From 85b0201739fa56723e028b9893e4e900c19fb730 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Tue, 3 May 2016 14:50:25 +0100 Subject: [PATCH] addons: mpd - initial package --- packages/addons/service/mpd/changelog.txt | 2 + packages/addons/service/mpd/icon/icon.png | Bin 0 -> 24915 bytes packages/addons/service/mpd/package.mk | 103 ++++ .../addons/service/mpd/source/bin/mpd.start | 41 ++ .../addons/service/mpd/source/config/mpd.conf | 453 ++++++++++++++++++ packages/addons/service/mpd/source/default.py | 19 + .../resources/language/English/strings.xml | 5 + .../service/mpd/source/resources/settings.xml | 8 + .../service/mpd/source/settings-default.xml | 3 + .../service/mpd/source/sleep.d/mpd.power | 42 ++ .../system.d/service.multimedia.mpd.service | 13 + 11 files changed, 689 insertions(+) create mode 100644 packages/addons/service/mpd/changelog.txt create mode 100644 packages/addons/service/mpd/icon/icon.png create mode 100644 packages/addons/service/mpd/package.mk create mode 100755 packages/addons/service/mpd/source/bin/mpd.start create mode 100644 packages/addons/service/mpd/source/config/mpd.conf create mode 100644 packages/addons/service/mpd/source/default.py create mode 100644 packages/addons/service/mpd/source/resources/language/English/strings.xml create mode 100644 packages/addons/service/mpd/source/resources/settings.xml create mode 100644 packages/addons/service/mpd/source/settings-default.xml create mode 100644 packages/addons/service/mpd/source/sleep.d/mpd.power create mode 100644 packages/addons/service/mpd/source/system.d/service.multimedia.mpd.service diff --git a/packages/addons/service/mpd/changelog.txt b/packages/addons/service/mpd/changelog.txt new file mode 100644 index 0000000000..c03759c728 --- /dev/null +++ b/packages/addons/service/mpd/changelog.txt @@ -0,0 +1,2 @@ +8.0.100 +- update to mpd-0.19.15 diff --git a/packages/addons/service/mpd/icon/icon.png b/packages/addons/service/mpd/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3927473b32c11156ee3877f7b6244b5f8ab3ada9 GIT binary patch literal 24915 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 /dev/null 2>&1 diff --git a/packages/addons/service/mpd/source/config/mpd.conf b/packages/addons/service/mpd/source/config/mpd.conf new file mode 100644 index 0000000000..195784d693 --- /dev/null +++ b/packages/addons/service/mpd/source/config/mpd.conf @@ -0,0 +1,453 @@ +# An example configuration file for MPD +# See the mpd.conf man page for a more detailed description of each parameter. + + +# Files and directories ####################################################### +# +# This setting controls the top directory which MPD will search to discover the +# available audio files and add them to the daemon's online database. This +# setting defaults to the XDG directory, otherwise the music directory will be +# be disabled and audio files will only be accepted over ipc socket (using +# file:// protocol) or streaming files over an accepted protocol. +# +music_directory "/storage/music" +# +# This setting sets the MPD internal playlist directory. The purpose of this +# directory is storage for playlists created by MPD. The server will use +# playlist files not created by the server but only if they are in the MPD +# format. This setting defaults to playlist saving being disabled. +# +playlist_directory "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/playlists" +# +# This setting sets the location of the MPD database. This file is used to +# load the database at server start up and store the database while the +# server is not up. This setting defaults to disabled which will allow +# MPD to accept files over ipc socket (using file:// protocol) or streaming +# files over an accepted protocol. +# +db_file "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/mpd.db" +# +# These settings are the locations for the daemon log files for the daemon. +# These logs are great for troubleshooting, depending on your log_level +# settings. +# +# The special value "syslog" makes MPD use the local syslog daemon. This +# setting defaults to logging to syslog, otherwise logging is disabled. +# +log_file "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/log/mpd.log" +# +# This setting sets the location of the file which stores the process ID +# for use of mpd --kill and some init scripts. This setting is disabled by +# default and the pid file will not be stored. +# +pid_file "/var/run/mpd.pid" +# +# This setting sets the location of the file which contains information about +# most variables to get MPD back into the same general shape it was in before +# it was brought down. This setting is disabled by default and the server +# state will be reset on server start up. +# +state_file "/storage/.kodi/userdata/addon_data/service.multimedia.mpd/state" +# +# The location of the sticker database. This is a database which +# manages dynamic information attached to songs. +# +#sticker_file "/storage/.mpd/sticker.sql" +# +############################################################################### + + +# General music daemon options ################################################ +# +# This setting specifies the user that MPD will run as. MPD should never run as +# root and you may use this setting to make MPD change its user ID after +# initialization. This setting is disabled by default and MPD is run as the +# current user. +# +#user "mpd" +# +# This setting specifies the group that MPD will run as. If not specified +# primary group of user specified with "user" setting will be used (if set). +# This is useful if MPD needs to be a member of group such as "audio" to +# have permission to use sound card. +# +#group "nogroup" +# +# This setting sets the address for the daemon to listen on. Careful attention +# should be paid if this is assigned to anything other then the default, any. +# This setting can deny access to control of the daemon. +# +# For network +#bind_to_address "any" +# +# And for Unix Socket +#bind_to_address "/storage/.mpd/socket" +# +# This setting is the TCP port that is desired for the daemon to get assigned +# to. +# +#port "6600" +# +# This setting controls the type of information which is logged. Available +# setting arguments are "default", "secure" or "verbose". The "verbose" setting +# argument is recommended for troubleshooting, though can quickly stretch +# available resources on limited hardware storage. +# +#log_level "default" +# +# If you have a problem with your MP3s ending abruptly it is recommended that +# you set this argument to "no" to attempt to fix the problem. If this solves +# the problem, it is highly recommended to fix the MP3 files with vbrfix +# (available from ), at which +# point gapless MP3 playback can be enabled. +# +#gapless_mp3_playback "yes" +# +# Setting "restore_paused" to "yes" puts MPD into pause mode instead +# of starting playback after startup. +# +#restore_paused "no" +# +# This setting enables MPD to create playlists in a format usable by other +# music players. +# +#save_absolute_paths_in_playlists "no" +# +# This setting defines a list of tag types that will be extracted during the +# audio file discovery process. Optionally, 'comment' can be added to this +# list. +# +#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" +# +# This setting enables automatic update of MPD's database when files in +# music_directory are changed. +# +#auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# +############################################################################### + + +# Symbolic link behavior ###################################################### +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links outside of the configured music_directory. +# +#follow_outside_symlinks "yes" +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links inside of the configured music_directory. +# +#follow_inside_symlinks "yes" +# +############################################################################### + + +# Zeroconf / Avahi Service Discovery ########################################## +# +# If this setting is set to "yes", service information will be published with +# Zeroconf / Avahi. +# +#zeroconf_enabled "yes" +# +# The argument to this setting will be the Zeroconf / Avahi unique name for +# this MPD server on the network. +# +#zeroconf_name "Music Player" +# +############################################################################### + + +# Permissions ################################################################# +# +# If this setting is set, MPD will require password authorization. The password +# can setting can be specified multiple times for different password profiles. +# +#password "password@read,add,control,admin" +# +# This setting specifies the permissions a user has who has not yet logged in. +# +#default_permissions "read,add,control,admin" +# +############################################################################### + + +# Input ####################################################################### +# + +#input { +# plugin "curl" +# proxy "proxy.isp.com:8080" +# proxy_user "user" +# proxy_password "password" +#} + +# +############################################################################### + +############################################################################### +############################################################################### +# +# A BIG FAT WARNING +# +# This may block your xbmc audio. It might also play no audio at all, +# if streamsilence is enabled and you try to use the very same device. +# +############################################################################### +############################################################################### + +# Audio Output ################################################################ +# +# MPD supports various audio output types, as well as playing through multiple +# audio outputs at the same time, through multiple audio_output settings +# blocks. Setting this block is optional, though the server will only attempt +# autodetection for one sound card. +# +# See for examples of +# other audio outputs. +# +# An example of an ALSA output: +# +##audio_output { +## type "alsa" +## name "ALSA Device" +### device "hw:0,0" # optional +#### format "44100:16:2" # optional +#### mixer_type "hardware" # optional +#### mixer_device "default" # optional +#### mixer_control "PCM" # optional +#### mixer_index "0" # optional +##} +# +# An example of an OSS output: +# +#audio_output { +# type "oss" +# name "My OSS Device" +## device "/dev/dsp" # optional +## format "44100:16:2" # optional +## mixer_type "hardware" # optional +## mixer_device "/dev/mixer" # optional +## mixer_control "PCM" # optional +#} +# +# An example of a shout output (for streaming to Icecast): +# +#audio_output { +# type "shout" +# encoding "ogg" # optional +# name "My Shout Stream" +# host "localhost" +# port "8000" +# mount "/mpd.ogg" +# password "hackme" +# quality "5.0" +# bitrate "128" +# format "44100:16:1" +## protocol "icecast2" # optional +## user "source" # optional +## description "My Stream Description" # optional +## url "http://example.com" # optional +## genre "jazz" # optional +## public "no" # optional +## timeout "2" # optional +## mixer_type "software" # optional +#} +# +# An example of a recorder output: +# +#audio_output { +# type "recorder" +# name "My recorder" +# encoder "vorbis" # optional, vorbis or lame +# path "/var/lib/mpd/recorder/mpd.ogg" +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +#} +# +# An example of a httpd output (built-in HTTP streaming server): +# +#audio_output { +## type "httpd" +# name "My HTTP Stream" +# encoder "vorbis" # optional, vorbis or lame +# port "8000" +# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 +# quality "5.0" # do not define if bitrate is defined +# bitrate "320" # do not define if quality is defined +# format "44100:16:1" +# max_clients "0" # optional 0=no limit +#} +# +# An example of a pulseaudio output (streaming to a remote pulseaudio server) +# +#audio_output { +# type "pulse" +# name "My Pulse Output" +## server "remote_server" # optional +## sink "remote_server_sink" # optional +#} +# +## Example "pipe" output: +# +#audio_output { +# type "pipe" +# name "my pipe" +# command "aplay -f cd 2>/dev/null" +## Or if you're want to use AudioCompress +# command "AudioCompress -m | aplay -f cd 2>/dev/null" +## Or to send raw PCM stream through PCM: +# command "nc example.org 8765" +# format "44100:16:2" +#} +# +## An example of a null output (for no audio output): +# +audio_output { + type "null" + name "My Null Output" + mixer_type "none" # optional +} +# +# This setting will change all decoded audio to be converted to the specified +# format before being passed to the audio outputs. By default, this setting is +# disabled. +# +#audio_output_format "44100:16:2" +# +# If MPD has been compiled with libsamplerate support, this setting specifies +# the sample rate converter to use. Possible values can be found in the +# mpd.conf man page or the libsamplerate documentation. By default, this is +# setting is disabled. +# +#samplerate_converter "Fastest Sinc Interpolator" +# +############################################################################### + + +# Normalization automatic volume adjustments ################################## +# +# This setting specifies the type of ReplayGain to use. This setting can have +# the argument "off", "album" or "track". See +# for more details. This setting is off by default. +# +#replaygain "album" +# +# This setting sets the pre-amp used for files that have ReplayGain tags. By +# default this setting is disabled. +# +#replaygain_preamp "0" +# +# This setting enables on-the-fly normalization volume adjustment. This will +# result in the volume of all playing audio to be adjusted so the output has +# equal "loudness". This setting is disabled by default. +# +#volume_normalization "no" +# +############################################################################### + + +# MPD Internal Buffering ###################################################### +# +# This setting adjusts the size of internal decoded audio buffering. Changing +# this may have undesired effects. Don't change this if you don't know what you +# are doing. +# +#audio_buffer_size "2048" +# +# This setting controls the percentage of the buffer which is filled before +# beginning to play. Increasing this reduces the chance of audio file skipping, +# at the cost of increased time prior to audio playback. +# +#buffer_before_play "10%" +# +############################################################################### + + +# Resource Limitations ######################################################## +# +# These settings are various limitations to prevent MPD from using too many +# resources. Generally, these settings should be minimized to prevent security +# risks, depending on the operating resources. +# +#connection_timeout "60" +#max_connections "10" +#max_playlist_length "16384" +#max_command_list_size "2048" +#max_output_buffer_size "8192" +# +############################################################################### + +# Client TCP keep alive ####################################################### +# +# For clients connected by TCP on supported platforms. +# Allows detection of dangling connections due to clients disappearing from +# the network without closing their connections. +# +# This is not usually necessary but can be useful in cases such as wifi connectected +# clients that go in and out of network range or turn off wifi without closing their +# connections. Combined with low max_connections this can soon cause clients to not +# be able to connect. +# +# +# Enable tcp keepalive on new client connections (default is "no") +# +#tcp_keep_alive "no" +# +# Time in seconds since the last communication on the connection and before +# the keepalive probing is started. (default is 7200 seconds) +#tcp_keep_alive_idle "7200" +# +# Interval in seconds between keepalive probes, once a probe started. +# (default is 75 seconds) +#tcp_keep_alive_interval "75" +# +# Number of failed probes before the connection is pronounced dead and +# the connection is closed. (default is 9 times) +#tcp_keep_alive_count "9" +# +############################################################################### + +# Character Encoding ########################################################## +# +# If file or directory names do not display correctly for your locale then you +# may need to modify this setting. +# +#filesystem_charset "UTF-8" +# +# This setting controls the encoding that ID3v1 tags should be converted from. +# +#id3v1_encoding "ISO-8859-1" +# +############################################################################### + + +# SIDPlay decoder ############################################################# +# +# songlength_database: +# Location of your songlengths file, as distributed with the HVSC. +# The sidplay plugin checks this for matching MD5 fingerprints. +# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq +# +# default_songlength: +# This is the default playing time in seconds for songs not in the +# songlength database, or in case you're not using a database. +# A value of 0 means play indefinitely. +# +# filter: +# Turns the SID filter emulation on or off. +# +#decoder { +# plugin "sidplay" +# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt" +# default_songlength "120" +# filter "true" +#} +# +############################################################################### + diff --git a/packages/addons/service/mpd/source/default.py b/packages/addons/service/mpd/source/default.py new file mode 100644 index 0000000000..6f814651a2 --- /dev/null +++ b/packages/addons/service/mpd/source/default.py @@ -0,0 +1,19 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ diff --git a/packages/addons/service/mpd/source/resources/language/English/strings.xml b/packages/addons/service/mpd/source/resources/language/English/strings.xml new file mode 100644 index 0000000000..d388c262c1 --- /dev/null +++ b/packages/addons/service/mpd/source/resources/language/English/strings.xml @@ -0,0 +1,5 @@ + + + General + Restart on suspend / resume + diff --git a/packages/addons/service/mpd/source/resources/settings.xml b/packages/addons/service/mpd/source/resources/settings.xml new file mode 100644 index 0000000000..ae2693c874 --- /dev/null +++ b/packages/addons/service/mpd/source/resources/settings.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/addons/service/mpd/source/settings-default.xml b/packages/addons/service/mpd/source/settings-default.xml new file mode 100644 index 0000000000..f5afe2c799 --- /dev/null +++ b/packages/addons/service/mpd/source/settings-default.xml @@ -0,0 +1,3 @@ + + + diff --git a/packages/addons/service/mpd/source/sleep.d/mpd.power b/packages/addons/service/mpd/source/sleep.d/mpd.power new file mode 100644 index 0000000000..1ba5ab37c6 --- /dev/null +++ b/packages/addons/service/mpd/source/sleep.d/mpd.power @@ -0,0 +1,42 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +. /etc/profile + +oe_setup_addon service.multimedia.mpd + +SERVICE="service.multimedia.mpd" + +if [ "$RESTART_ON_RESUME" == "true" ] ; then + case "$1" in + pre) + if systemctl is-active "$SERVICE" &>/dev/null ; then + systemctl stop "$SERVICE" + fi + ;; + post) + if systemctl is-enabled "$SERVICE" &>/dev/null ; then + systemctl start "$SERVICE" + fi + ;; + esac +fi diff --git a/packages/addons/service/mpd/source/system.d/service.multimedia.mpd.service b/packages/addons/service/mpd/source/system.d/service.multimedia.mpd.service new file mode 100644 index 0000000000..147cd72129 --- /dev/null +++ b/packages/addons/service/mpd/source/system.d/service.multimedia.mpd.service @@ -0,0 +1,13 @@ +[Unit] +Description=mpd +After=graphical.target + +[Service] +ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.multimedia.mpd/bin/mpd.start" +TimeoutStopSec=1 +Restart=always +RestartSec=2 +StartLimitInterval=0 + +[Install] +WantedBy=kodi.target