mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 05:06:43 +00:00
librespot: enable streaming to Kodi
This commit is contained in:
parent
36eca04370
commit
a49aea0084
@ -1,2 +1,5 @@
|
|||||||
|
101
|
||||||
|
- Enable streaming to Kodi
|
||||||
|
|
||||||
100
|
100
|
||||||
- Initial addon
|
- Initial addon
|
||||||
|
@ -18,20 +18,21 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
PKG_NAME="librespot"
|
PKG_NAME="librespot"
|
||||||
PKG_VERSION="2259188"
|
PKG_VERSION="67deb07"
|
||||||
PKG_REV="100"
|
PKG_REV="101"
|
||||||
PKG_ARCH="any"
|
PKG_ARCH="any"
|
||||||
PKG_LICENSE="prop."
|
PKG_LICENSE="MIT"
|
||||||
PKG_SITE="https://github.com/plietar/$PKG_NAME/"
|
PKG_SITE="https://github.com/plietar/$PKG_NAME/"
|
||||||
PKG_URL="https://github.com/plietar/$PKG_NAME/archive/$PKG_VERSION.zip"
|
PKG_URL="https://github.com/plietar/$PKG_NAME/archive/$PKG_VERSION.zip"
|
||||||
PKG_DEPENDS_TARGET="toolchain avahi libvorbis pyalsaaudio rust"
|
PKG_DEPENDS_TARGET="toolchain avahi ffmpegx libvorbis pyalsaaudio rust"
|
||||||
PKG_SECTION="service"
|
PKG_SECTION="service"
|
||||||
PKG_LONGDESC="Librespot ($PKG_VERSION) plays Spotify through LibreELEC using the opensource librespot library using a Spotify app as a remote."
|
PKG_SHORTDESC="Librespot: play Spotify through LibreELEC using a Spotify app as a remote"
|
||||||
|
PKG_LONGDESC="Librespot ($PKG_VERSION) plays Spotify through LibreELEC using the open source librespot library using a Spotify app as a remote."
|
||||||
PKG_AUTORECONF="no"
|
PKG_AUTORECONF="no"
|
||||||
|
|
||||||
PKG_IS_ADDON="yes"
|
PKG_IS_ADDON="yes"
|
||||||
PKG_ADDON_NAME="Librespot"
|
PKG_ADDON_NAME="Librespot"
|
||||||
PKG_ADDON_TYPE="xbmc.service"
|
PKG_ADDON_TYPE="xbmc.service.library"
|
||||||
PKG_MAINTAINER="Anton Voyl (awiouy)"
|
PKG_MAINTAINER="Anton Voyl (awiouy)"
|
||||||
|
|
||||||
configure_target() {
|
configure_target() {
|
||||||
@ -43,6 +44,8 @@ configure_target() {
|
|||||||
make_target() {
|
make_target() {
|
||||||
cd src
|
cd src
|
||||||
$CARGO_BUILD --no-default-features --features "alsa-backend with-avahi"
|
$CARGO_BUILD --no-default-features --features "alsa-backend with-avahi"
|
||||||
|
cd "$PKG_BUILD/.$TARGET_NAME"/*/release
|
||||||
|
$STRIP librespot
|
||||||
}
|
}
|
||||||
|
|
||||||
makeinstall_target() {
|
makeinstall_target() {
|
||||||
@ -50,15 +53,16 @@ makeinstall_target() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addon() {
|
addon() {
|
||||||
|
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID"
|
||||||
|
cp "$(get_build_dir pyalsaaudio)/.install_pkg/usr/lib/python2.7/site-packages/alsaaudio.so" \
|
||||||
|
"$ADDON_BUILD/$PKG_ADDON_ID"
|
||||||
|
|
||||||
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/bin"
|
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/bin"
|
||||||
cp "$PKG_BUILD/.$TARGET_NAME"/*/release/librespot \
|
cp "$PKG_BUILD/.$TARGET_NAME"/*/release/librespot \
|
||||||
|
"$(get_build_dir ffmpegx)/.install_pkg/usr/local/bin/ffmpegx" \
|
||||||
"$ADDON_BUILD/$PKG_ADDON_ID/bin"
|
"$ADDON_BUILD/$PKG_ADDON_ID/bin"
|
||||||
|
|
||||||
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/lib"
|
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/lib"
|
||||||
cp "$(get_build_dir avahi)/avahi-compat-libdns_sd/.libs/libdns_sd.so.1" \
|
cp "$(get_build_dir avahi)/avahi-compat-libdns_sd/.libs/libdns_sd.so.1" \
|
||||||
"$ADDON_BUILD/$PKG_ADDON_ID/lib"
|
"$ADDON_BUILD/$PKG_ADDON_ID/lib"
|
||||||
|
|
||||||
mkdir -p "$ADDON_BUILD/$PKG_ADDON_ID/wizard"
|
|
||||||
cp "$(get_build_dir pyalsaaudio)/.install_pkg/usr/lib/python2.7/site-packages/alsaaudio.so" \
|
|
||||||
"$ADDON_BUILD/$PKG_ADDON_ID/wizard/"
|
|
||||||
}
|
}
|
||||||
|
@ -1,87 +0,0 @@
|
|||||||
From 031cc0a420db9d3ae8dd3543d07ff8503bdc508d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Michael Herger <michael@herger.net>
|
|
||||||
Date: Tue, 20 Jun 2017 12:31:55 +0200
|
|
||||||
Subject: [PATCH] Add --disable-audio-cache startup parameter
|
|
||||||
|
|
||||||
Disable caching of downloaded audio files at runtime. Comes in handy when running librespot on a small device with SD card or other small storage.
|
|
||||||
---
|
|
||||||
src/audio_file.rs | 24 +++++++++++++-----------
|
|
||||||
src/main.rs | 2 ++
|
|
||||||
src/session.rs | 2 ++
|
|
||||||
3 files changed, 17 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/audio_file.rs b/src/audio_file.rs
|
|
||||||
index 369d5ca..d014ba2 100644
|
|
||||||
--- a/src/audio_file.rs
|
|
||||||
+++ b/src/audio_file.rs
|
|
||||||
@@ -151,17 +151,19 @@ impl AudioFileManager {
|
|
||||||
complete_tx: Some(complete_tx),
|
|
||||||
};
|
|
||||||
|
|
||||||
- let session = self.session();
|
|
||||||
- self.session().spawn(move |_| {
|
|
||||||
- complete_rx.map(move |mut file| {
|
|
||||||
- if let Some(cache) = session.cache() {
|
|
||||||
- cache.save_file(file_id, &mut file);
|
|
||||||
- debug!("File {} complete, saving to cache", file_id);
|
|
||||||
- } else {
|
|
||||||
- debug!("File {} complete", file_id);
|
|
||||||
- }
|
|
||||||
- }).or_else(|oneshot::Canceled| Ok(()))
|
|
||||||
- });
|
|
||||||
+ if self.session().config().use_audio_cache {
|
|
||||||
+ let session = self.session();
|
|
||||||
+ self.session().spawn(move |_| {
|
|
||||||
+ complete_rx.map(move |mut file| {
|
|
||||||
+ if let Some(cache) = session.cache() {
|
|
||||||
+ cache.save_file(file_id, &mut file);
|
|
||||||
+ debug!("File {} complete, saving to cache", file_id);
|
|
||||||
+ } else {
|
|
||||||
+ debug!("File {} complete", file_id);
|
|
||||||
+ }
|
|
||||||
+ }).or_else(|oneshot::Canceled| Ok(()))
|
|
||||||
+ });
|
|
||||||
+ }
|
|
||||||
|
|
||||||
AudioFileOpen::Streaming(open)
|
|
||||||
}
|
|
||||||
diff --git a/src/main.rs b/src/main.rs
|
|
||||||
index 38c57fd..8a31a44 100644
|
|
||||||
--- a/src/main.rs
|
|
||||||
+++ b/src/main.rs
|
|
||||||
@@ -86,6 +86,7 @@ struct Setup {
|
|
||||||
fn setup(args: &[String]) -> Setup {
|
|
||||||
let mut opts = getopts::Options::new();
|
|
||||||
opts.optopt("c", "cache", "Path to a directory where files will be cached.", "CACHE")
|
|
||||||
+ .optflag("", "disable-audio-cache", "Disable caching of the audio data.")
|
|
||||||
.reqopt("n", "name", "Device name", "NAME")
|
|
||||||
.optopt("b", "bitrate", "Bitrate (96, 160 or 320). Defaults to 160", "BITRATE")
|
|
||||||
.optopt("", "onstart", "Run PROGRAM when playback is about to begin.", "PROGRAM")
|
|
||||||
@@ -152,6 +153,7 @@ fn setup(args: &[String]) -> Setup {
|
|
||||||
bitrate: bitrate,
|
|
||||||
onstart: matches.opt_str("onstart"),
|
|
||||||
onstop: matches.opt_str("onstop"),
|
|
||||||
+ use_audio_cache: !matches.opt_present("disable-audio-cache"),
|
|
||||||
};
|
|
||||||
|
|
||||||
let device = matches.opt_str("device");
|
|
||||||
diff --git a/src/session.rs b/src/session.rs
|
|
||||||
index 86162bd..a5d397e 100644
|
|
||||||
--- a/src/session.rs
|
|
||||||
+++ b/src/session.rs
|
|
||||||
@@ -49,6 +49,7 @@ pub struct Config {
|
|
||||||
pub bitrate: Bitrate,
|
|
||||||
pub onstart: Option<String>,
|
|
||||||
pub onstop: Option<String>,
|
|
||||||
+ pub use_audio_cache: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Config {
|
|
||||||
@@ -60,6 +61,7 @@ impl Default for Config {
|
|
||||||
bitrate: Bitrate::Bitrate160,
|
|
||||||
onstart: None,
|
|
||||||
onstop: None,
|
|
||||||
+ use_audio_cache: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -16,24 +16,8 @@
|
|||||||
# along with LibreELEC. If not, see <http://www.gnu.org/licenses/>.
|
# along with LibreELEC. If not, see <http://www.gnu.org/licenses/>.
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
import alsaaudio as alsa
|
from default import addon as addon
|
||||||
import xbmcaddon
|
|
||||||
import xbmcgui
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
addon()
|
||||||
addon = xbmcaddon.Addon('service.librespot')
|
|
||||||
dialog = xbmcgui.Dialog()
|
|
||||||
strings = addon.getLocalizedString
|
|
||||||
|
|
||||||
while True:
|
|
||||||
pcms = alsa.pcms()[1:]
|
|
||||||
if len(pcms) == 0:
|
|
||||||
dialog.ok(strings(30211), strings(30212))
|
|
||||||
break
|
|
||||||
pcmx = dialog.select(strings(30113), pcms)
|
|
||||||
if pcmx == -1:
|
|
||||||
break
|
|
||||||
pcm = pcms[pcmx]
|
|
||||||
addon.setSetting('ls_o', pcm)
|
|
||||||
break
|
|
@ -17,10 +17,6 @@
|
|||||||
# along with LibreELEC. If not, see <http://www.gnu.org/licenses/>.
|
# along with LibreELEC. If not, see <http://www.gnu.org/licenses/>.
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
. /etc/os-release
|
|
||||||
. /etc/profile
|
|
||||||
oe_setup_addon service.librespot
|
|
||||||
|
|
||||||
activate_card() {
|
activate_card() {
|
||||||
if [ -e "/proc/asound/$1" ]; then
|
if [ -e "/proc/asound/$1" ]; then
|
||||||
return
|
return
|
||||||
@ -39,7 +35,10 @@ activate_card() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ ! "$(cat /proc/asound/pcm 2> /dev/null)" ]; then
|
init_alsa() {
|
||||||
|
. /etc/os-release
|
||||||
|
|
||||||
|
if [ ! "$(cat /proc/asound/pcm 2> /dev/null)" ]; then
|
||||||
case "$LIBREELEC_ARCH" in
|
case "$LIBREELEC_ARCH" in
|
||||||
RPi*.arm)
|
RPi*.arm)
|
||||||
activate_card "ALSA"
|
activate_card "ALSA"
|
||||||
@ -49,9 +48,9 @@ if [ ! "$(cat /proc/asound/pcm 2> /dev/null)" ]; then
|
|||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$ls_o" in
|
case "$ls_o" in
|
||||||
*:CARD=*)
|
*:CARD=*)
|
||||||
card="${ls_o##*:CARD=}"
|
card="${ls_o##*:CARD=}"
|
||||||
card="${card%%,*}"
|
card="${card%%,*}"
|
||||||
@ -71,30 +70,48 @@ case "$ls_o" in
|
|||||||
echo "Unknown playback device specification $ls_o"
|
echo "Unknown playback device specification $ls_o"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ -n "$ls_b" -a "$ls_b" != "-" ]; then
|
case "$LIBREELEC_ARCH" in
|
||||||
bitrate="--bitrate $ls_b"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$ls_o" ]; then
|
|
||||||
device="--device $ls_o"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$ls_p" -a -n "$ls_u" ]; then
|
|
||||||
discovery="--disable-discovery --password $ls_p --username $ls_u"
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$LIBREELEC_ARCH" in
|
|
||||||
RPi*.arm)
|
RPi*.arm)
|
||||||
[ "$(readlink /proc/asound/ALSA)" == "card$index" ] && [ "$pcm_3" ] &&
|
[ "$(readlink /proc/asound/ALSA)" == "card$index" ] && [ "$pcm_3" ] &&
|
||||||
amixer -c "$index" cset name="PCM Playback Route" "$pcm_3"
|
amixer -c "$index" cset name="PCM Playback Route" "$pcm_3"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
librespot $bitrate \
|
|
||||||
--cache "$ADDON_HOME/cache" \
|
. /etc/profile
|
||||||
$device \
|
oe_setup_addon service.librespot
|
||||||
|
|
||||||
|
LIBRESPOT="librespot --cache \"$ADDON_HOME/cache\"
|
||||||
--disable-audio-cache \
|
--disable-audio-cache \
|
||||||
$discovery \
|
--name \"Librespot@$HOSTNAME\""
|
||||||
--name "Librespot@$HOSTNAME"
|
|
||||||
|
if [ -n "$ls_b" -a "$ls_b" != "-" ]; then
|
||||||
|
LIBRESPOT="$LIBRESPOT --bitrate $ls_b"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ls_p" -a -n "$ls_u" ]; then
|
||||||
|
LIBRESPOT="$LIBRESPOT --disable-discovery \
|
||||||
|
--password \"$ls_p\" \
|
||||||
|
--username \"$ls_u\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ls_O" == "Kodi" ]; then
|
||||||
|
LIBRESPOT="$LIBRESPOT --backend pipe \
|
||||||
|
--onstart=\"kodi-send \
|
||||||
|
--action=RunAddon(service.librespot)\" \
|
||||||
|
| ffmpegx -hide_banner -loglevel warning \
|
||||||
|
-avioflags direct -fflags nobuffer \
|
||||||
|
-re -ac 2 -ar 44100 -channel_layout stereo -f s16le -i pipe: \
|
||||||
|
-sdp_file \"$ADDON_HOME/librespot.sdp\" \
|
||||||
|
-f rtp rtp://127.0.0.1:5555"
|
||||||
|
else
|
||||||
|
init_alsa
|
||||||
|
if [ -n "$ls_o" ]; then
|
||||||
|
LIBRESPOT="$LIBRESPOT --device \"$ls_o\""
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval $LIBRESPOT
|
||||||
|
@ -16,20 +16,91 @@
|
|||||||
# along with LibreELEC. If not, see <http://www.gnu.org/licenses/>.
|
# along with LibreELEC. If not, see <http://www.gnu.org/licenses/>.
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
import alsaaudio as alsa
|
||||||
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import sys
|
||||||
import xbmc
|
import xbmc
|
||||||
import xbmcaddon
|
import xbmcaddon
|
||||||
|
import xbmcgui
|
||||||
|
|
||||||
|
|
||||||
|
ICON = xbmcaddon.Addon().getAddonInfo('icon')
|
||||||
|
ID = xbmcaddon.Addon().getAddonInfo('id')
|
||||||
|
NAME = xbmcaddon.Addon().getAddonInfo('name')
|
||||||
|
PROFILE = xbmcaddon.Addon().getAddonInfo('profile')
|
||||||
|
STRINGS = xbmcaddon.Addon().getLocalizedString
|
||||||
|
|
||||||
|
ITEM = os.path.join(PROFILE, 'librespot.sdp')
|
||||||
|
LISTITEM = xbmcgui.ListItem(NAME)
|
||||||
|
LISTITEM.setArt({'thumb': ICON})
|
||||||
|
|
||||||
|
|
||||||
|
def addon():
|
||||||
|
if len(sys.argv) == 1:
|
||||||
|
Player().play()
|
||||||
|
elif sys.argv[1] == 'wizard':
|
||||||
|
dialog = xbmcgui.Dialog()
|
||||||
|
while True:
|
||||||
|
pcms = alsa.pcms()[1:]
|
||||||
|
if len(pcms) == 0:
|
||||||
|
dialog.ok(NAME, STRINGS(30210))
|
||||||
|
break
|
||||||
|
pcmx = dialog.select(STRINGS(30112), pcms)
|
||||||
|
if pcmx == -1:
|
||||||
|
break
|
||||||
|
pcm = pcms[pcmx]
|
||||||
|
xbmcaddon.Addon().setSetting('ls_o', pcm)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
def systemctl(command):
|
||||||
|
subprocess.call(['systemctl', command, ID])
|
||||||
|
|
||||||
|
|
||||||
class Monitor(xbmc.Monitor):
|
class Monitor(xbmc.Monitor):
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
xbmc.Monitor.__init__(self)
|
super(Monitor, self).__init__(self)
|
||||||
self.id = xbmcaddon.Addon().getAddonInfo('id')
|
self.player = Player()
|
||||||
|
|
||||||
def onSettingsChanged(self):
|
def onSettingsChanged(self):
|
||||||
subprocess.call(['systemctl', 'restart', self.id])
|
self.player.stop()
|
||||||
|
|
||||||
|
|
||||||
|
class Player(xbmc.Player):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(Player, self).__init__(self)
|
||||||
|
if self.isPlaying():
|
||||||
|
self.onPlayBackStarted()
|
||||||
|
|
||||||
|
def onPlayBackEnded(self):
|
||||||
|
if not self.islibrespot:
|
||||||
|
xbmc.sleep(5000)
|
||||||
|
if not self.isPlaying():
|
||||||
|
systemctl('start')
|
||||||
|
|
||||||
|
def onPlayBackStarted(self):
|
||||||
|
if self.getPlayingFile() == ITEM:
|
||||||
|
self.islibrespot = True
|
||||||
|
else:
|
||||||
|
self.islibrespot = False
|
||||||
|
systemctl('stop')
|
||||||
|
|
||||||
|
def onPlayBackStopped(self):
|
||||||
|
systemctl('restart')
|
||||||
|
|
||||||
|
def play(self):
|
||||||
|
if not self.isPlaying():
|
||||||
|
super(Player, self).play(ITEM, LISTITEM)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
if self.isPlaying():
|
||||||
|
if self.getPlayingFile() == ITEM:
|
||||||
|
super(Player, self).stop()
|
||||||
|
else:
|
||||||
|
systemctl('restart')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
Monitor().waitForAbort()
|
Monitor().waitForAbort()
|
||||||
|
@ -4,69 +4,73 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30100"
|
msgctxt "#30100"
|
||||||
msgid "Configuration"
|
msgid "Librespot"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30101"
|
msgctxt "#30101"
|
||||||
msgid "ALSA"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30102"
|
|
||||||
msgid "Configuration wizard"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30103"
|
|
||||||
msgid "Playback device"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30104"
|
|
||||||
msgid "Playback route"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30105"
|
|
||||||
msgid "auto detect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30106"
|
|
||||||
msgid "headphone jack"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30107"
|
|
||||||
msgid "HDMI"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30108"
|
|
||||||
msgid "Spotify"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30109"
|
|
||||||
msgid "Username"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30110"
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30111"
|
|
||||||
msgid "Discovery mode (set username and password to disable)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "#30112"
|
|
||||||
msgid "Bit rate"
|
msgid "Bit rate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30113"
|
msgctxt "#30102"
|
||||||
msgid "-"
|
msgid "-"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30114"
|
msgctxt "#30103"
|
||||||
msgid "90"
|
msgid "96"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30115"
|
msgctxt "#30104"
|
||||||
msgid "160"
|
msgid "160"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#30116"
|
msgctxt "#30105"
|
||||||
msgid "320"
|
msgid "320"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30106"
|
||||||
|
msgid "Output"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30107"
|
||||||
|
msgid "Username"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30108"
|
||||||
|
msgid "Password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30109"
|
||||||
|
msgid "Discovery mode (set username and password to disable)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30110"
|
||||||
|
msgid "ALSA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30111"
|
||||||
|
msgid "Configuration wizard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30112"
|
||||||
|
msgid "Playback device"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30113"
|
||||||
|
msgid "Playback route"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30114"
|
||||||
|
msgid "auto detect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30115"
|
||||||
|
msgid "headphone jack"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30116"
|
||||||
|
msgid "HDMI"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#30210"
|
||||||
|
msgid "Could not find a playback device"
|
||||||
|
msgstr ""
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
<settings>
|
<settings>
|
||||||
<category label="30100" >
|
<category label="30100" >
|
||||||
<setting label="30101" type="lsep" />
|
<setting label="30101" type="labelenum" id="ls_b" lvalues="30102|30103|30104|30105" />
|
||||||
<setting label="30102" type="action" action="RunScript(/storage/.kodi/addons/service.librespot/wizard/wizard.py)" />
|
<setting label="30106" type="labelenum" id="ls_O" lvalues="ALSA|Kodi" />
|
||||||
<setting label="30103" type="text" id="ls_o" default="" />
|
<setting label="30107" type="text" id="ls_u" />
|
||||||
<setting label="30104" type="enum" id="pcm_3" lvalues="30105|30106|30107" visible="eq(-1,default:CARD=ALSA)|eq(-1,sysdefault:CARD=ALSA)" />
|
<setting label="30108" type="text" id="ls_p" option="hidden" visible="!eq(-1,)" />
|
||||||
<setting label="30108" type="lsep" />
|
<setting label="30109" type="bool" id="ls_d" default="true" enable="false" visible="eq(-1,)|eq(-2,)" />
|
||||||
<setting label="30109" type="text" id="ls_u" />
|
<setting label="30109" type="bool" id="ls_D" default="false" enable="false" visible="!eq(-2,)+!eq(-3,)" />
|
||||||
<setting label="30110" type="text" id="ls_p" option="hidden" visible="!eq(-1,)" />
|
</category>
|
||||||
<setting label="30111" type="bool" id="ls_d" default="true" enable="false" visible="eq(-1,)|eq(-2,)" />
|
<category label="30110" >
|
||||||
<setting label="30112" type="labelenum" id="ls_b" lvalues="30113|30114|30115|30116" />
|
<setting label="30106" type="labelenum" id="ls_O" lvalues="ALSA|Kodi" visible="false" />
|
||||||
|
<setting label="30111" type="action" action="RunAddon(service.librespot,wizard)" enable="eq(-1,0)" />
|
||||||
|
<setting label="30112" type="text" id="ls_o" default="" enable="eq(-2,0)" />
|
||||||
|
<setting label="30113" type="enum" id="pcm_3" lvalues="30114|30115|30116" enable="eq(-3,0)" visible="eq(-1,default:CARD=ALSA)|eq(-1,sysdefault:CARD=ALSA)" />
|
||||||
</category>
|
</category>
|
||||||
</settings>
|
</settings>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user