diff --git a/packages/addons/service/librespot/changelog.txt b/packages/addons/service/librespot/changelog.txt index fc23063611..cd46510b0c 100644 --- a/packages/addons/service/librespot/changelog.txt +++ b/packages/addons/service/librespot/changelog.txt @@ -1,3 +1,9 @@ +109 +- Refer librespot-org repository +- Update to bc7ceb3 +- Set stream type to audio in Kodi mode +- Initial volume as a setting + 108 - Correct bug which prevented disabling the service from Kodi - Place named pipe in /var/run/librespot diff --git a/packages/addons/service/librespot/package.mk b/packages/addons/service/librespot/package.mk index fe498ce23c..d452a834d3 100644 --- a/packages/addons/service/librespot/package.mk +++ b/packages/addons/service/librespot/package.mk @@ -18,12 +18,12 @@ ################################################################################ PKG_NAME="librespot" -PKG_VERSION="ddfc28f" -PKG_REV="108" +PKG_VERSION="bc7ceb3" +PKG_REV="109" PKG_ARCH="any" PKG_LICENSE="MIT" -PKG_SITE="https://github.com/plietar/$PKG_NAME/" -PKG_URL="https://github.com/plietar/$PKG_NAME/archive/$PKG_VERSION.zip" +PKG_SITE="https://github.com/librespot-org/$PKG_NAME/" +PKG_URL="https://github.com/librespot-org/$PKG_NAME/archive/$PKG_VERSION.zip" PKG_DEPENDS_TARGET="toolchain avahi libvorbis pulseaudio pyalsaaudio rust" PKG_SECTION="service" PKG_SHORTDESC="Librespot: play Spotify through LibreELEC using a Spotify app as a remote" diff --git a/packages/addons/service/librespot/patches/librespot-01_dns_sd.patch b/packages/addons/service/librespot/patches/librespot-01_dns_sd.patch index 670493cddf..94b28742c7 100644 --- a/packages/addons/service/librespot/patches/librespot-01_dns_sd.patch +++ b/packages/addons/service/librespot/patches/librespot-01_dns_sd.patch @@ -1,63 +1,78 @@ -From b0d70bed1d5f3614f0e966c53c3a4898c7b33918 Mon Sep 17 00:00:00 2001 +From 1bfecca0614ab3426df349fed41652692b8a7863 Mon Sep 17 00:00:00 2001 From: awiouy -Date: Mon, 4 Sep 2017 23:01:38 +0200 +Date: Fri, 26 Jan 2018 19:35:21 +0100 Subject: [PATCH] use dns-sd instead of mdns for discovery --- - Cargo.lock | 19 +++++-------------- + Cargo.lock | 29 ++++++++++------------------- Cargo.toml | 2 +- src/discovery.rs | 19 ++++++++++--------- src/lib.rs | 2 +- - 4 files changed, 17 insertions(+), 25 deletions(-) + 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock -index d8128db..5f54617 100644 +index 1bee811..7f6c2bc 100644 --- a/Cargo.lock +++ b/Cargo.lock -@@ -277,7 +277,7 @@ dependencies = [ - "librespot-metadata 0.1.0", - "librespot-protocol 0.1.0", - "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -- "mdns 0.2.0 (git+https://github.com/plietar/rust-mdns)", -+ "dns-sd 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "portaudio-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", -@@ -386,20 +386,12 @@ version = "0.1.6" - source = "registry+https://github.com/rust-lang/crates.io-index" +@@ -106,6 +106,15 @@ dependencies = [ + "quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + ] - [[package]] --name = "mdns" --version = "0.2.0" --source = "git+https://github.com/plietar/rust-mdns#c0fc73502d7d752a4ffeb5268a017561405e218c" ++[[package]] +name = "dns-sd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ -- "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -- "dns-parser 0.3.2 (git+https://github.com/plietar/dns-parser)", -- "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", -- "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -- "multimap 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -- "net2 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)", -- "nix 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", -- "rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", -- "tokio-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ++dependencies = [ ++ "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - ] - ++] ++ [[package]] -@@ -1099,7 +1091,6 @@ dependencies = [ - "checksum magenta 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf0336886480e671965f794bc9b6fce88503563013d1bfb7a502c81fe3ac527" - "checksum magenta-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40d014c7011ac470ae28e2f76a02bfea4a8480f73e701353b49ad7a8d75f4699" + name = "dtoa" + version = "0.4.2" +@@ -283,7 +292,7 @@ dependencies = [ + "librespot-metadata 0.1.0", + "librespot-protocol 0.1.0", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +- "mdns 0.2.0 (git+https://github.com/plietar/rust-mdns)", ++ "dns-sd 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "portaudio-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", +@@ -395,23 +404,6 @@ name = "matches" + version = "0.1.6" + source = "registry+https://github.com/rust-lang/crates.io-index" + +-[[package]] +-name = "mdns" +-version = "0.2.0" +-source = "git+https://github.com/plietar/rust-mdns#c0fc73502d7d752a4ffeb5268a017561405e218c" +-dependencies = [ +- "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +- "dns-parser 0.3.2 (git+https://github.com/plietar/dns-parser)", +- "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", +- "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +- "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +- "multimap 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +- "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", +- "nix 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", +- "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", +- "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +-] +- + [[package]] + name = "memchr" + version = "2.0.1" +@@ -1134,7 +1126,6 @@ dependencies = [ + "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" + "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" -"checksum mdns 0.2.0 (git+https://github.com/plietar/rust-mdns)" = "" - "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" - "checksum mime 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c5ca99d8a021c1687882fd68dca26e601ceff5c26571c7cb41cf4ed60d57cb2d" - "checksum mio 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "dbd91d3bfbceb13897065e97b2ef177a09a438cb33612b2d371bf568819a9313" + "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" + "checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd" + "checksum mio 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "75f72a93f046f1517e3cfddc0a096eb756a2ba727d36edc8227dee769a50a9b0" diff --git a/Cargo.toml b/Cargo.toml -index f4e6349..131e4f3 100644 +index 277e149..96dd02d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ futures = "0.1.8" @@ -70,39 +85,39 @@ index f4e6349..131e4f3 100644 protobuf = "1.1" rand = "0.3.13" diff --git a/src/discovery.rs b/src/discovery.rs -index 3eaa5f0..6f9a4ae 100644 +index fc168d5..55472f3 100644 --- a/src/discovery.rs +++ b/src/discovery.rs @@ -6,7 +6,7 @@ use futures::sync::mpsc; - use futures::{Future, Stream, BoxFuture, Poll, Async}; - use hyper::server::{Service, NewService, Request, Response, Http}; + use futures::{Future, Stream, Poll}; + use hyper::server::{Service, Request, Response, Http}; use hyper::{self, Get, Post, StatusCode}; -use mdns; +use dns_sd::DNSService; use num_bigint::BigUint; use rand; use std::collections::BTreeMap; -@@ -203,7 +203,7 @@ impl NewService for Discovery { +@@ -191,7 +191,7 @@ impl Service for Discovery { pub struct DiscoveryStream { credentials: mpsc::UnboundedReceiver, - _svc: mdns::Service, + _svc: DNSService, - task: Box>, } -@@ -213,7 +213,7 @@ pub fn discovery(handle: &Handle, config: ConnectConfig, device_id: String) - let (discovery, creds_rx) = Discovery::new(config.clone(), device_id); - - let listener = TcpListener::bind(&"0.0.0.0:0".parse().unwrap(), handle)?; -- let addr = listener.local_addr()?; -+ let port = listener.local_addr().unwrap().port(); - - let http = Http::new(); - let handle_ = handle.clone(); -@@ -222,12 +222,13 @@ pub fn discovery(handle: &Handle, config: ConnectConfig, device_id: String) - Ok(()) - })); + pub fn discovery(handle: &Handle, config: ConnectConfig, device_id: String) +@@ -203,7 +203,7 @@ pub fn discovery(handle: &Handle, config: ConnectConfig, device_id: String) + let http = Http::new(); + http.serve_addr_handle(&"0.0.0.0:0".parse().unwrap(), &handle, move || Ok(discovery.clone())).unwrap() + }; +- let addr = serve.incoming_ref().local_addr(); ++ let port = serve.incoming_ref().local_addr().port(); + let server_future = { + let handle = handle.clone(); + serve.for_each(move |connection| { +@@ -214,12 +214,13 @@ pub fn discovery(handle: &Handle, config: ConnectConfig, device_id: String) + }; + handle.spawn(server_future); - let responder = mdns::Responder::spawn(&handle)?; - let svc = responder.register( @@ -121,10 +136,10 @@ index 3eaa5f0..6f9a4ae 100644 Ok(DiscoveryStream { credentials: creds_rx, diff --git a/src/lib.rs b/src/lib.rs -index b9c920e..dfaf5a2 100644 +index 53257a8..0f8910a 100644 --- a/src/lib.rs +++ b/src/lib.rs -@@ -13,7 +13,7 @@ extern crate base64; +@@ -10,7 +10,7 @@ extern crate base64; extern crate crypto; extern crate futures; extern crate hyper; diff --git a/packages/addons/service/librespot/patches/librespot-02_kodi_hooks.patch b/packages/addons/service/librespot/patches/librespot-02_kodi_hooks.patch index 2512ca5eb6..18716f1716 100644 --- a/packages/addons/service/librespot/patches/librespot-02_kodi_hooks.patch +++ b/packages/addons/service/librespot/patches/librespot-02_kodi_hooks.patch @@ -1,6 +1,6 @@ -From a20f55c268bf44d6923be4cad6c6fdfecfc5dd8a Mon Sep 17 00:00:00 2001 +From 2f4e4d6efa8b80a5bcfda697b5353d4edaf99e20 Mon Sep 17 00:00:00 2001 From: awiouy -Date: Tue, 12 Sep 2017 09:37:53 +0200 +Date: Fri, 26 Jan 2018 21:02:29 +0100 Subject: [PATCH] kodi hooks --- @@ -8,7 +8,7 @@ Subject: [PATCH] kodi hooks 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/player.rs b/src/player.rs -index 29380e3..44b9a24 100644 +index 94df2e1..6595220 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,6 +1,7 @@ @@ -17,9 +17,9 @@ index 29380e3..44b9a24 100644 use std::borrow::Cow; +use std::env; use std::mem; - use std::sync::mpsc::{RecvError, TryRecvError}; + use std::sync::mpsc::{RecvError, TryRecvError, RecvTimeoutError}; use std::thread; -@@ -13,7 +14,7 @@ use core::util::{self, SpotifyId, Subfile}; +@@ -14,7 +15,7 @@ use core::util::{self, SpotifyId, Subfile}; use audio_backend::Sink; use audio::{AudioFile, AudioDecrypt}; use audio::{VorbisDecoder, VorbisPacket}; @@ -27,17 +27,17 @@ index 29380e3..44b9a24 100644 +use metadata::{Artist, FileFormat, Track, Metadata}; use mixer::AudioFilter; - #[derive(Clone)] -@@ -215,7 +216,7 @@ impl PlayerInternal { + pub struct Player { +@@ -272,7 +273,7 @@ impl PlayerInternal { None => { - self.sink.stop().unwrap(); + self.stop_sink(); - self.run_onstop(); + info!("onstop 1"); let old_state = mem::replace(&mut self.state, PlayerState::Stopped); old_state.signal_end_of_track(); -@@ -227,6 +228,12 @@ impl PlayerInternal { +@@ -284,6 +285,12 @@ impl PlayerInternal { debug!("command={:?}", cmd); match cmd { PlayerCommand::Load(track_id, play, position, end_of_track) => { @@ -48,18 +48,18 @@ index 29380e3..44b9a24 100644 + self.run_onstart(); + if self.state.is_playing() { - self.sink.stop().unwrap(); + self.stop_sink_if_running(); } -@@ -235,7 +242,7 @@ impl PlayerInternal { +@@ -292,7 +299,7 @@ impl PlayerInternal { Some(decoder) => { if play { if !self.state.is_playing() { - self.run_onstart(); + info!("onstart 1"); } - self.sink.start().unwrap(); + self.start_sink(); -@@ -245,7 +252,7 @@ impl PlayerInternal { +@@ -302,7 +309,7 @@ impl PlayerInternal { }; } else { if self.state.is_playing() { @@ -68,7 +68,7 @@ index 29380e3..44b9a24 100644 } self.state = PlayerState::Paused { -@@ -258,7 +265,7 @@ impl PlayerInternal { +@@ -315,7 +322,7 @@ impl PlayerInternal { None => { end_of_track.complete(()); if self.state.is_playing() { @@ -77,19 +77,19 @@ index 29380e3..44b9a24 100644 } } } -@@ -279,7 +286,7 @@ impl PlayerInternal { +@@ -336,7 +343,7 @@ impl PlayerInternal { if let PlayerState::Paused { .. } = self.state { self.state.paused_to_playing(); - self.run_onstart(); + info!("onstart 2"); - self.sink.start().unwrap(); + self.start_sink(); } else { warn!("Player::play called from invalid state"); -@@ -291,17 +298,19 @@ impl PlayerInternal { +@@ -348,17 +355,19 @@ impl PlayerInternal { self.state.playing_to_paused(); - self.sink.stop().unwrap(); + self.stop_sink_if_running(); - self.run_onstop(); + info!("onstop 4"); } else { @@ -102,7 +102,7 @@ index 29380e3..44b9a24 100644 + match self.state { PlayerState::Playing { .. } => { - self.sink.stop().unwrap(); + self.stop_sink_if_running(); - self.run_onstop(); + info!("onstop 5"); self.state = PlayerState::Stopped; diff --git a/packages/addons/service/librespot/patches/librespot-03_pulseaudio_sink.patch b/packages/addons/service/librespot/patches/librespot-03_pulseaudio_sink.patch index 7596eb776d..e50b646926 100644 --- a/packages/addons/service/librespot/patches/librespot-03_pulseaudio_sink.patch +++ b/packages/addons/service/librespot/patches/librespot-03_pulseaudio_sink.patch @@ -1,6 +1,6 @@ -From e9bb269936ea26b1c0c698b8d05aaf68e2e79bcc Mon Sep 17 00:00:00 2001 +From 3e51e00e717f80f7c23ed112e6ab42d1a61cb7a9 Mon Sep 17 00:00:00 2001 From: awiouy -Date: Tue, 12 Sep 2017 09:41:14 +0200 +Date: Fri, 26 Jan 2018 21:07:48 +0100 Subject: [PATCH] use librespot_sink pulseadio sink --- @@ -8,21 +8,22 @@ Subject: [PATCH] use librespot_sink pulseadio sink 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/audio_backend/pulseaudio.rs b/src/audio_backend/pulseaudio.rs -index 3b9a09b..ce78062 100644 +index e9f0039..d5c2bbb 100644 --- a/src/audio_backend/pulseaudio.rs +++ b/src/audio_backend/pulseaudio.rs -@@ -23,12 +23,13 @@ impl Open for PulseAudioSink { - - let name = CString::new("librespot").unwrap(); - let description = CString::new("A spoty client library").unwrap(); -+ let sink = CString::new("librespot_sink").unwrap(); +@@ -75,13 +75,14 @@ impl Open for PulseAudioSink { - let s = unsafe { - pa_simple_new(null(), // Use the default server. - name.as_ptr(), // Our application's name. - PA_STREAM_PLAYBACK, -- null(), // Use the default device. -+ sink.as_ptr(), // Our sink. - description.as_ptr(), // Description of our stream. - &ss, // Our sample format. - null(), // Use default channel map + impl Sink for PulseAudioSink { + fn start(&mut self) -> io::Result<()> { ++ let sink = CString::new("librespot_sink").unwrap(); + if self.s == null_mut() { + self.s = call_pulseaudio( + |err| unsafe { + pa_simple_new(null(), // Use the default server. + self.name.as_ptr(), // Our application's name. + PA_STREAM_PLAYBACK, +- null(), // Use the default device. ++ sink.as_ptr(), // Our sink. + self.desc.as_ptr(), // desc of our stream. + &self.ss, // Our sample format. + null(), // Use default channel map diff --git a/packages/addons/service/librespot/source/addon.py b/packages/addons/service/librespot/source/addon.py index d7a59a1187..ccd6fc7402 100644 --- a/packages/addons/service/librespot/source/addon.py +++ b/packages/addons/service/librespot/source/addon.py @@ -28,7 +28,7 @@ while True: if len(pcms) == 0: dialog.ok(xbmcaddon.Addon().getAddonInfo('name'), strings(30210)) break - pcmx = dialog.select(strings(30112), pcms) + pcmx = dialog.select(strings(30115), pcms) if pcmx == -1: break pcm = pcms[pcmx] diff --git a/packages/addons/service/librespot/source/bin/librespot.start b/packages/addons/service/librespot/source/bin/librespot.start index edc8b701f5..2ec9cd7fd0 100755 --- a/packages/addons/service/librespot/source/bin/librespot.start +++ b/packages/addons/service/librespot/source/bin/librespot.start @@ -86,6 +86,7 @@ oe_setup_addon service.librespot LIBRESPOT="librespot --cache \"$ADDON_HOME/cache\" \ --disable-audio-cache \ + --initial-volume "$ls_v" \ --name \"Librespot@$HOSTNAME\" \ --onstart librespot.onstart \ --onstop librespot.onstop" diff --git a/packages/addons/service/librespot/source/default.py b/packages/addons/service/librespot/source/default.py index fd044fd7d1..4125273a6a 100644 --- a/packages/addons/service/librespot/source/default.py +++ b/packages/addons/service/librespot/source/default.py @@ -103,6 +103,7 @@ class Player(xbmc.Player): if not self.isPlaying() and xbmcaddon.Addon().getSetting('ls_O') == 'Kodi': suspendSink('0') listitem = xbmcgui.ListItem(xbmcaddon.Addon().getAddonInfo('name')) + listitem.addStreamInfo('audio',{'codec': 'mp3'}) listitem.setArt({'thumb': xbmcaddon.Addon().getAddonInfo('icon')}) super(Player, self).play(self.ITEM, listitem) del listitem diff --git a/packages/addons/service/librespot/source/resources/language/English/strings.po b/packages/addons/service/librespot/source/resources/language/English/strings.po index 3b62e23c88..6ab58f6669 100644 --- a/packages/addons/service/librespot/source/resources/language/English/strings.po +++ b/packages/addons/service/librespot/source/resources/language/English/strings.po @@ -8,66 +8,78 @@ msgid "Librespot" msgstr "" msgctxt "#30101" -msgid "Bit rate" +msgid "Initial volume" msgstr "" msgctxt "#30102" -msgid "-" +msgid "Bit rate" msgstr "" msgctxt "#30103" -msgid "96" +msgid "-" msgstr "" msgctxt "#30104" -msgid "160" +msgid "96" msgstr "" msgctxt "#30105" -msgid "320" +msgid "160" msgstr "" msgctxt "#30106" -msgid "Output" +msgid "320" msgstr "" msgctxt "#30107" -msgid "Username" +msgid "Output" msgstr "" msgctxt "#30108" -msgid "Password" -msgstr "" - -msgctxt "#30109" -msgid "Discovery mode (set username and password to disable)" -msgstr "" - -msgctxt "#30110" msgid "ALSA" msgstr "" +msgctxt "#30109" +msgid "Kodi" +msgstr "" + +msgctxt "#30110" +msgid "Username" +msgstr "" + msgctxt "#30111" -msgid "Configuration wizard" +msgid "Password" msgstr "" msgctxt "#30112" -msgid "Playback device" +msgid "Discovery mode (set username and password to disable)" msgstr "" msgctxt "#30113" -msgid "Playback route" +msgid "ALSA" msgstr "" msgctxt "#30114" -msgid "auto detect" +msgid "Configuration wizard" msgstr "" msgctxt "#30115" -msgid "headphone jack" +msgid "Playback device" msgstr "" msgctxt "#30116" +msgid "Playback route" +msgstr "" + +msgctxt "#30117" +msgid "auto detect" +msgstr "" + +msgctxt "#30118" +msgid "headphone jack" +msgstr "" + +msgctxt "#30119" msgid "HDMI" msgstr "" diff --git a/packages/addons/service/librespot/source/resources/settings.xml b/packages/addons/service/librespot/source/resources/settings.xml index 46264902af..2c0666c358 100644 --- a/packages/addons/service/librespot/source/resources/settings.xml +++ b/packages/addons/service/librespot/source/resources/settings.xml @@ -1,17 +1,18 @@ - - - - - - + + + + + + + - - - - - + + + + + diff --git a/packages/addons/service/librespot/source/settings-default.xml b/packages/addons/service/librespot/source/settings-default.xml new file mode 100644 index 0000000000..b0d077dec2 --- /dev/null +++ b/packages/addons/service/librespot/source/settings-default.xml @@ -0,0 +1,11 @@ + + + + + + + + + + +