From 780de86d694d12a30254367d2b436c7f8693facb Mon Sep 17 00:00:00 2001 From: awiouy Date: Sat, 3 Mar 2018 19:59:22 +0100 Subject: [PATCH 1/8] aixlog: initial package --- .../snapcast-depends/aixlog/package.mk | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/addons/addon-depends/snapcast-depends/aixlog/package.mk diff --git a/packages/addons/addon-depends/snapcast-depends/aixlog/package.mk b/packages/addons/addon-depends/snapcast-depends/aixlog/package.mk new file mode 100644 index 0000000000..721dd28cc2 --- /dev/null +++ b/packages/addons/addon-depends/snapcast-depends/aixlog/package.mk @@ -0,0 +1,37 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +PKG_NAME="aixlog" +PKG_VERSION="1.1.0" +PKG_ARCH="any" +PKG_LICENSE="MIT" +PKG_SITE="https://github.com/badaix/aixlog" +PKG_URL="https://github.com/badaix/aixlog/archive/v$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain" +PKG_SECTION="tools" +PKG_LONGDESC="Header-only C++ logging library" +PKG_IS_ADDON="no" +PKG_USE_CMAKE="no" + +make_target() { + : +} + +makeinstall_target() { + : +} From 8ade757f2b7f820d9e639f9898490719a704466b Mon Sep 17 00:00:00 2001 From: awiouy Date: Sat, 3 Mar 2018 19:59:42 +0100 Subject: [PATCH 2/8] asio: initial package --- .../snapcast-depends/asio/package.mk | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 packages/addons/addon-depends/snapcast-depends/asio/package.mk diff --git a/packages/addons/addon-depends/snapcast-depends/asio/package.mk b/packages/addons/addon-depends/snapcast-depends/asio/package.mk new file mode 100644 index 0000000000..955616452e --- /dev/null +++ b/packages/addons/addon-depends/snapcast-depends/asio/package.mk @@ -0,0 +1,36 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +PKG_NAME="asio" +PKG_VERSION="9229964" +PKG_ARCH="any" +PKG_LICENSE="BSL" +PKG_SITE="http://think-async.com/Asio" +PKG_URL="https://github.com/chriskohlhoff/asio/archive/$PKG_VERSION.zip" +PKG_DEPENDS_TARGET="toolchain" +PKG_SECTION="tools" +PKG_LONGDESC="Asio C++ Library" +PKG_IS_ADDON="no" + +make_target() { + : +} + +makeinstall_target() { + : +} From 72580f1e828394ac2fa00fa7b6c373c6ad6dc22b Mon Sep 17 00:00:00 2001 From: awiouy Date: Sat, 3 Mar 2018 20:00:37 +0100 Subject: [PATCH 3/8] popl: initial package --- .../snapcast-depends/popl/package.mk | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/addons/addon-depends/snapcast-depends/popl/package.mk diff --git a/packages/addons/addon-depends/snapcast-depends/popl/package.mk b/packages/addons/addon-depends/snapcast-depends/popl/package.mk new file mode 100644 index 0000000000..68c1038590 --- /dev/null +++ b/packages/addons/addon-depends/snapcast-depends/popl/package.mk @@ -0,0 +1,37 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +PKG_NAME="popl" +PKG_VERSION="1.0.0" +PKG_ARCH="any" +PKG_LICENSE="GPLv3" +PKG_SITE="https://github.com/badaix/popl" +PKG_URL="https://github.com/badaix/popl/archive/v$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain" +PKG_SECTION="tools" +PKG_LONGDESC="Header-only C++ program options parser library" +PKG_IS_ADDON="no" +PKG_USE_CMAKE="no" + +make_target() { + : +} + +makeinstall_target() { + : +} From cc4d22091103fd792318bfa9cd465ca4c47c485a Mon Sep 17 00:00:00 2001 From: awiouy Date: Tue, 6 Mar 2018 20:40:15 +0100 Subject: [PATCH 4/8] shairport-sync: initial package --- .../shairport-sync/package.mk | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 packages/addons/addon-depends/snapcast-depends/shairport-sync/package.mk diff --git a/packages/addons/addon-depends/snapcast-depends/shairport-sync/package.mk b/packages/addons/addon-depends/snapcast-depends/shairport-sync/package.mk new file mode 100644 index 0000000000..6a8651a9e8 --- /dev/null +++ b/packages/addons/addon-depends/snapcast-depends/shairport-sync/package.mk @@ -0,0 +1,43 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +PKG_NAME="shairport-sync" +PKG_VERSION="3.1.7" +PKG_ARCH="any" +PKG_LICENSE="OSS" +PKG_SITE="https://github.com/mikebrady/shairport-sync" +PKG_URL="https://github.com/mikebrady/shairport-sync/archive/$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain alsa-lib avahi libconfig libdaemon openssl popt pulseaudio soxr" +PKG_SECTION="tools" +PKG_LONGDESC="AirPlay audio player" +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-alsa \ + --with-avahi \ + --with-convolution \ + --with-metadata \ + --with-pa \ + --with-pipe \ + --with-soxr \ + --with-ssl=openssl \ + --with-stdout" + +makeinstall_target() { + : +} From c8c57fba6e9d47366a81a09590b0c446b8f0f438 Mon Sep 17 00:00:00 2001 From: awiouy Date: Sat, 3 Mar 2018 20:01:49 +0100 Subject: [PATCH 5/8] snapcast: initial package --- .../snapcast-depends/snapcast/package.mk | 42 +++++++++++++++++++ .../patches/snapcast-01_makefiles.patch | 30 +++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 packages/addons/addon-depends/snapcast-depends/snapcast/package.mk create mode 100644 packages/addons/addon-depends/snapcast-depends/snapcast/patches/snapcast-01_makefiles.patch diff --git a/packages/addons/addon-depends/snapcast-depends/snapcast/package.mk b/packages/addons/addon-depends/snapcast-depends/snapcast/package.mk new file mode 100644 index 0000000000..1df659d2ca --- /dev/null +++ b/packages/addons/addon-depends/snapcast-depends/snapcast/package.mk @@ -0,0 +1,42 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +PKG_NAME="snapcast" +PKG_VERSION="0.13.0" +PKG_ARCH="any" +PKG_LICENSE="GPLv3" +PKG_SITE="https://github.com/badaix/snapcast" +PKG_URL="https://github.com/badaix/snapcast/archive/v$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain aixlog alsa-lib asio avahi flac libvorbis popl" +PKG_SECTION="tools" +PKG_LONGDESC="Synchronous multi-room audio player" +PKG_IS_ADDON="no" +PKG_USE_CMAKE="no" + +pre_configure_target() { + cd .. + rm -rf .$TARGET_NAME + CXXFLAGS="$CXXFLAGS -pthread \ + -I$(get_build_dir aixlog)/include \ + -I$(get_build_dir asio)/asio/include \ + -I$(get_build_dir popl)/include" +} + +makeinstall_target() { + : +} diff --git a/packages/addons/addon-depends/snapcast-depends/snapcast/patches/snapcast-01_makefiles.patch b/packages/addons/addon-depends/snapcast-depends/snapcast/patches/snapcast-01_makefiles.patch new file mode 100644 index 0000000000..e9fada239e --- /dev/null +++ b/packages/addons/addon-depends/snapcast-depends/snapcast/patches/snapcast-01_makefiles.patch @@ -0,0 +1,30 @@ +diff -Naur snapcast-0.13.0/client/Makefile snapcast-0.13.0.Makefiles/client/Makefile +--- snapcast-0.13.0/client/Makefile 2018-03-04 21:43:32.000000000 +0100 ++++ snapcast-0.13.0.Makefiles/client/Makefile 2018-03-05 13:33:36.686709820 +0100 +@@ -78,10 +78,8 @@ + + else + +-CXX = g++ +-STRIP = strip + CXXFLAGS += -pthread -DHAS_VORBIS -DHAS_ALSA -DHAS_AVAHI -DHAS_DAEMON +-LDFLAGS += -lrt -lasound -lvorbis -lavahi-client -lavahi-common -static-libgcc -static-libstdc++ -latomic ++LDFLAGS += -lrt -lasound -lvorbis -lavahi-client -lavahi-common -logg + OBJ += ../common/daemon.o player/alsaPlayer.o browseZeroConf/browseAvahi.o + + endif +diff -Naur snapcast-0.13.0/server/Makefile snapcast-0.13.0.Makefiles/server/Makefile +--- snapcast-0.13.0/server/Makefile 2018-03-04 21:43:32.000000000 +0100 ++++ snapcast-0.13.0.Makefiles/server/Makefile 2018-03-05 13:34:03.530858350 +0100 +@@ -84,10 +84,8 @@ + + else + +-CXX = g++ +-STRIP = strip + CXXFLAGS += -DHAS_AVAHI -DHAS_DAEMON -pthread +-LDFLAGS = -lrt -lvorbis -lvorbisenc -logg -lFLAC -lavahi-client -lavahi-common -static-libgcc -static-libstdc++ ++LDFLAGS = -lrt -lvorbis -lvorbisenc -logg -lFLAC -lavahi-client -lavahi-common + OBJ += ../common/daemon.o publishZeroConf/publishAvahi.o + + endif From 1e54f6b69079594c5129d2aff9ddae15988fe170 Mon Sep 17 00:00:00 2001 From: awiouy Date: Sun, 4 Mar 2018 08:41:14 +0100 Subject: [PATCH 6/8] snapclient: initial addon --- .../addons/service/snapclient/changelog.txt | 2 + .../addons/service/snapclient/icon/icon.png | Bin 0 -> 39841 bytes packages/addons/service/snapclient/package.mk | 47 ++++++++++++ .../addons/service/snapclient/source/addon.py | 40 ++++++++++ .../snapclient/source/bin/snapclient.start | 51 +++++++++++++ .../service/snapclient/source/default.py | 70 ++++++++++++++++++ .../resources/language/English/strings.po | 70 ++++++++++++++++++ .../snapclient/source/resources/settings.xml | 18 +++++ .../snapclient/source/settings-default.xml | 10 +++ .../system.d/service.snapclient.service | 11 +++ 10 files changed, 319 insertions(+) create mode 100644 packages/addons/service/snapclient/changelog.txt create mode 100644 packages/addons/service/snapclient/icon/icon.png create mode 100644 packages/addons/service/snapclient/package.mk create mode 100644 packages/addons/service/snapclient/source/addon.py create mode 100644 packages/addons/service/snapclient/source/bin/snapclient.start create mode 100644 packages/addons/service/snapclient/source/default.py create mode 100644 packages/addons/service/snapclient/source/resources/language/English/strings.po create mode 100644 packages/addons/service/snapclient/source/resources/settings.xml create mode 100644 packages/addons/service/snapclient/source/settings-default.xml create mode 100644 packages/addons/service/snapclient/source/system.d/service.snapclient.service diff --git a/packages/addons/service/snapclient/changelog.txt b/packages/addons/service/snapclient/changelog.txt new file mode 100644 index 0000000000..ffbebe8438 --- /dev/null +++ b/packages/addons/service/snapclient/changelog.txt @@ -0,0 +1,2 @@ +100 +- Initial addon diff --git a/packages/addons/service/snapclient/icon/icon.png b/packages/addons/service/snapclient/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b764a02395fb77ec60e76ad88206ef0a3f76c34e GIT binary patch literal 39841 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 literal 0 HcmV?d00001 diff --git a/packages/addons/service/snapclient/package.mk b/packages/addons/service/snapclient/package.mk new file mode 100644 index 0000000000..f152b1d6ad --- /dev/null +++ b/packages/addons/service/snapclient/package.mk @@ -0,0 +1,47 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +PKG_NAME="snapclient" +PKG_VERSION="0.13.0" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="GPLv3" +PKG_DEPENDS_TARGET="toolchain snapcast" +PKG_SECTION="service" +PKG_SHORTDESC="Snapclient: Synchronous multi-room audio client" +PKG_LONGDESC="Snapclient ($PKG_VERSION) is a Snapcast client. Snapcast is a multi-room client-server audio system, where all clients are time synchronized with the server to play perfectly synced audioplays." +PKG_AUTORECONF="no" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Snapclient" +PKG_ADDON_TYPE="xbmc.service.library" +PKG_MAINTAINER="Anton Voyl (awiouy)" + +make_target() { + : +} + +makeinstall_target() { + : +} + +addon() { + mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/bin" + cp "$(get_build_dir snapcast)/client/snapclient" \ + "$ADDON_BUILD/$PKG_ADDON_ID/bin" +} diff --git a/packages/addons/service/snapclient/source/addon.py b/packages/addons/service/snapclient/source/addon.py new file mode 100644 index 0000000000..4775b5397b --- /dev/null +++ b/packages/addons/service/snapclient/source/addon.py @@ -0,0 +1,40 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +import os.path +import subprocess +import xbmcaddon +import xbmcgui + +SNAPCLIENT = os.path.join( + xbmcaddon.Addon().getAddonInfo('path'), 'bin', 'snapclient') + +card = '' +cards = [] +lines = subprocess.check_output([SNAPCLIENT, '--list']).splitlines() + +for line in lines: + if line != '': + card = card + ' ' + line + else: + cards.append(card) + card = '' + +dialog = xbmcgui.Dialog() +dialog.select(xbmcaddon.Addon().getLocalizedString(30015), cards) +del dialog diff --git a/packages/addons/service/snapclient/source/bin/snapclient.start b/packages/addons/service/snapclient/source/bin/snapclient.start new file mode 100644 index 0000000000..5901fb9295 --- /dev/null +++ b/packages/addons/service/snapclient/source/bin/snapclient.start @@ -0,0 +1,51 @@ +#!/bin/sh +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +. /etc/profile +oe_setup_addon service.snapclient + +. /etc/os-release +case "$LIBREELEC_ARCH" in + RPi*.arm) + if [ "$sc_a" == "true" ]; then + ALSA="/proc/asound/ALSA" + if [ ! -e "$ALSA" ]; then + echo "Starting Raspberry Pi onboard audio" + dtparam audio=on + sleep 1 + fi + if [ -e "$ALSA" ]; then + echo "Setting Raspberry Pi onboard audio playback route" + index="$(readlink $ALSA)" + index="${index##*card}" + amixer -c "$index" cset name="PCM Playback Route" "$sc_r" + fi + fi + ;; +esac + +[ -n "$sc_h" ] && sc_H="--hostID $sc_h" +[ -n "$sc_s" ] && sc_S="--soundcard $sc_s" + +snapclient \ + --daemon "$sc_n" \ + $sc_H \ + --latency "$sc_l" \ + --port "$sc_p" \ + $sc_S diff --git a/packages/addons/service/snapclient/source/default.py b/packages/addons/service/snapclient/source/default.py new file mode 100644 index 0000000000..bfdd4981a5 --- /dev/null +++ b/packages/addons/service/snapclient/source/default.py @@ -0,0 +1,70 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +import subprocess +import xbmc +import xbmcaddon + + +def systemctl(command): + subprocess.call( + ['systemctl', command, xbmcaddon.Addon().getAddonInfo('id')]) + + +class Monitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self) + self.player = Player() + + def onSettingsChanged(self): + self.player.start('restart') + + +class Player(xbmc.Player): + + def __init__(self): + super(Player, self).__init__(self) + self.start('start') + + def onPlayBackEnded(self): + if xbmcaddon.Addon().getSetting('sc_k') == 'true': + xbmc.sleep(500) + if not self.isPlaying(): + systemctl('start') + + def onPlayBackStarted(self): + if xbmcaddon.Addon().getSetting('sc_k') == 'true': + systemctl('stop') + + def onPlayBackStopped(self): + if xbmcaddon.Addon().getSetting('sc_k') == 'true': + systemctl('start') + + def start(self, command): + if xbmcaddon.Addon().getSetting('sc_k') == 'true': + if self.isPlaying(): + systemctl('stop') + else: + systemctl(command) + else: + systemctl(command) + + +if __name__ == '__main__': + Monitor().waitForAbort() diff --git a/packages/addons/service/snapclient/source/resources/language/English/strings.po b/packages/addons/service/snapclient/source/resources/language/English/strings.po new file mode 100644 index 0000000000..12eb6aa994 --- /dev/null +++ b/packages/addons/service/snapclient/source/resources/language/English/strings.po @@ -0,0 +1,70 @@ +# Kodi Media Center language file +# Addon Name: snapclient +# Addon id: service.snapclient +# Addon Provider: Team LibreELEC +msgid "" +msgstr "" + +msgctxt "#30000" +msgid "Snapclient" +msgstr "" + +msgctxt "#30001" +msgid "List sound cards" +msgstr "" + +msgctxt "#30002" +msgid "Sound card" +msgstr "" + +msgctxt "#30003" +msgid "Host ID" +msgstr "" + +msgctxt "#30004" +msgid "Port" +msgstr "" + +msgctxt "#30005" +msgid "Priority" +msgstr "" + +msgctxt "#30006" +msgid "Latency" +msgstr "" + +msgctxt "#30007" +msgid "Kodi" +msgstr "" + +msgctxt "#30008" +msgid "Stop Snapclient when Kodi plays" +msgstr "" + +msgctxt "#30009" +msgid "Rasperry Pi" +msgstr "" + +msgctxt "#30010" +msgid "Manage onboard audio" +msgstr "" + +msgctxt "#30011" +msgid "Onboard audio playback route" +msgstr "" + +msgctxt "#30012" +msgid "Autodetect" +msgstr "" + +msgctxt "#30013" +msgid "Jack" +msgstr "" + +msgctxt "#30014" +msgid "HDMI" +msgstr "" + +msgctxt "#30015" +msgid "Available sound cards" +msgstr "" diff --git a/packages/addons/service/snapclient/source/resources/settings.xml b/packages/addons/service/snapclient/source/resources/settings.xml new file mode 100644 index 0000000000..fdbdf00ddf --- /dev/null +++ b/packages/addons/service/snapclient/source/resources/settings.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/packages/addons/service/snapclient/source/settings-default.xml b/packages/addons/service/snapclient/source/settings-default.xml new file mode 100644 index 0000000000..21bb0b094a --- /dev/null +++ b/packages/addons/service/snapclient/source/settings-default.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/addons/service/snapclient/source/system.d/service.snapclient.service b/packages/addons/service/snapclient/source/system.d/service.snapclient.service new file mode 100644 index 0000000000..3d472614c6 --- /dev/null +++ b/packages/addons/service/snapclient/source/system.d/service.snapclient.service @@ -0,0 +1,11 @@ +[Unit] +Description=Snapclient +After=kodi.service network-online.target sound.target +Requires=kodi.service network-online.target sound.target + +[Service] +Type=forking +ExecStart=/bin/sh /storage/.kodi/addons/service.snapclient/bin/snapclient.start + +[Install] +WantedBy=kodi.target From ca20c72f088034926c3d9d8c88e5ffd8af3b0798 Mon Sep 17 00:00:00 2001 From: awiouy Date: Sun, 4 Mar 2018 18:54:17 +0100 Subject: [PATCH 7/8] snapserver: initial addon --- .../addons/service/snapserver/changelog.txt | 2 + .../addons/service/snapserver/icon/icon.png | Bin 0 -> 40635 bytes packages/addons/service/snapserver/package.mk | 48 ++++++++++++++++++ .../snapserver/source/bin/snapserver.start | 39 ++++++++++++++ .../service/snapserver/source/default.py | 39 ++++++++++++++ .../resources/language/English/strings.po | 30 +++++++++++ .../snapserver/source/resources/settings.xml | 10 ++++ .../snapserver/source/settings-default.xml | 7 +++ .../system.d/service.snapserver.service | 11 ++++ 9 files changed, 186 insertions(+) create mode 100644 packages/addons/service/snapserver/changelog.txt create mode 100644 packages/addons/service/snapserver/icon/icon.png create mode 100644 packages/addons/service/snapserver/package.mk create mode 100644 packages/addons/service/snapserver/source/bin/snapserver.start create mode 100644 packages/addons/service/snapserver/source/default.py create mode 100644 packages/addons/service/snapserver/source/resources/language/English/strings.po create mode 100644 packages/addons/service/snapserver/source/resources/settings.xml create mode 100644 packages/addons/service/snapserver/source/settings-default.xml create mode 100644 packages/addons/service/snapserver/source/system.d/service.snapserver.service diff --git a/packages/addons/service/snapserver/changelog.txt b/packages/addons/service/snapserver/changelog.txt new file mode 100644 index 0000000000..ffbebe8438 --- /dev/null +++ b/packages/addons/service/snapserver/changelog.txt @@ -0,0 +1,2 @@ +100 +- Initial addon diff --git a/packages/addons/service/snapserver/icon/icon.png b/packages/addons/service/snapserver/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf0f85a1a5207b135ac6d8e50b1bc2027454a93 GIT binary patch literal 40635 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. +################################################################################ + +PKG_NAME="snapserver" +PKG_VERSION="0.13.0" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="GPLv3" +PKG_DEPENDS_TARGET="toolchain shairport-sync snapcast" +PKG_SECTION="service" +PKG_SHORTDESC="Snapserver: Synchronous multi-room audio server" +PKG_LONGDESC="Snapclient ($PKG_VERSION) is a Snapcast server. Snapcast is a multi-room client-server audio system, where all clients are time synchronized with the server to play perfectly synced audioplays." +PKG_AUTORECONF="no" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Snapserver" +PKG_ADDON_TYPE="xbmc.service" +PKG_MAINTAINER="Anton Voyl (awiouy)" + +make_target() { + : +} + +makeinstall_target() { + : +} + +addon() { + mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/bin" + cp "$(get_build_dir shairport-sync)/.$TARGET_NAME/shairport-sync" \ + "$(get_build_dir snapcast)/server/snapserver" \ + "$ADDON_BUILD/$PKG_ADDON_ID/bin" +} diff --git a/packages/addons/service/snapserver/source/bin/snapserver.start b/packages/addons/service/snapserver/source/bin/snapserver.start new file mode 100644 index 0000000000..3cc71a6609 --- /dev/null +++ b/packages/addons/service/snapserver/source/bin/snapserver.start @@ -0,0 +1,39 @@ +#!/bin/sh +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +. /etc/profile +oe_setup_addon service.snapserver + +case "$ss_ps" in + Default) + ss_us="--stream pipe:///tmp/snapfifo?name=Default" + ;; + Airplay) + ss_us="--stream airplay:///shairport-sync?name=Airplay" + ;; + Spotify) + ss_us="--stream spotify:///librespot?name=Spotify" + ;; +esac + +snapserver \ + --controlPort "$ss_cp" \ + --daemon "$ss_ni" \ + --port "$ss_sp" \ + $ss_us diff --git a/packages/addons/service/snapserver/source/default.py b/packages/addons/service/snapserver/source/default.py new file mode 100644 index 0000000000..a4ba4d9ce1 --- /dev/null +++ b/packages/addons/service/snapserver/source/default.py @@ -0,0 +1,39 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC 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 of the License, or +# (at your option) any later version. +# +# LibreELEC 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 LibreELEC. If not, see . +################################################################################ + +import subprocess +import xbmc +import xbmcaddon + + +def systemctl(command): + subprocess.call( + ['systemctl', command, xbmcaddon.Addon().getAddonInfo('id')]) + + +class Monitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self) + + def onSettingsChanged(self): + systemctl('restart') + + +if __name__ == '__main__': + Monitor().waitForAbort() diff --git a/packages/addons/service/snapserver/source/resources/language/English/strings.po b/packages/addons/service/snapserver/source/resources/language/English/strings.po new file mode 100644 index 0000000000..2ee26e3825 --- /dev/null +++ b/packages/addons/service/snapserver/source/resources/language/English/strings.po @@ -0,0 +1,30 @@ +# Kodi Media Center language file +# Addon Name: snapserver +# Addon id: service.snapclient +# Addon Provider: Team LibreELEC +msgid "" +msgstr "" + +msgctxt "#30000" +msgid "Snapserver" +msgstr "" + +msgctxt "#30001" +msgid "Server port" +msgstr "" + +msgctxt "#30002" +msgid "Control port" +msgstr "" + +msgctxt "#30003" +msgid "Priority" +msgstr "" + +msgctxt "#30004" +msgid "Preset" +msgstr "" + +msgctxt "#30005" +msgid "Stream" +msgstr "" diff --git a/packages/addons/service/snapserver/source/resources/settings.xml b/packages/addons/service/snapserver/source/resources/settings.xml new file mode 100644 index 0000000000..2a1ea8583a --- /dev/null +++ b/packages/addons/service/snapserver/source/resources/settings.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/addons/service/snapserver/source/settings-default.xml b/packages/addons/service/snapserver/source/settings-default.xml new file mode 100644 index 0000000000..c414a13335 --- /dev/null +++ b/packages/addons/service/snapserver/source/settings-default.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/addons/service/snapserver/source/system.d/service.snapserver.service b/packages/addons/service/snapserver/source/system.d/service.snapserver.service new file mode 100644 index 0000000000..09232a23f5 --- /dev/null +++ b/packages/addons/service/snapserver/source/system.d/service.snapserver.service @@ -0,0 +1,11 @@ +[Unit] +Description=Snapserver +After=kodi.service network-online.target sound.target +Requires=kodi.service network-online.target sound.target + +[Service] +Type=forking +ExecStart=/bin/sh /storage/.kodi/addons/service.snapserver/bin/snapserver.start + +[Install] +WantedBy=kodi.target From 405ab3fe30b62c2f4bbbc1ca3115b6e1d47290b5 Mon Sep 17 00:00:00 2001 From: awiouy Date: Sun, 4 Mar 2018 20:22:12 +0100 Subject: [PATCH 8/8] licenses: add BSL --- licenses/BSL.txt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 licenses/BSL.txt diff --git a/licenses/BSL.txt b/licenses/BSL.txt new file mode 100644 index 0000000000..36b7cd93cd --- /dev/null +++ b/licenses/BSL.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE.