diff --git a/com.bubblesoft.android.bubbleupnp_log.txt b/com.bubblesoft.android.bubbleupnp_log.txt deleted file mode 100644 index 2e011821..00000000 --- a/com.bubblesoft.android.bubbleupnp_log.txt +++ /dev/null @@ -1,2806 +0,0 @@ -[main (2) ] INFO - 0:00:00.84 - enableLogToFile: opened /storage/emulated/0/Download/com.bubblesoft.android.bubbleupnp_log.txt -[main (2) ] INFO - 0:00:00.84 - enableLogToFile: logging to file is enabled in 80 ms -[main (2) ] INFO - 0:00:00.87 - system locale: fr_FR -[main (2) ] INFO - 0:00:00.88 - app locale: fr_FR -[main (2) ] INFO - 0:00:00.88 - os.arch: aarch64 -[main (2) ] INFO - 0:00:00.88 - API level: 36 -[main (2) ] INFO - 0:00:00.88 - manufacturer: samsung -[main (2) ] INFO - 0:00:00.88 - model: SM-A536B -[main (2) ] INFO - 0:00:00.88 - product: a53xnaeea -[main (2) ] INFO - 0:00:00.89 - fingerprint: samsung/a53xnaeea/a53x:16/BP2A.250605.031.A3/A536BXXSHGYJ3:user/release-keys -[main (2) ] INFO - 0:00:00.89 - debuggable: false -[main (2) ] INFO - 0:00:00.89 - installed on external storage: false -[main (2) ] INFO - 0:00:00.91 - touch supported: true -[main (2) ] INFO - 0:00:00.92 - gestural navigation: true -[main (2) ] INFO - 0:00:00.93 - large memory class: 512 -[main (2) ] INFO - 0:00:00.94 - isSustainedPerformanceModeSupported: false -[main (2) ] INFO - 0:00:00.94 - SUPPORTED_ABIS: arm64-v8a,armeabi-v7a,armeabi -[main (2) ] INFO - 0:00:00.94 - app: version: 4.6.1, code: 3000911 -[main (2) ] INFO - 0:00:00.95 - app standby bucket: EXEMPTED -[main (2) ] INFO - 0:00:00.96 - isBackgroundRestricted: false -[main (2) ] INFO - 0:00:00.96 - xposed running: false -[main (2) ] INFO - 0:00:00.98 - isDevMode: true -[main (2) ] INFO - 0:00:00.110 - app info: true false false true true true 0 -[main (2) ] INFO - 0:00:00.120 - watchdog: set inactivity delay to 15 mins -[main (2) ] INFO - 0:00:00.121 - useScopedStorage: true -[main (2) ] INFO - 0:00:00.121 - created file: file:///storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/cache/bubbleupnpserver/.nomedia -[main (2) ] INFO - 0:00:00.122 - getLocalRendererRemoteControlVideoApp: no package name -[main (2) ] INFO - 0:00:00.143 - isReadExternalStorageGranted: true -[main (2) ] INFO - 0:00:00.143 - isWriteExternalStorageGranted: true -[main (2) ] INFO - 0:00:00.144 - dynamic theming: called AppCompatDelegate.setDefaultNightMode(-1) -[main (2) ] INFO - 0:00:00.144 - App.onCreate() took: 145 ms -[main (2) ] INFO - 0:00:00.146 - StrictMode (JB): LAX -[main (2) ] INFO - 0:00:00.156 - attachBaseContext(base)@9e5576d:-1 -[main (2) ] INFO - 0:00:00.167 - onCreate(): Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 xflg=0x4 cmp=com.bubblesoft.android.bubbleupnp/.MainActivity bnds=[841,188][1041,472] }@9e5576d:5237 -[main (2) ] INFO - 0:00:00.167 - Referrer: android-app://com.sec.android.app.launcher -[main (2) ] INFO - 0:00:00.207 - attachBaseContext(base)@2e41698:-1 -[main (2) ] INFO - 0:00:00.209 - dynamic theming: isDynamicColorAvailable: true, isRuntimeColorThemeGenAvailable: true -[main (2) ] INFO - 0:00:00.209 - dynamic theming: theme mode: 0 -[main (2) ] INFO - 0:00:00.210 - dynamic theming: theme overlay applied -[main (2) ] INFO - 0:00:00.210 - dynamic theming: dark theme: false -[main (2) ] INFO - 0:00:00.210 - dynamic theming: dialogs elevation overlay enabled: true -[main (2) ] INFO - 0:00:00.213 - dynamic theming: applied color harmonization -[main (2) ] INFO - 0:00:00.215 - dynamic theming: initDynamicTheming took: 6 ms -[main (2) ] INFO - 0:00:00.222 - onCreate(): Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 xflg=0x4 cmp=com.bubblesoft.android.bubbleupnp/.MainTabActivity bnds=[841,188][1041,472] }@2e41698:5237 -[main (2) ] INFO - 0:00:00.227 - dynamic theming: colorPrimary: #ff475d92 -[main (2) ] INFO - 0:00:00.227 - dynamic theming: android:windowBackground: #fffaf8ff -[main (2) ] INFO - 0:00:00.228 - dynamic theming: android:colorbackground: #fffaf8ff -[main (2) ] INFO - 0:00:00.229 - startAndBindServiceWithRetry: retryOnFailure true -[Main #1 (179) ] INFO - 0:00:00.293 - task: start: getSearchableInfo -[Main #1 (179) ] INFO - 0:00:00.294 - task: end, 1ms: getSearchableInfo -[main (2) ] INFO - 0:00:00.299 - remote config: FirebaseApp: true -[main (2) ] INFO - 0:00:00.303 - MainTabActivity.onCreate() took: 94 ms -[main (2) ] INFO - 0:00:00.304 - onStart()@2e41698:5237 -[main (2) ] INFO - 0:00:00.307 - onPostCreate()@2e41698:5237 -[main (2) ] INFO - 0:00:00.307 - startup page index: 0 -[main (2) ] INFO - 0:00:00.308 - onResume()@2e41698:5237 -[main (2) ] INFO - 0:00:00.330 - Insets: Insets{left=0, top=88, right=0, bottom=45} -[main (2) ] INFO - 0:00:00.359 - onAttach()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.360 - onCreate()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.361 - onCreateView()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.378 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:00.378 - tidal: cache folder: /data/user/0/com.bubblesoft.android.bubbleupnp/cache -[main (2) ] INFO - 0:00:00.379 - qobuz: username: set -[main (2) ] INFO - 0:00:00.379 - qobuz: cache folder: /data/user/0/com.bubblesoft.android.bubbleupnp/cache -[main (2) ] INFO - 0:00:00.379 - NowPlayingFragment.onCreateView() took: 19 ms -[main (2) ] INFO - 0:00:00.380 - onActivityCreated()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.381 - onStart()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.382 - onResume()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.384 - onAttach()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:00:00.385 - onCreate()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:00:00.385 - onCreateView()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:00:00.394 - PlaylistFragment.onCreateView() took: 9 ms -[main (2) ] INFO - 0:00:00.395 - onActivityCreated()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:00:00.395 - onStart()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:00:00.404 - onAttach()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:00.404 - onCreate()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:00.405 - onCreateView()@ec98be8/2e41698:5237 -[Main #1 (179) ] INFO - 0:00:00.426 - task: start: getSearchableInfo -[main (2) ] INFO - 0:00:00.426 - LibraryFragment.onCreateView() took: 21 ms -[Main #1 (179) ] INFO - 0:00:00.427 - task: end, 1ms: getSearchableInfo -[main (2) ] INFO - 0:00:00.427 - onActivityCreated()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:00.427 - onStart()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:00.430 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:00.464 - display: screen generalized size: normal -[main (2) ] INFO - 0:00:00.464 - display: screen generalized density: 480 dpi -[main (2) ] INFO - 0:00:00.465 - display: logical density factor: 3.000000 -[main (2) ] INFO - 0:00:00.465 - display: screen size (pixels, Display.getSize()): 1080x2400 -[main (2) ] INFO - 0:00:00.465 - display: screen size (pixels, displayMetrics): 1080x2400 -[main (2) ] INFO - 0:00:00.465 - display: screen size (dp): 360x800 -[main (2) ] INFO - 0:00:00.465 - display: screen size (conf: screenWidthDp x screenHeightDp) (dp): 360x800 -[main (2) ] INFO - 0:00:00.465 - display: smallest width (dp): 360 -[main (2) ] INFO - 0:00:00.465 - display: screen size (inches): 2.637801x5.905512, diagonal: 6.467848 -[main (2) ] INFO - 0:00:00.465 - display: screen size aspect ratio (h/w): 2.222222 -[main (2) ] INFO - 0:00:00.465 - display: isTallActivity: true -[main (2) ] INFO - 0:00:00.466 - display: isInMultiWindowMode: false -[main (2) ] INFO - 0:00:00.466 - display: xdpi: 409.432007 -[main (2) ] INFO - 0:00:00.466 - display: ydpi: 406.399994 -[main (2) ] INFO - 0:00:00.466 - display: landscape: false -[main (2) ] INFO - 0:00:00.466 - display: isPhoneSize: true -[main (2) ] INFO - 0:00:00.466 - display: E2E35.isEnforced: true -[main (2) ] INFO - 0:00:00.466 - onCreate -[main (2) ] INFO - 0:00:00.473 - doStartForeground: calling startForeground(), fromOnStartCommand: false, serviceType: 2 -[main (2) ] INFO - 0:00:00.484 - isCustomNotificationExitButtonSupported: true -[main (2) ] WARNING - 0:00:00.492 - failed to set FFmpeg executable -[main (2) ] INFO - 0:00:00.496 - ffmpeg process started, timeout: 0s: -version -[main (2) ] INFO - 0:00:00.682 - runFFMPEG: finished ffmpeg process took: 190 ms -[main (2) ] INFO - 0:00:00.682 - runFFMPEG: written 2136 bytes -[main (2) ] INFO - 0:00:00.683 - ffmpeg version N-118170-g7e778586e7-bubblesoftapps.com Copyright (c) 2000-2024 the FFmpeg developers -built with Android (6875598, based on r399163b) clang version 11.0.5 (https://android.googlesource.com/toolchain/llvm-project 87f1315dfbea7c137aa2e6d362dbb457e388158d) -configuration: --target-os=android --cross-prefix=/home/bobbie/ffmpeg-android/toolchain-android/bin/aarch64-linux-android- --arch=aarch64 --cpu=armv8-a --sysroot=/home/bobbie/ffmpeg-android/toolchain-android/sysroot --pkg-config=/home/bobbie/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/bobbie/ffmpeg-android/build/arm64-v8a --extra-cflags='-I/home/bobbie/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all -fPIE -fPIC' --extra-ldflags='-Wl,-z,max-page-size=16384 -fuse-ld=gold -L/home/bobbie/ffmpeg-android/toolchain-android/lib64 -L/home/bobbie/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie -Wl,--fix-cortex-a8 -Wl,-z,max-page-size=16384' --extra-libs='-lhogweed -lnettle -lgmp -lvorbis -logg -lm -lz' --extra-cxxflags= --extra-version=bubblesoftapps.com --disable-shared --disable-debug --disable-programs --disable-doc --disable-avdevice --disable-postproc --disable-protocols --disable-protocol='rtp,udp' --disable-encoders --disable-filters --disable-libv4l2 --enable-gpl --enable-version3 --enable-pic --enable-static --enable-ffmpeg --enable-libxml2 --enable-gnutls --enable-protocol='fd,http,https,pipe,crypto,file' --enable-encoder='aac,libmp3lame,libopus,ac3,eac3,pcm_s16le,pcm_s16be,pcm_s24le,pcm_s24be,flac,libvorbis,mjpeg,libx264,srt,wrapped_avframe,h264_mediacodec,png,pcm_s32le,pcm_s32be' --enable-filter='aresample,volume,afir,replaygain,scale,setsar,setdar' --enable-demuxer=dash --enable-libmp3lame --enable-libopus --enable-libsoxr --enable-libvorbis --enable-libx264 --enable-jni --enable-mediacodec --enable-hwaccels -libavutil 59. 53.100 / 59. 53.100 -libavcodec 61. 28.100 / 61. 28.100 -libavformat 61. 9.101 / 61. 9.101 -libavfilter 10. 6.101 / 10. 6.101 -libswscale 8. 13.100 / 8. 13.100 -libswresample 5. 4.100 / 5. 4.100 - -[main (2) ] INFO - 0:00:00.683 - FFmpeg executable: /data/app/~~rP3Ghg18CfximalIH4RRoQ==/com.bubblesoft.android.bubbleupnp-vax1mni2sS4Ql7kqL8ugMA==/lib/arm64/libffmpeg.so -[main (2) ] INFO - 0:00:00.684 - renderer chooser target: loaded 1 targets -[Main #1 (179) ] INFO - 0:00:00.684 - task: start: publishRendererChooserTargets -[main (2) ] INFO - 0:00:00.687 - created Apache HttpClient -[Main #1 (179) ] INFO - 0:00:00.697 - task: end, 13ms: publishRendererChooserTargets -[Main #1 (179) ] INFO - 0:00:00.700 - task: start: DownloadManager -[Main #1: DownloadManager (179) ] INFO - 0:00:00.700 - waiting for download requests... -[main (2) ] INFO - 0:00:00.701 - .d : default UPnP action timeout: 30s -[main (2) ] INFO - 0:00:00.701 - StreamRequestMessage short connect timeout: 1000 -[main (2) ] INFO - 0:00:00.702 - .d : >>> Starting UPnP service... -[main (2) ] INFO - 0:00:00.703 - .d : Using configuration: com.bubblesoft.android.bubbleupnp.AndroidUpnpService$u0 -[main (2) ] INFO - 0:00:00.706 - .d : <<< UPnP service started successfully -[main (2) ] INFO - 0:00:00.707 - local renderer gapless support: false -[main (2) ] INFO - 0:00:00.726 - MediaPlayerRenderer.setVolume(): 14 -[main (2) ] INFO - 0:00:00.731 - local renderer audio session id: 2065, send intent delay: 500 -[main (2) ] INFO - 0:00:00.743 - local renderer: RenderingControl service max volume: 15 -[main (2) ] INFO - 0:00:00.743 - MediaRenderer LastChange thread: initial last change running: false -[Main #2 (199) ] INFO - 0:00:00.744 - task: start: MediaRenderer-LastChange -[Main #2: MediaRenderer-LastChange (199) ] INFO - 0:00:00.744 - MediaRenderer LastChange thread: stopped -[main (2) ] INFO - 0:00:00.745 - created local renderer -[main (2) ] INFO - 0:00:00.746 - OpenHome local renderer is disabled -[main (2) ] INFO - 0:00:00.751 - starting Jetty... -[main (2) ] INFO - 0:00:00.752 - createConnector: type: 3 -[main (2) ] INFO - 0:00:00.755 - external storage available: true, root directory: /storage/emulated/0, state: mounted, path: null -[Main #3 (201) ] INFO - 0:00:00.757 - task: start: checkAlbumArtistColumnSupport -[main (2) ] INFO - 0:00:00.757 - audio cast fifo exists: /data/data/com.bubblesoft.android.bubbleupnp/audiocast -[Main #3: checkAlbumArtistColumnSupport (] INFO - 0:00:00.757 - Album Artist column supported (from pref): false -[Main #3 (201) ] INFO - 0:00:00.757 - task: end, 0ms: checkAlbumArtistColumnSupport -[main (2) ] INFO - 0:00:00.760 - audio cast fifo exists: /data/data/com.bubblesoft.android.bubbleupnp/audiocast -[main (2) ] INFO - 0:00:00.760 - excluded remote directories: [] -[main (2) ] INFO - 0:00:00.763 - jetty-7.x.y-SNAPSHOT -[main (2) ] INFO - 0:00:00.766 - started {} -[main (2) ] INFO - 0:00:00.767 - started {} -[main (2) ] INFO - 0:00:00.767 - started {} -[main (2) ] INFO - 0:00:00.767 - started {} -[main (2) ] INFO - 0:00:00.768 - started {} -[main (2) ] INFO - 0:00:00.768 - started {} -[main (2) ] INFO - 0:00:00.769 - started {} -[main (2) ] INFO - 0:00:00.769 - started {} -[main (2) ] INFO - 0:00:00.769 - started {} -[main (2) ] INFO - 0:00:00.771 - Started {} -[main (2) ] INFO - 0:00:00.772 - started Jetty -[main (2) ] WARNING - 0:00:00.774 - smb: failed to load: /data/user/0/com.bubblesoft.android.bubbleupnp/files/smbshares: java.io.FileNotFoundException: /data/user/0/com.bubblesoft.android.bubbleupnp/files/smbshares: open failed: ENOENT (No such file or directory) -[main (2) ] INFO - 0:00:00.774 - smb: setLocalIpAddress: null -[main (2) ] INFO - 0:00:00.774 - added local media server to registry -[main (2) ] INFO - 0:00:00.774 - created local media server -[main (2) ] INFO - 0:00:00.775 - initBatterySavingMode: false -[main (2) ] WARNING - 0:00:00.775 - discovery maintenance: executor already stopped -[main (2) ] INFO - 0:00:00.775 - .b : WiFi lock acquired -[main (2) ] INFO - 0:00:00.793 - wake lock acquired -[main (2) ] INFO - 0:00:00.795 - initBatterySavingMode: added MediaRouter callback -[main (2) ] INFO - 0:00:00.796 - .b : network type changed => WIFI -[main (2) ] WARNING - 0:00:00.796 - .b : WiFi multicast lock already released -[main (2) ] INFO - 0:00:00.796 - .b : WiFi lock released -[main (2) ] INFO - 0:00:00.803 - .a : Creating Router: xr.b$a -[main (2) ] WARNING - 0:00:00.805 - .f : Network interface reports it is not multicast capable: dummy0 -[main (2) ] WARNING - 0:00:00.805 - .f : Network interface reports it is not multicast capable: lo -[main (2) ] INFO - 0:00:00.806 - .f : Skipping unsupported non-IPv4 address: /fe80::6aba:a4eb:8bbb:193e%epdg1 -[main (2) ] INFO - 0:00:00.806 - .f : Skipping unsupported non-IPv4 address: /fe80::24a5:caff:fecb:20a%dummy0 -[main (2) ] INFO - 0:00:00.806 - .f : Skipping unsupported non-IPv4 address: /fe80::1c35:9cff:fe48:4f02%wlan0 -[main (2) ] INFO - 0:00:00.806 - .f : Skipping unsupported non-IPv4 address: /2a01:e0a:db2:76f0:1c35:9cff:fe48:4f02 -[main (2) ] INFO - 0:00:00.806 - .f : Skipping unsupported non-IPv4 address: /2a01:e0a:db2:76f0:2459:6fe5:13c0:a045 -[main (2) ] INFO - 0:00:00.807 - .f : Skipping unsupported non-IPv4 address: /fdde:0:31df:4f52::1288:da64 -[main (2) ] INFO - 0:00:00.807 - .f : Skipping unsupported non-IPv4 address: /::1 -[main (2) ] INFO - 0:00:00.807 - .f : Display name: wlan0 -[main (2) ] INFO - 0:00:00.807 - .f : Name: wlan0 -[main (2) ] INFO - 0:00:00.807 - .f : InetAddress: /fe80::1c35:9cff:fe48:4f02%wlan0 -[main (2) ] INFO - 0:00:00.807 - .f : InetAddress: /2a01:e0a:db2:76f0:1c35:9cff:fe48:4f02 -[main (2) ] INFO - 0:00:00.807 - .f : InetAddress: /2a01:e0a:db2:76f0:2459:6fe5:13c0:a045 -[main (2) ] INFO - 0:00:00.807 - .f : InetAddress: /192.168.0.98 -[main (2) ] INFO - 0:00:00.807 - .f : Interface Address -[main (2) ] INFO - 0:00:00.808 - .f : Address: /fe80::1c35:9cff:fe48:4f02%wlan0 -[main (2) ] INFO - 0:00:00.808 - .f : Broadcast: null -[main (2) ] INFO - 0:00:00.808 - .f : Prefix length: 64 -[main (2) ] INFO - 0:00:00.808 - .f : Interface Address -[main (2) ] INFO - 0:00:00.808 - .f : Address: /2a01:e0a:db2:76f0:1c35:9cff:fe48:4f02 -[main (2) ] INFO - 0:00:00.808 - .f : Broadcast: null -[main (2) ] INFO - 0:00:00.808 - .f : Prefix length: 64 -[main (2) ] INFO - 0:00:00.808 - .f : Interface Address -[main (2) ] INFO - 0:00:00.809 - .f : Address: /2a01:e0a:db2:76f0:2459:6fe5:13c0:a045 -[main (2) ] INFO - 0:00:00.809 - .f : Broadcast: null -[main (2) ] INFO - 0:00:00.809 - .f : Prefix length: 64 -[main (2) ] INFO - 0:00:00.809 - .f : Interface Address -[main (2) ] INFO - 0:00:00.809 - .f : Address: /192.168.0.98 -[main (2) ] INFO - 0:00:00.809 - .f : Broadcast: /192.168.0.255 -[main (2) ] INFO - 0:00:00.809 - .f : Prefix length: 24 -[main (2) ] INFO - 0:00:00.809 - .f : Up? true -[main (2) ] INFO - 0:00:00.809 - .f : Loopback? false -[main (2) ] INFO - 0:00:00.810 - .f : PointToPoint? false -[main (2) ] INFO - 0:00:00.810 - .f : Supports multicast? true -[main (2) ] INFO - 0:00:00.810 - .f : Virtual? false -[main (2) ] INFO - 0:00:00.810 - .f : Hardware address: null -[main (2) ] INFO - 0:00:00.811 - .f : MTU: 1500 -[main (2) ] INFO - 0:00:00.811 - .f : Display name: lo -[main (2) ] INFO - 0:00:00.811 - .f : Name: lo -[main (2) ] INFO - 0:00:00.811 - .f : InetAddress: /::1 -[main (2) ] INFO - 0:00:00.811 - .f : InetAddress: /127.0.0.1 -[main (2) ] INFO - 0:00:00.811 - .f : Interface Address -[main (2) ] INFO - 0:00:00.811 - .f : Address: /::1 -[main (2) ] INFO - 0:00:00.811 - .f : Broadcast: null -[main (2) ] INFO - 0:00:00.812 - .f : Prefix length: 128 -[main (2) ] INFO - 0:00:00.812 - .f : Interface Address -[main (2) ] INFO - 0:00:00.812 - .f : Address: /127.0.0.1 -[main (2) ] INFO - 0:00:00.812 - .f : Broadcast: null -[main (2) ] INFO - 0:00:00.812 - .f : Prefix length: 8 -[main (2) ] INFO - 0:00:00.812 - .f : Up? true -[main (2) ] INFO - 0:00:00.812 - .f : Loopback? true -[main (2) ] INFO - 0:00:00.812 - .f : PointToPoint? false -[main (2) ] INFO - 0:00:00.813 - .f : Supports multicast? false -[main (2) ] INFO - 0:00:00.813 - .f : Virtual? false -[main (2) ] INFO - 0:00:00.813 - .f : Hardware address: null -[main (2) ] INFO - 0:00:00.813 - .f : MTU: 65536 -[main (2) ] INFO - 0:00:00.814 - .i : /127.0.0.1:58645: created socket (for receiving TCP streams) -[main (2) ] INFO - 0:00:00.814 - .i : /192.168.0.98:58645: created socket (for receiving TCP streams) -[main (2) ] INFO - 0:00:00.815 - .e : wlan0: Creating wildcard socket (for receiving multicast datagrams) on port: 1900 -[main (2) ] INFO - 0:00:00.815 - .e : wlan0: Joining multicast group: /239.255.255.250:1900 -[main (2) ] INFO - 0:00:00.816 - .e : lo: Creating wildcard socket (for receiving multicast datagrams) on port: 1900 -[main (2) ] INFO - 0:00:00.816 - .e : lo: Joining multicast group: /239.255.255.250:1900 -[main (2) ] INFO - 0:00:00.816 - .a : Creating bound socket (for datagram input/output) on: /127.0.0.1 -[main (2) ] INFO - 0:00:00.817 - .a : Creating bound socket (for datagram input/output) on: /192.168.0.98 -[main (2) ] INFO - 0:00:00.817 - .b : WiFi multicast lock acquired -[main (2) ] INFO - 0:00:00.819 - .b : WiFi lock acquired -[main (2) ] INFO - 0:00:00.826 - .b : enabled router on network type change (new network: WIFI) -[main (2) ] INFO - 0:00:00.826 - inspecting new device: La glouglou mobile -[main (2) ] INFO - 0:00:00.827 - La glouglou mobile : No product service found -[main (2) ] INFO - 0:00:00.827 - La glouglou mobile : volume range: 0..15 -[main (2) ] INFO - 0:00:00.827 - La glouglou mobile : supports SetNextAVTransportURI: false -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.861 - codec name: c2.sec.amrnb.decoder, supported types: audio/3gpp -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.862 - codec name: c2.sec.amrwb.decoder, supported types: audio/amr-wb -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.862 - codec name: c2.sec.flac.decoder, supported types: audio/flac -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.862 - codec name: c2.sec.ima.decoder, supported types: audio/x-ima -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.862 - codec name: c2.sec.mp3.decoder.mpeg, supported types: audio/mpeg -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.862 - codec name: c2.sec.mp3.decoder, supported types: audio/mpeg -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.862 - codec name: c2.sec.mp3.decoder.mpeg-L1, supported types: audio/mpeg-L1 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.862 - codec name: c2.sec.mp3.decoder.mpeg-L2, supported types: audio/mpeg-L2 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.sec.vc1.decoder.wvc1, supported types: video/wvc1 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.sec.vc1.decoder, supported types: video/wvc1 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.sec.vc1.decoder.x-ms-wmv, supported types: video/x-ms-wmv -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.dolby.ac4.decoder, supported types: audio/ac4 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: OMX.dolby.ac4.decoder, supported types: audio/ac4 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.dolby.eac3.decoder.ac3, supported types: audio/ac3 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.dolby.eac3.decoder, supported types: audio/ac3 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.dolby.eac3.decoder.eac3, supported types: audio/eac3 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.dolby.eac3.decoder.eac3-joc, supported types: audio/eac3-joc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.android.aac.decoder, supported types: audio/mp4a-latm -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: OMX.google.aac.decoder, supported types: audio/mp4a-latm -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.863 - codec name: c2.android.amrnb.decoder, supported types: audio/3gpp -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: OMX.google.amrnb.decoder, supported types: audio/3gpp -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: c2.android.amrwb.decoder, supported types: audio/amr-wb -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: OMX.google.amrwb.decoder, supported types: audio/amr-wb -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: c2.android.flac.decoder, supported types: audio/flac -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: OMX.google.flac.decoder, supported types: audio/flac -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: c2.android.g711.alaw.decoder, supported types: audio/g711-alaw -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: OMX.google.g711.alaw.decoder, supported types: audio/g711-alaw -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: c2.android.g711.mlaw.decoder, supported types: audio/g711-mlaw -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.864 - codec name: OMX.google.g711.mlaw.decoder, supported types: audio/g711-mlaw -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: c2.android.gsm.decoder, supported types: audio/gsm -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: OMX.google.gsm.decoder, supported types: audio/gsm -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: c2.android.mp3.decoder, supported types: audio/mpeg -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: OMX.google.mp3.decoder, supported types: audio/mpeg -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: c2.android.opus.decoder, supported types: audio/opus -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: OMX.google.opus.decoder, supported types: audio/opus -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: c2.android.raw.decoder, supported types: audio/raw -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: OMX.google.raw.decoder, supported types: audio/raw -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: c2.android.vorbis.decoder, supported types: audio/vorbis -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: OMX.google.vorbis.decoder, supported types: audio/vorbis -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.865 - codec name: c2.exynos.h264.decoder, supported types: video/avc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: OMX.Exynos.avc.dec, supported types: video/avc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.exynos.h264.decoder.secure, supported types: video/avc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.exynos.hevc.decoder, supported types: video/hevc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: OMX.Exynos.hevc.dec, supported types: video/hevc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.exynos.hevc.decoder.secure, supported types: video/hevc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.exynos.vp8.decoder, supported types: video/x-vnd.on2.vp8 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: OMX.Exynos.vp8.dec, supported types: video/x-vnd.on2.vp8 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.sec.mpeg4.decoder, supported types: video/mp4v-es -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.android.apv.decoder, supported types: video/apv -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.android.av1-dav1d.decoder, supported types: video/av01 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: c2.android.avc.decoder, supported types: video/avc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.866 - codec name: OMX.google.h264.decoder, supported types: video/avc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: c2.android.h263.decoder, supported types: video/3gpp -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: OMX.google.h263.decoder, supported types: video/3gpp -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: c2.android.hevc.decoder, supported types: video/hevc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: OMX.google.hevc.decoder, supported types: video/hevc -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: c2.android.mpeg4.decoder, supported types: video/mp4v-es -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: OMX.google.mpeg4.decoder, supported types: video/mp4v-es -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: c2.android.vp8.decoder, supported types: video/x-vnd.on2.vp8 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: OMX.google.vp8.decoder, supported types: video/x-vnd.on2.vp8 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: c2.android.vp9.decoder, supported types: video/x-vnd.on2.vp9 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: OMX.google.vp9.decoder, supported types: video/x-vnd.on2.vp9 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.867 - codec name: c2.android.av1.decoder, supported types: video/av01 -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.868 - stock audio codecs: OPUS, FLAC, WAV, MP3, MP2, MP1, AAC, M4A, OGG, DFF, DSF, DSD -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.868 - non-stock audio codecs: AIFF, L16, L24, Musepack, WavPack, TAK, AMR, AC3, MKA, MPEG-DASH, DTS, Monkey's Audio, WMA -[cling-8 (GetProtocolInfo) (210) ] INFO - 0:00:00.869 - StockAudioSupport initialization took: 41 ms -[main (2) ] INFO - 0:00:00.870 - La glouglou mobile : protocolInfo: http-get:*:audio/opus:*,http-get:*:audio/x-flac:*,http-get:*:application/flac:*,http-get:*:audio/flac:*,http-get:*:application/x-flac:*,http-get:*:audio/wav:*,http-get:*:application/x-wave:*,http-get:*:audio/wave:*,http-get:*:application/wave:*,http-get:*:application/wav:*,http-get:*:application/x-wav:*,http-get:*:audio/x-wave:*,http-get:*:audio/x-wav:*,http-get:*:audio/mp3:*,http-get:*:application/mp3:*,http-get:*:application/x-mp3:*,http-get:*:audio/mpg:*,http-get:*:audio/mpeg3:*,http-get:*:application/mpeg:*,http-get:*:audio/x-mp3:*,http-get:*:audio/x-mpegaudio:*,http-get:*:audio/mpeg:*,http-get:*:audio/x-mpeg3:*,http-get:*:audio/x-mpg:*,http-get:*:audio/x-mpeg:*,http-get:*:application/mpeg3:*,http-get:*:audio/mp2:*,http-get:*:application/mp2:*,http-get:*:audio/mp1:*,http-get:*:application/mp1:*,http-get:*:audio/aacp:*,http-get:*:audio/aac:*,http-get:*:audio/3gpp:*,http-get:*:audio/3gpp2:*,http-get:*:audio/x-aac:*,http-get:*:audio/m4a:*,http-get:*:audio/mp4:*,http-get:*:application/x-m4b:*,http-get:*:application/x-m4a:*,http-get:*:application/x-m4p:*,http-get:*:application/x-mp4:*,http-get:*:audio/mpeg4:*,http-get:*:audio/x-m4b:*,http-get:*:audio/x-m4a:*,http-get:*:audio/x-m4p:*,http-get:*:audio/x-mp4:*,http-get:*:application/mpeg4:*,http-get:*:audio/x-ogg:*,http-get:*:application/x-ogg:*,http-get:*:audio/vorbis:*,http-get:*:application/ogg:*,http-get:*:audio/ogg:*,http-get:*:audio/dff:*,http-get:*:audio/x-dff:*,http-get:*:audio/x-dsf:*,http-get:*:audio/dsf:*,http-get:*:audio/x-dsd:*,http-get:*:audio/dsd:*,http-get:*:audio/x-scpls:*,http-get:*:application/aiff:*,http-get:*:audio/aiff:*,http-get:*:application/x-aif:*,http-get:*:application/aif:*,http-get:*:application/x-aiff:*,http-get:*:audio/x-aifc:*,http-get:*:audio/x-aiff:*,http-get:*:audio/aif:*,http-get:*:audio/aifc:*,http-get:*:audio/x-aif:*,http-get:*:audio/L16:*,http-get:*:audio/l24:*,http-get:*:audio/L24:*,http-get:*:audio/mpc:*,http-get:*:application/musepack:*,http-get:*:application/x-mpc:*,http-get:*:application/mpc:*,http-get:*:audio/musepack:*,http-get:*:application/x-musepack:*,http-get:*:audio/x-mpc:*,http-get:*:audio/x-musepack:*,http-get:*:audio/wavpack:*,http-get:*:application/x-wavpack:*,http-get:*:audio/x-wv:*,http-get:*:application/wavpack:*,http-get:*:audio/wv:*,http-get:*:audio/x-wavpack:*,http-get:*:application/wv:*,http-get:*:application/x-wv:*,http-get:*:audio/x-tak:*,http-get:*:audio/tak:*,http-get:*:audio/amr:*,http-get:*:audio/ac3:*,http-get:*:audio/x-matroska:*,http-get:*:application/dash+xml:*,http-get:*:audio/x-dts:*,http-get:*:audio/vnd-dts:*,http-get:*:application/ape:*,http-get:*:application/x-ape:*,http-get:*:audio/monkeys-audio:*,http-get:*:audio/x-monkeys-audio:*,http-get:*:audio/ape:*,http-get:*:application/monkeysaudio:*,http-get:*:audio/x-monkeysaudio:*,http-get:*:application/monkeys-audio:*,http-get:*:audio/x-ape:*,http-get:*:application/x-monkeys-audio:*,http-get:*:application/x-monkeysaudio:*,http-get:*:audio/monkeysaudio:*,http-get:*:audio/x-ms-wma:*,http-get:*:application/x-ms-wma:*,http-get:*:application/wma:*,http-get:*:audio/wma:*,http-get:*:audio/L16:*,http-get:*:audio/L16;channels=1;rate=11025:*,http-get:*:audio/L16;channels=1;rate=22050:*,http-get:*:audio/L16;channels=1;rate=44100:*,http-get:*:audio/L16;channels=1;rate=48000:*,http-get:*:audio/L16;channels=1;rate=88200:*,http-get:*:audio/L16;channels=1;rate=96000:*,http-get:*:audio/L16;channels=1;rate=176400:*,http-get:*:audio/L16;channels=1;rate=192000:*,http-get:*:audio/L16;channels=2;rate=11025:*,http-get:*:audio/L16;channels=2;rate=22050:*,http-get:*:audio/L16;channels=2;rate=44100:*,http-get:*:audio/L16;channels=2;rate=48000:*,http-get:*:audio/L16;channels=2;rate=88200:*,http-get:*:audio/L16;channels=2;rate=96000:*,http-get:*:audio/L16;channels=2;rate=176400:*,http-get:*:audio/L16;channels=2;rate=192000:*,http-get:*:audio/L16;channels=6;rate=11025:*,http-get:*:audio/L16;channels=6;rate=22050:*,http-get:*:audio/L16;channels=6;rate=44100:*,http-get:*:audio/L16;channels=6;rate=48000:*,http-get:*:audio/L16;channels=6;rate=88200:*,http-get:*:audio/L16;channels=6;rate=96000:*,http-get:*:audio/L16;channels=6;rate=176400:*,http-get:*:audio/L16;channels=6;rate=192000:*,http-get:*:audio/L16;channels=8;rate=11025:*,http-get:*:audio/L16;channels=8;rate=22050:*,http-get:*:audio/L16;channels=8;rate=44100:*,http-get:*:audio/L16;channels=8;rate=48000:*,http-get:*:audio/L16;channels=8;rate=88200:*,http-get:*:audio/L16;channels=8;rate=96000:*,http-get:*:audio/L16;channels=8;rate=176400:*,http-get:*:audio/L16;channels=8;rate=192000:*,http-get:*:video/vnd.dlna.mpeg-tts:*,http-get:*:video/mpeg2:*,http-get:*:video/mpeg:*,http-get:*:application/vnd.apple.mpegurl:*,http-get:*:application/x-mpegurl:*,http-get:*:video/x-m4v:*,http-get:*:video/mp4v-es:*,http-get:*:video/mp4:*,http-get:*:video/mp2ts:*,http-get:*:video/mp2t:*,http-get:*:video/quicktime:*,http-get:*:video/x-ms-wmv:*,http-get:*:video/x-ms-asf:*,http-get:*:video/x-ms-video:*,http-get:*:video/divx:*,http-get:*:video/vnd.divx:*,http-get:*:video/x-divx:*,http-get:*:video/x-ms-avi:*,http-get:*:video/avi:*,http-get:*:video/x-msvideo:*,http-get:*:video/x-mkv:*,http-get:*:video/mkv:*,http-get:*:video/x-matroska:*,http-get:*:video/ogg:*,http-get:*:video/3gpp:*,http-get:*:video/webm:*,http-get:*:application/flv:*,http-get:*:video/x-flv:*,http-get:*:video/flv:*,http-get:*:video/wtv:*,http-get:*:application/vnd.rn-realmedia-vbr:*,http-get:*:video/vnd.rn-realvideo:*,http-get:*:application/vnd.rn-realmedia:*,http-get:*:image/png:*,http-get:*:image/jpeg:*,http-get:*:image/bmp:*,http-get:*:image/gif:*,http-get:*:image/jpg:*,http-get:*:image/heic:*,http-get:*:image/webp:*,http-get:*:image/mpo:* -[main (2) ] INFO - 0:00:00.871 - La glouglou mobile : discarding problematic mime-type: audio/l24 -[main (2) ] INFO - 0:00:00.871 - La glouglou mobile : discarding problematic mime-type: audio/l24 -[main (2) ] INFO - 0:00:00.871 - La glouglou mobile : adding all DSD mime-types -[main (2) ] INFO - 0:00:00.871 - La glouglou mobile : max samplerate: -1, supports 24-bit: true, supports multichannel: true -[main (2) ] INFO - 0:00:00.872 - La glouglou mobile : supported mime-types: [audio/opus, audio/x-flac, application/flac, audio/flac, application/x-flac, audio/wav, application/x-wave, audio/wave, application/wave, application/wav, application/x-wav, audio/x-wave, audio/x-wav, audio/mp3, application/mp3, application/x-mp3, audio/mpg, audio/mpeg3, application/mpeg, audio/x-mp3, audio/x-mpegaudio, audio/mpeg, audio/x-mpeg3, audio/x-mpg, audio/x-mpeg, application/mpeg3, audio/mp2, application/mp2, audio/mp1, application/mp1, audio/aacp, audio/aac, audio/3gpp, audio/3gpp2, audio/x-aac, audio/m4a, audio/mp4, application/x-m4b, application/x-m4a, application/x-m4p, application/x-mp4, audio/mpeg4, audio/x-m4b, audio/x-m4a, audio/x-m4p, audio/x-mp4, application/mpeg4, audio/x-ogg, application/x-ogg, audio/vorbis, application/ogg, audio/ogg, audio/dff, audio/x-dff, audio/x-dsf, audio/dsf, audio/x-dsd, audio/dsd, audio/x-scpls, application/aiff, audio/aiff, application/x-aif, application/aif, application/x-aiff, audio/x-aifc, audio/x-aiff, audio/aif, audio/aifc, audio/x-aif, audio/lpcm, audio/L16, audio/l16, audio/mpc, application/musepack, application/x-mpc, application/mpc, audio/musepack, application/x-musepack, audio/x-mpc, audio/x-musepack, audio/wavpack, application/x-wavpack, audio/x-wv, application/wavpack, audio/wv, audio/x-wavpack, application/wv, application/x-wv, audio/x-tak, audio/tak, audio/amr, audio/ac3, audio/x-matroska, application/dash+xml, audio/x-dts, audio/vnd-dts, application/ape, application/x-ape, audio/monkeys-audio, audio/x-monkeys-audio, audio/ape, application/monkeysaudio, audio/x-monkeysaudio, application/monkeys-audio, audio/x-ape, application/x-monkeys-audio, application/x-monkeysaudio, audio/monkeysaudio, audio/x-ms-wma, application/x-ms-wma, application/wma, audio/wma, video/vnd.dlna.mpeg-tts, video/mpeg2, video/mpeg, application/vnd.apple.mpegurl, application/x-mpegurl, video/x-m4v, video/mp4v-es, video/mp4, video/3gpp, video/mp2ts, video/mp2t, video/quicktime, video/x-ms-wmv, video/x-ms-asf, video/x-ms-video, video/x-ms-avi, video/avi, video/x-msvideo, video/divx, video/vnd.divx, video/x-divx, video/x-mkv, video/mkv, video/x-matroska, video/ogg, video/webm, application/flv, video/x-flv, video/flv, video/wtv, application/vnd.rn-realmedia-vbr, video/vnd.rn-realvideo, application/vnd.rn-realmedia, image/png, image/jpeg, image/jpg, image/bmp, image/gif, image/heic, image/webp, image/mpo] -[main (2) ] INFO - 0:00:00.872 - La glouglou mobile : hasSetNextPlayItem: false, supportsSetNextPlayItem: false -[main (2) ] INFO - 0:00:00.872 - added renderer: La glouglou mobile (ip: null) -[AsyncTask #1 (187) ] INFO - 0:00:00.873 - loadPlaylist: loaded /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/files/playlists/playlist.dpl -[main (2) ] INFO - 0:00:00.875 - found renderer: La glouglou mobile -[main (2) ] INFO - 0:00:00.877 - .c : - - Manufacturer: Bubblesoft - Manufacturer URL: http://forum.xda-developers.com/showthread.php?t=1118891 - Model name: BubbleUPnP Media Renderer - Model description: BubbleUPnP Media Renderer - Model number: 4.6.1 - UDN: 402e3e8f-f894-485e-b5e7-61a960912a16 - -[main (2) ] INFO - 0:00:00.878 - La glouglou mobile : not a Media Server: java.lang.Exception: La glouglou mobile : cannot find service ContentDirectory -[main (2) ] INFO - 0:00:00.878 - inspecting new device: BubbleUPnP Media Server (SM-A536B) -[main (2) ] INFO - 0:00:00.878 - BubbleUPnP Media Server (SM-A536B): No product service found -[main (2) ] WARNING - 0:00:00.879 - BubbleUPnP Media Server (SM-A536B): no RenderingControl service found -[main (2) ] INFO - 0:00:00.879 - BubbleUPnP Media Server (SM-A536B): constructed successfully -[Main #3 (201) ] INFO - 0:00:00.879 - task: start: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:00.879 - active media server: Local et Cloud -[main (2) ] INFO - 0:00:00.881 - found Media Server: BubbleUPnP Media Server (SM-A536B) -[Main #3: MediaServer-FetchSupportedMimeT] INFO - 0:00:00.881 - BubbleUPnP Media Server (SM-A536B) supported mime-types: [audio/mpeg, audio/mp4, audio/mp4, audio/wav, audio/wave, audio/x-wav, audio/mpeg, audio/x-mpeg, audio/mp1, audio/aac, audio/flac, audio/x-flac, audio/m4a, audio/mp4, audio/x-m4a, audio/x-scpls, audio/vorbis, audio/ogg, audio/x-ogg, audio/x-ms-wma, application/x-ms-wma, audio/wma, application/wma, image/png, image/png, image/jpeg, image/jpeg, image/jpeg, image/jpeg, image/png, image/jpeg, image/bmp, image/gif, image/jpg, image/heic, image/webp, image/mpo, video/vnd.dlna.mpeg-tts, video/mpeg2, video/mpeg, application/vnd.apple.mpegurl, application/x-mpegurl, video/x-m4v, video/mp4v-es, video/mp4, video/mp2ts, video/mp2t, video/quicktime, video/x-ms-wmv, video/x-ms-asf, video/x-ms-video, video/divx, video/vnd.divx, video/x-divx, video/x-ms-avi, video/avi, video/x-msvideo, video/x-mkv, video/mkv, video/x-matroska, video/ogg, video/3gpp, video/webm, application/flv, video/x-flv, video/flv, video/wtv, application/vnd.rn-realmedia-vbr, video/vnd.rn-realvideo, application/vnd.rn-realmedia] -[main (2) ] INFO - 0:00:00.882 - .c : - - Manufacturer: Bubblesoft - Manufacturer URL: http://forum.xda-developers.com/showthread.php?t=1118891 - Model name: BubbleUPnP Media Server - Model description: BubbleUPnP Media Server - Model number: 4.6.1 - UDN: d38a2dc7-13c1-4a39-ab36-513490cf6766 - -[Main #3 (201) ] INFO - 0:00:00.882 - task: end, 3ms: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:00.882 - createConnector: type: 3 -[main (2) ] INFO - 0:00:00.883 - Started {} -[main (2) ] INFO - 0:00:00.883 - started Jetty connector on 192.168.0.98:57645 -[main (2) ] INFO - 0:00:00.883 - smb: setLocalIpAddress: /192.168.0.98 -[main (2) ] SEVERE - 0:00:00.884 - watchdog: device search++: 1 -[main (2) ] INFO - 0:00:00.884 - performDeviceSearch: searching... -[main (2) ] INFO - 0:00:00.886 - play mode: -1 -[main (2) ] INFO - 0:00:00.888 - play mode: -3.5 -[main (2) ] INFO - 0:00:00.890 - set scrobbler: 0 -[main (2) ] INFO - 0:00:00.891 - Trakt resume: cleared progressed entities -[main (2) ] INFO - 0:00:00.892 - registered receiver for 'mute on phone call' -[main (2) ] INFO - 0:00:00.894 - setUsingBattery: true => true -[Main #3 (201) ] INFO - 0:00:00.896 - task: start: AndroidUpnpService-LoadResumePositions -[main (2) ] INFO - 0:00:00.896 - isGMSAvailable: true, hasTunInterface: false, isGoogleCastDiscoveryAlwaysStarted: false -[Main #3: AndroidUpnpService-LoadResumePo] INFO - 0:00:00.897 - loaded 10 resume positions -[Main #3 (201) ] INFO - 0:00:00.897 - task: end, 1ms: AndroidUpnpService-LoadResumePositions -[Main #4 (225) ] INFO - 0:00:00.897 - task: start: clearTempVLCSubFiles -[Main #3 (201) ] INFO - 0:00:00.897 - task: start: processAppExitReasons -[main (2) ] INFO - 0:00:00.898 - AndroidUpnpService.onCreate() took: 431 ms -[Main #6 (227) ] INFO - 0:00:00.898 - task: start: clear older HLS remux files -[main (2) ] INFO - 0:00:00.899 - doStartForeground: calling startForeground(), fromOnStartCommand: true, serviceType: 2 -[Main #5 (226) ] INFO - 0:00:00.898 - task: start: clear transcode tmp files -[Main #6 (227) ] INFO - 0:00:00.901 - task: end, 4ms: clear older HLS remux files -[Main #3 (201) ] INFO - 0:00:00.902 - task: end, 4ms: processAppExitReasons -[Main #5 (226) ] INFO - 0:00:00.902 - task: end, 5ms: clear transcode tmp files -[cling-21 (229) ] INFO - 0:00:00.904 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.233:49152/description.xml -[main (2) ] INFO - 0:00:00.911 - toast: AVERTISSEMENT: - -Le logging est activé - -[main (2) ] INFO - 0:00:00.920 - warning toast: Le logging est activé - -[main (2) ] INFO - 0:00:00.922 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:00.923 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.924 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.925 - Insets: Insets{left=0, top=88, right=0, bottom=45} -[main (2) ] INFO - 0:00:00.931 - onDestroy()@9e5576d:5237 -[main (2) ] INFO - 0:00:00.931 - installed security provider -[main (2) ] INFO - 0:00:00.932 - MediaPlayerRenderer: onRouteSelected: MediaRouter.RouteInfo{ uniqueId=ROUTE_2e8a299d, name=Toyota Touch, description=Audio Bluetooth, iconUri=null, enabled=true, isSystemRoute=true, connectionState=0, canDisconnect=false, playbackType=0, playbackStream=3, deviceType=3, volumeHandling=1, volume=14, volumeMax=15, presentationDisplayId=-1, extras=null, settingsIntent=null, providerPackageName=android }, BT: true -[main (2) ] INFO - 0:00:00.932 - onRouteSelected (local): route: MediaRouter.RouteInfo{ uniqueId=ROUTE_2e8a299d, name=Toyota Touch, description=Audio Bluetooth, iconUri=null, enabled=true, isSystemRoute=true, connectionState=0, canDisconnect=false, playbackType=0, playbackStream=3, deviceType=3, volumeHandling=1, volume=14, volumeMax=15, presentationDisplayId=-1, extras=null, settingsIntent=null, providerPackageName=android }, reason: 0 -[main (2) ] INFO - 0:00:00.934 - .b : selected item: France Culture -[main (2) ] INFO - 0:00:00.934 - .b : selected item: France Culture -[main (2) ] INFO - 0:00:00.935 - .b : CONNECTIVITY_ACTION -[main (2) ] INFO - 0:00:00.935 - .b : EXTRA_NO_CONNECTIVITY: false -[main (2) ] INFO - 0:00:00.935 - .b : EXTRA_REASON: null -[main (2) ] INFO - 0:00:00.935 - .b : EXTRA_IS_FAILOVER: false -[main (2) ] INFO - 0:00:00.936 - .b : EXTRA_NETWORK_INFO: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: , failover: false, available: true, roaming: false] -[main (2) ] INFO - 0:00:00.936 - .b : EXTRA_OTHER_NETWORK_INFO: none -[main (2) ] INFO - 0:00:00.936 - .b : EXTRA_EXTRA_INFO: -[main (2) ] INFO - 0:00:00.936 - .b : No network change...ignoring event -[main (2) ] INFO - 0:00:00.939 - onNetworkSearchStarted -[main (2) ] INFO - 0:00:00.967 - added listener: 1 listeners -[main (2) ] INFO - 0:00:00.968 - added listener: 2 listeners -[main (2) ] INFO - 0:00:00.969 - added listener: 3 listeners -[main (2) ] INFO - 0:00:00.969 - active renderer: none -[main (2) ] INFO - 0:00:00.970 - created mini-player (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) -[main (2) ] INFO - 0:00:00.971 - added listener: 4 listeners -[main (2) ] WARNING - 0:00:00.971 - refreshLocalMediaServerLibraryList: failed to find separator container (1) -[main (2) ] INFO - 0:00:00.971 - active renderer: none -[Main #4 (225) ] INFO - 0:00:00.977 - task: end, 79ms: clearTempVLCSubFiles -[main (2) ] INFO - 0:00:00.978 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:00.978 - saveMediaServerState: Local et Cloud -[main (2) ] INFO - 0:00:00.981 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:00.981 - saveMediaServerState: Local et Cloud -[main (2) ] INFO - 0:00:00.982 - positionStack: [] -[main (2) ] INFO - 0:00:00.982 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:00:00.982 - containerPath: [] -[main (2) ] INFO - 0:00:00.983 - remote config: fetch succeeded, activated: false -[AsyncTask #1 (187) ] INFO - 0:00:00.984 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:00:00.985 - BrowseTask.doInBackground(): loading container 'Local et Cloud' -[cling-17 (Browse) (221) ] INFO - 0:00:00.986 - ObjectID: 0 -[cling-17 (Browse) (221) ] INFO - 0:00:00.986 - BrowseFlag: BrowseDirectChildren -[cling-17 (Browse) (221) ] INFO - 0:00:00.986 - StartingIndex: 0 -[cling-17 (Browse) (221) ] INFO - 0:00:00.986 - RequestedCount: 0 -[cling-17 (Browse) (221) ] INFO - 0:00:00.986 - Filter: * -[cling-17 (Browse) (221) ] INFO - 0:00:00.988 - sorted 0 items took: 0 ms -[cling-17 (Browse) (221) ] WARNING - 0:00:00.990 - webdav: failed to load: /data/user/0/com.bubblesoft.android.bubbleupnp/files/webdavservers: java.io.FileNotFoundException: /data/user/0/com.bubblesoft.android.bubbleupnp/files/webdavservers: open failed: ENOENT (No such file or directory) -[cling-17 (Browse) (221) ] INFO - 0:00:00.998 - browsed 10/10 items in 10ms -[cling-23 (233) ] INFO - 0:00:00.998 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.137:49152/description.xml -[main (2) ] INFO - 0:00:00.999 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:00.999 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[cling-17 (221) ] INFO - 0:00:01.1 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.138:8080/device/63623ff4-ee41-4850-90aa-2d39395df981/desc.xml -[main (2) ] INFO - 0:00:01.57 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:01.57 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:01.58 - loaded file d38a2dc7-13c1-4a39-ab36-513490cf6766-Bookmarks ok: 0 items, 1 ms -[main (2) ] INFO - 0:00:01.58 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:01.59 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:01.60 - sorted 2 items took: 0 ms -[AsyncTask #1 (187) ] INFO - 0:00:01.63 - finished browsing: got 10 objects -[AsyncTask #1 (187) ] INFO - 0:00:01.64 - BrowseTask.doInBackground(): no item -[main (2) ] INFO - 0:00:01.67 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[cling-17 (221) ] INFO - 0:00:01.69 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.200:49152/uuid-2899a4df-39ae-160a-6563-dca6329ead0d/description.xml -[main (2) ] INFO - 0:00:01.71 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[glide-disk-cache-thread-0 (236) ] INFO - 0:00:01.170 - Glide: registered GlideUrl loader -[main (2) ] INFO - 0:00:01.171 - inspecting new device: PMOMusic Media Server -[main (2) ] INFO - 0:00:01.171 - PMOMusic Media Server: No product service found -[main (2) ] WARNING - 0:00:01.172 - PMOMusic Media Server: no RenderingControl service found -[main (2) ] INFO - 0:00:01.172 - PMOMusic Media Server: constructed successfully -[Main #4 (225) ] INFO - 0:00:01.172 - task: start: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:01.172 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:00:01.173 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:01.173 - no icon for PMOMusic Media Server -[main (2) ] INFO - 0:00:01.173 - found Media Server: PMOMusic Media Server -[main (2) ] INFO - 0:00:01.174 - .c : - - Manufacturer: PMOMusic - Model name: PMOMusic Media Server - UDN: 63623ff4-ee41-4850-90aa-2d39395df981 - -[glide-disk-cache-thread-0 (236) ] INFO - 0:00:01.171 - created okhttp/5.3.2 client -[main (2) ] INFO - 0:00:01.178 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:01.179 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[Main #4: MediaServer-FetchSupportedMimeT] INFO - 0:00:01.186 - PMOMusic Media Server supported mime-types: [audio/flac, audio/x-flac, application/flac, application/x-flac, application/ogg, audio/ogg, audio/x-ogg] -[Main #4 (225) ] INFO - 0:00:01.186 - task: end, 14ms: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:01.200 - inspecting new device: Chambre -[main (2) ] INFO - 0:00:01.200 - Chambre: No product service found -[main (2) ] INFO - 0:00:01.201 - Chambre: volume range: 0..100 -[main (2) ] INFO - 0:00:01.201 - Chambre: supports SetNextAVTransportURI: true -[main (2) ] INFO - 0:00:01.221 - Chambre: protocolInfo: http-get:*:audio/wav:DLNA.ORG_PN=LPCM,http-get:*:audio/x-wav:DLNA.ORG_PN=LPCM,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3X,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAPRO,http-get:*:audio/mpeg:DLNA.ORG_PN=MP2_MPS,http-get:*:audio/mp3:*,http-get:*:audio/wma:*,http-get:*:audio/mpeg:*,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320,http-get:*:audio/m4a:DLNA.ORG_PN=AAC_ISO,http-get:*:audio/aac:DLNA.ORG_PN=AAC_ISO,http-get:*:audio/ac3:DLNA.ORG_PN=AC3,http-get:*:audio/ogg:*,http-get:*:audio/ape:*,http-get:*:audio/x-ape:*,http-get:*:audio/flac:* -[main (2) ] INFO - 0:00:01.221 - Chambre: max samplerate: 192000, supports 24-bit: true, supports multichannel: true -[main (2) ] INFO - 0:00:01.221 - Chambre: supported mime-types: [audio/wav, application/x-wave, audio/wave, application/wave, application/wav, application/x-wav, audio/x-wave, audio/x-wav, audio/mp3, application/mp3, application/x-mp3, audio/mpg, audio/mpeg3, application/mpeg, audio/x-mp3, audio/x-mpegaudio, audio/mpeg, audio/x-mpeg3, audio/x-mpg, audio/x-mpeg, application/mpeg3, audio/x-ms-wma, application/x-ms-wma, application/wma, audio/wma, audio/vnd.dlna.adts, audio/m4a, audio/mp4, application/x-m4b, application/x-m4a, application/x-m4p, application/x-mp4, audio/mpeg4, audio/x-m4b, audio/x-m4a, audio/x-m4p, audio/x-mp4, application/mpeg4, audio/aacp, audio/aac, audio/3gpp, audio/3gpp2, audio/x-aac, audio/ac3, audio/x-ogg, application/x-ogg, audio/vorbis, application/ogg, audio/ogg, application/ape, application/x-ape, audio/monkeys-audio, audio/x-monkeys-audio, audio/ape, application/monkeysaudio, audio/x-monkeysaudio, application/monkeys-audio, audio/x-ape, application/x-monkeys-audio, application/x-monkeysaudio, audio/monkeysaudio, audio/x-flac, application/flac, audio/flac, application/x-flac] -[main (2) ] INFO - 0:00:01.222 - Chambre: hasSetNextPlayItem: true, supportsSetNextPlayItem: true -[main (2) ] INFO - 0:00:01.222 - added renderer: Chambre (ip: 192.168.0.233) -[main (2) ] INFO - 0:00:01.223 - found renderer: Chambre -[main (2) ] INFO - 0:00:01.223 - .c : - - Manufacturer: Rakoit Technology(SZ) Co., Ltd. - Manufacturer URL: https://www.rakoit.com - Model name: H50 - Model description: Arylic Wi-Fi Sound System - Model number: V01-Jul 4 2023 - - Model URL: https://www.arylic.com - Serial number: 00001 - UDN: FF97F35D-934D-3F36-6EE8-4A26FF97F35D - -[main (2) ] INFO - 0:00:01.223 - Chambre: not a Media Server: java.lang.Exception: Chambre: cannot find service ContentDirectory -[main (2) ] INFO - 0:00:01.226 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:01.226 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:01.227 - inspecting new device: Glouglou Box -[main (2) ] INFO - 0:00:01.227 - Glouglou Box: No product service found -[main (2) ] INFO - 0:00:01.228 - Glouglou Box: volume range: 0..100 -[main (2) ] INFO - 0:00:01.228 - Glouglou Box: supports SetNextAVTransportURI: false -[main (2) ] INFO - 0:00:01.241 - Glouglou Box: protocolInfo: http-get:*:audio/wav:DLNA.ORG_PN=LPCM,http-get:*:audio/x-wav:DLNA.ORG_PN=LPCM,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3X,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAPRO,http-get:*:audio/mpeg:DLNA.ORG_PN=MP2_MPS,http-get:*:audio/mp3:*,http-get:*:audio/wma:*,http-get:*:audio/mpeg:*,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320,http-get:*:audio/m4a:DLNA.ORG_PN=AAC_ISO,http-get:*:audio/aac:DLNA.ORG_PN=AAC_ISO,http-get:*:audio/ac3:DLNA.ORG_PN=AC3,http-get:*:audio/ogg:*,http-get:*:audio/ape:*,http-get:*:audio/x-ape:*,http-get:*:audio/flac:* -[main (2) ] INFO - 0:00:01.242 - Glouglou Box: max samplerate: 192000, supports 24-bit: true, supports multichannel: true -[main (2) ] INFO - 0:00:01.242 - Glouglou Box: supported mime-types: [audio/wav, application/x-wave, audio/wave, application/wave, application/wav, application/x-wav, audio/x-wave, audio/x-wav, audio/mp3, application/mp3, application/x-mp3, audio/mpg, audio/mpeg3, application/mpeg, audio/x-mp3, audio/x-mpegaudio, audio/mpeg, audio/x-mpeg3, audio/x-mpg, audio/x-mpeg, application/mpeg3, audio/x-ms-wma, application/x-ms-wma, application/wma, audio/wma, audio/vnd.dlna.adts, audio/m4a, audio/mp4, application/x-m4b, application/x-m4a, application/x-m4p, application/x-mp4, audio/mpeg4, audio/x-m4b, audio/x-m4a, audio/x-m4p, audio/x-mp4, application/mpeg4, audio/aacp, audio/aac, audio/3gpp, audio/3gpp2, audio/x-aac, audio/ac3, audio/x-ogg, application/x-ogg, audio/vorbis, application/ogg, audio/ogg, application/ape, application/x-ape, audio/monkeys-audio, audio/x-monkeys-audio, audio/ape, application/monkeysaudio, audio/x-monkeysaudio, application/monkeys-audio, audio/x-ape, application/x-monkeys-audio, application/x-monkeysaudio, audio/monkeysaudio, audio/x-flac, application/flac, audio/flac, application/x-flac] -[main (2) ] INFO - 0:00:01.242 - Glouglou Box: hasSetNextPlayItem: false, supportsSetNextPlayItem: false -[main (2) ] INFO - 0:00:01.242 - added renderer: Glouglou Box (ip: 192.168.0.137) -[main (2) ] INFO - 0:00:01.243 - found renderer: Glouglou Box -[main (2) ] INFO - 0:00:01.243 - .c : - - Manufacturer: Harman International Industries Inc - Manufacturer URL: https://www.harman.com - Model name: JBL Authentics 300 - Model description: JBL soundbar - Model number: V01-May 21 2025 - - Model URL: https://www.jbl.com - Serial number: 00001 - UDN: FFB8F005-0874-39C2-7E46-EF53FFB8F005 - -[main (2) ] INFO - 0:00:01.243 - Glouglou Box: not a Media Server: java.lang.Exception: Glouglou Box: cannot find service ContentDirectory -[main (2) ] INFO - 0:00:01.245 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:01.245 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:01.292 - inspecting new device: pizzicato-Music -[main (2) ] INFO - 0:00:01.293 - pizzicato-Music: found OpenHome device -[main (2) ] INFO - 0:00:01.293 - pizzicato-Music: Found Product service -[main (2) ] INFO - 0:00:01.293 - pizzicato-Music: Found Playlist service -[main (2) ] INFO - 0:00:01.294 - pizzicato-Music: Found Time service -[main (2) ] INFO - 0:00:01.294 - pizzicato-Music: Found Volume service -[main (2) ] INFO - 0:00:01.305 - pizzicato-Music: Found Info service -[main (2) ] INFO - 0:00:01.305 - pizzicato-Music: Found Credentials service -[main (2) ] INFO - 0:00:01.334 - pizzicato-Music: adding audio/x-dsf and audio/x-dff due to audio/x-dsd presence -[main (2) ] INFO - 0:00:01.335 - pizzicato-Music: protocolInfo: http-get:*:audio/L16:DLNA.ORG_PN=LPCM,http-get:*:application/flac:*,http-get:*:application/x-flac:*,http-get:*:application/ogg:*,http-get:*:application/vnd.apple.mpegurl:*,http-get:*:application/x-mpegurl:*,http-get:*:audio/flac:*,http-get:*:audio/x-flac:*,http-get:*:audio/aac:*,http-get:*:audio/x-aiff:*,http-get:*:audio/aif:*,http-get:*:audio/aiff:*,http-get:*:audio/dff:*,http-get:*:audio/x-dff:*,http-get:*:audio/dsd:*,http-get:*:audio/x-dsd:*,http-get:*:audio/dsf:*,http-get:*:audio/x-dsf:*,http-get:*:audio/m4a:*,http-get:*:audio/x-m4a:*,http-get:*:audio/matroska:*,http-get:*:audio/x-matroska:*,http-get:*:audio/mp1:*,http-get:*:audio/mp3:*,http-get:*:audio/mp4:*,http-get:*:audio/mpeg:*,http-get:*:audio/x-mpeg:*,http-get:*:audio/ogg:*,http-get:*:audio/vorbis:*,http-get:*:audio/x-ape:*,http-get:*:audio/ape:*,http-get:*:audio/x-monkeys-audio:*,http-get:*:audio/wav:*,http-get:*:audio/x-wav:*,http-get:*:audio/wave:*,http-get:*:audio/x-ms-wma:*,http-get:*:audio/x-ogg:*,http-get:*:audio/x-scpls:*,http-get:*:audio/x-vorbis+ogg:*,http-get:*:audio/x-vorbis:*,http-get:*:audio/x-wavpack:*,http-get:*:video/mp4:* -[main (2) ] INFO - 0:00:01.335 - pizzicato-Music: supported mime-types: [audio/lpcm, audio/L16, audio/l16, audio/x-flac, application/flac, audio/flac, application/x-flac, audio/x-ogg, application/x-ogg, audio/vorbis, application/ogg, audio/ogg, application/vnd.apple.mpegurl, application/x-mpegurl, audio/aacp, audio/aac, audio/3gpp, audio/3gpp2, audio/x-aac, application/aiff, audio/aiff, application/x-aif, application/aif, application/x-aiff, audio/x-aifc, audio/x-aiff, audio/aif, audio/aifc, audio/x-aif, audio/dff, audio/x-dff, audio/x-dsd, audio/dsd, audio/x-dsf, audio/dsf, audio/m4a, audio/mp4, application/x-m4b, application/x-m4a, application/x-m4p, application/x-mp4, audio/mpeg4, audio/x-m4b, audio/x-m4a, audio/x-m4p, audio/x-mp4, application/mpeg4, audio/matroska, audio/x-matroska, audio/mp1, application/mp1, audio/mp3, application/mp3, application/x-mp3, audio/mpg, audio/mpeg3, application/mpeg, audio/x-mp3, audio/x-mpegaudio, audio/mpeg, audio/x-mpeg3, audio/x-mpg, audio/x-mpeg, application/mpeg3, application/ape, application/x-ape, audio/monkeys-audio, audio/x-monkeys-audio, audio/ape, application/monkeysaudio, audio/x-monkeysaudio, application/monkeys-audio, audio/x-ape, application/x-monkeys-audio, application/x-monkeysaudio, audio/monkeysaudio, audio/wav, application/x-wave, audio/wave, application/wave, application/wav, application/x-wav, audio/x-wave, audio/x-wav, audio/x-ms-wma, application/x-ms-wma, application/wma, audio/wma, audio/x-scpls, audio/x-vorbis+ogg, audio/x-vorbis, audio/wavpack, application/x-wavpack, audio/x-wv, application/wavpack, audio/wv, audio/x-wavpack, application/wv, application/x-wv, video/mp4v-es, video/mp4, video/3gpp] -[main (2) ] INFO - 0:00:01.335 - pizzicato-Music: volume range: 0..100 -[main (2) ] INFO - 0:00:01.336 - added renderer: pizzicato-Music (ip: 192.168.0.200) -[main (2) ] INFO - 0:00:01.336 - qobuz: user auth token: unset -[main (2) ] INFO - 0:00:01.337 - qobuz: cleared credentials -[main (2) ] INFO - 0:00:01.337 - qobuz: username: set -[main (2) ] INFO - 0:00:01.337 - tidal: session: unset -[main (2) ] INFO - 0:00:01.337 - tidal: reset -[main (2) ] INFO - 0:00:01.338 - fireRootContentChanged -[main (2) ] INFO - 0:00:01.339 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:01.339 - saveMediaServerState: Local et Cloud -[main (2) ] INFO - 0:00:01.339 - positionStack: [] -[main (2) ] INFO - 0:00:01.339 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:00:01.340 - containerPath: [] -[AsyncTask #1 (187) ] INFO - 0:00:01.341 - BrowseTask.doInBackground(): enter -[main (2) ] INFO - 0:00:01.341 - active renderer: pizzicato-Music -[AsyncTask #1 (187) ] INFO - 0:00:01.341 - BrowseTask.doInBackground(): loading container 'Local et Cloud' -[main (2) ] INFO - 0:00:01.342 - supports video: false -[main (2) ] INFO - 0:00:01.342 - tidal: OH token id: null -[cling-17 (Browse) (221) ] INFO - 0:00:01.342 - ObjectID: 0 -[cling-17 (Browse) (221) ] INFO - 0:00:01.342 - BrowseFlag: BrowseDirectChildren -[main (2) ] INFO - 0:00:01.342 - pizzicato-Music: control volume with pizzicato-Music -[cling-17 (Browse) (221) ] INFO - 0:00:01.343 - StartingIndex: 0 -[cling-17 (Browse) (221) ] INFO - 0:00:01.343 - RequestedCount: 0 -[cling-17 (Browse) (221) ] INFO - 0:00:01.343 - Filter: * -[cling-17 (Browse) (221) ] INFO - 0:00:01.344 - sorted 0 items took: 0 ms -[cling-17 (Browse) (221) ] INFO - 0:00:01.347 - browsed 10/10 items in 3ms -[main (2) ] INFO - 0:00:01.357 - pizzicato-Music: onSourceChange: Playlist -[main (2) ] INFO - 0:00:01.358 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Product -[main (2) ] INFO - 0:00:01.358 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Playlist -[main (2) ] INFO - 0:00:01.359 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Info -[main (2) ] INFO - 0:00:01.359 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Credentials -[main (2) ] INFO - 0:00:01.359 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Volume -[main (2) ] INFO - 0:00:01.360 - onSourceChange: Playlist -[main (2) ] INFO - 0:00:01.360 - selected item changed (service): -[main (2) ] INFO - 0:00:01.361 - image file cache is enabled: /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/cache/images -[main (2) ] INFO - 0:00:01.361 - enabled image file cache -[cling-25 (240) ] INFO - 0:00:01.375 - pizzicato-Music: Established subscription uuid:3c16bfa0-648d-d76f-fe5e-64eaff0a8143 on service (n) ServiceId: urn:av-openhome-org:serviceId:Volume -[main (2) ] INFO - 0:00:01.388 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:00:01.388 - SETACTIVE: onTransportStateChanged: post STOP callback -[cling-25 (240) ] INFO - 0:00:01.388 - pizzicato-Music: Established subscription uuid:4f47affc-06ec-2985-254c-fe5b915eff95 on service (n) ServiceId: urn:av-openhome-org:serviceId:Info -[cling-33 (248) ] INFO - 0:00:01.404 - pizzicato-Music: Established subscription uuid:85105959-8465-e1ae-1173-390be1f8c52c on service (n) ServiceId: urn:av-openhome-org:serviceId:Credentials -[cling-34 (249) ] INFO - 0:00:01.416 - pizzicato-Music: Established subscription uuid:6a044423-bdd0-dc26-794f-9c22a8044a8d on service (n) ServiceId: urn:av-openhome-org:serviceId:Product -[cling-34 (249) ] INFO - 0:00:01.422 - pizzicato-Music: Established subscription uuid:96b0cb0d-2712-6f1a-0bf3-f5a9cf749e69 on service (n) ServiceId: urn:av-openhome-org:serviceId:Playlist -[main (2) ] INFO - 0:00:01.426 - VolumeProvider: created for 'pizzicato-Music' -[main (2) ] INFO - 0:00:01.451 - onNetworkSearchEnded -[main (2) ] INFO - 0:00:01.480 - active renderer: pizzicato-Music -[main (2) ] INFO - 0:00:01.481 - source changed: Playlist -[main (2) ] INFO - 0:00:01.481 - selected item changed (now playing): -[main (2) ] INFO - 0:00:01.481 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:01.483 - active renderer: pizzicato-Music -[main (2) ] INFO - 0:00:01.484 - active renderer: pizzicato-Music -[main (2) ] INFO - 0:00:01.484 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) -[main (2) ] INFO - 0:00:01.484 - no icon for pizzicato-Music -[main (2) ] INFO - 0:00:01.484 - found renderer: pizzicato-Music -[main (2) ] INFO - 0:00:01.485 - .c : - - Manufacturer: JF Light Industries - Manufacturer URL: https://framagit.org/medoc92 - Model name: UpMPD - Model description: UPnP front-end to MPD - Model number: 42 - Model URL: https://framagit.org/medoc92/upmpdcli/code/ - Serial number: upmpdcli version 1.9.5 libupnpp 1.0.2 mpd 0.23.5 - UDN: 2899a4df-39ae-160a-6563-dca6329ead0d - -[main (2) ] INFO - 0:00:01.485 - pizzicato-Music: not a Media Server: java.lang.Exception: pizzicato-Music: cannot find service ContentDirectory -[main (2) ] INFO - 0:00:01.486 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:01.486 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:01.487 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[cling-28 (243) ] INFO - 0:00:01.488 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.138:8080/device/4b5d30eb-34cb-4bcc-806e-a075eebf9cd7/desc.xml -[main (2) ] INFO - 0:00:01.497 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:00:01.497 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:01.498 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:01.498 - loaded file d38a2dc7-13c1-4a39-ab36-513490cf6766-Bookmarks ok: 0 items, 0 ms -[main (2) ] INFO - 0:00:01.498 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:01.499 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:01.500 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:01.500 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:01.501 - pizzicato-Music: Credentials: supported ids: [qobuz.com] -[AsyncTask #1 (187) ] INFO - 0:00:01.501 - finished browsing: got 10 objects -[AsyncTask #1 (187) ] INFO - 0:00:01.501 - BrowseTask.doInBackground(): no item -[main (2) ] INFO - 0:00:01.512 - pizzicato-Music: CredentialsSubscriptionCallback.getAction(qobuz.com): username: unset, password: unset, enabled: true, status: null, data: set -[main (2) ] INFO - 0:00:01.513 - pizzicato-Music: AbstractRenderer.onVolumeChange: 100 -[main (2) ] INFO - 0:00:01.513 - VolumeProvider: onVolumeChanged: 100 -[main (2) ] INFO - 0:00:01.526 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:00:01.527 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:01.527 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:00:01.527 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:00:01.528 - pizzicato-Music: AbstractRenderer.onMuteChange: false -[main (2) ] INFO - 0:00:01.546 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:01.547 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:00:01.548 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:00:01.548 - onStandbyChange: standby=false, ignore=true -[Main #4 (225) ] INFO - 0:00:01.548 - task: start: AbstractPlaylistService-FirstIdArray -[main (2) ] WARNING - 0:00:01.549 - .b : couldn't find item trackId = 23 -[Main #4: AbstractPlaylistService-FirstId] INFO - 0:00:01.549 - pizzicato-Music: reading 1 new items to insert: [23] -[main (2) ] INFO - 0:00:01.549 - selected item changed (service): -[Main #4: AbstractPlaylistService-FirstId] INFO - 0:00:01.549 - pizzicato-Music: getting [0..1[ -[Main #4 (225) ] INFO - 0:00:01.571 - task: end, 23ms: AbstractPlaylistService-FirstIdArray -[main (2) ] INFO - 0:00:01.572 - selected item changed (now playing): -[main (2) ] INFO - 0:00:01.572 - setSeekBarDetailsText: -[main (2) ] INFO - 0:00:01.574 - started task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:00:01.574 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:00:01.574 - dynamic shortcuts: added 'pizzicato-Music' -[main (2) ] INFO - 0:00:01.575 - renderer chooser target: saved 1 targets -[Main #4 (225) ] INFO - 0:00:01.576 - task: start: publishRendererChooserTargets -[Main #4 (225) ] INFO - 0:00:01.587 - task: end, 10ms: publishRendererChooserTargets -[main (2) ] INFO - 0:00:01.594 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:01.595 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:01.596 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:01.635 - qobuz: Linn status: null -[main (2) ] INFO - 0:00:01.635 - qobuz: username: unset -[main (2) ] INFO - 0:00:01.635 - qobuz: set custom app id -[main (2) ] INFO - 0:00:01.636 - qobuz: user auth token: unset -[main (2) ] INFO - 0:00:01.662 - inspecting new device: PMOMusic Audio Renderer -[main (2) ] INFO - 0:00:01.663 - PMOMusic Audio Renderer: No product service found -[main (2) ] WARNING - 0:00:01.663 - PMOMusic Audio Renderer: Volume state variable has no range, using default -[main (2) ] INFO - 0:00:01.663 - PMOMusic Audio Renderer: volume range: 0..100 -[main (2) ] INFO - 0:00:01.663 - PMOMusic Audio Renderer: supports SetNextAVTransportURI: true -[main (2) ] WARNING - 0:00:01.673 - PMOMusic Audio Renderer: cannot get ProtocolInfo: null sink value, source value: null -[main (2) ] INFO - 0:00:01.673 - PMOMusic Audio Renderer: supported mime-types: [] -[main (2) ] INFO - 0:00:01.673 - PMOMusic Audio Renderer: hasSetNextPlayItem: true, supportsSetNextPlayItem: true -[main (2) ] INFO - 0:00:01.674 - added renderer: PMOMusic Audio Renderer (ip: 192.168.0.138) -[main (2) ] INFO - 0:00:01.674 - no icon for PMOMusic Audio Renderer -[main (2) ] INFO - 0:00:01.674 - found renderer: PMOMusic Audio Renderer -[main (2) ] INFO - 0:00:01.674 - .c : - - Manufacturer: PMOMusic - Model name: PMOMusic Audio Renderer - UDN: 4b5d30eb-34cb-4bcc-806e-a075eebf9cd7 - -[main (2) ] INFO - 0:00:01.674 - PMOMusic Audio Renderer: not a Media Server: java.lang.Exception: PMOMusic Audio Renderer: cannot find service ContentDirectory -[main (2) ] INFO - 0:00:01.677 - .b : selected item (track id): Babylon -[main (2) ] INFO - 0:00:01.677 - selected item changed (service): Babylon -[main (2) ] INFO - 0:00:01.694 - selected item changed (now playing): Babylon -[main (2) ] INFO - 0:00:01.708 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:01.709 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:01.709 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[cling-23 (233) ] INFO - 0:00:01.944 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.254:52424/device.xml -[main (2) ] INFO - 0:00:01.982 - inspecting new device: Freebox Server -[main (2) ] INFO - 0:00:01.983 - Freebox Server: No product service found -[main (2) ] WARNING - 0:00:01.983 - Freebox Server: no RenderingControl service found -[main (2) ] INFO - 0:00:01.984 - Freebox Server: constructed successfully -[main (2) ] INFO - 0:00:01.985 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[Main #4 (225) ] INFO - 0:00:01.984 - task: start: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:01.985 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:00:01.986 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:00:01.987 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:01.987 - found Media Server: Freebox Server -[main (2) ] INFO - 0:00:01.988 - .c : - - Manufacturer: Freebox SAS - Manufacturer URL: http://www.freebox.fr - Model name: Freebox Media Server - Model description: Freebox UPnP Media Server - Model number: 1 - Model URL: http://www.freebox.fr - Serial number: 1 - UDN: e929a46e-d218-377d-2dde-32bd8080dfbf - -[main (2) ] INFO - 0:00:01.989 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:01.989 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:01.990 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[Main #4: MediaServer-FetchSupportedMimeT] INFO - 0:00:01.995 - Freebox Server supported mime-types: [image/jpeg, image/jpeg, image/jpeg, image/jpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mpeg, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/mp4, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/vnd.dlna.mpeg-tts, video/x-ms-wmv, video/x-ms-wmv, video/x-ms-wmv, video/x-ms-wmv, video/x-ms-wmv, video/x-ms-wmv, video/x-ms-wmv, video/x-ms-wmv, video/3gpp, video/3gpp, audio/mpeg, audio/x-ms-wma, audio/x-ms-wma, audio/x-ms-wma, audio/x-ms-wma, audio/x-ms-wma, audio/mp4, audio/mp4, audio/mp4, audio/3gpp, audio/mp4, audio/mp4, audio/L16, image/jpeg, video/avi, video/divx, video/x-matroska, video/mpeg, video/mp4, video/x-ms-wmv, video/x-msvideo, video/x-flv, video/x-tivo-mpeg, video/quicktime, audio/mp4, audio/x-wav, audio/x-flac, application/ogg] -[Main #4 (225) ] INFO - 0:00:01.996 - task: end, 12ms: MediaServer-FetchSupportedMimeType -[cling-14 (218) ] INFO - 0:00:02.152 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.200:49152/uuid-c110358f-d885-b44a-d6d3-dca6329ead0d/description.xml -[main (2) ] INFO - 0:00:02.203 - inspecting new device: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:00:02.203 - pizzicato-Music-mediaserver: No product service found -[main (2) ] WARNING - 0:00:02.204 - pizzicato-Music-mediaserver: no RenderingControl service found -[main (2) ] INFO - 0:00:02.204 - pizzicato-Music-mediaserver: constructed successfully -[Main #4 (225) ] INFO - 0:00:02.204 - task: start: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:02.205 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:00:02.205 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:00:02.205 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:00:02.206 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:00:02.206 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:00:02.207 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:02.207 - found Media Server: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:00:02.208 - .c : - - Manufacturer: lesbonscomptes.com/upmpdcli - Model name: Upmpdcli Media Server - UDN: c110358f-d885-b44a-d6d3-dca6329ead0d - -[Main #4: MediaServer-FetchSupportedMimeT] WARNING - 0:00:02.213 - pizzicato-Music-mediaserver: cannot get ProtocolInfo: null source value -[Main #4 (225) ] INFO - 0:00:02.214 - task: end, 10ms: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:02.222 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:02.222 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:02.224 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:02.267 - onRouteAdded 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:00:02.268 - Glouglou Box: No product service found -[main (2) ] WARNING - 0:00:02.268 - Glouglou Box: no RenderingControl service found -[main (2) ] INFO - 0:00:02.269 - Glouglou Box: url: http://192.168.0.137:8008, device version: 5, model name: JBL Authentics 300, service port: 8009, video out: false, video in: false, audio out: true, audio in: false, multizone group: false -[main (2) ] INFO - 0:00:02.269 - Glouglou Box: no video out support -[main (2) ] INFO - 0:00:02.271 - added renderer: Glouglou Box (ip: 192.168.0.137) -[Main #4 (225) ] INFO - 0:00:02.271 - task: start: ChromecastRenderer-FetchNetworkConnectionType -[main (2) ] INFO - 0:00:02.273 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:02.273 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:02.274 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[Main #4: ChromecastRenderer-FetchNetwork] INFO - 0:00:02.293 - Glouglou Box: ethernet connected: false, isCCwGTV: false -[Main #4 (225) ] INFO - 0:00:02.293 - task: end, 21ms: ChromecastRenderer-FetchNetworkConnectionType -[main (2) ] INFO - 0:00:02.394 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[cling-41 (260) ] INFO - 0:00:02.411 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.34:8096/dlna/526dedec-fde2-4224-bac6-06f7b11711cf/description.xml -[main (2) ] INFO - 0:00:02.445 - inspecting new device: fenice -[main (2) ] INFO - 0:00:02.446 - fenice: No product service found -[main (2) ] WARNING - 0:00:02.446 - fenice: no RenderingControl service found -[main (2) ] INFO - 0:00:02.446 - fenice: constructed successfully -[Main #4 (225) ] INFO - 0:00:02.446 - task: start: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:02.447 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:00:02.447 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:00:02.447 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:00:02.447 - refreshLocalMediaServerLibraryList: added: fenice -[main (2) ] INFO - 0:00:02.447 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:00:02.447 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:00:02.448 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:00:02.448 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:02.449 - found Media Server: fenice -[main (2) ] INFO - 0:00:02.449 - .c : - - Manufacturer: Jellyfin - Manufacturer URL: https://github.com/jellyfin/jellyfin - Model name: Jellyfin Server - Model description: UPnP/AV 1.0 Compliant Media Server - Model number: 01 - Model URL: https://github.com/jellyfin/jellyfin - Presentation URL: http://192.168.0.34:8096/web/index.html - Serial number: 526dedecfde24224bac606f7b11711cf - UDN: 526dedec-fde2-4224-bac6-06f7b11711cf - -[main (2) ] INFO - 0:00:02.455 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:02.456 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:02.457 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[Main #4: MediaServer-FetchSupportedMimeT] INFO - 0:00:02.469 - fenice supported mime-types: [video/mpeg, video/mp4, video/vnd.dlna.mpeg-tts, video/avi, video/x-matroska, video/x-ms-wmv, video/wtv, audio/mpeg, audio/mp3, audio/mp4, audio/x-ms-wma, audio/wav, audio/L16, image/jpeg, image/png, image/gif, image/tiff] -[Main #4 (225) ] INFO - 0:00:02.469 - task: end, 24ms: MediaServer-FetchSupportedMimeType -[main (2) ] INFO - 0:00:03.406 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:00:04.403 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:00:05.410 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[pool-13-thread-1 (267) ] INFO - 0:00:06.20 - ProfileInstaller: Compiled with profile -[main (2) ] INFO - 0:00:06.133 - onPause()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:06.133 - removed listener: 3 listeners -[main (2) ] INFO - 0:00:06.135 - onResume()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:06.135 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:00:06.135 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) -[main (2) ] INFO - 0:00:06.136 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:00:06.137 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:00:06.143 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:06.145 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:08.650 - path = [server://63623ff4-ee41-4850-90aa-2d39395df981] -[main (2) ] INFO - 0:00:08.651 - active media server: PMOMusic Media Server -[main (2) ] INFO - 0:00:08.652 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:08.653 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:00:08.654 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:08.654 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:00:08.655 - positionStack: [8] -[main (2) ] INFO - 0:00:08.655 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:00:08.655 - containerPath: [] -[AsyncTask #1 (187) ] INFO - 0:00:08.658 - BrowseTask.doInBackground(): enter -[main (2) ] INFO - 0:00:08.658 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[AsyncTask #1 (187) ] INFO - 0:00:08.658 - BrowseTask.doInBackground(): loading container 'PMOMusic Media Server' -[main (2) ] INFO - 0:00:08.659 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:08.673 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:08.674 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:08.674 - loaded file 63623ff4-ee41-4850-90aa-2d39395df981-Bookmarks ok: 0 items, 0 ms -[main (2) ] INFO - 0:00:08.675 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:00:08.675 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:00:08.676 - sorted 2 items took: 0 ms -[AsyncTask #1 (187) ] INFO - 0:00:08.677 - finished browsing: got 4 objects -[AsyncTask #1 (187) ] INFO - 0:00:08.677 - BrowseTask.doInBackground(): no item -[main (2) ] INFO - 0:00:08.686 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:08.687 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:11.649 - path = [radio-paradise:channel:mellow] -[main (2) ] INFO - 0:00:11.651 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:11.651 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:00:11.652 - positionStack: [0] -[main (2) ] INFO - 0:00:11.652 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:00:11.652 - containerPath: [radio-paradise:channel:mellow] -[AsyncTask #1 (187) ] INFO - 0:00:11.654 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:00:11.655 - BrowseTask.doInBackground(): loading container 'Mellow Mix' -[main (2) ] INFO - 0:00:11.660 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:11.661 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[Main #4 (225) ] INFO - 0:00:11.686 - task: start: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:00:11.686 - finished browsing: got 2 objects -[AsyncTask #1 (187) ] INFO - 0:00:11.687 - BrowseTask.doInBackground(): no item -[Main #4: extractItemsMetadata (225) ] INFO - 0:00:11.687 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #1 (268) ] INFO - 0:00:11.688 - task: start: Item #0 -[MetadataExtract #1: Item #0 (268) ] INFO - 0:00:11.689 - AbstractMediaMetadataRetriever: file cache enabled: true -[MetadataExtract #1: Item #0 (268) ] INFO - 0:00:11.691 - FfmpegMediaMetadataRetriever: hash=-435748687: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Every Dawn’s a Mountain","100000":"false","2":"Tamino","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","8":"2025"} -[MetadataExtract #1 (268) ] INFO - 0:00:11.692 - task: end, 4ms: Item #0 -[Main #4: extractItemsMetadata (225) ] INFO - 0:00:11.692 - task: executor 'MetadataExtract #%d': close took 5 ms -[Main #4 (225) ] INFO - 0:00:11.693 - task: end, 7ms: extractItemsMetadata -[main (2) ] INFO - 0:00:11.693 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:11.695 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:12.627 - path = [radio-paradise:channel:mellow, radio-paradise:channel:mellow:history] -[main (2) ] INFO - 0:00:12.628 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:12.629 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:00:12.629 - positionStack: [0, 0] -[main (2) ] INFO - 0:00:12.629 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:00:12.630 - containerPath: [radio-paradise:channel:mellow, radio-paradise:channel:mellow:history] -[main (2) ] INFO - 0:00:12.633 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[AsyncTask #1 (187) ] INFO - 0:00:12.633 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:00:12.634 - BrowseTask.doInBackground(): loading container 'Mellow Mix - History' -[main (2) ] INFO - 0:00:12.634 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[Main #4 (225) ] INFO - 0:00:12.737 - task: start: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:00:12.737 - finished browsing: got 48 objects -[AsyncTask #1 (187) ] INFO - 0:00:12.738 - BrowseTask.doInBackground(): no item -[MetadataExtract #2 (270) ] INFO - 0:00:12.740 - task: start: Item #1 -[MetadataExtract #1 (269) ] INFO - 0:00:12.740 - task: start: Item #0 -[MetadataExtract #3 (271) ] INFO - 0:00:12.741 - task: start: Item #2 -[MetadataExtract #4 (272) ] INFO - 0:00:12.741 - task: start: Item #3 -[MetadataExtract #8 (276) ] INFO - 0:00:12.743 - task: start: Item #7 -[Main #4: extractItemsMetadata (225) ] INFO - 0:00:12.742 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #7 (275) ] INFO - 0:00:12.743 - task: start: Item #6 -[MetadataExtract #5 (273) ] INFO - 0:00:12.742 - task: start: Item #4 -[MetadataExtract #6 (274) ] INFO - 0:00:12.742 - task: start: Item #5 -[MetadataExtract #2: Item #1 (270) ] INFO - 0:00:12.743 - FfmpegMediaMetadataRetriever: hash=-1913648982: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Aukai","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Slow Sun","39":"16","9":"206810"} -[main (2) ] INFO - 0:00:12.745 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[MetadataExtract #2 (270) ] INFO - 0:00:12.746 - task: end, 6ms: Item #1 -[MetadataExtract #2 (270) ] INFO - 0:00:12.746 - task: start: Item #8 -[main (2) ] INFO - 0:00:12.747 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[MetadataExtract #2: Item #8 (270) ] INFO - 0:00:12.753 - FfmpegMediaMetadataRetriever: hash=724650897: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Peter Gabriel","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Book of Love","39":"16","9":"216972"} -[MetadataExtract #2 (270) ] INFO - 0:00:12.753 - task: end, 6ms: Item #8 -[MetadataExtract #2 (270) ] INFO - 0:00:12.753 - task: start: Item #9 -[MetadataExtract #3: Item #2 (271) ] INFO - 0:00:12.755 - FfmpegMediaMetadataRetriever: hash=-106913403: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Diana Krall","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Fly Me to the Moon","39":"16","9":"328724"} -[MetadataExtract #3 (271) ] INFO - 0:00:12.756 - task: end, 15ms: Item #2 -[MetadataExtract #3 (271) ] INFO - 0:00:12.756 - task: start: Item #10 -[MetadataExtract #4: Item #3 (272) ] INFO - 0:00:12.758 - FfmpegMediaMetadataRetriever: hash=1993842102: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Mighty Rootsmen","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Won\u0027t Back Down","39":"16","9":"156594"} -[MetadataExtract #4 (272) ] INFO - 0:00:12.758 - task: end, 18ms: Item #3 -[MetadataExtract #4 (272) ] INFO - 0:00:12.759 - task: start: Item #11 -[MetadataExtract #8: Item #7 (276) ] INFO - 0:00:12.759 - FfmpegMediaMetadataRetriever: hash=42813812: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"I Am Kloot","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Let Them All In","39":"16","9":"231290"} -[MetadataExtract #8 (276) ] INFO - 0:00:12.760 - task: end, 17ms: Item #7 -[MetadataExtract #8 (276) ] INFO - 0:00:12.760 - task: start: Item #12 -[MetadataExtract #7: Item #6 (275) ] INFO - 0:00:12.761 - FfmpegMediaMetadataRetriever: hash=-962027383: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Ayla Nereo","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Ylva","39":"16","9":"289409"} -[MetadataExtract #7 (275) ] INFO - 0:00:12.762 - task: end, 19ms: Item #6 -[MetadataExtract #7 (275) ] INFO - 0:00:12.763 - task: start: Item #13 -[MetadataExtract #5: Item #4 (273) ] INFO - 0:00:12.763 - FfmpegMediaMetadataRetriever: hash=-407518392: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Josh Ritter","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Curse","39":"16","9":"292250"} -[MetadataExtract #5 (273) ] INFO - 0:00:12.764 - task: end, 22ms: Item #4 -[MetadataExtract #5 (273) ] INFO - 0:00:12.764 - task: start: Item #14 -[MetadataExtract #6: Item #5 (274) ] INFO - 0:00:12.766 - FfmpegMediaMetadataRetriever: hash=-1138992005: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Michael Hedges","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Prelude to Cello Suite #1 (JS Bach)","39":"16","9":"139943"} -[MetadataExtract #6 (274) ] INFO - 0:00:12.766 - task: end, 24ms: Item #5 -[MetadataExtract #6 (274) ] INFO - 0:00:12.766 - task: start: Item #15 -[MetadataExtract #1: Item #0 (269) ] INFO - 0:00:12.767 - FfmpegMediaMetadataRetriever: hash=-1759650642: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O\u0027Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Dancing Lessons","39":"16","9":"249470"} -[MetadataExtract #1 (269) ] INFO - 0:00:12.768 - task: end, 28ms: Item #0 -[MetadataExtract #1 (269) ] INFO - 0:00:12.768 - task: start: Item #16 -[MetadataExtract #2: Item #9 (270) ] INFO - 0:00:12.769 - FfmpegMediaMetadataRetriever: hash=277540764: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Foo Fighters","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Still","39":"16","9":"310800"} -[MetadataExtract #2 (270) ] INFO - 0:00:12.769 - task: end, 15ms: Item #9 -[MetadataExtract #2 (270) ] INFO - 0:00:12.769 - task: start: Item #17 -[MetadataExtract #3: Item #10 (271) ] INFO - 0:00:12.772 - FfmpegMediaMetadataRetriever: hash=1612634984: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"5050"} -[MetadataExtract #3 (271) ] INFO - 0:00:12.773 - task: end, 17ms: Item #10 -[MetadataExtract #3 (271) ] INFO - 0:00:12.773 - task: start: Item #18 -[MetadataExtract #4: Item #11 (272) ] INFO - 0:00:12.776 - FfmpegMediaMetadataRetriever: hash=1385248911: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Billy Bragg \u0026 Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"When The Roses Bloom Again","39":"16","9":"246000"} -[MetadataExtract #4 (272) ] INFO - 0:00:12.777 - task: end, 18ms: Item #11 -[MetadataExtract #4 (272) ] INFO - 0:00:12.778 - task: start: Item #19 -[MetadataExtract #8: Item #12 (276) ] INFO - 0:00:12.778 - FfmpegMediaMetadataRetriever: hash=-352088410: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Suzanne Vega","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"12 Mortal Men","39":"16","9":"157000"} -[MetadataExtract #8 (276) ] INFO - 0:00:12.779 - task: end, 19ms: Item #12 -[MetadataExtract #8 (276) ] INFO - 0:00:12.779 - task: start: Item #20 -[MetadataExtract #7: Item #13 (275) ] INFO - 0:00:12.782 - FfmpegMediaMetadataRetriever: hash=1891231045: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Sundays","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wild Horses","39":"16","9":"277000"} -[MetadataExtract #7 (275) ] INFO - 0:00:12.783 - task: end, 21ms: Item #13 -[MetadataExtract #7 (275) ] INFO - 0:00:12.784 - task: start: Item #21 -[MetadataExtract #5: Item #14 (273) ] INFO - 0:00:12.784 - FfmpegMediaMetadataRetriever: hash=-1053255835: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tim Buckley","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Happy Time","39":"16","9":"190000"} -[MetadataExtract #5 (273) ] INFO - 0:00:12.785 - task: end, 20ms: Item #14 -[MetadataExtract #5 (273) ] INFO - 0:00:12.785 - task: start: Item #22 -[MetadataExtract #7: Item #21 (275) ] INFO - 0:00:12.785 - FfmpegMediaMetadataRetriever: hash=1757379569: expensive op: retrieveMetadata -[MetadataExtract #1: Item #16 (269) ] INFO - 0:00:12.785 - FfmpegMediaMetadataRetriever: hash=-1783977340: expensive op: retrieveMetadata -[MetadataExtract #2: Item #17 (270) ] INFO - 0:00:12.786 - FfmpegMediaMetadataRetriever: hash=1845475776: expensive op: retrieveMetadata -[MetadataExtract #3: Item #18 (271) ] INFO - 0:00:12.786 - FfmpegMediaMetadataRetriever: hash=1710638978: expensive op: retrieveMetadata -[MetadataExtract #4: Item #19 (272) ] INFO - 0:00:12.787 - FfmpegMediaMetadataRetriever: hash=-894762509: expensive op: retrieveMetadata -[MetadataExtract #8: Item #20 (276) ] INFO - 0:00:12.788 - FfmpegMediaMetadataRetriever: hash=-993423853: expensive op: retrieveMetadata -[MetadataExtract #6: Item #15 (274) ] INFO - 0:00:12.790 - FfmpegMediaMetadataRetriever: hash=1003137573: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Trespassers William","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Different Stars","39":"16","9":"278647"} -[MetadataExtract #6 (274) ] INFO - 0:00:12.791 - task: end, 24ms: Item #15 -[MetadataExtract #6 (274) ] INFO - 0:00:12.791 - task: start: Item #23 -[MetadataExtract #5: Item #22 (273) ] INFO - 0:00:12.791 - FfmpegMediaMetadataRetriever: hash=-395410295: expensive op: retrieveMetadata -[MetadataExtract #6: Item #23 (274) ] INFO - 0:00:12.792 - FfmpegMediaMetadataRetriever: hash=-2056388036: expensive op: retrieveMetadata -[MetadataExtract #4: Item #19 (272) ] INFO - 0:00:12.818 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/f0b1544d237f5347612a7f7832f8f1ac -[MetadataExtract #1: Item #16 (269) ] INFO - 0:00:12.820 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/2ad68dd550b16313027271cb63d9153b -[MetadataExtract #8: Item #20 (276) ] INFO - 0:00:12.837 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/aa7e068ebfa7f443972ab1b72cffc3a8 -[MetadataExtract #7: Item #21 (275) ] INFO - 0:00:12.848 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/508871fecdd0d94347006d53b427111e -[MetadataExtract #5: Item #22 (273) ] INFO - 0:00:12.852 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/ca41892cc7c2b2298f6eff806ba2399a -[MetadataExtract #3: Item #18 (271) ] INFO - 0:00:12.852 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/82dc11173748da450c8bdb1067b00bbb -[MetadataExtract #6: Item #23 (274) ] INFO - 0:00:12.854 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/c8befc1539c774548f106f2f5ea6c4bf -[MetadataExtract #2: Item #17 (270) ] INFO - 0:00:12.854 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/67c92e72e18e489dee64f769588cb1ce -[MetadataExtract #4: Item #19 (272) ] INFO - 0:00:13.53 - ffprobe finished -[MetadataExtract #4: Item #19 (272) ] INFO - 0:00:13.54 - ffprobe took: 241 ms -[MetadataExtract #4: Item #19 (272) ] INFO - 0:00:13.54 - added cached probe info for http://192.168.0.138:8080/audio/flac/f0b1544d237f5347612a7f7832f8f1ac_null_, expires in 8 seconds -[MetadataExtract #4: Item #19 (272) ] INFO - 0:00:13.54 - FfmpegMediaMetadataRetriever: hash=-894762509: retrieveMetadata took: 268 ms -[MetadataExtract #4: Item #19 (272) ] INFO - 0:00:13.55 - FfmpegMediaMetadataRetriever: hash=-894762509: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"8516"} -[MetadataExtract #4 (272) ] INFO - 0:00:13.56 - task: end, 278ms: Item #19 -[MetadataExtract #4 (272) ] INFO - 0:00:13.56 - task: start: Item #24 -[MetadataExtract #4: Item #24 (272) ] INFO - 0:00:13.56 - FfmpegMediaMetadataRetriever: hash=1899042957: expensive op: retrieveMetadata -[MetadataExtract #4: Item #24 (272) ] INFO - 0:00:13.88 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/43c48c8e99e74c18b5b404eb388dce24 -[MetadataExtract #7: Item #21 (275) ] INFO - 0:00:13.135 - ffprobe finished -[MetadataExtract #7: Item #21 (275) ] INFO - 0:00:13.135 - ffprobe took: 307 ms -[MetadataExtract #7: Item #21 (275) ] INFO - 0:00:13.136 - added cached probe info for http://192.168.0.138:8080/audio/flac/508871fecdd0d94347006d53b427111e_null_, expires in 235 seconds -[MetadataExtract #7: Item #21 (275) ] INFO - 0:00:13.136 - FfmpegMediaMetadataRetriever: hash=1757379569: retrieveMetadata took: 351 ms -[MetadataExtract #7: Item #21 (275) ] INFO - 0:00:13.137 - FfmpegMediaMetadataRetriever: hash=1757379569: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Cactus Blossoms","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Mississippi","39":"16","9":"235634"} -[MetadataExtract #7 (275) ] INFO - 0:00:13.138 - task: end, 354ms: Item #21 -[MetadataExtract #7 (275) ] INFO - 0:00:13.139 - task: start: Item #25 -[MetadataExtract #7: Item #25 (275) ] INFO - 0:00:13.140 - FfmpegMediaMetadataRetriever: hash=-524282951: expensive op: retrieveMetadata -[MetadataExtract #7: Item #25 (275) ] INFO - 0:00:13.185 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/2dc9f632f96001db6f6e0c714e61ea00 -[MetadataExtract #3: Item #18 (271) ] INFO - 0:00:13.198 - ffprobe finished -[MetadataExtract #3: Item #18 (271) ] INFO - 0:00:13.201 - ffprobe took: 360 ms -[MetadataExtract #3: Item #18 (271) ] INFO - 0:00:13.202 - added cached probe info for http://192.168.0.138:8080/audio/flac/82dc11173748da450c8bdb1067b00bbb_null_, expires in 249 seconds -[MetadataExtract #3: Item #18 (271) ] INFO - 0:00:13.203 - FfmpegMediaMetadataRetriever: hash=1710638978: retrieveMetadata took: 417 ms -[MetadataExtract #3: Item #18 (271) ] INFO - 0:00:13.205 - FfmpegMediaMetadataRetriever: hash=1710638978: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O’Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Back Where You Belong","39":"16","9":"249150"} -[MetadataExtract #3 (271) ] INFO - 0:00:13.206 - task: end, 432ms: Item #18 -[MetadataExtract #3 (271) ] INFO - 0:00:13.207 - task: start: Item #26 -[MetadataExtract #3: Item #26 (271) ] INFO - 0:00:13.209 - FfmpegMediaMetadataRetriever: hash=687172484: expensive op: retrieveMetadata -[MetadataExtract #2: Item #17 (270) ] INFO - 0:00:13.251 - ffprobe finished -[MetadataExtract #2: Item #17 (270) ] INFO - 0:00:13.251 - ffprobe took: 414 ms -[MetadataExtract #2: Item #17 (270) ] INFO - 0:00:13.252 - added cached probe info for http://192.168.0.138:8080/audio/flac/67c92e72e18e489dee64f769588cb1ce_null_, expires in 320 seconds -[MetadataExtract #2: Item #17 (270) ] INFO - 0:00:13.252 - FfmpegMediaMetadataRetriever: hash=1845475776: retrieveMetadata took: 466 ms -[MetadataExtract #2: Item #17 (270) ] INFO - 0:00:13.253 - FfmpegMediaMetadataRetriever: hash=1845475776: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Bruce Cockburn","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wondering Where the Lions Are (Live)","39":"16","9":"320000"} -[MetadataExtract #2 (270) ] INFO - 0:00:13.254 - task: end, 484ms: Item #17 -[MetadataExtract #2 (270) ] INFO - 0:00:13.254 - task: start: Item #27 -[MetadataExtract #2: Item #27 (270) ] INFO - 0:00:13.254 - FfmpegMediaMetadataRetriever: hash=131303568: expensive op: retrieveMetadata -[MetadataExtract #5: Item #22 (273) ] INFO - 0:00:13.258 - ffprobe finished -[MetadataExtract #5: Item #22 (273) ] INFO - 0:00:13.258 - ffprobe took: 419 ms -[MetadataExtract #5: Item #22 (273) ] INFO - 0:00:13.259 - added cached probe info for http://192.168.0.138:8080/audio/flac/ca41892cc7c2b2298f6eff806ba2399a_null_, expires in 211 seconds -[MetadataExtract #5: Item #22 (273) ] INFO - 0:00:13.259 - FfmpegMediaMetadataRetriever: hash=-395410295: retrieveMetadata took: 467 ms -[MetadataExtract #5: Item #22 (273) ] INFO - 0:00:13.260 - FfmpegMediaMetadataRetriever: hash=-395410295: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sierra Ferrell","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Don’t Let Your Deal Go Down","39":"16","9":"211710"} -[MetadataExtract #5 (273) ] INFO - 0:00:13.260 - task: end, 475ms: Item #22 -[MetadataExtract #5 (273) ] INFO - 0:00:13.261 - task: start: Item #28 -[MetadataExtract #5: Item #28 (273) ] INFO - 0:00:13.261 - FfmpegMediaMetadataRetriever: hash=485794117: expensive op: retrieveMetadata -[MetadataExtract #3: Item #26 (271) ] INFO - 0:00:13.264 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/d5b6f3e1ccc8f4828ca2dc0efd69b987 -[MetadataExtract #2: Item #27 (270) ] INFO - 0:00:13.297 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/6ea1402e7b33ffb328887cb914d51778 -[MetadataExtract #8: Item #20 (276) ] INFO - 0:00:13.304 - ffprobe finished -[MetadataExtract #8: Item #20 (276) ] INFO - 0:00:13.305 - ffprobe took: 472 ms -[MetadataExtract #8: Item #20 (276) ] INFO - 0:00:13.305 - added cached probe info for http://192.168.0.138:8080/audio/flac/aa7e068ebfa7f443972ab1b72cffc3a8_null_, expires in 202 seconds -[MetadataExtract #8: Item #20 (276) ] INFO - 0:00:13.306 - FfmpegMediaMetadataRetriever: hash=-993423853: retrieveMetadata took: 518 ms -[MetadataExtract #5: Item #28 (273) ] INFO - 0:00:13.305 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/ffda328ef818229238661ec37ff37956 -[MetadataExtract #8: Item #20 (276) ] INFO - 0:00:13.307 - FfmpegMediaMetadataRetriever: hash=-993423853: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"R.E.M.","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Perfect Circle","39":"16","9":"202700"} -[MetadataExtract #8 (276) ] INFO - 0:00:13.307 - task: end, 527ms: Item #20 -[MetadataExtract #8 (276) ] INFO - 0:00:13.307 - task: start: Item #29 -[MetadataExtract #8: Item #29 (276) ] INFO - 0:00:13.308 - FfmpegMediaMetadataRetriever: hash=-775299294: expensive op: retrieveMetadata -[MetadataExtract #1: Item #16 (269) ] INFO - 0:00:13.348 - ffprobe finished -[MetadataExtract #1: Item #16 (269) ] INFO - 0:00:13.349 - ffprobe took: 534 ms -[MetadataExtract #1: Item #16 (269) ] INFO - 0:00:13.349 - added cached probe info for http://192.168.0.138:8080/audio/flac/2ad68dd550b16313027271cb63d9153b_null_, expires in 260 seconds -[MetadataExtract #1: Item #16 (269) ] INFO - 0:00:13.350 - FfmpegMediaMetadataRetriever: hash=-1783977340: retrieveMetadata took: 565 ms -[MetadataExtract #1: Item #16 (269) ] INFO - 0:00:13.350 - FfmpegMediaMetadataRetriever: hash=-1783977340: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"David Gray","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"260750"} -[MetadataExtract #1 (269) ] INFO - 0:00:13.351 - task: end, 583ms: Item #16 -[MetadataExtract #1 (269) ] INFO - 0:00:13.351 - task: start: Item #30 -[MetadataExtract #1: Item #30 (269) ] INFO - 0:00:13.352 - FfmpegMediaMetadataRetriever: hash=-1561902046: expensive op: retrieveMetadata -[MetadataExtract #8: Item #29 (276) ] INFO - 0:00:13.357 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/497c78b081943f22c0b7a2861e0bb35f -[MetadataExtract #6: Item #23 (274) ] INFO - 0:00:13.379 - ffprobe finished -[MetadataExtract #6: Item #23 (274) ] INFO - 0:00:13.380 - ffprobe took: 537 ms -[MetadataExtract #6: Item #23 (274) ] INFO - 0:00:13.380 - added cached probe info for http://192.168.0.138:8080/audio/flac/c8befc1539c774548f106f2f5ea6c4bf_null_, expires in 231 seconds -[MetadataExtract #6: Item #23 (274) ] INFO - 0:00:13.381 - FfmpegMediaMetadataRetriever: hash=-2056388036: retrieveMetadata took: 589 ms -[MetadataExtract #6: Item #23 (274) ] INFO - 0:00:13.383 - FfmpegMediaMetadataRetriever: hash=-2056388036: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Norah Jones","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Light as a Feather","39":"16","9":"231305"} -[MetadataExtract #6 (274) ] INFO - 0:00:13.384 - task: end, 593ms: Item #23 -[MetadataExtract #6 (274) ] INFO - 0:00:13.384 - task: start: Item #31 -[MetadataExtract #6: Item #31 (274) ] INFO - 0:00:13.385 - FfmpegMediaMetadataRetriever: hash=1402956451: expensive op: retrieveMetadata -[MetadataExtract #1: Item #30 (269) ] INFO - 0:00:13.390 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/e87aa42bc2f5632ebdf983a47b90d4fc -[MetadataExtract #4: Item #24 (272) ] INFO - 0:00:13.402 - ffprobe finished -[MetadataExtract #4: Item #24 (272) ] INFO - 0:00:13.402 - ffprobe took: 321 ms -[MetadataExtract #4: Item #24 (272) ] INFO - 0:00:13.402 - added cached probe info for http://192.168.0.138:8080/audio/flac/43c48c8e99e74c18b5b404eb388dce24_null_, expires in 182 seconds -[MetadataExtract #4: Item #24 (272) ] INFO - 0:00:13.403 - FfmpegMediaMetadataRetriever: hash=1899042957: retrieveMetadata took: 347 ms -[MetadataExtract #4: Item #24 (272) ] INFO - 0:00:13.404 - FfmpegMediaMetadataRetriever: hash=1899042957: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"London Grammar","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Shyer","39":"16","9":"182000"} -[MetadataExtract #4 (272) ] INFO - 0:00:13.404 - task: end, 348ms: Item #24 -[MetadataExtract #4 (272) ] INFO - 0:00:13.405 - task: start: Item #32 -[MetadataExtract #4: Item #32 (272) ] INFO - 0:00:13.405 - FfmpegMediaMetadataRetriever: hash=1984356975: expensive op: retrieveMetadata -[MetadataExtract #6: Item #31 (274) ] INFO - 0:00:13.424 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/77d393f256c7d2b397d9af5c8504596c -[MetadataExtract #4: Item #32 (272) ] INFO - 0:00:13.442 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/069ef589ce1d9621a87afb28e7fa658c -[MetadataExtract #7: Item #25 (275) ] INFO - 0:00:13.575 - ffprobe finished -[MetadataExtract #7: Item #25 (275) ] INFO - 0:00:13.577 - ffprobe took: 395 ms -[MetadataExtract #7: Item #25 (275) ] INFO - 0:00:13.578 - added cached probe info for http://192.168.0.138:8080/audio/flac/2dc9f632f96001db6f6e0c714e61ea00_null_, expires in 114 seconds -[MetadataExtract #7: Item #25 (275) ] INFO - 0:00:13.579 - FfmpegMediaMetadataRetriever: hash=-524282951: retrieveMetadata took: 439 ms -[MetadataExtract #7: Item #25 (275) ] INFO - 0:00:13.581 - FfmpegMediaMetadataRetriever: hash=-524282951: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Meyer, Douglas \u0026 Barenberg","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Hymn Of Ordinary Motion","39":"16","9":"114000"} -[MetadataExtract #7 (275) ] INFO - 0:00:13.582 - task: end, 443ms: Item #25 -[MetadataExtract #7 (275) ] INFO - 0:00:13.582 - task: start: Item #33 -[MetadataExtract #7: Item #33 (275) ] INFO - 0:00:13.584 - FfmpegMediaMetadataRetriever: hash=1977966954: expensive op: retrieveMetadata -[MetadataExtract #7: Item #33 (275) ] INFO - 0:00:13.629 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/ef96c7fc42def2977a9963e2d4e892ff -[MetadataExtract #5: Item #28 (273) ] INFO - 0:00:13.638 - ffprobe finished -[MetadataExtract #5: Item #28 (273) ] INFO - 0:00:13.638 - ffprobe took: 335 ms -[MetadataExtract #5: Item #28 (273) ] INFO - 0:00:13.639 - added cached probe info for http://192.168.0.138:8080/audio/flac/ffda328ef818229238661ec37ff37956_null_, expires in 325 seconds -[MetadataExtract #5: Item #28 (273) ] INFO - 0:00:13.639 - FfmpegMediaMetadataRetriever: hash=485794117: retrieveMetadata took: 378 ms -[MetadataExtract #5: Item #28 (273) ] INFO - 0:00:13.640 - FfmpegMediaMetadataRetriever: hash=485794117: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tracy Chapman","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"New Beginning","39":"16","9":"325000"} -[MetadataExtract #5 (273) ] INFO - 0:00:13.640 - task: end, 379ms: Item #28 -[MetadataExtract #5 (273) ] INFO - 0:00:13.640 - task: start: Item #34 -[MetadataExtract #5: Item #34 (273) ] INFO - 0:00:13.641 - FfmpegMediaMetadataRetriever: hash=1475446356: expensive op: retrieveMetadata -[MetadataExtract #5: Item #34 (273) ] INFO - 0:00:13.674 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/4d69f84b74a86795a52fcb73c3800af8 -[MetadataExtract #2: Item #27 (270) ] INFO - 0:00:13.748 - ffprobe finished -[MetadataExtract #2: Item #27 (270) ] INFO - 0:00:13.750 - ffprobe took: 457 ms -[MetadataExtract #2: Item #27 (270) ] INFO - 0:00:13.751 - added cached probe info for http://192.168.0.138:8080/audio/flac/6ea1402e7b33ffb328887cb914d51778_null_, expires in 199 seconds -[MetadataExtract #2: Item #27 (270) ] INFO - 0:00:13.751 - FfmpegMediaMetadataRetriever: hash=131303568: retrieveMetadata took: 497 ms -[MetadataExtract #2: Item #27 (270) ] INFO - 0:00:13.753 - FfmpegMediaMetadataRetriever: hash=131303568: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Neko Case","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Buckets of Rain","39":"16","9":"199000"} -[MetadataExtract #2 (270) ] INFO - 0:00:13.754 - task: end, 500ms: Item #27 -[MetadataExtract #2 (270) ] INFO - 0:00:13.755 - task: start: Item #35 -[MetadataExtract #2: Item #35 (270) ] INFO - 0:00:13.756 - FfmpegMediaMetadataRetriever: hash=1109877331: expensive op: retrieveMetadata -[MetadataExtract #3: Item #26 (271) ] INFO - 0:00:13.793 - ffprobe finished -[MetadataExtract #3: Item #26 (271) ] INFO - 0:00:13.798 - ffprobe took: 540 ms -[MetadataExtract #3: Item #26 (271) ] INFO - 0:00:13.805 - added cached probe info for http://192.168.0.138:8080/audio/flac/d5b6f3e1ccc8f4828ca2dc0efd69b987_null_, expires in 229 seconds -[MetadataExtract #3: Item #26 (271) ] INFO - 0:00:13.806 - FfmpegMediaMetadataRetriever: hash=687172484: retrieveMetadata took: 597 ms -[MetadataExtract #8: Item #29 (276) ] INFO - 0:00:13.808 - ffprobe finished -[MetadataExtract #2: Item #35 (270) ] INFO - 0:00:13.809 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/667f1ebbc85d6440a7ff4afb9a527b89 -[MetadataExtract #8: Item #29 (276) ] INFO - 0:00:13.809 - ffprobe took: 463 ms -[MetadataExtract #8: Item #29 (276) ] INFO - 0:00:13.811 - added cached probe info for http://192.168.0.138:8080/audio/flac/497c78b081943f22c0b7a2861e0bb35f_null_, expires in 188 seconds -[MetadataExtract #3: Item #26 (271) ] INFO - 0:00:13.808 - FfmpegMediaMetadataRetriever: hash=687172484: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tom Waits","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Heart of Saturday Night","39":"16","9":"229000"} -[MetadataExtract #8: Item #29 (276) ] INFO - 0:00:13.812 - FfmpegMediaMetadataRetriever: hash=-775299294: retrieveMetadata took: 504 ms -[MetadataExtract #3 (271) ] INFO - 0:00:13.813 - task: end, 605ms: Item #26 -[MetadataExtract #8: Item #29 (276) ] INFO - 0:00:13.818 - FfmpegMediaMetadataRetriever: hash=-775299294: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Blind Faith","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Can\u0027t Find My Way Home","39":"16","9":"188500"} -[MetadataExtract #8 (276) ] INFO - 0:00:13.819 - task: end, 511ms: Item #29 -[MetadataExtract #8 (276) ] INFO - 0:00:13.819 - task: start: Item #37 -[MetadataExtract #8: Item #37 (276) ] INFO - 0:00:13.822 - FfmpegMediaMetadataRetriever: hash=496599921: expensive op: retrieveMetadata -[MetadataExtract #3 (271) ] INFO - 0:00:13.813 - task: start: Item #36 -[MetadataExtract #3: Item #36 (271) ] INFO - 0:00:13.831 - FfmpegMediaMetadataRetriever: hash=-2093135018: expensive op: retrieveMetadata -[MetadataExtract #8: Item #37 (276) ] INFO - 0:00:13.867 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/a8f5995175f02b30b884ec3324c831a4 -[MetadataExtract #3: Item #36 (271) ] INFO - 0:00:13.889 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/d46e57c82ed02a1848e32c0b01f21cb7 -[MetadataExtract #1: Item #30 (269) ] INFO - 0:00:13.895 - ffprobe finished -[MetadataExtract #1: Item #30 (269) ] INFO - 0:00:13.895 - ffprobe took: 512 ms -[MetadataExtract #1: Item #30 (269) ] INFO - 0:00:13.896 - added cached probe info for http://192.168.0.138:8080/audio/flac/e87aa42bc2f5632ebdf983a47b90d4fc_null_, expires in 136 seconds -[MetadataExtract #1: Item #30 (269) ] INFO - 0:00:13.896 - FfmpegMediaMetadataRetriever: hash=-1561902046: retrieveMetadata took: 544 ms -[MetadataExtract #1: Item #30 (269) ] INFO - 0:00:13.897 - FfmpegMediaMetadataRetriever: hash=-1561902046: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Willie Nelson","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Blue Eyes Crying in the Rain","39":"16","9":"136200"} -[MetadataExtract #1 (269) ] INFO - 0:00:13.897 - task: end, 546ms: Item #30 -[MetadataExtract #1 (269) ] INFO - 0:00:13.897 - task: start: Item #38 -[MetadataExtract #1: Item #38 (269) ] INFO - 0:00:13.898 - FfmpegMediaMetadataRetriever: hash=1709432058: expensive op: retrieveMetadata -[MetadataExtract #6: Item #31 (274) ] INFO - 0:00:13.921 - ffprobe finished -[MetadataExtract #6: Item #31 (274) ] INFO - 0:00:13.925 - ffprobe took: 509 ms -[MetadataExtract #6: Item #31 (274) ] INFO - 0:00:13.926 - added cached probe info for http://192.168.0.138:8080/audio/flac/77d393f256c7d2b397d9af5c8504596c_null_, expires in 300 seconds -[MetadataExtract #6: Item #31 (274) ] INFO - 0:00:13.927 - FfmpegMediaMetadataRetriever: hash=1402956451: retrieveMetadata took: 541 ms -[MetadataExtract #6: Item #31 (274) ] INFO - 0:00:13.929 - FfmpegMediaMetadataRetriever: hash=1402956451: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jon Redfern","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Love the Sun","39":"16","9":"300000"} -[MetadataExtract #6 (274) ] INFO - 0:00:13.933 - task: end, 549ms: Item #31 -[MetadataExtract #6 (274) ] INFO - 0:00:13.933 - task: start: Item #39 -[MetadataExtract #6: Item #39 (274) ] INFO - 0:00:13.937 - FfmpegMediaMetadataRetriever: hash=-475084519: expensive op: retrieveMetadata -[MetadataExtract #1: Item #38 (269) ] INFO - 0:00:13.945 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/8122ae21da8da1e762a22dabd9817802 -[MetadataExtract #6: Item #39 (274) ] INFO - 0:00:13.984 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/b71d978c46b591f2211c5834a0e5b902 -[MetadataExtract #4: Item #32 (272) ] INFO - 0:00:14.66 - ffprobe finished -[MetadataExtract #4: Item #32 (272) ] INFO - 0:00:14.67 - ffprobe took: 637 ms -[MetadataExtract #4: Item #32 (272) ] INFO - 0:00:14.67 - added cached probe info for http://192.168.0.138:8080/audio/flac/069ef589ce1d9621a87afb28e7fa658c_null_, expires in 232 seconds -[MetadataExtract #4: Item #32 (272) ] INFO - 0:00:14.67 - FfmpegMediaMetadataRetriever: hash=1984356975: retrieveMetadata took: 661 ms -[MetadataExtract #4: Item #32 (272) ] INFO - 0:00:14.68 - FfmpegMediaMetadataRetriever: hash=1984356975: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cyndi Lauper","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Time After Time","39":"16","9":"232250"} -[MetadataExtract #4 (272) ] INFO - 0:00:14.68 - task: end, 663ms: Item #32 -[MetadataExtract #4 (272) ] INFO - 0:00:14.69 - task: start: Item #40 -[MetadataExtract #4: Item #40 (272) ] INFO - 0:00:14.69 - FfmpegMediaMetadataRetriever: hash=-238367317: expensive op: retrieveMetadata -[MetadataExtract #4: Item #40 (272) ] INFO - 0:00:14.108 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/079e09407590d3c89234f3433280c3e0 -[MetadataExtract #5: Item #34 (273) ] INFO - 0:00:14.168 - ffprobe finished -[MetadataExtract #5: Item #34 (273) ] INFO - 0:00:14.169 - ffprobe took: 498 ms -[MetadataExtract #5: Item #34 (273) ] INFO - 0:00:14.169 - added cached probe info for http://192.168.0.138:8080/audio/flac/4d69f84b74a86795a52fcb73c3800af8_null_, expires in 191 seconds -[MetadataExtract #5: Item #34 (273) ] INFO - 0:00:14.169 - FfmpegMediaMetadataRetriever: hash=1475446356: retrieveMetadata took: 528 ms -[MetadataExtract #5: Item #34 (273) ] INFO - 0:00:14.173 - FfmpegMediaMetadataRetriever: hash=1475446356: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Elephant Revival","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Barefoot Friend","39":"16","9":"191000"} -[MetadataExtract #5 (273) ] INFO - 0:00:14.174 - task: end, 534ms: Item #34 -[MetadataExtract #5 (273) ] INFO - 0:00:14.174 - task: start: Item #41 -[MetadataExtract #5: Item #41 (273) ] INFO - 0:00:14.175 - FfmpegMediaMetadataRetriever: hash=-1032742246: expensive op: retrieveMetadata -[MetadataExtract #5: Item #41 (273) ] INFO - 0:00:14.212 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/1585bae3666307dd663c6f837492dec7 -[MetadataExtract #7: Item #33 (275) ] INFO - 0:00:14.225 - ffprobe finished -[MetadataExtract #7: Item #33 (275) ] INFO - 0:00:14.230 - ffprobe took: 612 ms -[MetadataExtract #7: Item #33 (275) ] INFO - 0:00:14.231 - added cached probe info for http://192.168.0.138:8080/audio/flac/ef96c7fc42def2977a9963e2d4e892ff_null_, expires in 222 seconds -[MetadataExtract #7: Item #33 (275) ] INFO - 0:00:14.231 - FfmpegMediaMetadataRetriever: hash=1977966954: retrieveMetadata took: 647 ms -[MetadataExtract #7: Item #33 (275) ] INFO - 0:00:14.233 - FfmpegMediaMetadataRetriever: hash=1977966954: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Fleetwood Mac","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Walk a Thin Line","39":"16","9":"222000"} -[MetadataExtract #7 (275) ] INFO - 0:00:14.234 - task: end, 651ms: Item #33 -[MetadataExtract #7 (275) ] INFO - 0:00:14.235 - task: start: Item #42 -[MetadataExtract #7: Item #42 (275) ] INFO - 0:00:14.236 - FfmpegMediaMetadataRetriever: hash=2140521498: expensive op: retrieveMetadata -[MetadataExtract #7: Item #42 (275) ] INFO - 0:00:14.293 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/d852d1f210c87200bd68b1429738ca5b -[MetadataExtract #3: Item #36 (271) ] INFO - 0:00:14.443 - ffprobe finished -[MetadataExtract #3: Item #36 (271) ] INFO - 0:00:14.445 - ffprobe took: 572 ms -[MetadataExtract #3: Item #36 (271) ] INFO - 0:00:14.446 - added cached probe info for http://192.168.0.138:8080/audio/flac/d46e57c82ed02a1848e32c0b01f21cb7_null_, expires in 209 seconds -[MetadataExtract #3: Item #36 (271) ] INFO - 0:00:14.449 - FfmpegMediaMetadataRetriever: hash=-2093135018: retrieveMetadata took: 618 ms -[MetadataExtract #3: Item #36 (271) ] INFO - 0:00:14.453 - FfmpegMediaMetadataRetriever: hash=-2093135018: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Shins","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Turn on Me","39":"16","9":"209500"} -[MetadataExtract #3 (271) ] INFO - 0:00:14.455 - task: end, 642ms: Item #36 -[MetadataExtract #2: Item #35 (270) ] INFO - 0:00:14.455 - ffprobe finished -[MetadataExtract #3 (271) ] INFO - 0:00:14.456 - task: start: Item #43 -[MetadataExtract #2: Item #35 (270) ] INFO - 0:00:14.457 - ffprobe took: 662 ms -[MetadataExtract #2: Item #35 (270) ] INFO - 0:00:14.457 - added cached probe info for http://192.168.0.138:8080/audio/flac/667f1ebbc85d6440a7ff4afb9a527b89_null_, expires in 264 seconds -[MetadataExtract #2: Item #35 (270) ] INFO - 0:00:14.457 - FfmpegMediaMetadataRetriever: hash=1109877331: retrieveMetadata took: 701 ms -[MetadataExtract #2: Item #35 (270) ] INFO - 0:00:14.458 - FfmpegMediaMetadataRetriever: hash=1109877331: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Hamilton Leithauser","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Silent Orchestra","39":"16","9":"264060"} -[MetadataExtract #2 (270) ] INFO - 0:00:14.458 - task: end, 704ms: Item #35 -[MetadataExtract #2 (270) ] INFO - 0:00:14.459 - task: start: Item #44 -[MetadataExtract #3: Item #43 (271) ] INFO - 0:00:14.460 - FfmpegMediaMetadataRetriever: hash=-1752918010: expensive op: retrieveMetadata -[MetadataExtract #2: Item #44 (270) ] INFO - 0:00:14.461 - FfmpegMediaMetadataRetriever: hash=152071891: expensive op: retrieveMetadata -[MetadataExtract #8: Item #37 (276) ] INFO - 0:00:14.511 - ffprobe finished -[MetadataExtract #8: Item #37 (276) ] INFO - 0:00:14.511 - ffprobe took: 651 ms -[MetadataExtract #8: Item #37 (276) ] INFO - 0:00:14.512 - added cached probe info for http://192.168.0.138:8080/audio/flac/a8f5995175f02b30b884ec3324c831a4_null_, expires in 204 seconds -[MetadataExtract #8: Item #37 (276) ] INFO - 0:00:14.512 - FfmpegMediaMetadataRetriever: hash=496599921: retrieveMetadata took: 690 ms -[MetadataExtract #8: Item #37 (276) ] INFO - 0:00:14.513 - FfmpegMediaMetadataRetriever: hash=496599921: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Moby","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wait for Me","39":"16","9":"204000"} -[MetadataExtract #8 (276) ] INFO - 0:00:14.513 - task: end, 693ms: Item #37 -[MetadataExtract #8 (276) ] INFO - 0:00:14.513 - task: start: Item #45 -[MetadataExtract #8: Item #45 (276) ] INFO - 0:00:14.514 - FfmpegMediaMetadataRetriever: hash=-731586392: expensive op: retrieveMetadata -[MetadataExtract #2: Item #44 (270) ] INFO - 0:00:14.516 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/f1f31e24b2c730171b8642af0d0bcc04 -[MetadataExtract #3: Item #43 (271) ] INFO - 0:00:14.526 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/ed084a8cd1b7ef2d38d4d8e8e272cc7c -[MetadataExtract #1: Item #38 (269) ] INFO - 0:00:14.531 - ffprobe finished -[MetadataExtract #1: Item #38 (269) ] INFO - 0:00:14.533 - ffprobe took: 595 ms -[MetadataExtract #1: Item #38 (269) ] INFO - 0:00:14.534 - added cached probe info for http://192.168.0.138:8080/audio/flac/8122ae21da8da1e762a22dabd9817802_null_, expires in 289 seconds -[MetadataExtract #1: Item #38 (269) ] INFO - 0:00:14.535 - FfmpegMediaMetadataRetriever: hash=1709432058: retrieveMetadata took: 637 ms -[MetadataExtract #1: Item #38 (269) ] INFO - 0:00:14.538 - FfmpegMediaMetadataRetriever: hash=1709432058: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cocosuma","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Servant","39":"16","9":"289070"} -[MetadataExtract #1 (269) ] INFO - 0:00:14.539 - task: end, 642ms: Item #38 -[MetadataExtract #1 (269) ] INFO - 0:00:14.540 - task: start: Item #46 -[MetadataExtract #1: Item #46 (269) ] INFO - 0:00:14.541 - FfmpegMediaMetadataRetriever: hash=-174877526: expensive op: retrieveMetadata -[MetadataExtract #8: Item #45 (276) ] INFO - 0:00:14.553 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/e5bee29a1067b71f8d96ab7bc592eec7 -[MetadataExtract #1: Item #46 (269) ] INFO - 0:00:14.573 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/8ee666aeb2de061e86fc6d568b5f2a18 -[MetadataExtract #6: Item #39 (274) ] INFO - 0:00:14.635 - ffprobe finished -[MetadataExtract #6: Item #39 (274) ] INFO - 0:00:14.638 - ffprobe took: 661 ms -[MetadataExtract #6: Item #39 (274) ] INFO - 0:00:14.641 - added cached probe info for http://192.168.0.138:8080/audio/flac/b71d978c46b591f2211c5834a0e5b902_null_, expires in 164 seconds -[MetadataExtract #6: Item #39 (274) ] INFO - 0:00:14.648 - FfmpegMediaMetadataRetriever: hash=-475084519: retrieveMetadata took: 711 ms -[MetadataExtract #6: Item #39 (274) ] INFO - 0:00:14.665 - FfmpegMediaMetadataRetriever: hash=-475084519: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimi Hendrix","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Castles Made Of Sand","39":"16","9":"164612"} -[MetadataExtract #6 (274) ] INFO - 0:00:14.671 - task: end, 737ms: Item #39 -[MetadataExtract #6 (274) ] INFO - 0:00:14.674 - task: start: Item #47 -[MetadataExtract #6: Item #47 (274) ] INFO - 0:00:14.680 - FfmpegMediaMetadataRetriever: hash=1850019505: expensive op: retrieveMetadata -[MetadataExtract #6: Item #47 (274) ] INFO - 0:00:14.774 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/4c33e09beef28347ed88555d69adfa0c -[MetadataExtract #4: Item #40 (272) ] INFO - 0:00:14.804 - ffprobe finished -[MetadataExtract #4: Item #40 (272) ] INFO - 0:00:14.806 - ffprobe took: 710 ms -[MetadataExtract #4: Item #40 (272) ] INFO - 0:00:14.808 - added cached probe info for http://192.168.0.138:8080/audio/flac/079e09407590d3c89234f3433280c3e0_null_, expires in 182 seconds -[MetadataExtract #4: Item #40 (272) ] INFO - 0:00:14.809 - FfmpegMediaMetadataRetriever: hash=-238367317: retrieveMetadata took: 740 ms -[MetadataExtract #4: Item #40 (272) ] INFO - 0:00:14.811 - FfmpegMediaMetadataRetriever: hash=-238367317: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Oi Va Voi","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Know What You Are","39":"16","9":"182000"} -[MetadataExtract #4 (272) ] INFO - 0:00:14.834 - task: end, 765ms: Item #40 -[MetadataExtract #5: Item #41 (273) ] INFO - 0:00:14.848 - ffprobe finished -[MetadataExtract #5: Item #41 (273) ] INFO - 0:00:14.848 - ffprobe took: 644 ms -[MetadataExtract #5: Item #41 (273) ] INFO - 0:00:14.849 - added cached probe info for http://192.168.0.138:8080/audio/flac/1585bae3666307dd663c6f837492dec7_null_, expires in 193 seconds -[MetadataExtract #5: Item #41 (273) ] INFO - 0:00:14.849 - FfmpegMediaMetadataRetriever: hash=-1032742246: retrieveMetadata took: 674 ms -[MetadataExtract #5: Item #41 (273) ] INFO - 0:00:14.850 - FfmpegMediaMetadataRetriever: hash=-1032742246: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Sky Blue Sky","39":"16","9":"193957"} -[MetadataExtract #5 (273) ] INFO - 0:00:14.850 - task: end, 676ms: Item #41 -[MetadataExtract #7: Item #42 (275) ] INFO - 0:00:14.966 - ffprobe finished -[MetadataExtract #7: Item #42 (275) ] INFO - 0:00:14.967 - ffprobe took: 682 ms -[MetadataExtract #7: Item #42 (275) ] INFO - 0:00:14.968 - added cached probe info for http://192.168.0.138:8080/audio/flac/d852d1f210c87200bd68b1429738ca5b_null_, expires in 215 seconds -[MetadataExtract #7: Item #42 (275) ] INFO - 0:00:14.969 - FfmpegMediaMetadataRetriever: hash=2140521498: retrieveMetadata took: 733 ms -[MetadataExtract #7: Item #42 (275) ] INFO - 0:00:14.972 - FfmpegMediaMetadataRetriever: hash=2140521498: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Manchester Orchestra","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Capital Karma","39":"16","9":"215108"} -[MetadataExtract #7 (275) ] INFO - 0:00:14.985 - task: end, 750ms: Item #42 -[MetadataExtract #3: Item #43 (271) ] INFO - 0:00:14.999 - ffprobe finished -[MetadataExtract #3: Item #43 (271) ] INFO - 0:00:14.999 - ffprobe took: 492 ms -[MetadataExtract #3: Item #43 (271) ] INFO - 0:00:15.0 - added cached probe info for http://192.168.0.138:8080/audio/flac/ed084a8cd1b7ef2d38d4d8e8e272cc7c_null_, expires in 201 seconds -[MetadataExtract #3: Item #43 (271) ] INFO - 0:00:15.0 - FfmpegMediaMetadataRetriever: hash=-1752918010: retrieveMetadata took: 540 ms -[MetadataExtract #3: Item #43 (271) ] INFO - 0:00:15.1 - FfmpegMediaMetadataRetriever: hash=-1752918010: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Paul Simon","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Loves Me Like A Rock","39":"16","9":"201000"} -[MetadataExtract #3 (271) ] INFO - 0:00:15.1 - task: end, 546ms: Item #43 -[MetadataExtract #2: Item #44 (270) ] INFO - 0:00:15.24 - ffprobe finished -[MetadataExtract #2: Item #44 (270) ] INFO - 0:00:15.25 - ffprobe took: 516 ms -[MetadataExtract #2: Item #44 (270) ] INFO - 0:00:15.25 - added cached probe info for http://192.168.0.138:8080/audio/flac/f1f31e24b2c730171b8642af0d0bcc04_null_, expires in 336 seconds -[MetadataExtract #2: Item #44 (270) ] INFO - 0:00:15.25 - FfmpegMediaMetadataRetriever: hash=152071891: retrieveMetadata took: 564 ms -[MetadataExtract #2: Item #44 (270) ] INFO - 0:00:15.26 - FfmpegMediaMetadataRetriever: hash=152071891: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tamino","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"336306"} -[MetadataExtract #2 (270) ] INFO - 0:00:15.26 - task: end, 568ms: Item #44 -[MetadataExtract #1: Item #46 (269) ] INFO - 0:00:15.35 - ffprobe finished -[MetadataExtract #1: Item #46 (269) ] INFO - 0:00:15.37 - ffprobe took: 473 ms -[MetadataExtract #1: Item #46 (269) ] INFO - 0:00:15.38 - added cached probe info for http://192.168.0.138:8080/audio/flac/8ee666aeb2de061e86fc6d568b5f2a18_null_, expires in 180 seconds -[MetadataExtract #1: Item #46 (269) ] INFO - 0:00:15.38 - FfmpegMediaMetadataRetriever: hash=-174877526: retrieveMetadata took: 498 ms -[MetadataExtract #1: Item #46 (269) ] INFO - 0:00:15.40 - FfmpegMediaMetadataRetriever: hash=-174877526: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimmy Cliff","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Harder They Come","39":"16","9":"180968"} -[MetadataExtract #1 (269) ] INFO - 0:00:15.41 - task: end, 502ms: Item #46 -[MetadataExtract #8: Item #45 (276) ] INFO - 0:00:15.83 - ffprobe finished -[MetadataExtract #8: Item #45 (276) ] INFO - 0:00:15.85 - ffprobe took: 543 ms -[MetadataExtract #8: Item #45 (276) ] INFO - 0:00:15.86 - added cached probe info for http://192.168.0.138:8080/audio/flac/e5bee29a1067b71f8d96ab7bc592eec7_null_, expires in 164 seconds -[MetadataExtract #8: Item #45 (276) ] INFO - 0:00:15.86 - FfmpegMediaMetadataRetriever: hash=-731586392: retrieveMetadata took: 573 ms -[MetadataExtract #8: Item #45 (276) ] INFO - 0:00:15.88 - FfmpegMediaMetadataRetriever: hash=-731586392: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sonny Chillingworth","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Moe \u0027Uhane (Dream Slack Key)","39":"16","9":"164000"} -[MetadataExtract #8 (276) ] INFO - 0:00:15.89 - task: end, 575ms: Item #45 -[MetadataExtract #6: Item #47 (274) ] INFO - 0:00:15.149 - ffprobe finished -[MetadataExtract #6: Item #47 (274) ] INFO - 0:00:15.150 - ffprobe took: 396 ms -[MetadataExtract #6: Item #47 (274) ] INFO - 0:00:15.150 - added cached probe info for http://192.168.0.138:8080/audio/flac/4c33e09beef28347ed88555d69adfa0c_null_, expires in 332 seconds -[MetadataExtract #6: Item #47 (274) ] INFO - 0:00:15.151 - FfmpegMediaMetadataRetriever: hash=1850019505: retrieveMetadata took: 471 ms -[MetadataExtract #6: Item #47 (274) ] INFO - 0:00:15.153 - FfmpegMediaMetadataRetriever: hash=1850019505: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Harry Manx","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Bring That Thing (live)","39":"16","9":"332000"} -[MetadataExtract #6 (274) ] INFO - 0:00:15.154 - task: end, 479ms: Item #47 -[Main #4: extractItemsMetadata (225) ] INFO - 0:00:15.155 - task: executor 'MetadataExtract #%d': close took 2413 ms -[Main #4 (225) ] INFO - 0:00:15.155 - task: end, 2418ms: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:00:17.535 - BrowseTask.doInBackground(): enter -[main (2) ] INFO - 0:00:17.541 - selected item changed (service): -[main (2) ] INFO - 0:00:17.592 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:17.593 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:17.598 - pizzicato-Music: Dancing Lessons: returning first supported resource -[main (2) ] INFO - 0:00:17.607 - selected item changed (service): -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:17.620 - pizzicato-Music: addItemsAfter: inserted item after id=24, url=http://192.168.0.138:8080/audio/flac/50ec4ba2cffd1ef92ebe194f36657375, metadata=object.item.audioItem.musicTrackDancing LessonsSinéad O'ConnorSinéad O'ConnorRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2000-01-01Faith and Courage63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/50ec4ba2cffd1ef92ebe194f36657375 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:17.622 - pizzicato-Music: addItemsAfter: wait 2000ms (workaround) -[main (2) ] WARNING - 0:00:17.629 - .b : couldn't find item trackId = 23 -[main (2) ] INFO - 0:00:17.629 - selected item changed (service): -[main (2) ] WARNING - 0:00:17.652 - .b : couldn't find item trackId = 0 -[main (2) ] INFO - 0:00:17.653 - selected item changed (service): -[main (2) ] INFO - 0:00:17.681 - stopping task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:00:17.681 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:00:17.681 - SETACTIVE: onTransportStateChanged: post STOP callback -[main (2) ] INFO - 0:00:17.717 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:17.719 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:18.623 - pizzicato-Music: processIdArray: ignoring update due to lock -[main (2) ] WARNING - 0:00:18.624 - .b : couldn't find item trackId = 0 -[main (2) ] INFO - 0:00:18.624 - selected item changed (service): -[main (2) ] WARNING - 0:00:18.648 - .b : couldn't find item trackId = 24 -[main (2) ] INFO - 0:00:18.648 - selected item changed (service): -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.641 - pizzicato-Music: reading 1 new items to insert: [24] -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.642 - pizzicato-Music: getting [0..1[ -[main (2) ] INFO - 0:00:19.666 - .b : selected item (track id): Dancing Lessons -[main (2) ] INFO - 0:00:19.667 - selected item changed (service): Dancing Lessons -[main (2) ] INFO - 0:00:19.698 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:19.700 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:19.736 - playItem: main thread -[PlaybackActions (323) ] INFO - 0:00:19.737 - playItem: worker thread enter -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.738 - pizzicato-Music: Slow Sun: returning first supported resource -[PlaybackAction:playItem (323) ] INFO - 0:00:19.749 - playItem worker thread took: 11 ms -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.762 - pizzicato-Music: addItemsAfter: inserted item after id=25, url=http://192.168.0.138:8080/audio/flac/341b0cbfdfe9755ac1c676d0e77a23c9, metadata=object.item.audioItem.musicTrackSlow SunAukaiAukaiRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2025-01-01Slow Sun - Single63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/341b0cbfdfe9755ac1c676d0e77a23c9 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.766 - pizzicato-Music: Fly Me to the Moon: returning first supported resource -[main (2) ] INFO - 0:00:19.775 - pizzicato-Music: processIdArray: ignoring update due to lock -[main (2) ] INFO - 0:00:19.776 - started task TimeTask: pizzicato-Music -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.786 - pizzicato-Music: addItemsAfter: inserted item after id=26, url=http://192.168.0.138:8080/audio/flac/f1f7731535fdb77e83b401c5c54790a9, metadata=object.item.audioItem.musicTrackFly Me to the MoonDiana KrallDiana KrallRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2002-01-01Live In Paris63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f1f7731535fdb77e83b401c5c54790a9 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.789 - pizzicato-Music: I Won't Back Down: returning first supported resource -[main (2) ] INFO - 0:00:19.790 - loadPlaylist: loaded /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/files/playlists/recent.dpl -[main (2) ] INFO - 0:00:19.795 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:00:19.796 - dynamic shortcuts: added 'pizzicato-Music' -[main (2) ] INFO - 0:00:19.797 - renderer chooser target: saved 1 targets -[Main #4 (225) ] INFO - 0:00:19.798 - task: start: publishRendererChooserTargets -[AsyncTask #2 (325) ] INFO - 0:00:19.801 - saved file /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/files/playlists/recent.dpl ok: 100 items -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.805 - pizzicato-Music: addItemsAfter: inserted item after id=27, url=http://192.168.0.138:8080/audio/flac/4592022e5adbb88cec2f7883972b8303, metadata=object.item.audioItem.musicTrackI Won't Back DownThe Mighty RootsmenThe Mighty RootsmenRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2025-01-01The Mighty Rootsmen, Toots & The Maytals, Gregory Isaacs & Mykal Rose63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/4592022e5adbb88cec2f7883972b8303 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.808 - pizzicato-Music: The Curse: returning first supported resource -[Main #4 (225) ] INFO - 0:00:19.823 - task: end, 25ms: publishRendererChooserTargets -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.828 - pizzicato-Music: addItemsAfter: inserted item after id=28, url=http://192.168.0.138:8080/audio/flac/be31edd4a08b2208188269574312c1ef, metadata=object.item.audioItem.musicTrackThe CurseJosh RitterJosh RitterRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2010-01-01So Runs the World Away63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/be31edd4a08b2208188269574312c1ef -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.834 - pizzicato-Music: Prelude to Cello Suite #1 (JS Bach): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.854 - pizzicato-Music: addItemsAfter: inserted item after id=29, url=http://192.168.0.138:8080/audio/flac/f6f23d21ec900a59466e3b23e2ea95fc, metadata=object.item.audioItem.musicTrackPrelude to Cello Suite #1 (JS Bach)Michael HedgesMichael HedgesRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1990-01-01Select Sounds 199663623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f6f23d21ec900a59466e3b23e2ea95fc -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.858 - pizzicato-Music: Ylva: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.881 - pizzicato-Music: addItemsAfter: inserted item after id=30, url=http://192.168.0.138:8080/audio/flac/f5e11ed3dcebbc4b409786631d4703b2, metadata=object.item.audioItem.musicTrackYlvaAyla NereoAyla NereoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2023-01-01Sovereign Kin – Book I: The Spark63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f5e11ed3dcebbc4b409786631d4703b2 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.883 - pizzicato-Music: Let Them All In: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.919 - pizzicato-Music: addItemsAfter: inserted item after id=31, url=http://192.168.0.138:8080/audio/flac/668db4b5f4b25fbad790b5bec3b95b43, metadata=object.item.audioItem.musicTrackLet Them All InI Am KlootI Am KlootRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2013-01-01Let It All In63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/668db4b5f4b25fbad790b5bec3b95b43 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:19.924 - pizzicato-Music: The Book of Love: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.192 - pizzicato-Music: addItemsAfter: inserted item after id=32, url=http://192.168.0.138:8080/audio/flac/e807470e04488465c04c4d4de763c695, metadata=object.item.audioItem.musicTrackThe Book of LovePeter GabrielPeter GabrielRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2010-01-01Scratch My Back63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/e807470e04488465c04c4d4de763c695 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.196 - pizzicato-Music: Still: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.212 - pizzicato-Music: addItemsAfter: inserted item after id=33, url=http://192.168.0.138:8080/audio/flac/c1ed42dee1c68dc52ddcade17e7c03d8, metadata=object.item.audioItem.musicTrackStillFoo FightersFoo FightersRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2005-01-01In Your Honor63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/c1ed42dee1c68dc52ddcade17e7c03d8 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.217 - pizzicato-Music: Listener-supported: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.235 - pizzicato-Music: addItemsAfter: inserted item after id=34, url=http://192.168.0.138:8080/audio/flac/0354ff365fc12530ab574798918231f3, metadata=object.item.audioItem.musicTrackListener-supportedCommercial-freeCommercial-freeRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/0354ff365fc12530ab574798918231f3 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.239 - pizzicato-Music: When The Roses Bloom Again: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.285 - pizzicato-Music: addItemsAfter: inserted item after id=35, url=http://192.168.0.138:8080/audio/flac/25540bcbdb5fb212d0d3c1a29faa762f, metadata=object.item.audioItem.musicTrackWhen The Roses Bloom AgainBilly Bragg & WilcoBilly Bragg & WilcoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2012-01-01Mermaid Avenue Vol III63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/25540bcbdb5fb212d0d3c1a29faa762f -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.291 - pizzicato-Music: 12 Mortal Men: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.307 - pizzicato-Music: addItemsAfter: inserted item after id=36, url=http://192.168.0.138:8080/audio/flac/b1819621989454decfdeeb2fd1012742, metadata=object.item.audioItem.musicTrack12 Mortal MenSuzanne VegaSuzanne VegaRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2016-01-01Lover, Beloved: Songs from an Evening with Carson McCullers1263623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/b1819621989454decfdeeb2fd1012742 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.310 - pizzicato-Music: Wild Horses: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.329 - pizzicato-Music: addItemsAfter: inserted item after id=37, url=http://192.168.0.138:8080/audio/flac/7a1420295c9ba04a9123f5a8d3fc7b08, metadata=object.item.audioItem.musicTrackWild HorsesThe SundaysThe SundaysRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1992-01-01Blind63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/7a1420295c9ba04a9123f5a8d3fc7b08 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.331 - pizzicato-Music: Happy Time: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.352 - pizzicato-Music: addItemsAfter: inserted item after id=38, url=http://192.168.0.138:8080/audio/flac/a55129a8f5bc6ecefd7b904d794b9052, metadata=object.item.audioItem.musicTrackHappy TimeTim BuckleyTim BuckleyRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1969-01-01Blue Afternoon63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/a55129a8f5bc6ecefd7b904d794b9052 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.355 - pizzicato-Music: Different Stars: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.376 - pizzicato-Music: addItemsAfter: inserted item after id=39, url=http://192.168.0.138:8080/audio/flac/1d25a8b5f6be45e2bb26896b82ed15c7, metadata=object.item.audioItem.musicTrackDifferent StarsTrespassers WilliamTrespassers WilliamRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2002-01-01Different Stars63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/1d25a8b5f6be45e2bb26896b82ed15c7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.378 - pizzicato-Music: Babylon: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.398 - pizzicato-Music: addItemsAfter: inserted item after id=40, url=http://192.168.0.138:8080/audio/flac/2ad68dd550b16313027271cb63d9153b, metadata=object.item.audioItem.musicTrackBabylonDavid GrayDavid GrayRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1998-01-01White Ladder63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/2ad68dd550b16313027271cb63d9153b -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.401 - pizzicato-Music: Wondering Where the Lions Are (Live): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.417 - pizzicato-Music: addItemsAfter: inserted item after id=41, url=http://192.168.0.138:8080/audio/flac/67c92e72e18e489dee64f769588cb1ce, metadata=object.item.audioItem.musicTrackWondering Where the Lions Are (Live)Bruce CockburnBruce CockburnRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1997-01-01The Whole Night Sky63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/67c92e72e18e489dee64f769588cb1ce -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.420 - pizzicato-Music: Back Where You Belong: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.437 - pizzicato-Music: addItemsAfter: inserted item after id=42, url=http://192.168.0.138:8080/audio/flac/82dc11173748da450c8bdb1067b00bbb, metadata=object.item.audioItem.musicTrackBack Where You BelongSinéad O'ConnorSinéad O'ConnorRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2012-01-01How About I Be Me (And You Be You)?63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/82dc11173748da450c8bdb1067b00bbb -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.443 - pizzicato-Music: Listener-supported: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.460 - pizzicato-Music: addItemsAfter: inserted item after id=43, url=http://192.168.0.138:8080/audio/flac/f0b1544d237f5347612a7f7832f8f1ac, metadata=object.item.audioItem.musicTrackListener-supportedCommercial-freeCommercial-freeRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f0b1544d237f5347612a7f7832f8f1ac -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.465 - pizzicato-Music: Perfect Circle: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.481 - pizzicato-Music: addItemsAfter: inserted item after id=44, url=http://192.168.0.138:8080/audio/flac/aa7e068ebfa7f443972ab1b72cffc3a8, metadata=object.item.audioItem.musicTrackPerfect CircleR.E.M.R.E.M.Radio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1983-01-01Murmur63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/aa7e068ebfa7f443972ab1b72cffc3a8 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.488 - pizzicato-Music: Mississippi: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.505 - pizzicato-Music: addItemsAfter: inserted item after id=45, url=http://192.168.0.138:8080/audio/flac/508871fecdd0d94347006d53b427111e, metadata=object.item.audioItem.musicTrackMississippiThe Cactus BlossomsThe Cactus BlossomsRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2016-01-01You're Dreaming63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/508871fecdd0d94347006d53b427111e -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.511 - pizzicato-Music: Don’t Let Your Deal Go Down: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.532 - pizzicato-Music: addItemsAfter: inserted item after id=46, url=http://192.168.0.138:8080/audio/flac/ca41892cc7c2b2298f6eff806ba2399a, metadata=object.item.audioItem.musicTrackDon’t Let Your Deal Go DownSierra FerrellSierra FerrellRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2024-01-01Trail of Flowers63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ca41892cc7c2b2298f6eff806ba2399a -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.538 - pizzicato-Music: Light as a Feather: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.595 - pizzicato-Music: addItemsAfter: inserted item after id=47, url=http://192.168.0.138:8080/audio/flac/c8befc1539c774548f106f2f5ea6c4bf, metadata=object.item.audioItem.musicTrackLight as a FeatherNorah JonesNorah JonesRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2009-01-01The Fall63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/c8befc1539c774548f106f2f5ea6c4bf -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.602 - pizzicato-Music: Shyer: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.621 - pizzicato-Music: addItemsAfter: inserted item after id=48, url=http://192.168.0.138:8080/audio/flac/43c48c8e99e74c18b5b404eb388dce24, metadata=object.item.audioItem.musicTrackShyerLondon GrammarLondon GrammarRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2013-01-01If You Wait63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/43c48c8e99e74c18b5b404eb388dce24 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.627 - pizzicato-Music: The Hymn Of Ordinary Motion: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.647 - pizzicato-Music: addItemsAfter: inserted item after id=49, url=http://192.168.0.138:8080/audio/flac/2dc9f632f96001db6f6e0c714e61ea00, metadata=object.item.audioItem.musicTrackThe Hymn Of Ordinary MotionMeyer, Douglas & BarenbergMeyer, Douglas & BarenbergRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1993-01-01Skip, Hop & Wobble63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/2dc9f632f96001db6f6e0c714e61ea00 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.653 - pizzicato-Music: The Heart of Saturday Night: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.671 - pizzicato-Music: addItemsAfter: inserted item after id=50, url=http://192.168.0.138:8080/audio/flac/d5b6f3e1ccc8f4828ca2dc0efd69b987, metadata=object.item.audioItem.musicTrackThe Heart of Saturday NightTom WaitsTom WaitsRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1974-01-01Mainstreet63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/d5b6f3e1ccc8f4828ca2dc0efd69b987 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.677 - pizzicato-Music: Buckets of Rain: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.696 - pizzicato-Music: addItemsAfter: inserted item after id=51, url=http://192.168.0.138:8080/audio/flac/6ea1402e7b33ffb328887cb914d51778, metadata=object.item.audioItem.musicTrackBuckets of RainNeko CaseNeko CaseRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2005-01-01Sweetheart 200563623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/6ea1402e7b33ffb328887cb914d51778 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.702 - pizzicato-Music: New Beginning: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.723 - pizzicato-Music: addItemsAfter: inserted item after id=52, url=http://192.168.0.138:8080/audio/flac/ffda328ef818229238661ec37ff37956, metadata=object.item.audioItem.musicTrackNew BeginningTracy ChapmanTracy ChapmanRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1995-01-01New Beginning63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ffda328ef818229238661ec37ff37956 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.730 - pizzicato-Music: Can't Find My Way Home: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.754 - pizzicato-Music: addItemsAfter: inserted item after id=53, url=http://192.168.0.138:8080/audio/flac/497c78b081943f22c0b7a2861e0bb35f, metadata=object.item.audioItem.musicTrackCan't Find My Way HomeBlind FaithBlind FaithRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1969-01-01Blind Faith63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/497c78b081943f22c0b7a2861e0bb35f -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.760 - pizzicato-Music: Blue Eyes Crying in the Rain: returning first supported resource -[main (2) ] INFO - 0:00:20.787 - pizzicato-Music: processIdArray: ignoring update due to lock -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.784 - pizzicato-Music: addItemsAfter: inserted item after id=54, url=http://192.168.0.138:8080/audio/flac/e87aa42bc2f5632ebdf983a47b90d4fc, metadata=object.item.audioItem.musicTrackBlue Eyes Crying in the RainWillie NelsonWillie NelsonRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1975-01-01Red Headed Stranger63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/e87aa42bc2f5632ebdf983a47b90d4fc -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.790 - pizzicato-Music: I Love the Sun: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.812 - pizzicato-Music: addItemsAfter: inserted item after id=55, url=http://192.168.0.138:8080/audio/flac/77d393f256c7d2b397d9af5c8504596c, metadata=object.item.audioItem.musicTrackI Love the SunJon RedfernJon RedfernRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-01May Be Some Time63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/77d393f256c7d2b397d9af5c8504596c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.819 - pizzicato-Music: Time After Time: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.838 - pizzicato-Music: addItemsAfter: inserted item after id=56, url=http://192.168.0.138:8080/audio/flac/069ef589ce1d9621a87afb28e7fa658c, metadata=object.item.audioItem.musicTrackTime After TimeCyndi LauperCyndi LauperRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1982-01-01She’s So Unusual63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/069ef589ce1d9621a87afb28e7fa658c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.844 - pizzicato-Music: Walk a Thin Line: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.861 - pizzicato-Music: addItemsAfter: inserted item after id=57, url=http://192.168.0.138:8080/audio/flac/ef96c7fc42def2977a9963e2d4e892ff, metadata=object.item.audioItem.musicTrackWalk a Thin LineFleetwood MacFleetwood MacRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1979-01-01Tusk63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ef96c7fc42def2977a9963e2d4e892ff -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.866 - pizzicato-Music: Barefoot Friend: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.899 - pizzicato-Music: addItemsAfter: inserted item after id=58, url=http://192.168.0.138:8080/audio/flac/4d69f84b74a86795a52fcb73c3800af8, metadata=object.item.audioItem.musicTrackBarefoot FriendElephant RevivalElephant RevivalRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2010-01-01Break In the Clouds63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/4d69f84b74a86795a52fcb73c3800af8 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.902 - pizzicato-Music: The Silent Orchestra: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.919 - pizzicato-Music: addItemsAfter: inserted item after id=59, url=http://192.168.0.138:8080/audio/flac/667f1ebbc85d6440a7ff4afb9a527b89, metadata=object.item.audioItem.musicTrackThe Silent OrchestraHamilton LeithauserHamilton LeithauserRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2014-01-01Black Hours63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/667f1ebbc85d6440a7ff4afb9a527b89 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.921 - pizzicato-Music: Turn on Me: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.938 - pizzicato-Music: addItemsAfter: inserted item after id=60, url=http://192.168.0.138:8080/audio/flac/d46e57c82ed02a1848e32c0b01f21cb7, metadata=object.item.audioItem.musicTrackTurn on MeThe ShinsThe ShinsRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-01Wincing The Night Away63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/d46e57c82ed02a1848e32c0b01f21cb7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.940 - pizzicato-Music: Wait for Me: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.962 - pizzicato-Music: addItemsAfter: inserted item after id=61, url=http://192.168.0.138:8080/audio/flac/a8f5995175f02b30b884ec3324c831a4, metadata=object.item.audioItem.musicTrackWait for MeMobyMobyRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2009-01-01Wait for Me63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/a8f5995175f02b30b884ec3324c831a4 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.964 - pizzicato-Music: Servant: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.982 - pizzicato-Music: addItemsAfter: inserted item after id=62, url=http://192.168.0.138:8080/audio/flac/8122ae21da8da1e762a22dabd9817802, metadata=object.item.audioItem.musicTrackServantCocosumaCocosumaRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2006-01-01Pointing Excitedly To The Sky63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/8122ae21da8da1e762a22dabd9817802 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:20.984 - pizzicato-Music: Castles Made Of Sand: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.4 - pizzicato-Music: addItemsAfter: inserted item after id=63, url=http://192.168.0.138:8080/audio/flac/b71d978c46b591f2211c5834a0e5b902, metadata=object.item.audioItem.musicTrackCastles Made Of SandJimi HendrixJimi HendrixRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1967-01-01Electric Guitarland63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/b71d978c46b591f2211c5834a0e5b902 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.7 - pizzicato-Music: I Know What You Are: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.28 - pizzicato-Music: addItemsAfter: inserted item after id=64, url=http://192.168.0.138:8080/audio/flac/079e09407590d3c89234f3433280c3e0, metadata=object.item.audioItem.musicTrackI Know What You AreOi Va VoiOi Va VoiRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2009-01-01Travelling The Face Of The Globe63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/079e09407590d3c89234f3433280c3e0 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.31 - pizzicato-Music: Sky Blue Sky: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.60 - pizzicato-Music: addItemsAfter: inserted item after id=65, url=http://192.168.0.138:8080/audio/flac/1585bae3666307dd663c6f837492dec7, metadata=object.item.audioItem.musicTrackSky Blue SkyWilcoWilcoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-012005-11-01: Auditorium Theatre, Chicago, IL, USA63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/1585bae3666307dd663c6f837492dec7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.62 - pizzicato-Music: Capital Karma: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.77 - pizzicato-Music: addItemsAfter: inserted item after id=66, url=http://192.168.0.138:8080/audio/flac/d852d1f210c87200bd68b1429738ca5b, metadata=object.item.audioItem.musicTrackCapital KarmaManchester OrchestraManchester OrchestraRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2023-01-01The Valley Of Vision63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/d852d1f210c87200bd68b1429738ca5b -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.80 - pizzicato-Music: Loves Me Like A Rock: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.96 - pizzicato-Music: addItemsAfter: inserted item after id=67, url=http://192.168.0.138:8080/audio/flac/ed084a8cd1b7ef2d38d4d8e8e272cc7c, metadata=object.item.audioItem.musicTrackLoves Me Like A RockPaul SimonPaul SimonRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1973-01-01There Goes Rhymin' Simon63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ed084a8cd1b7ef2d38d4d8e8e272cc7c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.99 - pizzicato-Music: Babylon: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.116 - pizzicato-Music: addItemsAfter: inserted item after id=68, url=http://192.168.0.138:8080/audio/flac/f1f31e24b2c730171b8642af0d0bcc04, metadata=object.item.audioItem.musicTrackBabylonTaminoTaminoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2025-01-01Every Dawn’s a Mountain63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f1f31e24b2c730171b8642af0d0bcc04 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.119 - pizzicato-Music: Moe 'Uhane (Dream Slack Key): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.134 - pizzicato-Music: addItemsAfter: inserted item after id=69, url=http://192.168.0.138:8080/audio/flac/e5bee29a1067b71f8d96ab7bc592eec7, metadata=object.item.audioItem.musicTrackMoe 'Uhane (Dream Slack Key)Sonny ChillingworthSonny ChillingworthRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1993-01-01Sonny Solo63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/e5bee29a1067b71f8d96ab7bc592eec7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.137 - pizzicato-Music: The Harder They Come: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.156 - pizzicato-Music: addItemsAfter: inserted item after id=70, url=http://192.168.0.138:8080/audio/flac/8ee666aeb2de061e86fc6d568b5f2a18, metadata=object.item.audioItem.musicTrackThe Harder They ComeJimmy CliffJimmy CliffRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1972-01-01The Harder They Come63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/8ee666aeb2de061e86fc6d568b5f2a18 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.159 - pizzicato-Music: Bring That Thing (live): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.174 - pizzicato-Music: addItemsAfter: inserted item after id=71, url=http://192.168.0.138:8080/audio/flac/4c33e09beef28347ed88555d69adfa0c, metadata=object.item.audioItem.musicTrackBring That Thing (live)Harry ManxHarry ManxRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-01Dog My Cat63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/4c33e09beef28347ed88555d69adfa0c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.192 - pizzicato-Music: reading 47 new items to insert: [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71] -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:00:21.192 - pizzicato-Music: getting [0..47[ -[main (2) ] INFO - 0:00:21.287 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:21.290 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[Main #4 (225) ] INFO - 0:00:21.398 - task: start: extractItemsMetadata -[MetadataExtract #1 (326) ] INFO - 0:00:21.405 - task: start: Item #0 -[MetadataExtract #3 (328) ] INFO - 0:00:21.406 - task: start: Item #2 -[MetadataExtract #2 (327) ] INFO - 0:00:21.406 - task: start: Item #1 -[MetadataExtract #1: Item #0 (326) ] INFO - 0:00:21.406 - FfmpegMediaMetadataRetriever: hash=-1759650642: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O\u0027Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Dancing Lessons","39":"16","9":"249470"} -[MetadataExtract #4 (329) ] INFO - 0:00:21.406 - task: start: Item #3 -[MetadataExtract #1 (326) ] INFO - 0:00:21.407 - task: end, 3ms: Item #0 -[MetadataExtract #4: Item #3 (329) ] INFO - 0:00:21.408 - FfmpegMediaMetadataRetriever: hash=1993842102: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Mighty Rootsmen","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Won\u0027t Back Down","39":"16","9":"156594"} -[MetadataExtract #5 (330) ] INFO - 0:00:21.409 - task: start: Item #4 -[MetadataExtract #4 (329) ] INFO - 0:00:21.409 - task: end, 3ms: Item #3 -[MetadataExtract #2: Item #1 (327) ] INFO - 0:00:21.409 - FfmpegMediaMetadataRetriever: hash=-1913648982: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Aukai","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Slow Sun","39":"16","9":"206810"} -[MetadataExtract #2 (327) ] INFO - 0:00:21.410 - task: end, 4ms: Item #1 -[MetadataExtract #5: Item #4 (330) ] INFO - 0:00:21.410 - FfmpegMediaMetadataRetriever: hash=-407518392: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Josh Ritter","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Curse","39":"16","9":"292250"} -[MetadataExtract #6 (331) ] INFO - 0:00:21.411 - task: start: Item #5 -[MetadataExtract #5 (330) ] INFO - 0:00:21.411 - task: end, 2ms: Item #4 -[MetadataExtract #6: Item #5 (331) ] INFO - 0:00:21.411 - FfmpegMediaMetadataRetriever: hash=-1138992005: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Michael Hedges","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Prelude to Cello Suite #1 (JS Bach)","39":"16","9":"139943"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.411 - task: start: Item #6 -[MetadataExtract #5 (330) ] INFO - 0:00:21.412 - task: start: Item #11 -[MetadataExtract #1 (326) ] INFO - 0:00:21.412 - task: start: Item #8 -[MetadataExtract #4 (329) ] INFO - 0:00:21.412 - task: start: Item #9 -[MetadataExtract #2 (327) ] INFO - 0:00:21.412 - task: start: Item #10 -[Main #4: extractItemsMetadata (225) ] INFO - 0:00:21.412 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #6 (331) ] INFO - 0:00:21.412 - task: end, 1ms: Item #5 -[MetadataExtract #8 (333) ] INFO - 0:00:21.413 - task: start: Item #7 -[MetadataExtract #6 (331) ] INFO - 0:00:21.413 - task: start: Item #12 -[MetadataExtract #3: Item #2 (328) ] INFO - 0:00:21.413 - FfmpegMediaMetadataRetriever: hash=-106913403: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Diana Krall","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Fly Me to the Moon","39":"16","9":"328724"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.414 - task: end, 8ms: Item #2 -[MetadataExtract #7: Item #6 (332) ] INFO - 0:00:21.414 - FfmpegMediaMetadataRetriever: hash=-962027383: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Ayla Nereo","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Ylva","39":"16","9":"289409"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.415 - task: start: Item #13 -[MetadataExtract #7 (332) ] INFO - 0:00:21.415 - task: end, 4ms: Item #6 -[MetadataExtract #1: Item #8 (326) ] INFO - 0:00:21.415 - FfmpegMediaMetadataRetriever: hash=724650897: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Peter Gabriel","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Book of Love","39":"16","9":"216972"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.415 - task: start: Item #14 -[MetadataExtract #1 (326) ] INFO - 0:00:21.416 - task: end, 4ms: Item #8 -[MetadataExtract #1 (326) ] INFO - 0:00:21.416 - task: start: Item #15 -[MetadataExtract #7: Item #14 (332) ] INFO - 0:00:21.417 - FfmpegMediaMetadataRetriever: hash=-1053255835: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tim Buckley","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Happy Time","39":"16","9":"190000"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.417 - task: end, 1ms: Item #14 -[MetadataExtract #7 (332) ] INFO - 0:00:21.417 - task: start: Item #16 -[MetadataExtract #7: Item #16 (332) ] INFO - 0:00:21.418 - FfmpegMediaMetadataRetriever: hash=-1783977340: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"David Gray","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"260750"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.418 - task: end, 2ms: Item #16 -[MetadataExtract #7 (332) ] INFO - 0:00:21.419 - task: start: Item #17 -[MetadataExtract #4: Item #9 (329) ] INFO - 0:00:21.419 - FfmpegMediaMetadataRetriever: hash=277540764: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Foo Fighters","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Still","39":"16","9":"310800"} -[MetadataExtract #4 (329) ] INFO - 0:00:21.419 - task: end, 7ms: Item #9 -[MetadataExtract #4 (329) ] INFO - 0:00:21.419 - task: start: Item #18 -[MetadataExtract #6: Item #12 (331) ] INFO - 0:00:21.420 - FfmpegMediaMetadataRetriever: hash=-352088410: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Suzanne Vega","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"12 Mortal Men","39":"16","9":"157000"} -[MetadataExtract #6 (331) ] INFO - 0:00:21.420 - task: end, 7ms: Item #12 -[MetadataExtract #6 (331) ] INFO - 0:00:21.420 - task: start: Item #19 -[MetadataExtract #8: Item #7 (333) ] INFO - 0:00:21.421 - FfmpegMediaMetadataRetriever: hash=42813812: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"I Am Kloot","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Let Them All In","39":"16","9":"231290"} -[MetadataExtract #8 (333) ] INFO - 0:00:21.422 - task: end, 9ms: Item #7 -[MetadataExtract #8 (333) ] INFO - 0:00:21.423 - task: start: Item #20 -[MetadataExtract #3: Item #13 (328) ] INFO - 0:00:21.423 - FfmpegMediaMetadataRetriever: hash=1891231045: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Sundays","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wild Horses","39":"16","9":"277000"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.423 - task: end, 9ms: Item #13 -[MetadataExtract #1: Item #15 (326) ] INFO - 0:00:21.424 - FfmpegMediaMetadataRetriever: hash=1003137573: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Trespassers William","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Different Stars","39":"16","9":"278647"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.424 - task: start: Item #21 -[MetadataExtract #1 (326) ] INFO - 0:00:21.424 - task: end, 8ms: Item #15 -[MetadataExtract #1 (326) ] INFO - 0:00:21.424 - task: start: Item #22 -[MetadataExtract #2: Item #10 (327) ] INFO - 0:00:21.425 - FfmpegMediaMetadataRetriever: hash=1612634984: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"5050"} -[MetadataExtract #2 (327) ] INFO - 0:00:21.425 - task: end, 13ms: Item #10 -[MetadataExtract #2 (327) ] INFO - 0:00:21.425 - task: start: Item #23 -[MetadataExtract #7: Item #17 (332) ] INFO - 0:00:21.425 - FfmpegMediaMetadataRetriever: hash=1845475776: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Bruce Cockburn","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wondering Where the Lions Are (Live)","39":"16","9":"320000"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.426 - task: end, 7ms: Item #17 -[MetadataExtract #7 (332) ] INFO - 0:00:21.426 - task: start: Item #24 -[MetadataExtract #7: Item #24 (332) ] INFO - 0:00:21.427 - FfmpegMediaMetadataRetriever: hash=1899042957: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"London Grammar","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Shyer","39":"16","9":"182000"} -[MetadataExtract #4: Item #18 (329) ] INFO - 0:00:21.428 - FfmpegMediaMetadataRetriever: hash=1710638978: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O’Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Back Where You Belong","39":"16","9":"249150"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.428 - task: end, 2ms: Item #24 -[MetadataExtract #4 (329) ] INFO - 0:00:21.428 - task: end, 8ms: Item #18 -[MetadataExtract #7 (332) ] INFO - 0:00:21.428 - task: start: Item #25 -[MetadataExtract #4 (329) ] INFO - 0:00:21.428 - task: start: Item #26 -[MetadataExtract #7: Item #25 (332) ] INFO - 0:00:21.429 - FfmpegMediaMetadataRetriever: hash=-524282951: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Meyer, Douglas \u0026 Barenberg","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Hymn Of Ordinary Motion","39":"16","9":"114000"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.429 - task: end, 1ms: Item #25 -[MetadataExtract #7 (332) ] INFO - 0:00:21.429 - task: start: Item #27 -[MetadataExtract #8: Item #20 (333) ] INFO - 0:00:21.430 - FfmpegMediaMetadataRetriever: hash=-993423853: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"R.E.M.","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Perfect Circle","39":"16","9":"202700"} -[MetadataExtract #8 (333) ] INFO - 0:00:21.431 - task: end, 8ms: Item #20 -[MetadataExtract #8 (333) ] INFO - 0:00:21.431 - task: start: Item #28 -[MetadataExtract #8: Item #28 (333) ] INFO - 0:00:21.433 - FfmpegMediaMetadataRetriever: hash=485794117: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tracy Chapman","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"New Beginning","39":"16","9":"325000"} -[MetadataExtract #1: Item #22 (326) ] INFO - 0:00:21.434 - FfmpegMediaMetadataRetriever: hash=-395410295: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sierra Ferrell","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Don’t Let Your Deal Go Down","39":"16","9":"211710"} -[MetadataExtract #1 (326) ] INFO - 0:00:21.434 - task: end, 9ms: Item #22 -[MetadataExtract #1 (326) ] INFO - 0:00:21.434 - task: start: Item #29 -[MetadataExtract #2: Item #23 (327) ] INFO - 0:00:21.435 - FfmpegMediaMetadataRetriever: hash=-2056388036: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Norah Jones","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Light as a Feather","39":"16","9":"231305"} -[MetadataExtract #8 (333) ] INFO - 0:00:21.434 - task: end, 2ms: Item #28 -[MetadataExtract #2 (327) ] INFO - 0:00:21.435 - task: end, 10ms: Item #23 -[MetadataExtract #5: Item #11 (330) ] INFO - 0:00:21.435 - FfmpegMediaMetadataRetriever: hash=1385248911: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Billy Bragg \u0026 Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"When The Roses Bloom Again","39":"16","9":"246000"} -[MetadataExtract #2 (327) ] INFO - 0:00:21.436 - task: start: Item #31 -[MetadataExtract #5 (330) ] INFO - 0:00:21.436 - task: end, 24ms: Item #11 -[MetadataExtract #5 (330) ] INFO - 0:00:21.436 - task: start: Item #32 -[MetadataExtract #8 (333) ] INFO - 0:00:21.436 - task: start: Item #30 -[MetadataExtract #2: Item #31 (327) ] INFO - 0:00:21.437 - FfmpegMediaMetadataRetriever: hash=1402956451: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jon Redfern","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Love the Sun","39":"16","9":"300000"} -[MetadataExtract #2 (327) ] INFO - 0:00:21.437 - task: end, 1ms: Item #31 -[MetadataExtract #2 (327) ] INFO - 0:00:21.437 - task: start: Item #33 -[MetadataExtract #6: Item #19 (331) ] INFO - 0:00:21.437 - FfmpegMediaMetadataRetriever: hash=-894762509: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"8516"} -[MetadataExtract #6 (331) ] INFO - 0:00:21.438 - task: end, 18ms: Item #19 -[MetadataExtract #6 (331) ] INFO - 0:00:21.438 - task: start: Item #34 -[MetadataExtract #7: Item #27 (332) ] INFO - 0:00:21.438 - FfmpegMediaMetadataRetriever: hash=131303568: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Neko Case","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Buckets of Rain","39":"16","9":"199000"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.439 - task: end, 9ms: Item #27 -[MetadataExtract #7 (332) ] INFO - 0:00:21.439 - task: start: Item #35 -[MetadataExtract #3: Item #21 (328) ] INFO - 0:00:21.440 - FfmpegMediaMetadataRetriever: hash=1757379569: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Cactus Blossoms","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Mississippi","39":"16","9":"235634"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.441 - task: end, 17ms: Item #21 -[MetadataExtract #1: Item #29 (326) ] INFO - 0:00:21.441 - FfmpegMediaMetadataRetriever: hash=-775299294: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Blind Faith","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Can\u0027t Find My Way Home","39":"16","9":"188500"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.441 - task: start: Item #36 -[MetadataExtract #1 (326) ] INFO - 0:00:21.442 - task: end, 7ms: Item #29 -[MetadataExtract #1 (326) ] INFO - 0:00:21.442 - task: start: Item #37 -[MetadataExtract #5: Item #32 (330) ] INFO - 0:00:21.442 - FfmpegMediaMetadataRetriever: hash=1984356975: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cyndi Lauper","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Time After Time","39":"16","9":"232250"} -[MetadataExtract #5 (330) ] INFO - 0:00:21.442 - task: end, 7ms: Item #32 -[MetadataExtract #4: Item #26 (329) ] INFO - 0:00:21.443 - FfmpegMediaMetadataRetriever: hash=687172484: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tom Waits","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Heart of Saturday Night","39":"16","9":"229000"} -[MetadataExtract #5 (330) ] INFO - 0:00:21.443 - task: start: Item #38 -[MetadataExtract #4 (329) ] INFO - 0:00:21.443 - task: end, 15ms: Item #26 -[MetadataExtract #4 (329) ] INFO - 0:00:21.443 - task: start: Item #39 -[MetadataExtract #5: Item #38 (330) ] INFO - 0:00:21.444 - FfmpegMediaMetadataRetriever: hash=1709432058: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cocosuma","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Servant","39":"16","9":"289070"} -[MetadataExtract #5 (330) ] INFO - 0:00:21.444 - task: end, 1ms: Item #38 -[MetadataExtract #5 (330) ] INFO - 0:00:21.444 - task: start: Item #40 -[MetadataExtract #2: Item #33 (327) ] INFO - 0:00:21.444 - FfmpegMediaMetadataRetriever: hash=1977966954: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Fleetwood Mac","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Walk a Thin Line","39":"16","9":"222000"} -[MetadataExtract #2 (327) ] INFO - 0:00:21.445 - task: end, 7ms: Item #33 -[MetadataExtract #2 (327) ] INFO - 0:00:21.445 - task: start: Item #41 -[MetadataExtract #6: Item #34 (331) ] INFO - 0:00:21.445 - FfmpegMediaMetadataRetriever: hash=1475446356: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Elephant Revival","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Barefoot Friend","39":"16","9":"191000"} -[MetadataExtract #6 (331) ] INFO - 0:00:21.446 - task: end, 7ms: Item #34 -[MetadataExtract #6 (331) ] INFO - 0:00:21.446 - task: start: Item #42 -[MetadataExtract #7: Item #35 (332) ] INFO - 0:00:21.446 - FfmpegMediaMetadataRetriever: hash=1109877331: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Hamilton Leithauser","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Silent Orchestra","39":"16","9":"264060"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.446 - task: end, 8ms: Item #35 -[MetadataExtract #7 (332) ] INFO - 0:00:21.447 - task: start: Item #43 -[MetadataExtract #3: Item #36 (328) ] INFO - 0:00:21.447 - FfmpegMediaMetadataRetriever: hash=-2093135018: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Shins","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Turn on Me","39":"16","9":"209500"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.448 - task: end, 6ms: Item #36 -[MetadataExtract #1: Item #37 (326) ] INFO - 0:00:21.448 - FfmpegMediaMetadataRetriever: hash=496599921: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Moby","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wait for Me","39":"16","9":"204000"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.449 - task: start: Item #44 -[MetadataExtract #1 (326) ] INFO - 0:00:21.449 - task: end, 7ms: Item #37 -[MetadataExtract #1 (326) ] INFO - 0:00:21.449 - task: start: Item #45 -[MetadataExtract #4: Item #39 (329) ] INFO - 0:00:21.449 - FfmpegMediaMetadataRetriever: hash=-475084519: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimi Hendrix","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Castles Made Of Sand","39":"16","9":"164612"} -[MetadataExtract #4 (329) ] INFO - 0:00:21.450 - task: end, 6ms: Item #39 -[MetadataExtract #4 (329) ] INFO - 0:00:21.450 - task: start: Item #46 -[MetadataExtract #8: Item #30 (333) ] INFO - 0:00:21.450 - FfmpegMediaMetadataRetriever: hash=-1561902046: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Willie Nelson","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Blue Eyes Crying in the Rain","39":"16","9":"136200"} -[MetadataExtract #8 (333) ] INFO - 0:00:21.451 - task: end, 15ms: Item #30 -[MetadataExtract #8 (333) ] INFO - 0:00:21.451 - task: start: Item #47 -[MetadataExtract #5: Item #40 (330) ] INFO - 0:00:21.451 - FfmpegMediaMetadataRetriever: hash=-238367317: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Oi Va Voi","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Know What You Are","39":"16","9":"182000"} -[MetadataExtract #5 (330) ] INFO - 0:00:21.452 - task: end, 8ms: Item #40 -[MetadataExtract #2: Item #41 (327) ] INFO - 0:00:21.452 - FfmpegMediaMetadataRetriever: hash=-1032742246: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Sky Blue Sky","39":"16","9":"193957"} -[MetadataExtract #2 (327) ] INFO - 0:00:21.453 - task: end, 8ms: Item #41 -[MetadataExtract #6: Item #42 (331) ] INFO - 0:00:21.453 - FfmpegMediaMetadataRetriever: hash=2140521498: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Manchester Orchestra","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Capital Karma","39":"16","9":"215108"} -[MetadataExtract #6 (331) ] INFO - 0:00:21.454 - task: end, 8ms: Item #42 -[MetadataExtract #7: Item #43 (332) ] INFO - 0:00:21.454 - FfmpegMediaMetadataRetriever: hash=-1752918010: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Paul Simon","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Loves Me Like A Rock","39":"16","9":"201000"} -[MetadataExtract #7 (332) ] INFO - 0:00:21.454 - task: end, 8ms: Item #43 -[MetadataExtract #3: Item #44 (328) ] INFO - 0:00:21.455 - FfmpegMediaMetadataRetriever: hash=152071891: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tamino","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"336306"} -[MetadataExtract #3 (328) ] INFO - 0:00:21.456 - task: end, 7ms: Item #44 -[MetadataExtract #1: Item #45 (326) ] INFO - 0:00:21.457 - FfmpegMediaMetadataRetriever: hash=-731586392: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sonny Chillingworth","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Moe \u0027Uhane (Dream Slack Key)","39":"16","9":"164000"} -[MetadataExtract #1 (326) ] INFO - 0:00:21.457 - task: end, 8ms: Item #45 -[MetadataExtract #4: Item #46 (329) ] INFO - 0:00:21.458 - FfmpegMediaMetadataRetriever: hash=-174877526: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimmy Cliff","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Harder They Come","39":"16","9":"180968"} -[MetadataExtract #4 (329) ] INFO - 0:00:21.458 - task: end, 8ms: Item #46 -[MetadataExtract #8: Item #47 (333) ] INFO - 0:00:21.459 - FfmpegMediaMetadataRetriever: hash=1850019505: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Harry Manx","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Bring That Thing (live)","39":"16","9":"332000"} -[MetadataExtract #8 (333) ] INFO - 0:00:21.459 - task: end, 8ms: Item #47 -[Main #4: extractItemsMetadata (225) ] INFO - 0:00:21.459 - task: executor 'MetadataExtract #%d': close took 47 ms -[Main #4 (225) ] INFO - 0:00:21.460 - task: end, 62ms: extractItemsMetadata -[main (2) ] INFO - 0:00:30.333 - onPause()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:00:30.333 - removed listener: 2 listeners -[main (2) ] INFO - 0:00:30.336 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) -[main (2) ] INFO - 0:00:30.337 - onResume()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:30.337 - added listener: 3 listeners -[main (2) ] INFO - 0:00:30.338 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:00:30.338 - source changed: Playlist -[main (2) ] INFO - 0:00:30.338 - selected item changed (now playing): Dancing Lessons -[main (2) ] WARNING - 0:00:30.339 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:30.341 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:00:30.342 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:00:30.343 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:00:30.343 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:00:30.344 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:00:30.348 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:00:30.349 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:00:30.350 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:00:30.884 - performDeviceSearch: search done -[main (2) ] SEVERE - 0:00:30.885 - watchdog: device search--: 0 -[main (2) ] INFO - 0:01:00.864 - onPause()@2e41698:5237 -[main (2) ] INFO - 0:01:00.865 - onPause()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:01:00.866 - removed listener: 2 listeners -[main (2) ] INFO - 0:01:00.867 - removed listener: 1 listeners -[main (2) ] INFO - 0:01:00.912 - onStop()@2e41698:5237 -[main (2) ] INFO - 0:01:00.913 - onStop()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:01:00.914 - onStop()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:01:00.915 - onStop()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:01:00.916 - onSaveInstanceState(outState)@2e41698:5237 -[main (2) ] INFO - 0:01:00.921 - onSaveInstanceState()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:01:00.922 - onSaveInstanceState()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:01:00.923 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:01:01.484 - ACTION_SCREEN_OFF -[main (2) ] SEVERE - 0:01:01.486 - watchdog: schedule inactivity action in 15 mins -[main (2) ] SEVERE - 0:01:01.487 - watchdog: enabled -[cling-33 (Time) (248) ] WARNING - 0:03:24.967 - .h : Client connection was aborted: v5.y: 192.168.0.200:49152 failed to respond: http://192.168.0.200:49152/uuid-2899a4df-39ae-160a-6563-dca6329ead0d/ctl-urn-av-openhome-org-service-Time-1 -[cling-33 (Time) (248) ] WARNING - 0:03:24.972 - .d : Time: Error: Current state of service prevents invoking that action. Connection error or no response received. -[TimeTask: pizzicato-Music (324) ] WARNING - 0:03:24.974 - TimeTask: pizzicato-Music: is.c: Current state of service prevents invoking that action. Connection error or no response received. -[main (2) ] INFO - 0:03:25.546 - ACTION_SCREEN_ON -[main (2) ] SEVERE - 0:03:25.547 - watchdog: cancelled inactivity action -[main (2) ] SEVERE - 0:03:25.549 - watchdog: disabled -[main (2) ] INFO - 0:03:26.363 - onRouteRemoved 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:03:26.365 - not removing cast device due to recent screen on or off -[main (2) ] INFO - 0:03:26.772 - onRouteAdded 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:03:26.774 - not adding already added cast device -[main (2) ] INFO - 0:03:27.114 - onRestart()@2e41698:5237 -[main (2) ] INFO - 0:03:27.117 - onStart()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:03:27.124 - onStart()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:03:27.175 - onStart()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:27.183 - onStart()@2e41698:5237 -[main (2) ] INFO - 0:03:27.193 - onResume()@2e41698:5237 -[main (2) ] INFO - 0:03:27.195 - added listener: 2 listeners -[main (2) ] INFO - 0:03:27.197 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:03:27.211 - onResume()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:03:27.212 - added listener: 3 listeners -[main (2) ] INFO - 0:03:27.212 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:03:27.212 - source changed: Playlist -[main (2) ] INFO - 0:03:27.213 - selected item changed (now playing): Dancing Lessons -[main (2) ] WARNING - 0:03:27.213 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:03:27.214 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:03:27.214 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:03:27.215 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:03:27.216 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:03:27.216 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:03:27.219 - onCreateOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] WARNING - 0:03:27.220 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:03:27.231 - onPrepareOptionsMenu()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:03:28.841 - onPause()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:03:28.842 - removed listener: 2 listeners -[main (2) ] INFO - 0:03:28.843 - onResume()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:28.844 - added listener: 3 listeners -[main (2) ] INFO - 0:03:28.845 - refreshLocalMediaServerLibraryList: removed: fenice -[main (2) ] INFO - 0:03:28.845 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:03:28.845 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:03:28.845 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:03:28.846 - refreshLocalMediaServerLibraryList: added: fenice -[main (2) ] INFO - 0:03:28.846 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:03:28.846 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:03:28.847 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:03:28.847 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:03:28.847 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) -[main (2) ] INFO - 0:03:28.848 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:03:28.849 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:03:28.856 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:28.857 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:32.484 - pizzicato-Music: notify fake TransportState=Stopped on auto track change -[main (2) ] INFO - 0:03:32.485 - stopping task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:03:32.486 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:03:32.487 - SETACTIVE: onTransportStateChanged: post STOP callback -[main (2) ] INFO - 0:03:32.547 - .b : selected item (track id): Slow Sun -[main (2) ] INFO - 0:03:32.548 - selected item changed (service): Slow Sun -[main (2) ] INFO - 0:03:32.589 - pizzicato-Music: notify fake TransportState=Playing on auto track change -[main (2) ] INFO - 0:03:32.590 - started task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:03:32.598 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:03:32.598 - dynamic shortcuts: added 'pizzicato-Music' -[main (2) ] INFO - 0:03:32.600 - renderer chooser target: saved 1 targets -[Main #12 (339) ] INFO - 0:03:32.601 - task: start: publishRendererChooserTargets -[Main #12 (339) ] INFO - 0:03:32.610 - task: end, 9ms: publishRendererChooserTargets -[AsyncTask #3 (338) ] INFO - 0:03:32.619 - saved file /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/files/playlists/recent.dpl ok: 100 items -[main (2) ] SEVERE - 0:03:39.425 - watchdog: device search++: 1 -[main (2) ] INFO - 0:03:39.426 - performDeviceSearch: searching... -[main (2) ] INFO - 0:03:40.995 - active media server: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:03:40.996 - active media server UDN: uuid:c110358f-d885-b44a-d6d3-dca6329ead0d -[main (2) ] INFO - 0:03:41.6 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:41.6 - saveMediaServerState: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:03:41.9 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:41.9 - saveMediaServerState: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:03:41.9 - positionStack: [0, 0] -[main (2) ] INFO - 0:03:41.10 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:03:41.10 - containerPath: [] -[AsyncTask #1 (187) ] INFO - 0:03:41.11 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:03:41.12 - BrowseTask.doInBackground(): loading container 'pizzicato-Music-mediaserver' -[main (2) ] INFO - 0:03:41.13 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:41.14 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:41.34 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:03:41.36 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:03:41.37 - loaded file c110358f-d885-b44a-d6d3-dca6329ead0d-Bookmarks ok: 0 items, 1 ms -[main (2) ] INFO - 0:03:41.38 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:03:41.39 - sorted 2 items took: 1 ms -[main (2) ] INFO - 0:03:41.40 - sorted 2 items took: 0 ms -[AsyncTask #1 (187) ] INFO - 0:03:41.40 - finished browsing: got 6 objects -[AsyncTask #1 (187) ] INFO - 0:03:41.41 - BrowseTask.doInBackground(): no item -[main (2) ] INFO - 0:03:41.42 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:41.43 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] SEVERE - 0:03:44.469 - watchdog: device search--: 0 -[main (2) ] SEVERE - 0:03:44.469 - watchdog: device search++: 1 -[main (2) ] INFO - 0:03:44.469 - performDeviceSearch: searching... -[main (2) ] INFO - 0:03:45.805 - active media server: PMOMusic Media Server -[main (2) ] INFO - 0:03:45.806 - active media server UDN: uuid:63623ff4-ee41-4850-90aa-2d39395df981 -[main (2) ] INFO - 0:03:45.811 - restore path: [radio-paradise:channel:mellow, radio-paradise:channel:mellow:history] -[main (2) ] INFO - 0:03:45.819 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:45.820 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:58.89 - active media server: Local et Cloud -[main (2) ] INFO - 0:03:58.89 - active media server UDN: uuid:d38a2dc7-13c1-4a39-ab36-513490cf6766 -[main (2) ] INFO - 0:03:58.95 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:03:58.95 - restore path: [] -[main (2) ] INFO - 0:03:58.96 - restoring path: [] -[main (2) ] INFO - 0:03:58.97 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:58.97 - saveMediaServerState: Local et Cloud -[main (2) ] INFO - 0:03:58.97 - positionStack: [] -[main (2) ] INFO - 0:03:58.98 - itemList: Bundle[{firstVisiblePosition=1}] -[main (2) ] INFO - 0:03:58.98 - containerPath: [] -[main (2) ] INFO - 0:03:58.99 - restored position stack: [] -[main (2) ] INFO - 0:03:58.103 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:03:58.105 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:00.639 - path = [server://63623ff4-ee41-4850-90aa-2d39395df981] -[main (2) ] INFO - 0:04:00.640 - active media server: PMOMusic Media Server -[main (2) ] INFO - 0:04:00.640 - restore path: [radio-paradise:channel:mellow, radio-paradise:channel:mellow:history] -[main (2) ] INFO - 0:04:00.642 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:00.643 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:04.646 - path = [server://63623ff4-ee41-4850-90aa-2d39395df981] -[main (2) ] INFO - 0:04:04.647 - active media server: PMOMusic Media Server -[main (2) ] INFO - 0:04:04.650 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:04.651 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:06.526 - path = [server://63623ff4-ee41-4850-90aa-2d39395df981] -[main (2) ] INFO - 0:04:06.527 - active media server: PMOMusic Media Server -[main (2) ] INFO - 0:04:06.537 - onCreateOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:06.538 - onPrepareOptionsMenu()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:10.147 - onPause()@2e41698:5237 -[main (2) ] INFO - 0:04:10.152 - onPause()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:10.152 - removed listener: 2 listeners -[main (2) ] INFO - 0:04:10.156 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) -[main (2) ] INFO - 0:04:10.157 - removed listener: 1 listeners -[main (2) ] INFO - 0:04:10.439 - onStop()@2e41698:5237 -[main (2) ] INFO - 0:04:10.441 - onStop()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:04:10.443 - onStop()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:04:10.444 - onStop()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:10.453 - onSaveInstanceState(outState)@2e41698:5237 -[main (2) ] INFO - 0:04:10.465 - onSaveInstanceState()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:04:10.468 - onSaveInstanceState()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:04:10.470 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:10.986 - onDestroy()@2e41698:5237 -[main (2) ] INFO - 0:04:10.990 - onDestroyView()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:04:10.992 - onDestroy()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:04:10.996 - onDetach()@2af0cf8/2e41698:5237 -[main (2) ] INFO - 0:04:10.998 - onDestroyView()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:04:11.2 - onDestroy()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:04:11.3 - removed listener: 0 listeners -[main (2) ] INFO - 0:04:11.6 - onDetach()@5f65d35/2e41698:5237 -[main (2) ] INFO - 0:04:11.8 - onDestroyView()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:11.9 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) -[main (2) ] INFO - 0:04:11.10 - onSaveInstanceState()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:11.11 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:04:11.12 - positionStack: [3, 3, 3] -[main (2) ] INFO - 0:04:11.13 - itemList: Bundle[{firstVisiblePosition=3}] -[main (2) ] INFO - 0:04:11.14 - containerPath: [] -[main (2) ] INFO - 0:04:11.14 - refreshLocalMediaServerLibraryList: removed: fenice -[main (2) ] INFO - 0:04:11.15 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:04:11.16 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:04:11.17 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:04:11.18 - onDestroy()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:11.21 - onDetach()@ec98be8/2e41698:5237 -[main (2) ] INFO - 0:04:11.40 - onTaskRemoved: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 xflg=0x4 cmp=com.bubblesoft.android.bubbleupnp/.MainActivity }, mode: 2 -[main (2) ] INFO - 0:04:13.338 - attachBaseContext(base)@9ef2a0e:-1 -[main (2) ] INFO - 0:04:13.343 - onCreate(): Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 xflg=0x4 cmp=com.bubblesoft.android.bubbleupnp/.MainActivity bnds=[841,188][1041,472] }@9ef2a0e:5238 -[main (2) ] INFO - 0:04:13.343 - Referrer: android-app://com.sec.android.app.launcher -[main (2) ] INFO - 0:04:13.372 - attachBaseContext(base)@ea019b3:-1 -[main (2) ] INFO - 0:04:13.374 - dynamic theming: isDynamicColorAvailable: true, isRuntimeColorThemeGenAvailable: true -[main (2) ] INFO - 0:04:13.374 - dynamic theming: theme mode: 0 -[main (2) ] INFO - 0:04:13.375 - dynamic theming: theme overlay applied -[main (2) ] INFO - 0:04:13.375 - dynamic theming: dark theme: false -[main (2) ] INFO - 0:04:13.376 - dynamic theming: dialogs elevation overlay enabled: true -[main (2) ] INFO - 0:04:13.378 - dynamic theming: applied color harmonization -[main (2) ] INFO - 0:04:13.380 - dynamic theming: initDynamicTheming took: 6 ms -[main (2) ] INFO - 0:04:13.386 - onCreate(): Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 xflg=0x4 cmp=com.bubblesoft.android.bubbleupnp/.MainTabActivity bnds=[841,188][1041,472] }@ea019b3:5238 -[main (2) ] INFO - 0:04:13.389 - dynamic theming: colorPrimary: #ff475d92 -[main (2) ] INFO - 0:04:13.389 - dynamic theming: android:windowBackground: #fffaf8ff -[main (2) ] INFO - 0:04:13.390 - dynamic theming: android:colorbackground: #fffaf8ff -[main (2) ] INFO - 0:04:13.390 - startAndBindServiceWithRetry: retryOnFailure true -[Main #12 (339) ] INFO - 0:04:13.442 - task: start: getSearchableInfo -[Main #12 (339) ] INFO - 0:04:13.443 - task: end, 1ms: getSearchableInfo -[main (2) ] INFO - 0:04:13.444 - MainTabActivity.onCreate() took: 70 ms -[main (2) ] INFO - 0:04:13.445 - onStart()@ea019b3:5238 -[main (2) ] INFO - 0:04:13.446 - onPostCreate()@ea019b3:5238 -[main (2) ] INFO - 0:04:13.446 - startup page index: 0 -[main (2) ] INFO - 0:04:13.446 - onResume()@ea019b3:5238 -[main (2) ] INFO - 0:04:13.454 - display: screen generalized size: normal -[main (2) ] INFO - 0:04:13.454 - display: screen generalized density: 480 dpi -[main (2) ] INFO - 0:04:13.454 - display: logical density factor: 3.000000 -[main (2) ] INFO - 0:04:13.454 - display: screen size (pixels, Display.getSize()): 1080x2400 -[main (2) ] INFO - 0:04:13.455 - display: screen size (pixels, displayMetrics): 1080x2400 -[main (2) ] INFO - 0:04:13.455 - display: screen size (dp): 360x800 -[main (2) ] INFO - 0:04:13.455 - display: screen size (conf: screenWidthDp x screenHeightDp) (dp): 360x800 -[main (2) ] INFO - 0:04:13.455 - display: smallest width (dp): 360 -[main (2) ] INFO - 0:04:13.455 - display: screen size (inches): 2.637801x5.905512, diagonal: 6.467848 -[main (2) ] INFO - 0:04:13.455 - display: screen size aspect ratio (h/w): 2.222222 -[main (2) ] INFO - 0:04:13.455 - display: isTallActivity: true -[main (2) ] INFO - 0:04:13.455 - display: isInMultiWindowMode: false -[main (2) ] INFO - 0:04:13.455 - display: xdpi: 409.432007 -[main (2) ] INFO - 0:04:13.456 - display: ydpi: 406.399994 -[main (2) ] INFO - 0:04:13.456 - display: landscape: false -[main (2) ] INFO - 0:04:13.456 - display: isPhoneSize: true -[main (2) ] INFO - 0:04:13.456 - display: E2E35.isEnforced: true -[main (2) ] INFO - 0:04:13.456 - doStartForeground: calling startForeground(), fromOnStartCommand: true, serviceType: 2 -[main (2) ] INFO - 0:04:13.461 - added listener: 1 listeners -[main (2) ] INFO - 0:04:13.465 - Insets: Insets{left=0, top=88, right=0, bottom=45} -[main (2) ] INFO - 0:04:13.484 - onAttach()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.485 - onCreate()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.487 - onCreateView()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.504 - setSeekBarDetailsText: -[main (2) ] INFO - 0:04:13.504 - NowPlayingFragment.onCreateView() took: 19 ms -[main (2) ] INFO - 0:04:13.505 - onActivityCreated()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.506 - onStart()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.508 - onResume()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.510 - onAttach()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:04:13.510 - onCreate()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:04:13.511 - onCreateView()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:04:13.518 - PlaylistFragment.onCreateView() took: 7 ms -[main (2) ] INFO - 0:04:13.519 - onActivityCreated()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:04:13.520 - onStart()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:04:13.523 - onAttach()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:13.523 - onCreate()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:13.524 - onCreateView()@df8ac1c/ea019b3:5238 -[Main #12 (339) ] INFO - 0:04:13.550 - task: start: getSearchableInfo -[main (2) ] INFO - 0:04:13.550 - LibraryFragment.onCreateView() took: 26 ms -[main (2) ] INFO - 0:04:13.551 - onActivityCreated()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:13.551 - onStart()@df8ac1c/ea019b3:5238 -[Main #12 (339) ] INFO - 0:04:13.552 - task: end, 2ms: getSearchableInfo -[main (2) ] INFO - 0:04:13.555 - setSeekBarDetailsText: -[main (2) ] INFO - 0:04:13.568 - setSeekBarDetailsText: -[main (2) ] INFO - 0:04:13.577 - onCreateOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.578 - onPrepareOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.578 - Insets: Insets{left=0, top=88, right=0, bottom=45} -[main (2) ] INFO - 0:04:13.582 - onNetworkSearchStarted -[main (2) ] INFO - 0:04:13.609 - added listener: 2 listeners -[main (2) ] INFO - 0:04:13.609 - onNetworkSearchEnded -[main (2) ] INFO - 0:04:13.619 - active renderer: pizzicato-Music -[main (2) ] INFO - 0:04:13.619 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:04:13.620 - source changed: Playlist -[main (2) ] INFO - 0:04:13.620 - selected item changed (now playing): Slow Sun -[main (2) ] WARNING - 0:04:13.621 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:04:13.621 - setSeekBarDetailsText: -[main (2) ] INFO - 0:04:13.622 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:04:13.623 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:04:13.623 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:04:13.624 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:04:13.625 - added listener: 3 listeners -[main (2) ] INFO - 0:04:13.625 - active renderer: pizzicato-Music -[main (2) ] INFO - 0:04:13.626 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:04:13.626 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:04:13.626 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:04:13.628 - created mini-player (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:04:13.629 - added listener: 4 listeners -[main (2) ] INFO - 0:04:13.629 - refreshLocalMediaServerLibraryList: added: fenice -[main (2) ] INFO - 0:04:13.629 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:04:13.629 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:04:13.629 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:04:13.630 - active renderer: pizzicato-Music -[main (2) ] INFO - 0:04:13.630 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:04:13.630 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:04:13.632 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:04:13.632 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:04:13.633 - restore path: [] -[main (2) ] INFO - 0:04:13.633 - restoring path: [] -[main (2) ] INFO - 0:04:13.633 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:13.634 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:04:13.634 - positionStack: [] -[main (2) ] INFO - 0:04:13.634 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:04:13.634 - containerPath: [] -[main (2) ] INFO - 0:04:13.636 - restored position stack: [3, 3, 3] -[AsyncTask #1 (187) ] INFO - 0:04:13.636 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:04:13.636 - BrowseTask.doInBackground(): loading container 'PMOMusic Media Server' -[main (2) ] INFO - 0:04:13.638 - onCreateOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] WARNING - 0:04:13.638 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:04:13.639 - onPrepareOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:13.698 - onDestroy()@9ef2a0e:5238 -[main (2) ] INFO - 0:04:13.718 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:04:13.719 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:04:13.719 - loaded file 63623ff4-ee41-4850-90aa-2d39395df981-Bookmarks ok: 0 items, 0 ms -[main (2) ] INFO - 0:04:13.720 - sorted 0 items took: 0 ms -[main (2) ] INFO - 0:04:13.720 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:04:13.721 - sorted 2 items took: 0 ms -[AsyncTask #1 (187) ] INFO - 0:04:13.721 - finished browsing: got 4 objects -[AsyncTask #1 (187) ] INFO - 0:04:13.722 - BrowseTask.doInBackground(): no item -[main (2) ] INFO - 0:04:13.735 - onCreateOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] WARNING - 0:04:13.735 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:04:13.736 - onPrepareOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:14.470 - performDeviceSearch: search done -[main (2) ] SEVERE - 0:04:14.471 - watchdog: device search--: 0 -[main (2) ] INFO - 0:04:15.114 - onPause()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:15.115 - removed listener: 3 listeners -[main (2) ] INFO - 0:04:15.116 - onResume()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:15.117 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:04:15.117 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:04:15.118 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:04:15.118 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:04:15.124 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:15.125 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:22.211 - path = [radio-paradise:channel:mellow] -[main (2) ] INFO - 0:04:22.212 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:22.213 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:04:22.213 - positionStack: [3, 3, 3, 0] -[main (2) ] INFO - 0:04:22.214 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:04:22.214 - containerPath: [radio-paradise:channel:mellow] -[AsyncTask #1 (187) ] INFO - 0:04:22.216 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:04:22.218 - BrowseTask.doInBackground(): loading container 'Mellow Mix' -[main (2) ] INFO - 0:04:22.221 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:22.223 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[Main #12 (339) ] INFO - 0:04:22.325 - task: start: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:04:22.325 - finished browsing: got 2 objects -[Main #12: extractItemsMetadata (339) ] INFO - 0:04:22.326 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #1 (371) ] INFO - 0:04:22.327 - task: start: Item #0 -[AsyncTask #1 (187) ] INFO - 0:04:22.327 - BrowseTask.doInBackground(): no item -[MetadataExtract #1: Item #0 (371) ] INFO - 0:04:22.329 - FfmpegMediaMetadataRetriever: hash=-435748687: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Every Dawn’s a Mountain","100000":"false","2":"Tamino","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","8":"2025"} -[MetadataExtract #1 (371) ] INFO - 0:04:22.330 - task: end, 2ms: Item #0 -[Main #12: extractItemsMetadata (339) ] INFO - 0:04:22.330 - task: executor 'MetadataExtract #%d': close took 3 ms -[Main #12 (339) ] INFO - 0:04:22.330 - task: end, 5ms: extractItemsMetadata -[main (2) ] INFO - 0:04:22.338 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:22.340 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:25.543 - path = [radio-paradise:channel:mellow, radio-paradise:channel:mellow:history] -[main (2) ] INFO - 0:04:25.544 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:25.545 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:04:25.545 - positionStack: [3, 3, 3, 0, 0] -[main (2) ] INFO - 0:04:25.545 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:04:25.546 - containerPath: [radio-paradise:channel:mellow, radio-paradise:channel:mellow:history] -[AsyncTask #1 (187) ] INFO - 0:04:25.548 - BrowseTask.doInBackground(): enter -[main (2) ] INFO - 0:04:25.548 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[AsyncTask #1 (187) ] INFO - 0:04:25.550 - BrowseTask.doInBackground(): loading container 'Mellow Mix - History' -[main (2) ] INFO - 0:04:25.552 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[AsyncTask #1 (187) ] WARNING - 0:04:25.609 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/45e4c84bf08e1d976715235518c58175/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.610 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/198d8c63dcf1e621ebd05b9f6fd87386/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.612 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/32506bc2aa97bb3a9535b771c1617f0b/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.614 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/dfdd93bbc61c5a0020f32715f9bc9e50/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.616 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/4ba9909872cb63b07b07464d1961b476/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.618 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/eb8e4dfd1b055acf64fbc22e0ad36768/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.620 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/39cf232371b482b8cf4fb5c525ff0e94/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.621 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/0ebc06d64c2784a0ff329c4cc0a986b2/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.622 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/0d049094a8a6d753cd3c3ec2e10bfc21/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.623 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/7391afd94f3d145be1fb1f292daa136f/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.625 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/172d6ba8e1d0169e1d84320a5e50767e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.626 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/79fcba551a423af054b023a2bf24073b/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.626 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/d2659b50e0e36f276048a50373b5b4fc/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.627 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/9dcf5452f33adbef0459c74762cf2aca/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.628 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/fd1a51f5344d8d8fa3f3fc31ebc5343d/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.628 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/36a37ecd7a982a356841a48a770a460b/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.663 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/fdc013cb811954f7aa6254bf4c16697e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.664 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/1e715abd124e3f30a970b49a77a152c6/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.665 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/4b1a954e9f043987d8def8fbd3e3e867/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.666 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/172d6ba8e1d0169e1d84320a5e50767e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.667 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/877119bd9100473f4870130d11bb0ab3/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.668 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/e8e2f2e56b5d0be2a670afd4e375523e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.669 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/bff1f690ef399a0d7a5b9963a0da7a3f/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.670 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/76c207a03a3f01305e6348896434cf73/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.671 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/f119369cc72f919d63378465ed7fdf31/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.672 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/82299a6814ec9104010514c28757b2f5/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.673 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/1b21b135410e145a52d788f7f4a4fa68/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.674 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/fecc7386051e6225566f54dc7c9837d0/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.675 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/1ce26247b1226dee2fc34cfd59c28f78/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.677 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/5cdf1420bc8cc80959f2ee9647e2c4da/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.677 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/7939bfcb24a82b7bb6a28176b95fdd8f/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.678 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/d41896013ab277676ed6ed66b70de3c4/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.679 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/53d33f48da568006f936271d20a01d08/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.679 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/fc723fcd196fc4c8f9ae77956ffd9c52/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.680 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/a1c4f20c8a28b372b163946d345d2c08/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.681 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/9b5039a4842b724f57ae95263ab1f01e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.682 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/39e1de9ff912438cd3fcf3f91bda9de0/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.683 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/9a276a3ce9b0415b3c8e9f88afeae897/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.683 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/719247e307fdb74c644757b1d8a4e293/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.684 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/ba0be49db3556b512b53245c910ac83e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.685 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/7c8a7b431d4d1744b904c907c74179d5/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.685 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/54db28b37b416e714454b96996d39149/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.686 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/e8f2ef7188296f46cc0e1f2c72eef932/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.686 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/0bd78ed9f4f4d5fab2714c0c1b6ba18e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.687 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/90e782381dbaad0274534eeef83b7179/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.688 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/e354ad05237ab3e84d7c186532f4936e/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.688 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/b2fe22c3b34008425111d4109f7e1f34/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.689 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/3790a635131f43ba3aae7dffaebdabd5/256 -[AsyncTask #1 (187) ] WARNING - 0:04:25.689 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/ea63e4b76e7f60bf9086af35768a74a4/256 -[Main #12 (339) ] INFO - 0:04:25.690 - task: start: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:04:25.690 - finished browsing: got 49 objects -[AsyncTask #1 (187) ] INFO - 0:04:25.690 - BrowseTask.doInBackground(): no item -[MetadataExtract #1 (381) ] INFO - 0:04:25.691 - task: start: Item #0 -[MetadataExtract #2 (382) ] INFO - 0:04:25.691 - task: start: Item #1 -[MetadataExtract #3 (383) ] INFO - 0:04:25.691 - task: start: Item #2 -[MetadataExtract #4 (384) ] INFO - 0:04:25.692 - task: start: Item #3 -[MetadataExtract #6 (386) ] INFO - 0:04:25.692 - task: start: Item #5 -[MetadataExtract #5 (385) ] INFO - 0:04:25.692 - task: start: Item #4 -[MetadataExtract #7 (387) ] INFO - 0:04:25.693 - task: start: Item #6 -[Main #12: extractItemsMetadata (339) ] INFO - 0:04:25.693 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #8 (388) ] INFO - 0:04:25.693 - task: start: Item #7 -[MetadataExtract #1: Item #0 (381) ] INFO - 0:04:25.693 - FfmpegMediaMetadataRetriever: hash=-1759650642: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O\u0027Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Dancing Lessons","39":"16","9":"249470"} -[MetadataExtract #1 (381) ] INFO - 0:04:25.694 - task: end, 3ms: Item #0 -[MetadataExtract #1 (381) ] INFO - 0:04:25.694 - task: start: Item #8 -[MetadataExtract #2: Item #1 (382) ] INFO - 0:04:25.694 - FfmpegMediaMetadataRetriever: hash=-1913648982: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Aukai","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Slow Sun","39":"16","9":"206810"} -[MetadataExtract #2 (382) ] INFO - 0:04:25.694 - task: end, 4ms: Item #1 -[MetadataExtract #2 (382) ] INFO - 0:04:25.695 - task: start: Item #9 -[MetadataExtract #3: Item #2 (383) ] INFO - 0:04:25.695 - FfmpegMediaMetadataRetriever: hash=-106913403: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Diana Krall","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Fly Me to the Moon","39":"16","9":"328724"} -[MetadataExtract #3 (383) ] INFO - 0:04:25.695 - task: end, 4ms: Item #2 -[main (2) ] INFO - 0:04:25.695 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[MetadataExtract #3 (383) ] INFO - 0:04:25.696 - task: start: Item #10 -[MetadataExtract #4: Item #3 (384) ] INFO - 0:04:25.696 - FfmpegMediaMetadataRetriever: hash=1993842102: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Mighty Rootsmen","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Won\u0027t Back Down","39":"16","9":"156594"} -[main (2) ] INFO - 0:04:25.696 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[MetadataExtract #6: Item #5 (386) ] INFO - 0:04:25.697 - FfmpegMediaMetadataRetriever: hash=-1138992005: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Michael Hedges","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Prelude to Cello Suite #1 (JS Bach)","39":"16","9":"139943"} -[MetadataExtract #6 (386) ] INFO - 0:04:25.698 - task: end, 6ms: Item #5 -[MetadataExtract #6 (386) ] INFO - 0:04:25.698 - task: start: Item #11 -[MetadataExtract #6: Item #11 (386) ] INFO - 0:04:25.701 - FfmpegMediaMetadataRetriever: hash=1385248911: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Billy Bragg \u0026 Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"When The Roses Bloom Again","39":"16","9":"246000"} -[MetadataExtract #6 (386) ] INFO - 0:04:25.702 - task: end, 4ms: Item #11 -[MetadataExtract #6 (386) ] INFO - 0:04:25.702 - task: start: Item #12 -[MetadataExtract #6: Item #12 (386) ] INFO - 0:04:25.702 - FfmpegMediaMetadataRetriever: hash=-352088410: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Suzanne Vega","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"12 Mortal Men","39":"16","9":"157000"} -[MetadataExtract #8: Item #7 (388) ] INFO - 0:04:25.703 - FfmpegMediaMetadataRetriever: hash=42813812: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"I Am Kloot","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Let Them All In","39":"16","9":"231290"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.703 - task: end, 11ms: Item #7 -[MetadataExtract #8 (388) ] INFO - 0:04:25.704 - task: start: Item #13 -[MetadataExtract #4 (384) ] INFO - 0:04:25.697 - task: end, 5ms: Item #3 -[MetadataExtract #8: Item #13 (388) ] INFO - 0:04:25.704 - FfmpegMediaMetadataRetriever: hash=1891231045: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Sundays","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wild Horses","39":"16","9":"277000"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.705 - task: end, 1ms: Item #13 -[MetadataExtract #8 (388) ] INFO - 0:04:25.705 - task: start: Item #15 -[MetadataExtract #8: Item #15 (388) ] INFO - 0:04:25.705 - FfmpegMediaMetadataRetriever: hash=1003137573: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Trespassers William","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Different Stars","39":"16","9":"278647"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.706 - task: end, 1ms: Item #15 -[MetadataExtract #8 (388) ] INFO - 0:04:25.706 - task: start: Item #16 -[MetadataExtract #8: Item #16 (388) ] INFO - 0:04:25.706 - FfmpegMediaMetadataRetriever: hash=-1783977340: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"David Gray","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"260750"} -[MetadataExtract #5: Item #4 (385) ] INFO - 0:04:25.707 - FfmpegMediaMetadataRetriever: hash=-407518392: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Josh Ritter","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Curse","39":"16","9":"292250"} -[MetadataExtract #5 (385) ] INFO - 0:04:25.707 - task: end, 16ms: Item #4 -[MetadataExtract #5 (385) ] INFO - 0:04:25.708 - task: start: Item #17 -[MetadataExtract #5: Item #17 (385) ] INFO - 0:04:25.708 - FfmpegMediaMetadataRetriever: hash=1845475776: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Bruce Cockburn","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wondering Where the Lions Are (Live)","39":"16","9":"320000"} -[MetadataExtract #5 (385) ] INFO - 0:04:25.709 - task: end, 1ms: Item #17 -[MetadataExtract #5 (385) ] INFO - 0:04:25.709 - task: start: Item #18 -[MetadataExtract #8 (388) ] INFO - 0:04:25.709 - task: end, 3ms: Item #16 -[MetadataExtract #8 (388) ] INFO - 0:04:25.709 - task: start: Item #19 -[MetadataExtract #3: Item #10 (383) ] INFO - 0:04:25.709 - FfmpegMediaMetadataRetriever: hash=1612634984: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"5050"} -[MetadataExtract #3 (383) ] INFO - 0:04:25.710 - task: end, 14ms: Item #10 -[MetadataExtract #3 (383) ] INFO - 0:04:25.710 - task: start: Item #20 -[MetadataExtract #4 (384) ] INFO - 0:04:25.704 - task: start: Item #14 -[MetadataExtract #3: Item #20 (383) ] INFO - 0:04:25.711 - FfmpegMediaMetadataRetriever: hash=-993423853: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"R.E.M.","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Perfect Circle","39":"16","9":"202700"} -[MetadataExtract #5: Item #18 (385) ] INFO - 0:04:25.711 - FfmpegMediaMetadataRetriever: hash=1710638978: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O’Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Back Where You Belong","39":"16","9":"249150"} -[MetadataExtract #5 (385) ] INFO - 0:04:25.712 - task: end, 3ms: Item #18 -[MetadataExtract #6 (386) ] INFO - 0:04:25.708 - task: end, 6ms: Item #12 -[MetadataExtract #3 (383) ] INFO - 0:04:25.712 - task: end, 2ms: Item #20 -[MetadataExtract #3 (383) ] INFO - 0:04:25.713 - task: start: Item #23 -[MetadataExtract #6 (386) ] INFO - 0:04:25.712 - task: start: Item #22 -[MetadataExtract #5 (385) ] INFO - 0:04:25.712 - task: start: Item #21 -[MetadataExtract #1: Item #8 (381) ] INFO - 0:04:25.714 - FfmpegMediaMetadataRetriever: hash=724650897: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Peter Gabriel","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Book of Love","39":"16","9":"216972"} -[MetadataExtract #1 (381) ] INFO - 0:04:25.714 - task: end, 21ms: Item #8 -[MetadataExtract #1 (381) ] INFO - 0:04:25.715 - task: start: Item #24 -[MetadataExtract #7: Item #6 (387) ] INFO - 0:04:25.715 - FfmpegMediaMetadataRetriever: hash=-962027383: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Ayla Nereo","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Ylva","39":"16","9":"289409"} -[MetadataExtract #7 (387) ] INFO - 0:04:25.715 - task: end, 23ms: Item #6 -[MetadataExtract #7 (387) ] INFO - 0:04:25.716 - task: start: Item #25 -[MetadataExtract #1: Item #24 (381) ] INFO - 0:04:25.716 - FfmpegMediaMetadataRetriever: hash=1899042957: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"London Grammar","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Shyer","39":"16","9":"182000"} -[MetadataExtract #1 (381) ] INFO - 0:04:25.717 - task: end, 2ms: Item #24 -[MetadataExtract #1 (381) ] INFO - 0:04:25.717 - task: start: Item #26 -[MetadataExtract #4: Item #14 (384) ] INFO - 0:04:25.717 - FfmpegMediaMetadataRetriever: hash=-1053255835: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tim Buckley","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Happy Time","39":"16","9":"190000"} -[MetadataExtract #4 (384) ] INFO - 0:04:25.717 - task: end, 14ms: Item #14 -[MetadataExtract #4 (384) ] INFO - 0:04:25.718 - task: start: Item #27 -[MetadataExtract #2: Item #9 (382) ] INFO - 0:04:25.718 - FfmpegMediaMetadataRetriever: hash=277540764: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Foo Fighters","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Still","39":"16","9":"310800"} -[MetadataExtract #2 (382) ] INFO - 0:04:25.718 - task: end, 23ms: Item #9 -[MetadataExtract #2 (382) ] INFO - 0:04:25.718 - task: start: Item #28 -[MetadataExtract #3: Item #23 (383) ] INFO - 0:04:25.718 - FfmpegMediaMetadataRetriever: hash=-2056388036: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Norah Jones","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Light as a Feather","39":"16","9":"231305"} -[MetadataExtract #3 (383) ] INFO - 0:04:25.719 - task: end, 6ms: Item #23 -[MetadataExtract #3 (383) ] INFO - 0:04:25.719 - task: start: Item #29 -[MetadataExtract #6: Item #22 (386) ] INFO - 0:04:25.719 - FfmpegMediaMetadataRetriever: hash=-395410295: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sierra Ferrell","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Don’t Let Your Deal Go Down","39":"16","9":"211710"} -[MetadataExtract #6 (386) ] INFO - 0:04:25.719 - task: end, 8ms: Item #22 -[MetadataExtract #6 (386) ] INFO - 0:04:25.720 - task: start: Item #30 -[MetadataExtract #5: Item #21 (385) ] INFO - 0:04:25.720 - FfmpegMediaMetadataRetriever: hash=1757379569: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Cactus Blossoms","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Mississippi","39":"16","9":"235634"} -[MetadataExtract #5 (385) ] INFO - 0:04:25.720 - task: end, 7ms: Item #21 -[MetadataExtract #5 (385) ] INFO - 0:04:25.720 - task: start: Item #31 -[MetadataExtract #8: Item #19 (388) ] INFO - 0:04:25.720 - FfmpegMediaMetadataRetriever: hash=-894762509: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"8516"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.721 - task: end, 12ms: Item #19 -[MetadataExtract #8 (388) ] INFO - 0:04:25.721 - task: start: Item #32 -[MetadataExtract #7: Item #25 (387) ] INFO - 0:04:25.721 - FfmpegMediaMetadataRetriever: hash=-524282951: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Meyer, Douglas \u0026 Barenberg","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Hymn Of Ordinary Motion","39":"16","9":"114000"} -[MetadataExtract #7 (387) ] INFO - 0:04:25.721 - task: end, 6ms: Item #25 -[MetadataExtract #7 (387) ] INFO - 0:04:25.722 - task: start: Item #33 -[MetadataExtract #1: Item #26 (381) ] INFO - 0:04:25.722 - FfmpegMediaMetadataRetriever: hash=687172484: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tom Waits","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Heart of Saturday Night","39":"16","9":"229000"} -[MetadataExtract #1 (381) ] INFO - 0:04:25.722 - task: end, 5ms: Item #26 -[MetadataExtract #1 (381) ] INFO - 0:04:25.722 - task: start: Item #34 -[MetadataExtract #4: Item #27 (384) ] INFO - 0:04:25.722 - FfmpegMediaMetadataRetriever: hash=131303568: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Neko Case","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Buckets of Rain","39":"16","9":"199000"} -[MetadataExtract #4 (384) ] INFO - 0:04:25.723 - task: end, 5ms: Item #27 -[MetadataExtract #4 (384) ] INFO - 0:04:25.723 - task: start: Item #35 -[MetadataExtract #2: Item #28 (382) ] INFO - 0:04:25.723 - FfmpegMediaMetadataRetriever: hash=485794117: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tracy Chapman","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"New Beginning","39":"16","9":"325000"} -[MetadataExtract #2 (382) ] INFO - 0:04:25.723 - task: end, 6ms: Item #28 -[MetadataExtract #2 (382) ] INFO - 0:04:25.724 - task: start: Item #36 -[MetadataExtract #3: Item #29 (383) ] INFO - 0:04:25.724 - FfmpegMediaMetadataRetriever: hash=-775299294: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Blind Faith","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Can\u0027t Find My Way Home","39":"16","9":"188500"} -[MetadataExtract #3 (383) ] INFO - 0:04:25.724 - task: end, 5ms: Item #29 -[MetadataExtract #3 (383) ] INFO - 0:04:25.724 - task: start: Item #37 -[MetadataExtract #6: Item #30 (386) ] INFO - 0:04:25.724 - FfmpegMediaMetadataRetriever: hash=-1561902046: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Willie Nelson","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Blue Eyes Crying in the Rain","39":"16","9":"136200"} -[MetadataExtract #6 (386) ] INFO - 0:04:25.725 - task: end, 5ms: Item #30 -[MetadataExtract #6 (386) ] INFO - 0:04:25.725 - task: start: Item #38 -[MetadataExtract #5: Item #31 (385) ] INFO - 0:04:25.725 - FfmpegMediaMetadataRetriever: hash=1402956451: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jon Redfern","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Love the Sun","39":"16","9":"300000"} -[MetadataExtract #5 (385) ] INFO - 0:04:25.725 - task: end, 6ms: Item #31 -[MetadataExtract #5 (385) ] INFO - 0:04:25.726 - task: start: Item #39 -[MetadataExtract #8: Item #32 (388) ] INFO - 0:04:25.726 - FfmpegMediaMetadataRetriever: hash=1984356975: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cyndi Lauper","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Time After Time","39":"16","9":"232250"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.726 - task: end, 5ms: Item #32 -[MetadataExtract #8 (388) ] INFO - 0:04:25.726 - task: start: Item #40 -[MetadataExtract #7: Item #33 (387) ] INFO - 0:04:25.726 - FfmpegMediaMetadataRetriever: hash=1977966954: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Fleetwood Mac","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Walk a Thin Line","39":"16","9":"222000"} -[MetadataExtract #7 (387) ] INFO - 0:04:25.727 - task: end, 5ms: Item #33 -[MetadataExtract #7 (387) ] INFO - 0:04:25.727 - task: start: Item #41 -[MetadataExtract #1: Item #34 (381) ] INFO - 0:04:25.727 - FfmpegMediaMetadataRetriever: hash=1475446356: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Elephant Revival","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Barefoot Friend","39":"16","9":"191000"} -[MetadataExtract #1 (381) ] INFO - 0:04:25.727 - task: end, 5ms: Item #34 -[MetadataExtract #1 (381) ] INFO - 0:04:25.727 - task: start: Item #42 -[MetadataExtract #4: Item #35 (384) ] INFO - 0:04:25.727 - FfmpegMediaMetadataRetriever: hash=1109877331: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Hamilton Leithauser","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Silent Orchestra","39":"16","9":"264060"} -[MetadataExtract #4 (384) ] INFO - 0:04:25.728 - task: end, 5ms: Item #35 -[MetadataExtract #2: Item #36 (382) ] INFO - 0:04:25.728 - FfmpegMediaMetadataRetriever: hash=-2093135018: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Shins","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Turn on Me","39":"16","9":"209500"} -[MetadataExtract #4 (384) ] INFO - 0:04:25.728 - task: start: Item #43 -[MetadataExtract #2 (382) ] INFO - 0:04:25.729 - task: end, 5ms: Item #36 -[MetadataExtract #2 (382) ] INFO - 0:04:25.729 - task: start: Item #44 -[MetadataExtract #4: Item #43 (384) ] INFO - 0:04:25.730 - FfmpegMediaMetadataRetriever: hash=-1752918010: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Paul Simon","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Loves Me Like A Rock","39":"16","9":"201000"} -[MetadataExtract #4 (384) ] INFO - 0:04:25.731 - task: end, 3ms: Item #43 -[MetadataExtract #6: Item #38 (386) ] INFO - 0:04:25.731 - FfmpegMediaMetadataRetriever: hash=1709432058: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cocosuma","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Servant","39":"16","9":"289070"} -[MetadataExtract #4 (384) ] INFO - 0:04:25.732 - task: start: Item #45 -[MetadataExtract #5: Item #39 (385) ] INFO - 0:04:25.732 - FfmpegMediaMetadataRetriever: hash=-475084519: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimi Hendrix","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Castles Made Of Sand","39":"16","9":"164612"} -[MetadataExtract #6 (386) ] INFO - 0:04:25.733 - task: end, 8ms: Item #38 -[MetadataExtract #6 (386) ] INFO - 0:04:25.733 - task: start: Item #46 -[MetadataExtract #8: Item #40 (388) ] INFO - 0:04:25.733 - FfmpegMediaMetadataRetriever: hash=-238367317: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Oi Va Voi","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Know What You Are","39":"16","9":"182000"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.734 - task: end, 8ms: Item #40 -[MetadataExtract #8 (388) ] INFO - 0:04:25.734 - task: start: Item #47 -[MetadataExtract #8: Item #47 (388) ] INFO - 0:04:25.734 - FfmpegMediaMetadataRetriever: hash=1850019505: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Harry Manx","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Bring That Thing (live)","39":"16","9":"332000"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.735 - task: end, 1ms: Item #47 -[MetadataExtract #8 (388) ] INFO - 0:04:25.735 - task: start: Item #48 -[MetadataExtract #5 (385) ] INFO - 0:04:25.733 - task: end, 8ms: Item #39 -[MetadataExtract #1: Item #42 (381) ] INFO - 0:04:25.735 - FfmpegMediaMetadataRetriever: hash=2140521498: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Manchester Orchestra","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Capital Karma","39":"16","9":"215108"} -[MetadataExtract #1 (381) ] INFO - 0:04:25.736 - task: end, 8ms: Item #42 -[MetadataExtract #2: Item #44 (382) ] INFO - 0:04:25.736 - FfmpegMediaMetadataRetriever: hash=152071891: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tamino","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"336306"} -[MetadataExtract #2 (382) ] INFO - 0:04:25.736 - task: end, 7ms: Item #44 -[MetadataExtract #3: Item #37 (383) ] INFO - 0:04:25.737 - FfmpegMediaMetadataRetriever: hash=496599921: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Moby","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wait for Me","39":"16","9":"204000"} -[MetadataExtract #3 (383) ] INFO - 0:04:25.737 - task: end, 14ms: Item #37 -[MetadataExtract #4: Item #45 (384) ] INFO - 0:04:25.738 - FfmpegMediaMetadataRetriever: hash=-731586392: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sonny Chillingworth","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Moe \u0027Uhane (Dream Slack Key)","39":"16","9":"164000"} -[MetadataExtract #6: Item #46 (386) ] INFO - 0:04:25.739 - FfmpegMediaMetadataRetriever: hash=-174877526: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimmy Cliff","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Harder They Come","39":"16","9":"180968"} -[MetadataExtract #4 (384) ] INFO - 0:04:25.740 - task: end, 8ms: Item #45 -[MetadataExtract #6 (386) ] INFO - 0:04:25.740 - task: end, 8ms: Item #46 -[MetadataExtract #7: Item #41 (387) ] INFO - 0:04:25.740 - FfmpegMediaMetadataRetriever: hash=-1032742246: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Sky Blue Sky","39":"16","9":"193957"} -[MetadataExtract #7 (387) ] INFO - 0:04:25.741 - task: end, 14ms: Item #41 -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.740 - FfmpegMediaMetadataRetriever: hash=1096471425: expensive op: retrieveMetadata -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.741 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/497c78b081943f22c0b7a2861e0bb35f_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.742 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/e87aa42bc2f5632ebdf983a47b90d4fc_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.742 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/b71d978c46b591f2211c5834a0e5b902_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.742 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/079e09407590d3c89234f3433280c3e0_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.742 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/a8f5995175f02b30b884ec3324c831a4_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.743 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/ed084a8cd1b7ef2d38d4d8e8e272cc7c_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.743 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/82dc11173748da450c8bdb1067b00bbb_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.743 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/c8befc1539c774548f106f2f5ea6c4bf_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.743 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/ca41892cc7c2b2298f6eff806ba2399a_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.743 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/aa7e068ebfa7f443972ab1b72cffc3a8_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.744 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/e5bee29a1067b71f8d96ab7bc592eec7_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.744 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/2dc9f632f96001db6f6e0c714e61ea00_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.744 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/d46e57c82ed02a1848e32c0b01f21cb7_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.744 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/069ef589ce1d9621a87afb28e7fa658c_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.744 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/1585bae3666307dd663c6f837492dec7_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.745 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/d852d1f210c87200bd68b1429738ca5b_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.746 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/43c48c8e99e74c18b5b404eb388dce24_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.746 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/d5b6f3e1ccc8f4828ca2dc0efd69b987_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.746 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/4d69f84b74a86795a52fcb73c3800af8_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.746 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/ef96c7fc42def2977a9963e2d4e892ff_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.747 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/6ea1402e7b33ffb328887cb914d51778_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.747 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/8ee666aeb2de061e86fc6d568b5f2a18_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.747 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/508871fecdd0d94347006d53b427111e_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.747 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/f0b1544d237f5347612a7f7832f8f1ac_null_ -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.771 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 1 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/audio/flac/50314386354bec0fa6062156ab2e50fa -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.986 - ffprobe finished -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.986 - ffprobe took: 216 ms -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.986 - added cached probe info for http://192.168.0.138:8080/audio/flac/50314386354bec0fa6062156ab2e50fa_null_, expires in 173 seconds -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.987 - FfmpegMediaMetadataRetriever: hash=1096471425: retrieveMetadata took: 247 ms -[MetadataExtract #8: Item #48 (388) ] INFO - 0:04:25.987 - FfmpegMediaMetadataRetriever: hash=1096471425: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jenny Lewis","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Charging Sky (w/ The Watson Twins)","39":"16","9":"173476"} -[MetadataExtract #8 (388) ] INFO - 0:04:25.987 - task: end, 253ms: Item #48 -[Main #12: extractItemsMetadata (339) ] INFO - 0:04:25.988 - task: executor 'MetadataExtract #%d': close took 295 ms -[Main #12 (339) ] INFO - 0:04:25.989 - task: end, 299ms: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:04:32.12 - BrowseTask.doInBackground(): enter -[main (2) ] INFO - 0:04:32.28 - selected item changed (service): -[main (2) ] INFO - 0:04:32.86 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:32.87 - pizzicato-Music: Dancing Lessons: returning first supported resource -[main (2) ] INFO - 0:04:32.89 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:32.101 - selected item changed (service): -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:32.108 - pizzicato-Music: addItemsAfter: inserted item after id=72, url=http://192.168.0.138:8080/audio/flac/50ec4ba2cffd1ef92ebe194f36657375, metadata=object.item.audioItem.musicTrackDancing LessonsSinéad O'ConnorSinéad O'ConnorRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2000-01-01Faith and Courage63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/50ec4ba2cffd1ef92ebe194f36657375 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:32.109 - pizzicato-Music: addItemsAfter: wait 2000ms (workaround) -[main (2) ] WARNING - 0:04:32.122 - .b : couldn't find item trackId = 25 -[main (2) ] INFO - 0:04:32.123 - selected item changed (service): -[main (2) ] WARNING - 0:04:32.145 - .b : couldn't find item trackId = 0 -[main (2) ] INFO - 0:04:32.145 - selected item changed (service): -[main (2) ] INFO - 0:04:32.169 - stopping task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:04:32.169 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:04:32.169 - SETACTIVE: onTransportStateChanged: post STOP callback -[main (2) ] INFO - 0:04:32.185 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:32.186 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:33.99 - pizzicato-Music: processIdArray: ignoring update due to lock -[main (2) ] WARNING - 0:04:33.100 - .b : couldn't find item trackId = 0 -[main (2) ] INFO - 0:04:33.100 - selected item changed (service): -[main (2) ] WARNING - 0:04:33.126 - .b : couldn't find item trackId = 72 -[main (2) ] INFO - 0:04:33.126 - selected item changed (service): -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.125 - pizzicato-Music: reading 1 new items to insert: [72] -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.126 - pizzicato-Music: getting [0..1[ -[main (2) ] INFO - 0:04:34.148 - .b : selected item (track id): Dancing Lessons -[main (2) ] INFO - 0:04:34.149 - selected item changed (service): Dancing Lessons -[main (2) ] INFO - 0:04:34.182 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:34.184 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:34.210 - playItem: main thread -[PlaybackAction: idle (323) ] INFO - 0:04:34.211 - playItem: worker thread enter -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.214 - pizzicato-Music: Slow Sun: returning first supported resource -[PlaybackAction:playItem (323) ] INFO - 0:04:34.228 - playItem worker thread took: 17 ms -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.243 - pizzicato-Music: addItemsAfter: inserted item after id=73, url=http://192.168.0.138:8080/audio/flac/341b0cbfdfe9755ac1c676d0e77a23c9, metadata=object.item.audioItem.musicTrackSlow SunAukaiAukaiRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2025-01-01Slow Sun - Single63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/341b0cbfdfe9755ac1c676d0e77a23c9 -[main (2) ] INFO - 0:04:34.254 - pizzicato-Music: processIdArray: ignoring update due to lock -[main (2) ] INFO - 0:04:34.255 - started task TimeTask: pizzicato-Music -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.255 - pizzicato-Music: Fly Me to the Moon: returning first supported resource -[main (2) ] INFO - 0:04:34.258 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:04:34.258 - dynamic shortcuts: added 'pizzicato-Music' -[main (2) ] INFO - 0:04:34.260 - renderer chooser target: saved 1 targets -[Main #12 (339) ] INFO - 0:04:34.261 - task: start: publishRendererChooserTargets -[Main #12 (339) ] INFO - 0:04:34.286 - task: end, 26ms: publishRendererChooserTargets -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.287 - pizzicato-Music: addItemsAfter: inserted item after id=74, url=http://192.168.0.138:8080/audio/flac/f1f7731535fdb77e83b401c5c54790a9, metadata=object.item.audioItem.musicTrackFly Me to the MoonDiana KrallDiana KrallRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2002-01-01Live In Paris63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f1f7731535fdb77e83b401c5c54790a9 -[AsyncTask #4 (393) ] INFO - 0:04:34.294 - saved file /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/files/playlists/recent.dpl ok: 100 items -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.296 - pizzicato-Music: I Won't Back Down: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.325 - pizzicato-Music: addItemsAfter: inserted item after id=75, url=http://192.168.0.138:8080/audio/flac/4592022e5adbb88cec2f7883972b8303, metadata=object.item.audioItem.musicTrackI Won't Back DownThe Mighty RootsmenThe Mighty RootsmenRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2025-01-01The Mighty Rootsmen, Toots & The Maytals, Gregory Isaacs & Mykal Rose63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/4592022e5adbb88cec2f7883972b8303 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.332 - pizzicato-Music: The Curse: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.361 - pizzicato-Music: addItemsAfter: inserted item after id=76, url=http://192.168.0.138:8080/audio/flac/be31edd4a08b2208188269574312c1ef, metadata=object.item.audioItem.musicTrackThe CurseJosh RitterJosh RitterRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2010-01-01So Runs the World Away63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/be31edd4a08b2208188269574312c1ef -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.363 - pizzicato-Music: Prelude to Cello Suite #1 (JS Bach): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.425 - pizzicato-Music: addItemsAfter: inserted item after id=77, url=http://192.168.0.138:8080/audio/flac/f6f23d21ec900a59466e3b23e2ea95fc, metadata=object.item.audioItem.musicTrackPrelude to Cello Suite #1 (JS Bach)Michael HedgesMichael HedgesRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1990-01-01Select Sounds 199663623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f6f23d21ec900a59466e3b23e2ea95fc -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.431 - pizzicato-Music: Ylva: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.480 - pizzicato-Music: addItemsAfter: inserted item after id=78, url=http://192.168.0.138:8080/audio/flac/f5e11ed3dcebbc4b409786631d4703b2, metadata=object.item.audioItem.musicTrackYlvaAyla NereoAyla NereoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2023-01-01Sovereign Kin – Book I: The Spark63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f5e11ed3dcebbc4b409786631d4703b2 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.486 - pizzicato-Music: Let Them All In: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.529 - pizzicato-Music: addItemsAfter: inserted item after id=79, url=http://192.168.0.138:8080/audio/flac/668db4b5f4b25fbad790b5bec3b95b43, metadata=object.item.audioItem.musicTrackLet Them All InI Am KlootI Am KlootRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2013-01-01Let It All In63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/668db4b5f4b25fbad790b5bec3b95b43 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.531 - pizzicato-Music: The Book of Love: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.557 - pizzicato-Music: addItemsAfter: inserted item after id=80, url=http://192.168.0.138:8080/audio/flac/e807470e04488465c04c4d4de763c695, metadata=object.item.audioItem.musicTrackThe Book of LovePeter GabrielPeter GabrielRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2010-01-01Scratch My Back63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/e807470e04488465c04c4d4de763c695 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.560 - pizzicato-Music: Still: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.576 - pizzicato-Music: addItemsAfter: inserted item after id=81, url=http://192.168.0.138:8080/audio/flac/c1ed42dee1c68dc52ddcade17e7c03d8, metadata=object.item.audioItem.musicTrackStillFoo FightersFoo FightersRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2005-01-01In Your Honor63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/c1ed42dee1c68dc52ddcade17e7c03d8 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.579 - pizzicato-Music: Listener-supported: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.601 - pizzicato-Music: addItemsAfter: inserted item after id=82, url=http://192.168.0.138:8080/audio/flac/0354ff365fc12530ab574798918231f3, metadata=object.item.audioItem.musicTrackListener-supportedCommercial-freeCommercial-freeRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/0354ff365fc12530ab574798918231f3 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.607 - pizzicato-Music: When The Roses Bloom Again: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.626 - pizzicato-Music: addItemsAfter: inserted item after id=83, url=http://192.168.0.138:8080/audio/flac/25540bcbdb5fb212d0d3c1a29faa762f, metadata=object.item.audioItem.musicTrackWhen The Roses Bloom AgainBilly Bragg & WilcoBilly Bragg & WilcoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2012-01-01Mermaid Avenue Vol III63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/25540bcbdb5fb212d0d3c1a29faa762f -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.628 - pizzicato-Music: 12 Mortal Men: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.646 - pizzicato-Music: addItemsAfter: inserted item after id=84, url=http://192.168.0.138:8080/audio/flac/b1819621989454decfdeeb2fd1012742, metadata=object.item.audioItem.musicTrack12 Mortal MenSuzanne VegaSuzanne VegaRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2016-01-01Lover, Beloved: Songs from an Evening with Carson McCullers1263623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/b1819621989454decfdeeb2fd1012742 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.653 - pizzicato-Music: Wild Horses: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.670 - pizzicato-Music: addItemsAfter: inserted item after id=85, url=http://192.168.0.138:8080/audio/flac/7a1420295c9ba04a9123f5a8d3fc7b08, metadata=object.item.audioItem.musicTrackWild HorsesThe SundaysThe SundaysRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1992-01-01Blind63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/7a1420295c9ba04a9123f5a8d3fc7b08 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.677 - pizzicato-Music: Happy Time: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.699 - pizzicato-Music: addItemsAfter: inserted item after id=86, url=http://192.168.0.138:8080/audio/flac/a55129a8f5bc6ecefd7b904d794b9052, metadata=object.item.audioItem.musicTrackHappy TimeTim BuckleyTim BuckleyRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1969-01-01Blue Afternoon63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/a55129a8f5bc6ecefd7b904d794b9052 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.706 - pizzicato-Music: Different Stars: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.982 - pizzicato-Music: addItemsAfter: inserted item after id=87, url=http://192.168.0.138:8080/audio/flac/1d25a8b5f6be45e2bb26896b82ed15c7, metadata=object.item.audioItem.musicTrackDifferent StarsTrespassers WilliamTrespassers WilliamRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2002-01-01Different Stars63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/1d25a8b5f6be45e2bb26896b82ed15c7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:34.985 - pizzicato-Music: Babylon: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.6 - pizzicato-Music: addItemsAfter: inserted item after id=88, url=http://192.168.0.138:8080/audio/flac/2ad68dd550b16313027271cb63d9153b, metadata=object.item.audioItem.musicTrackBabylonDavid GrayDavid GrayRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1998-01-01White Ladder63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/2ad68dd550b16313027271cb63d9153b -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.9 - pizzicato-Music: Wondering Where the Lions Are (Live): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.27 - pizzicato-Music: addItemsAfter: inserted item after id=89, url=http://192.168.0.138:8080/audio/flac/67c92e72e18e489dee64f769588cb1ce, metadata=object.item.audioItem.musicTrackWondering Where the Lions Are (Live)Bruce CockburnBruce CockburnRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1997-01-01The Whole Night Sky63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/67c92e72e18e489dee64f769588cb1ce -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.30 - pizzicato-Music: Back Where You Belong: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.55 - pizzicato-Music: addItemsAfter: inserted item after id=90, url=http://192.168.0.138:8080/audio/flac/82dc11173748da450c8bdb1067b00bbb, metadata=object.item.audioItem.musicTrackBack Where You BelongSinéad O'ConnorSinéad O'ConnorRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2012-01-01How About I Be Me (And You Be You)?63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/82dc11173748da450c8bdb1067b00bbb -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.57 - pizzicato-Music: Listener-supported: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.110 - pizzicato-Music: addItemsAfter: inserted item after id=91, url=http://192.168.0.138:8080/audio/flac/f0b1544d237f5347612a7f7832f8f1ac, metadata=object.item.audioItem.musicTrackListener-supportedCommercial-freeCommercial-freeRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f0b1544d237f5347612a7f7832f8f1ac -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.115 - pizzicato-Music: Perfect Circle: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.139 - pizzicato-Music: addItemsAfter: inserted item after id=92, url=http://192.168.0.138:8080/audio/flac/aa7e068ebfa7f443972ab1b72cffc3a8, metadata=object.item.audioItem.musicTrackPerfect CircleR.E.M.R.E.M.Radio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1983-01-01Murmur63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/aa7e068ebfa7f443972ab1b72cffc3a8 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.145 - pizzicato-Music: Mississippi: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.170 - pizzicato-Music: addItemsAfter: inserted item after id=93, url=http://192.168.0.138:8080/audio/flac/508871fecdd0d94347006d53b427111e, metadata=object.item.audioItem.musicTrackMississippiThe Cactus BlossomsThe Cactus BlossomsRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2016-01-01You're Dreaming63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/508871fecdd0d94347006d53b427111e -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.176 - pizzicato-Music: Don’t Let Your Deal Go Down: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.203 - pizzicato-Music: addItemsAfter: inserted item after id=94, url=http://192.168.0.138:8080/audio/flac/ca41892cc7c2b2298f6eff806ba2399a, metadata=object.item.audioItem.musicTrackDon’t Let Your Deal Go DownSierra FerrellSierra FerrellRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2024-01-01Trail of Flowers63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ca41892cc7c2b2298f6eff806ba2399a -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.209 - pizzicato-Music: Light as a Feather: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.227 - pizzicato-Music: addItemsAfter: inserted item after id=95, url=http://192.168.0.138:8080/audio/flac/c8befc1539c774548f106f2f5ea6c4bf, metadata=object.item.audioItem.musicTrackLight as a FeatherNorah JonesNorah JonesRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2009-01-01The Fall63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/c8befc1539c774548f106f2f5ea6c4bf -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.235 - pizzicato-Music: Shyer: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.261 - pizzicato-Music: addItemsAfter: inserted item after id=96, url=http://192.168.0.138:8080/audio/flac/43c48c8e99e74c18b5b404eb388dce24, metadata=object.item.audioItem.musicTrackShyerLondon GrammarLondon GrammarRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2013-01-01If You Wait63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/43c48c8e99e74c18b5b404eb388dce24 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.268 - pizzicato-Music: The Hymn Of Ordinary Motion: returning first supported resource -[main (2) ] INFO - 0:04:35.271 - pizzicato-Music: processIdArray: ignoring update due to lock -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.291 - pizzicato-Music: addItemsAfter: inserted item after id=97, url=http://192.168.0.138:8080/audio/flac/2dc9f632f96001db6f6e0c714e61ea00, metadata=object.item.audioItem.musicTrackThe Hymn Of Ordinary MotionMeyer, Douglas & BarenbergMeyer, Douglas & BarenbergRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1993-01-01Skip, Hop & Wobble63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/2dc9f632f96001db6f6e0c714e61ea00 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.299 - pizzicato-Music: The Heart of Saturday Night: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.324 - pizzicato-Music: addItemsAfter: inserted item after id=98, url=http://192.168.0.138:8080/audio/flac/d5b6f3e1ccc8f4828ca2dc0efd69b987, metadata=object.item.audioItem.musicTrackThe Heart of Saturday NightTom WaitsTom WaitsRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1974-01-01Mainstreet63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/d5b6f3e1ccc8f4828ca2dc0efd69b987 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.330 - pizzicato-Music: Buckets of Rain: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.353 - pizzicato-Music: addItemsAfter: inserted item after id=99, url=http://192.168.0.138:8080/audio/flac/6ea1402e7b33ffb328887cb914d51778, metadata=object.item.audioItem.musicTrackBuckets of RainNeko CaseNeko CaseRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2005-01-01Sweetheart 200563623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/6ea1402e7b33ffb328887cb914d51778 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.358 - pizzicato-Music: New Beginning: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.390 - pizzicato-Music: addItemsAfter: inserted item after id=100, url=http://192.168.0.138:8080/audio/flac/ffda328ef818229238661ec37ff37956, metadata=object.item.audioItem.musicTrackNew BeginningTracy ChapmanTracy ChapmanRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1995-01-01New Beginning63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ffda328ef818229238661ec37ff37956 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.393 - pizzicato-Music: Can't Find My Way Home: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.409 - pizzicato-Music: addItemsAfter: inserted item after id=101, url=http://192.168.0.138:8080/audio/flac/497c78b081943f22c0b7a2861e0bb35f, metadata=object.item.audioItem.musicTrackCan't Find My Way HomeBlind FaithBlind FaithRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1969-01-01Blind Faith63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/497c78b081943f22c0b7a2861e0bb35f -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.412 - pizzicato-Music: Blue Eyes Crying in the Rain: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.439 - pizzicato-Music: addItemsAfter: inserted item after id=102, url=http://192.168.0.138:8080/audio/flac/e87aa42bc2f5632ebdf983a47b90d4fc, metadata=object.item.audioItem.musicTrackBlue Eyes Crying in the RainWillie NelsonWillie NelsonRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1975-01-01Red Headed Stranger63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/e87aa42bc2f5632ebdf983a47b90d4fc -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.443 - pizzicato-Music: I Love the Sun: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.460 - pizzicato-Music: addItemsAfter: inserted item after id=103, url=http://192.168.0.138:8080/audio/flac/77d393f256c7d2b397d9af5c8504596c, metadata=object.item.audioItem.musicTrackI Love the SunJon RedfernJon RedfernRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-01May Be Some Time63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/77d393f256c7d2b397d9af5c8504596c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.465 - pizzicato-Music: Time After Time: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.487 - pizzicato-Music: addItemsAfter: inserted item after id=104, url=http://192.168.0.138:8080/audio/flac/069ef589ce1d9621a87afb28e7fa658c, metadata=object.item.audioItem.musicTrackTime After TimeCyndi LauperCyndi LauperRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1982-01-01She’s So Unusual63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/069ef589ce1d9621a87afb28e7fa658c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.494 - pizzicato-Music: Walk a Thin Line: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.518 - pizzicato-Music: addItemsAfter: inserted item after id=105, url=http://192.168.0.138:8080/audio/flac/ef96c7fc42def2977a9963e2d4e892ff, metadata=object.item.audioItem.musicTrackWalk a Thin LineFleetwood MacFleetwood MacRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1979-01-01Tusk63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ef96c7fc42def2977a9963e2d4e892ff -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.525 - pizzicato-Music: Barefoot Friend: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.551 - pizzicato-Music: addItemsAfter: inserted item after id=106, url=http://192.168.0.138:8080/audio/flac/4d69f84b74a86795a52fcb73c3800af8, metadata=object.item.audioItem.musicTrackBarefoot FriendElephant RevivalElephant RevivalRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2010-01-01Break In the Clouds63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/4d69f84b74a86795a52fcb73c3800af8 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.558 - pizzicato-Music: The Silent Orchestra: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.579 - pizzicato-Music: addItemsAfter: inserted item after id=107, url=http://192.168.0.138:8080/audio/flac/667f1ebbc85d6440a7ff4afb9a527b89, metadata=object.item.audioItem.musicTrackThe Silent OrchestraHamilton LeithauserHamilton LeithauserRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2014-01-01Black Hours63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/667f1ebbc85d6440a7ff4afb9a527b89 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.586 - pizzicato-Music: Turn on Me: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.609 - pizzicato-Music: addItemsAfter: inserted item after id=108, url=http://192.168.0.138:8080/audio/flac/d46e57c82ed02a1848e32c0b01f21cb7, metadata=object.item.audioItem.musicTrackTurn on MeThe ShinsThe ShinsRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-01Wincing The Night Away63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/d46e57c82ed02a1848e32c0b01f21cb7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.612 - pizzicato-Music: Wait for Me: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.636 - pizzicato-Music: addItemsAfter: inserted item after id=109, url=http://192.168.0.138:8080/audio/flac/a8f5995175f02b30b884ec3324c831a4, metadata=object.item.audioItem.musicTrackWait for MeMobyMobyRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2009-01-01Wait for Me63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/a8f5995175f02b30b884ec3324c831a4 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.641 - pizzicato-Music: Servant: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.669 - pizzicato-Music: addItemsAfter: inserted item after id=110, url=http://192.168.0.138:8080/audio/flac/8122ae21da8da1e762a22dabd9817802, metadata=object.item.audioItem.musicTrackServantCocosumaCocosumaRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2006-01-01Pointing Excitedly To The Sky63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/8122ae21da8da1e762a22dabd9817802 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.673 - pizzicato-Music: Castles Made Of Sand: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.690 - pizzicato-Music: addItemsAfter: inserted item after id=111, url=http://192.168.0.138:8080/audio/flac/b71d978c46b591f2211c5834a0e5b902, metadata=object.item.audioItem.musicTrackCastles Made Of SandJimi HendrixJimi HendrixRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1967-01-01Electric Guitarland63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/b71d978c46b591f2211c5834a0e5b902 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.693 - pizzicato-Music: I Know What You Are: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.719 - pizzicato-Music: addItemsAfter: inserted item after id=112, url=http://192.168.0.138:8080/audio/flac/079e09407590d3c89234f3433280c3e0, metadata=object.item.audioItem.musicTrackI Know What You AreOi Va VoiOi Va VoiRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2009-01-01Travelling The Face Of The Globe63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/079e09407590d3c89234f3433280c3e0 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.724 - pizzicato-Music: Sky Blue Sky: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.743 - pizzicato-Music: addItemsAfter: inserted item after id=113, url=http://192.168.0.138:8080/audio/flac/1585bae3666307dd663c6f837492dec7, metadata=object.item.audioItem.musicTrackSky Blue SkyWilcoWilcoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-012005-11-01: Auditorium Theatre, Chicago, IL, USA63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/1585bae3666307dd663c6f837492dec7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.747 - pizzicato-Music: Capital Karma: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.770 - pizzicato-Music: addItemsAfter: inserted item after id=114, url=http://192.168.0.138:8080/audio/flac/d852d1f210c87200bd68b1429738ca5b, metadata=object.item.audioItem.musicTrackCapital KarmaManchester OrchestraManchester OrchestraRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2023-01-01The Valley Of Vision63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/d852d1f210c87200bd68b1429738ca5b -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.774 - pizzicato-Music: Loves Me Like A Rock: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.798 - pizzicato-Music: addItemsAfter: inserted item after id=115, url=http://192.168.0.138:8080/audio/flac/ed084a8cd1b7ef2d38d4d8e8e272cc7c, metadata=object.item.audioItem.musicTrackLoves Me Like A RockPaul SimonPaul SimonRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1973-01-01There Goes Rhymin' Simon63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/ed084a8cd1b7ef2d38d4d8e8e272cc7c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.804 - pizzicato-Music: Babylon: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.822 - pizzicato-Music: addItemsAfter: inserted item after id=116, url=http://192.168.0.138:8080/audio/flac/f1f31e24b2c730171b8642af0d0bcc04, metadata=object.item.audioItem.musicTrackBabylonTaminoTaminoRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2025-01-01Every Dawn’s a Mountain63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/f1f31e24b2c730171b8642af0d0bcc04 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.825 - pizzicato-Music: Moe 'Uhane (Dream Slack Key): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.839 - pizzicato-Music: addItemsAfter: inserted item after id=117, url=http://192.168.0.138:8080/audio/flac/e5bee29a1067b71f8d96ab7bc592eec7, metadata=object.item.audioItem.musicTrackMoe 'Uhane (Dream Slack Key)Sonny ChillingworthSonny ChillingworthRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1993-01-01Sonny Solo63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/e5bee29a1067b71f8d96ab7bc592eec7 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.842 - pizzicato-Music: The Harder They Come: returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.862 - pizzicato-Music: addItemsAfter: inserted item after id=118, url=http://192.168.0.138:8080/audio/flac/8ee666aeb2de061e86fc6d568b5f2a18, metadata=object.item.audioItem.musicTrackThe Harder They ComeJimmy CliffJimmy CliffRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)1972-01-01The Harder They Come63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/8ee666aeb2de061e86fc6d568b5f2a18 -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.865 - pizzicato-Music: Bring That Thing (live): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.885 - pizzicato-Music: addItemsAfter: inserted item after id=119, url=http://192.168.0.138:8080/audio/flac/4c33e09beef28347ed88555d69adfa0c, metadata=object.item.audioItem.musicTrackBring That Thing (live)Harry ManxHarry ManxRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2007-01-01Dog My Cat63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/4c33e09beef28347ed88555d69adfa0c -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.888 - pizzicato-Music: The Charging Sky (w/ The Watson Twins): returning first supported resource -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.904 - pizzicato-Music: addItemsAfter: inserted item after id=120, url=http://192.168.0.138:8080/audio/flac/50314386354bec0fa6062156ab2e50fa, metadata=object.item.audioItem.musicTrackThe Charging Sky (w/ The Watson Twins)Jenny LewisJenny LewisRadio Paradisetag.Audio_codec_long_name=FLAC (Free Lossless Audio Codec)2005-01-01Live and Unrehearsed63623ff4-ee41-4850-90aa-2d39395df981http://192.168.0.138:8080/audio/flac/50314386354bec0fa6062156ab2e50fa -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.924 - pizzicato-Music: reading 48 new items to insert: [73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120] -[AbstractPlaylistService-addItemsAfter (3] INFO - 0:04:35.925 - pizzicato-Music: getting [0..48[ -[main (2) ] INFO - 0:04:36.35 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:36.36 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[Main #12 (339) ] INFO - 0:04:36.101 - task: start: extractItemsMetadata -[MetadataExtract #1 (396) ] INFO - 0:04:36.105 - task: start: Item #0 -[MetadataExtract #2 (397) ] INFO - 0:04:36.105 - task: start: Item #1 -[MetadataExtract #3 (398) ] INFO - 0:04:36.106 - task: start: Item #2 -[MetadataExtract #1: Item #0 (396) ] INFO - 0:04:36.107 - FfmpegMediaMetadataRetriever: hash=-1759650642: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O\u0027Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Dancing Lessons","39":"16","9":"249470"} -[MetadataExtract #6 (401) ] INFO - 0:04:36.107 - task: start: Item #5 -[MetadataExtract #1 (396) ] INFO - 0:04:36.108 - task: end, 3ms: Item #0 -[MetadataExtract #4 (399) ] INFO - 0:04:36.108 - task: start: Item #3 -[MetadataExtract #1 (396) ] INFO - 0:04:36.108 - task: start: Item #8 -[Main #12: extractItemsMetadata (339) ] INFO - 0:04:36.109 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #7 (402) ] INFO - 0:04:36.109 - task: start: Item #6 -[MetadataExtract #5 (400) ] INFO - 0:04:36.109 - task: start: Item #4 -[MetadataExtract #6: Item #5 (401) ] INFO - 0:04:36.109 - FfmpegMediaMetadataRetriever: hash=-1138992005: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Michael Hedges","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Prelude to Cello Suite #1 (JS Bach)","39":"16","9":"139943"} -[MetadataExtract #6 (401) ] INFO - 0:04:36.109 - task: end, 2ms: Item #5 -[MetadataExtract #8 (403) ] INFO - 0:04:36.109 - task: start: Item #7 -[MetadataExtract #6 (401) ] INFO - 0:04:36.110 - task: start: Item #9 -[MetadataExtract #5: Item #4 (400) ] INFO - 0:04:36.110 - FfmpegMediaMetadataRetriever: hash=-407518392: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Josh Ritter","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Curse","39":"16","9":"292250"} -[MetadataExtract #5 (400) ] INFO - 0:04:36.111 - task: end, 2ms: Item #4 -[MetadataExtract #5 (400) ] INFO - 0:04:36.112 - task: start: Item #10 -[MetadataExtract #2: Item #1 (397) ] INFO - 0:04:36.112 - FfmpegMediaMetadataRetriever: hash=-1913648982: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Aukai","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Slow Sun","39":"16","9":"206810"} -[MetadataExtract #1: Item #8 (396) ] INFO - 0:04:36.113 - FfmpegMediaMetadataRetriever: hash=724650897: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Peter Gabriel","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Book of Love","39":"16","9":"216972"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.113 - task: end, 8ms: Item #1 -[MetadataExtract #1 (396) ] INFO - 0:04:36.113 - task: end, 5ms: Item #8 -[MetadataExtract #2 (397) ] INFO - 0:04:36.113 - task: start: Item #11 -[MetadataExtract #1 (396) ] INFO - 0:04:36.113 - task: start: Item #12 -[MetadataExtract #4: Item #3 (399) ] INFO - 0:04:36.114 - FfmpegMediaMetadataRetriever: hash=1993842102: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Mighty Rootsmen","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Won\u0027t Back Down","39":"16","9":"156594"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.115 - task: end, 7ms: Item #3 -[MetadataExtract #7: Item #6 (402) ] INFO - 0:04:36.115 - FfmpegMediaMetadataRetriever: hash=-962027383: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Ayla Nereo","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Ylva","39":"16","9":"289409"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.115 - task: start: Item #13 -[MetadataExtract #3: Item #2 (398) ] INFO - 0:04:36.115 - FfmpegMediaMetadataRetriever: hash=-106913403: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Diana Krall","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Fly Me to the Moon","39":"16","9":"328724"} -[MetadataExtract #3 (398) ] INFO - 0:04:36.116 - task: end, 10ms: Item #2 -[MetadataExtract #3 (398) ] INFO - 0:04:36.116 - task: start: Item #14 -[MetadataExtract #7 (402) ] INFO - 0:04:36.116 - task: end, 7ms: Item #6 -[MetadataExtract #7 (402) ] INFO - 0:04:36.116 - task: start: Item #15 -[MetadataExtract #8: Item #7 (403) ] INFO - 0:04:36.116 - FfmpegMediaMetadataRetriever: hash=42813812: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"I Am Kloot","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Let Them All In","39":"16","9":"231290"} -[MetadataExtract #8 (403) ] INFO - 0:04:36.117 - task: end, 8ms: Item #7 -[MetadataExtract #8 (403) ] INFO - 0:04:36.117 - task: start: Item #16 -[MetadataExtract #6: Item #9 (401) ] INFO - 0:04:36.117 - FfmpegMediaMetadataRetriever: hash=277540764: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Foo Fighters","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Still","39":"16","9":"310800"} -[MetadataExtract #6 (401) ] INFO - 0:04:36.117 - task: end, 8ms: Item #9 -[MetadataExtract #6 (401) ] INFO - 0:04:36.117 - task: start: Item #17 -[MetadataExtract #5: Item #10 (400) ] INFO - 0:04:36.118 - FfmpegMediaMetadataRetriever: hash=1612634984: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"5050"} -[MetadataExtract #5 (400) ] INFO - 0:04:36.119 - task: end, 7ms: Item #10 -[MetadataExtract #5 (400) ] INFO - 0:04:36.119 - task: start: Item #18 -[MetadataExtract #2: Item #11 (397) ] INFO - 0:04:36.120 - FfmpegMediaMetadataRetriever: hash=1385248911: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Billy Bragg \u0026 Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"When The Roses Bloom Again","39":"16","9":"246000"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.121 - task: end, 8ms: Item #11 -[MetadataExtract #1: Item #12 (396) ] INFO - 0:04:36.121 - FfmpegMediaMetadataRetriever: hash=-352088410: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Suzanne Vega","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"12 Mortal Men","39":"16","9":"157000"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.121 - task: start: Item #19 -[MetadataExtract #1 (396) ] INFO - 0:04:36.121 - task: end, 8ms: Item #12 -[MetadataExtract #1 (396) ] INFO - 0:04:36.121 - task: start: Item #20 -[MetadataExtract #4: Item #13 (399) ] INFO - 0:04:36.122 - FfmpegMediaMetadataRetriever: hash=1891231045: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Sundays","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wild Horses","39":"16","9":"277000"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.123 - task: end, 8ms: Item #13 -[MetadataExtract #3: Item #14 (398) ] INFO - 0:04:36.123 - FfmpegMediaMetadataRetriever: hash=-1053255835: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tim Buckley","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Happy Time","39":"16","9":"190000"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.124 - task: start: Item #21 -[MetadataExtract #3 (398) ] INFO - 0:04:36.124 - task: end, 8ms: Item #14 -[MetadataExtract #7: Item #15 (402) ] INFO - 0:04:36.124 - FfmpegMediaMetadataRetriever: hash=1003137573: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Trespassers William","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Different Stars","39":"16","9":"278647"} -[MetadataExtract #3 (398) ] INFO - 0:04:36.124 - task: start: Item #22 -[MetadataExtract #7 (402) ] INFO - 0:04:36.124 - task: end, 8ms: Item #15 -[MetadataExtract #7 (402) ] INFO - 0:04:36.125 - task: start: Item #23 -[MetadataExtract #3: Item #22 (398) ] INFO - 0:04:36.125 - FfmpegMediaMetadataRetriever: hash=-395410295: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sierra Ferrell","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Don’t Let Your Deal Go Down","39":"16","9":"211710"} -[MetadataExtract #3 (398) ] INFO - 0:04:36.125 - task: end, 1ms: Item #22 -[MetadataExtract #3 (398) ] INFO - 0:04:36.125 - task: start: Item #24 -[MetadataExtract #6: Item #17 (401) ] INFO - 0:04:36.125 - FfmpegMediaMetadataRetriever: hash=1845475776: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Bruce Cockburn","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wondering Where the Lions Are (Live)","39":"16","9":"320000"} -[MetadataExtract #6 (401) ] INFO - 0:04:36.126 - task: end, 8ms: Item #17 -[MetadataExtract #6 (401) ] INFO - 0:04:36.126 - task: start: Item #25 -[MetadataExtract #5: Item #18 (400) ] INFO - 0:04:36.126 - FfmpegMediaMetadataRetriever: hash=1710638978: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sinéad O’Connor","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Back Where You Belong","39":"16","9":"249150"} -[MetadataExtract #5 (400) ] INFO - 0:04:36.127 - task: end, 7ms: Item #18 -[MetadataExtract #5 (400) ] INFO - 0:04:36.128 - task: start: Item #26 -[MetadataExtract #2: Item #19 (397) ] INFO - 0:04:36.128 - FfmpegMediaMetadataRetriever: hash=-894762509: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"8516"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.129 - task: end, 8ms: Item #19 -[MetadataExtract #1: Item #20 (396) ] INFO - 0:04:36.129 - FfmpegMediaMetadataRetriever: hash=-993423853: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"R.E.M.","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Perfect Circle","39":"16","9":"202700"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.129 - task: start: Item #27 -[MetadataExtract #1 (396) ] INFO - 0:04:36.129 - task: end, 7ms: Item #20 -[MetadataExtract #1 (396) ] INFO - 0:04:36.129 - task: start: Item #28 -[MetadataExtract #4: Item #21 (399) ] INFO - 0:04:36.130 - FfmpegMediaMetadataRetriever: hash=1757379569: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Cactus Blossoms","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Mississippi","39":"16","9":"235634"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.131 - task: end, 7ms: Item #21 -[MetadataExtract #7: Item #23 (402) ] INFO - 0:04:36.131 - FfmpegMediaMetadataRetriever: hash=-2056388036: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Norah Jones","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Light as a Feather","39":"16","9":"231305"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.131 - task: start: Item #29 -[MetadataExtract #7 (402) ] INFO - 0:04:36.131 - task: end, 6ms: Item #23 -[MetadataExtract #7 (402) ] INFO - 0:04:36.131 - task: start: Item #30 -[MetadataExtract #8: Item #16 (403) ] INFO - 0:04:36.132 - FfmpegMediaMetadataRetriever: hash=-1783977340: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"David Gray","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"260750"} -[MetadataExtract #8 (403) ] INFO - 0:04:36.132 - task: end, 15ms: Item #16 -[MetadataExtract #8 (403) ] INFO - 0:04:36.132 - task: start: Item #31 -[MetadataExtract #3: Item #24 (398) ] INFO - 0:04:36.132 - FfmpegMediaMetadataRetriever: hash=1899042957: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"London Grammar","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Shyer","39":"16","9":"182000"} -[MetadataExtract #3 (398) ] INFO - 0:04:36.132 - task: end, 7ms: Item #24 -[MetadataExtract #3 (398) ] INFO - 0:04:36.132 - task: start: Item #32 -[MetadataExtract #6: Item #25 (401) ] INFO - 0:04:36.133 - FfmpegMediaMetadataRetriever: hash=-524282951: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Meyer, Douglas \u0026 Barenberg","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Hymn Of Ordinary Motion","39":"16","9":"114000"} -[MetadataExtract #6 (401) ] INFO - 0:04:36.133 - task: end, 7ms: Item #25 -[MetadataExtract #6 (401) ] INFO - 0:04:36.133 - task: start: Item #33 -[MetadataExtract #5: Item #26 (400) ] INFO - 0:04:36.134 - FfmpegMediaMetadataRetriever: hash=687172484: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tom Waits","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Heart of Saturday Night","39":"16","9":"229000"} -[MetadataExtract #5 (400) ] INFO - 0:04:36.135 - task: end, 7ms: Item #26 -[MetadataExtract #5 (400) ] INFO - 0:04:36.135 - task: start: Item #34 -[MetadataExtract #2: Item #27 (397) ] INFO - 0:04:36.136 - FfmpegMediaMetadataRetriever: hash=131303568: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Neko Case","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Buckets of Rain","39":"16","9":"199000"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.137 - task: end, 9ms: Item #27 -[MetadataExtract #1: Item #28 (396) ] INFO - 0:04:36.138 - FfmpegMediaMetadataRetriever: hash=485794117: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tracy Chapman","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"New Beginning","39":"16","9":"325000"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.138 - task: start: Item #35 -[MetadataExtract #1 (396) ] INFO - 0:04:36.138 - task: end, 8ms: Item #28 -[MetadataExtract #1 (396) ] INFO - 0:04:36.138 - task: start: Item #36 -[MetadataExtract #2: Item #35 (397) ] INFO - 0:04:36.140 - FfmpegMediaMetadataRetriever: hash=1109877331: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Hamilton Leithauser","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Silent Orchestra","39":"16","9":"264060"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.141 - task: end, 3ms: Item #35 -[MetadataExtract #7: Item #30 (402) ] INFO - 0:04:36.141 - FfmpegMediaMetadataRetriever: hash=-1561902046: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Willie Nelson","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Blue Eyes Crying in the Rain","39":"16","9":"136200"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.141 - task: start: Item #37 -[MetadataExtract #7 (402) ] INFO - 0:04:36.142 - task: end, 10ms: Item #30 -[MetadataExtract #7 (402) ] INFO - 0:04:36.142 - task: start: Item #38 -[MetadataExtract #8: Item #31 (403) ] INFO - 0:04:36.142 - FfmpegMediaMetadataRetriever: hash=1402956451: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jon Redfern","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Love the Sun","39":"16","9":"300000"} -[MetadataExtract #8 (403) ] INFO - 0:04:36.142 - task: end, 11ms: Item #31 -[MetadataExtract #8 (403) ] INFO - 0:04:36.143 - task: start: Item #39 -[MetadataExtract #3: Item #32 (398) ] INFO - 0:04:36.143 - FfmpegMediaMetadataRetriever: hash=1984356975: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cyndi Lauper","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Time After Time","39":"16","9":"232250"} -[MetadataExtract #3 (398) ] INFO - 0:04:36.143 - task: end, 10ms: Item #32 -[MetadataExtract #3 (398) ] INFO - 0:04:36.143 - task: start: Item #40 -[MetadataExtract #6: Item #33 (401) ] INFO - 0:04:36.143 - FfmpegMediaMetadataRetriever: hash=1977966954: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Fleetwood Mac","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Walk a Thin Line","39":"16","9":"222000"} -[MetadataExtract #6 (401) ] INFO - 0:04:36.144 - task: end, 11ms: Item #33 -[MetadataExtract #6 (401) ] INFO - 0:04:36.144 - task: start: Item #41 -[MetadataExtract #5: Item #34 (400) ] INFO - 0:04:36.145 - FfmpegMediaMetadataRetriever: hash=1475446356: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Elephant Revival","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Barefoot Friend","39":"16","9":"191000"} -[MetadataExtract #5 (400) ] INFO - 0:04:36.145 - task: end, 11ms: Item #34 -[MetadataExtract #5 (400) ] INFO - 0:04:36.146 - task: start: Item #42 -[MetadataExtract #4: Item #29 (399) ] INFO - 0:04:36.146 - FfmpegMediaMetadataRetriever: hash=-775299294: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Blind Faith","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Can\u0027t Find My Way Home","39":"16","9":"188500"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.147 - task: end, 16ms: Item #29 -[MetadataExtract #1: Item #36 (396) ] INFO - 0:04:36.147 - FfmpegMediaMetadataRetriever: hash=-2093135018: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"The Shins","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Turn on Me","39":"16","9":"209500"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.147 - task: start: Item #43 -[MetadataExtract #1 (396) ] INFO - 0:04:36.148 - task: end, 9ms: Item #36 -[MetadataExtract #1 (396) ] INFO - 0:04:36.148 - task: start: Item #44 -[MetadataExtract #2: Item #37 (397) ] INFO - 0:04:36.148 - FfmpegMediaMetadataRetriever: hash=496599921: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Moby","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Wait for Me","39":"16","9":"204000"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.149 - task: end, 7ms: Item #37 -[MetadataExtract #7: Item #38 (402) ] INFO - 0:04:36.149 - FfmpegMediaMetadataRetriever: hash=1709432058: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Cocosuma","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Servant","39":"16","9":"289070"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.149 - task: start: Item #45 -[MetadataExtract #7 (402) ] INFO - 0:04:36.150 - task: end, 8ms: Item #38 -[MetadataExtract #7 (402) ] INFO - 0:04:36.150 - task: start: Item #46 -[MetadataExtract #8: Item #39 (403) ] INFO - 0:04:36.150 - FfmpegMediaMetadataRetriever: hash=-475084519: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimi Hendrix","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Castles Made Of Sand","39":"16","9":"164612"} -[MetadataExtract #8 (403) ] INFO - 0:04:36.150 - task: end, 7ms: Item #39 -[MetadataExtract #8 (403) ] INFO - 0:04:36.150 - task: start: Item #47 -[MetadataExtract #3: Item #40 (398) ] INFO - 0:04:36.150 - FfmpegMediaMetadataRetriever: hash=-238367317: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Oi Va Voi","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"I Know What You Are","39":"16","9":"182000"} -[MetadataExtract #3 (398) ] INFO - 0:04:36.151 - task: end, 7ms: Item #40 -[MetadataExtract #3 (398) ] INFO - 0:04:36.151 - task: start: Item #48 -[MetadataExtract #6: Item #41 (401) ] INFO - 0:04:36.151 - FfmpegMediaMetadataRetriever: hash=-1032742246: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Wilco","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Sky Blue Sky","39":"16","9":"193957"} -[MetadataExtract #6 (401) ] INFO - 0:04:36.152 - task: end, 8ms: Item #41 -[MetadataExtract #5: Item #42 (400) ] INFO - 0:04:36.152 - FfmpegMediaMetadataRetriever: hash=2140521498: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Manchester Orchestra","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Capital Karma","39":"16","9":"215108"} -[MetadataExtract #5 (400) ] INFO - 0:04:36.152 - task: end, 6ms: Item #42 -[MetadataExtract #4: Item #43 (399) ] INFO - 0:04:36.153 - FfmpegMediaMetadataRetriever: hash=-1752918010: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Paul Simon","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Loves Me Like A Rock","39":"16","9":"201000"} -[MetadataExtract #4 (399) ] INFO - 0:04:36.153 - task: end, 5ms: Item #43 -[MetadataExtract #1: Item #44 (396) ] INFO - 0:04:36.153 - FfmpegMediaMetadataRetriever: hash=152071891: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Tamino","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Babylon","39":"16","9":"336306"} -[MetadataExtract #1 (396) ] INFO - 0:04:36.154 - task: end, 6ms: Item #44 -[MetadataExtract #2: Item #45 (397) ] INFO - 0:04:36.154 - FfmpegMediaMetadataRetriever: hash=-731586392: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Sonny Chillingworth","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Moe \u0027Uhane (Dream Slack Key)","39":"16","9":"164000"} -[MetadataExtract #2 (397) ] INFO - 0:04:36.155 - task: end, 5ms: Item #45 -[MetadataExtract #7: Item #46 (402) ] INFO - 0:04:36.155 - FfmpegMediaMetadataRetriever: hash=-174877526: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jimmy Cliff","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Harder They Come","39":"16","9":"180968"} -[MetadataExtract #7 (402) ] INFO - 0:04:36.155 - task: end, 5ms: Item #46 -[MetadataExtract #8: Item #47 (403) ] INFO - 0:04:36.156 - FfmpegMediaMetadataRetriever: hash=1850019505: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Harry Manx","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Bring That Thing (live)","39":"16","9":"332000"} -[MetadataExtract #8 (403) ] INFO - 0:04:36.156 - task: end, 5ms: Item #47 -[MetadataExtract #3: Item #48 (398) ] INFO - 0:04:36.158 - FfmpegMediaMetadataRetriever: hash=1096471425: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Jenny Lewis","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"The Charging Sky (w/ The Watson Twins)","39":"16","9":"173476"} -[MetadataExtract #3 (398) ] INFO - 0:04:36.159 - task: end, 8ms: Item #48 -[Main #12: extractItemsMetadata (339) ] INFO - 0:04:36.159 - task: executor 'MetadataExtract #%d': close took 50 ms -[Main #12 (339) ] INFO - 0:04:36.159 - task: end, 58ms: extractItemsMetadata -[main (2) ] INFO - 0:04:37.370 - onPause()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:37.370 - removed listener: 2 listeners -[main (2) ] INFO - 0:04:37.372 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:04:37.373 - onResume()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:37.373 - added listener: 3 listeners -[main (2) ] INFO - 0:04:37.373 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:04:37.373 - source changed: Playlist -[main (2) ] INFO - 0:04:37.373 - selected item changed (now playing): Dancing Lessons -[main (2) ] WARNING - 0:04:37.374 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:04:37.375 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:04:37.375 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:04:37.376 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:04:37.377 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:04:37.377 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:04:37.380 - onCreateOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] WARNING - 0:04:37.380 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:04:37.381 - onPrepareOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:46.605 - onPause()@ea019b3:5238 -[main (2) ] INFO - 0:04:46.607 - onPause()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:46.608 - removed listener: 2 listeners -[main (2) ] INFO - 0:04:46.609 - removed listener: 1 listeners -[main (2) ] INFO - 0:04:47.173 - onStop()@ea019b3:5238 -[main (2) ] INFO - 0:04:47.173 - onStop()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:04:47.174 - onStop()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:04:47.174 - onStop()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:47.175 - onSaveInstanceState(outState)@ea019b3:5238 -[main (2) ] INFO - 0:04:47.180 - onSaveInstanceState()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:04:47.183 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:04:47.184 - onSaveInstanceState()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:05:34.572 - ACTION_SCREEN_OFF -[main (2) ] SEVERE - 0:05:34.576 - watchdog: schedule inactivity action in 15 mins -[main (2) ] SEVERE - 0:05:34.576 - watchdog: enabled -[cling-53 (Time) (345) ] WARNING - 0:06:08.801 - .h : Client connection was aborted: v5.y: 192.168.0.200:49152 failed to respond: http://192.168.0.200:49152/uuid-2899a4df-39ae-160a-6563-dca6329ead0d/ctl-urn-av-openhome-org-service-Time-1 -[cling-53 (Time) (345) ] WARNING - 0:06:08.805 - .d : Time: Error: Current state of service prevents invoking that action. Connection error or no response received. -[TimeTask: pizzicato-Music (392) ] WARNING - 0:06:08.807 - TimeTask: pizzicato-Music: is.c: Current state of service prevents invoking that action. Connection error or no response received. -[main (2) ] INFO - 0:06:22.178 - ACTION_SCREEN_ON -[main (2) ] SEVERE - 0:06:22.178 - watchdog: cancelled inactivity action -[main (2) ] SEVERE - 0:06:22.179 - watchdog: disabled -[main (2) ] INFO - 0:06:23.14 - onRouteRemoved 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:06:23.15 - not removing cast device due to recent screen on or off -[main (2) ] INFO - 0:06:25.170 - onRouteAdded 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:06:25.171 - not adding already added cast device -[main (2) ] INFO - 0:07:03.568 - onRestart()@ea019b3:5238 -[main (2) ] INFO - 0:07:03.574 - onStart()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:07:03.577 - onStart()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:07:03.578 - onStart()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:03.580 - onStart()@ea019b3:5238 -[main (2) ] INFO - 0:07:03.587 - onResume()@ea019b3:5238 -[main (2) ] INFO - 0:07:03.587 - added listener: 2 listeners -[main (2) ] INFO - 0:07:03.595 - sorted 2 items took: 5 ms -[main (2) ] INFO - 0:07:03.598 - onResume()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:07:03.598 - added listener: 3 listeners -[main (2) ] INFO - 0:07:03.598 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:07:03.599 - source changed: Playlist -[main (2) ] INFO - 0:07:03.599 - selected item changed (now playing): Dancing Lessons -[main (2) ] WARNING - 0:07:03.599 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:07:03.600 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:07:03.600 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:07:03.601 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:07:03.601 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 -[main (2) ] INFO - 0:07:03.602 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:07:03.603 - onCreateOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] WARNING - 0:07:03.604 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers -[main (2) ] INFO - 0:07:03.605 - onPrepareOptionsMenu()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:07:06.544 - setVolume: main thread -[PlaybackAction: idle (323) ] INFO - 0:07:06.545 - setVolume: worker thread enter -[PlaybackAction:setVolume (323) ] INFO - 0:07:06.546 - pizzicato-Music: setVolume: 95 -[PlaybackAction:setVolume (323) ] INFO - 0:07:06.565 - setVolume worker thread took: 19 ms -[main (2) ] INFO - 0:07:06.583 - pizzicato-Music: AbstractRenderer.onVolumeChange: 95 -[main (2) ] INFO - 0:07:06.584 - VolumeProvider: onVolumeChanged: 95 -[main (2) ] INFO - 0:07:06.598 - pizzicato-Music: MainFragmentBase.onVolumeChange: 95 -[main (2) ] INFO - 0:07:06.598 - pizzicato-Music: MainFragmentBase.onVolumeChange: 95 -[main (2) ] INFO - 0:07:06.599 - setSeekBarDetailsText: FLAC • 44.1 kHz • 16 bit -[main (2) ] INFO - 0:07:09.493 - seek: main thread -[PlaybackAction: idle (323) ] INFO - 0:07:09.494 - seek: worker thread enter -[cling-62 (SeekSecondAbsolute) (354) ] WARNING - 0:07:09.514 - .d : SeekSecondAbsolute: Error: Action Failed (HTTP response was: 500 Internal Server Error) -[PlaybackAction:seek (323) ] WARNING - 0:07:09.516 - is.c: Action Failed - at zs.h.s(SourceFile:152) - at zs.h.c(SourceFile:21) - at zs.j.c(SourceFile:4) - at vs.g.d(SourceFile:20) - at vs.g.b(SourceFile:124) - at ts.h.a(SourceFile:1) - at ts.g.run(SourceFile:1) - at gs.a.run(SourceFile:93) - at t7.d.run(SourceFile:58) - at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) - at java.lang.Thread.run(Thread.java:1119) - -[PlaybackAction:seek (323) ] INFO - 0:07:09.517 - seek worker thread took: 22 ms -[main (2) ] INFO - 0:07:09.523 - toast: Action Failed (code: 501) -[main (2) ] INFO - 0:07:13.571 - onPause()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:07:13.572 - removed listener: 2 listeners -[main (2) ] INFO - 0:07:13.573 - onResume()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:13.574 - added listener: 3 listeners -[main (2) ] INFO - 0:07:13.574 - refreshLocalMediaServerLibraryList: removed: fenice -[main (2) ] INFO - 0:07:13.575 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:07:13.575 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:07:13.575 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:07:13.576 - refreshLocalMediaServerLibraryList: added: fenice -[main (2) ] INFO - 0:07:13.576 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:07:13.576 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:07:13.576 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:07:13.577 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:07:13.577 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:07:13.579 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:07:13.579 - pizzicato-Music: MainFragmentBase.onVolumeChange: 95 -[main (2) ] INFO - 0:07:13.596 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:13.597 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:19.840 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:19.840 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:07:19.840 - positionStack: [3, 3, 3, 0, 0] -[main (2) ] INFO - 0:07:19.841 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:07:19.841 - containerPath: [radio-paradise:channel:mellow] -[main (2) ] INFO - 0:07:19.844 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:19.845 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:21.107 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:21.107 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:07:21.107 - positionStack: [3, 3, 3, 0] -[main (2) ] INFO - 0:07:21.108 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:07:21.108 - containerPath: [] -[main (2) ] INFO - 0:07:21.113 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:21.114 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:26.853 - path = [radio-paradise:channel:eclectic] -[main (2) ] INFO - 0:07:26.855 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:26.855 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:07:26.856 - positionStack: [3, 3, 3, 0] -[main (2) ] INFO - 0:07:26.856 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:07:26.856 - containerPath: [radio-paradise:channel:eclectic] -[AsyncTask #1 (187) ] INFO - 0:07:26.858 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:07:26.859 - BrowseTask.doInBackground(): loading container 'Eclectic Mix' -[main (2) ] INFO - 0:07:26.862 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:26.864 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[Main #14 (405) ] INFO - 0:07:26.940 - task: start: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:07:26.940 - finished browsing: got 2 objects -[AsyncTask #1 (187) ] INFO - 0:07:26.941 - BrowseTask.doInBackground(): no item -[Main #14: extractItemsMetadata (405) ] INFO - 0:07:26.942 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #1 (406) ] INFO - 0:07:26.942 - task: start: Item #0 -[main (2) ] INFO - 0:07:26.945 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.946 - FfmpegMediaMetadataRetriever: hash=396690447: expensive op: retrieveMetadata -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.946 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/667f1ebbc85d6440a7ff4afb9a527b89_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.946 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/ffda328ef818229238661ec37ff37956_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.946 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/2ad68dd550b16313027271cb63d9153b_null_ -[main (2) ] INFO - 0:07:26.947 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.947 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/f1f31e24b2c730171b8642af0d0bcc04_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.947 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/67c92e72e18e489dee64f769588cb1ce_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.947 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/50314386354bec0fa6062156ab2e50fa_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.947 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/8122ae21da8da1e762a22dabd9817802_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.948 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/4c33e09beef28347ed88555d69adfa0c_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.950 - removed expired cached probe info for http://192.168.0.138:8080/audio/flac/77d393f256c7d2b397d9af5c8504596c_null_ -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:26.971 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 0 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/radioparadise/stream/eclectic/flac -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:29.214 - ffprobe finished -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:29.215 - ffprobe took: 2247 ms -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:29.215 - added cached probe info for http://192.168.0.138:8080/radioparadise/stream/eclectic/flac_null_, expires in 1800 seconds -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:29.215 - FfmpegMediaMetadataRetriever: hash=396690447: retrieveMetadata took: 2269 ms -[MetadataExtract #1: Item #0 (406) ] INFO - 0:07:29.216 - FfmpegMediaMetadataRetriever: hash=396690447: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Miss Perfumado","100000":"false","2":"Cesária Évora","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Sodade","39":"16","8":"1992"} -[MetadataExtract #1 (406) ] INFO - 0:07:29.217 - task: end, 2275ms: Item #0 -[Main #14: extractItemsMetadata (405) ] INFO - 0:07:29.218 - task: executor 'MetadataExtract #%d': close took 2276 ms -[Main #14 (405) ] INFO - 0:07:29.218 - task: end, 2278ms: extractItemsMetadata -[main (2) ] INFO - 0:07:32.513 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:32.514 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:07:32.514 - positionStack: [3, 3, 3, 0] -[main (2) ] INFO - 0:07:32.514 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:07:32.514 - containerPath: [] -[main (2) ] INFO - 0:07:32.526 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:32.527 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:34.955 - path = [radio-paradise:channel:main] -[main (2) ] INFO - 0:07:34.957 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:34.957 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:07:34.958 - positionStack: [3, 3, 3, 0] -[main (2) ] INFO - 0:07:34.958 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:07:34.958 - containerPath: [radio-paradise:channel:main] -[AsyncTask #1 (187) ] INFO - 0:07:34.961 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:07:34.962 - BrowseTask.doInBackground(): loading container 'Main Mix' -[main (2) ] INFO - 0:07:34.965 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:34.967 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[Main #14 (405) ] INFO - 0:07:34.983 - task: start: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:07:34.983 - finished browsing: got 2 objects -[Main #14: extractItemsMetadata (405) ] INFO - 0:07:34.984 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[AsyncTask #1 (187) ] INFO - 0:07:34.984 - BrowseTask.doInBackground(): no item -[MetadataExtract #1 (412) ] INFO - 0:07:34.985 - task: start: Item #0 -[MetadataExtract #1: Item #0 (412) ] INFO - 0:07:34.989 - FfmpegMediaMetadataRetriever: hash=-961650152: expensive op: retrieveMetadata -[main (2) ] INFO - 0:07:34.998 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:35.0 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[MetadataExtract #1: Item #0 (412) ] INFO - 0:07:35.12 - ffprobe process started, timeout: 20000 ms: --ffprobe -show_format -show_streams -seekable 0 -headers User-Agent: Lavf/ffprobe - -i http://192.168.0.138:8080/radioparadise/stream/main/flac -[MetadataExtract #1: Item #0 (412) ] INFO - 0:07:37.280 - ffprobe finished -[MetadataExtract #1: Item #0 (412) ] INFO - 0:07:37.281 - ffprobe took: 2273 ms -[MetadataExtract #1: Item #0 (412) ] INFO - 0:07:37.281 - added cached probe info for http://192.168.0.138:8080/radioparadise/stream/main/flac_null_, expires in 1800 seconds -[MetadataExtract #1: Item #0 (412) ] INFO - 0:07:37.282 - FfmpegMediaMetadataRetriever: hash=-961650152: retrieveMetadata took: 2293 ms -[MetadataExtract #1: Item #0 (412) ] INFO - 0:07:37.284 - FfmpegMediaMetadataRetriever: hash=-961650152: saveFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Dancing in the Dragon\u0027s Jaws","100000":"false","2":"Bruce Cockburn","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Creation Dream","39":"16","8":"1979"} -[MetadataExtract #1 (412) ] INFO - 0:07:37.285 - task: end, 2300ms: Item #0 -[Main #14: extractItemsMetadata (405) ] INFO - 0:07:37.286 - task: executor 'MetadataExtract #%d': close took 2302 ms -[Main #14 (405) ] INFO - 0:07:37.286 - task: end, 2302ms: extractItemsMetadata -[main (2) ] INFO - 0:07:41.519 - path = [radio-paradise:channel:main, radio-paradise:channel:main:history] -[main (2) ] INFO - 0:07:41.520 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:41.521 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:07:41.521 - positionStack: [3, 3, 3, 0, 0] -[main (2) ] INFO - 0:07:41.521 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:07:41.522 - containerPath: [radio-paradise:channel:main, radio-paradise:channel:main:history] -[AsyncTask #1 (187) ] INFO - 0:07:41.524 - BrowseTask.doInBackground(): enter -[AsyncTask #1 (187) ] INFO - 0:07:41.525 - BrowseTask.doInBackground(): loading container 'Main Mix - History' -[main (2) ] INFO - 0:07:41.529 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:41.530 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[AsyncTask #1 (187) ] WARNING - 0:07:41.546 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/172d6ba8e1d0169e1d84320a5e50767e/256 -[AsyncTask #1 (187) ] WARNING - 0:07:41.547 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/bfe30f44862ff716159155b224da4d35/256 -[AsyncTask #1 (187) ] WARNING - 0:07:41.548 - handleTag: invalid URL: java.net.MalformedURLException: no protocol: /covers/jpeg/4e3d1afd0b1079d2e4908e530e4fa07a/256 -[Main #14 (405) ] INFO - 0:07:41.551 - task: start: extractItemsMetadata -[AsyncTask #1 (187) ] INFO - 0:07:41.551 - finished browsing: got 3 objects -[AsyncTask #1 (187) ] INFO - 0:07:41.552 - BrowseTask.doInBackground(): no item -[MetadataExtract #1 (414) ] INFO - 0:07:41.553 - task: start: Item #0 -[Main #14: extractItemsMetadata (405) ] INFO - 0:07:41.553 - task: executor 'MetadataExtract #%d': waiting for close to complete... -[MetadataExtract #2 (415) ] INFO - 0:07:41.553 - task: start: Item #1 -[MetadataExtract #3 (416) ] INFO - 0:07:41.554 - task: start: Item #2 -[MetadataExtract #1: Item #0 (414) ] INFO - 0:07:41.556 - FfmpegMediaMetadataRetriever: hash=308158566: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","100000":"false","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","39":"16","9":"6951"} -[MetadataExtract #1 (414) ] INFO - 0:07:41.557 - task: end, 4ms: Item #0 -[MetadataExtract #2: Item #1 (415) ] INFO - 0:07:41.558 - FfmpegMediaMetadataRetriever: hash=1562327667: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"John Martyn","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"Bless The Weather","39":"16","9":"259601"} -[MetadataExtract #2 (415) ] INFO - 0:07:41.559 - task: end, 6ms: Item #1 -[MetadataExtract #3: Item #2 (416) ] INFO - 0:07:41.560 - FfmpegMediaMetadataRetriever: hash=-139052036: loadFileCacheMetadata: {"-1":"FfmpegMediaMetadataRetriever","10000":"2","-2":"2","1":"Radio Paradise","100000":"false","2":"Florence + The Machine","10100":"FLAC (Free Lossless Audio Codec)","38":"44100","7":"What the Water Gave Me (unplugged)","39":"16","9":"285000"} -[MetadataExtract #3 (416) ] INFO - 0:07:41.560 - task: end, 6ms: Item #2 -[Main #14: extractItemsMetadata (405) ] INFO - 0:07:41.561 - task: executor 'MetadataExtract #%d': close took 8 ms -[Main #14 (405) ] INFO - 0:07:41.561 - task: end, 10ms: extractItemsMetadata -[main (2) ] INFO - 0:07:41.562 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:07:41.564 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:11.996 - onPause()@ea019b3:5238 -[main (2) ] INFO - 0:08:11.998 - onPause()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:11.998 - removed listener: 2 listeners -[main (2) ] INFO - 0:08:12.16 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:08:12.17 - removed listener: 1 listeners -[main (2) ] INFO - 0:08:12.105 - onStop()@ea019b3:5238 -[main (2) ] INFO - 0:08:12.116 - onStop()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:08:12.120 - onStop()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:08:12.121 - onStop()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:12.122 - onSaveInstanceState(outState)@ea019b3:5238 -[main (2) ] INFO - 0:08:12.124 - onSaveInstanceState()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:08:12.126 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:12.127 - onSaveInstanceState()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:08:12.575 - ACTION_SCREEN_OFF -[main (2) ] SEVERE - 0:08:12.578 - watchdog: schedule inactivity action in 15 mins -[main (2) ] SEVERE - 0:08:12.580 - watchdog: enabled -[main (2) ] INFO - 0:08:15.206 - onRestart()@ea019b3:5238 -[main (2) ] INFO - 0:08:15.208 - onStart()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:08:15.225 - onStart()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:08:15.231 - onStart()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:15.234 - onStart()@ea019b3:5238 -[main (2) ] INFO - 0:08:15.243 - onResume()@ea019b3:5238 -[main (2) ] INFO - 0:08:15.245 - added listener: 2 listeners -[main (2) ] INFO - 0:08:15.247 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:08:15.249 - onResume()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:15.250 - added listener: 3 listeners -[main (2) ] INFO - 0:08:15.250 - refreshLocalMediaServerLibraryList: removed: fenice -[main (2) ] INFO - 0:08:15.251 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:08:15.251 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:08:15.252 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:08:15.252 - refreshLocalMediaServerLibraryList: added: fenice -[main (2) ] INFO - 0:08:15.253 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:08:15.253 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:08:15.253 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:08:15.254 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:08:15.255 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:08:15.257 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:08:15.257 - pizzicato-Music: MainFragmentBase.onVolumeChange: 95 -[main (2) ] INFO - 0:08:15.266 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:15.270 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:15.294 - Insets: Insets{left=0, top=88, right=0, bottom=0} -[main (2) ] INFO - 0:08:15.332 - ACTION_SCREEN_ON -[main (2) ] SEVERE - 0:08:15.332 - watchdog: cancelled inactivity action -[main (2) ] SEVERE - 0:08:15.332 - watchdog: disabled -[main (2) ] INFO - 0:08:15.433 - Insets: Insets{left=0, top=88, right=0, bottom=45} -[main (2) ] INFO - 0:08:16.515 - onRouteRemoved 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:08:16.517 - not removing cast device due to recent screen on or off -[main (2) ] INFO - 0:08:16.802 - onRouteAdded 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:08:16.803 - not adding already added cast device -[main (2) ] INFO - 0:08:19.371 - onPause()@ea019b3:5238 -[main (2) ] INFO - 0:08:19.372 - onPause()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:19.372 - removed listener: 2 listeners -[main (2) ] INFO - 0:08:19.374 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:08:19.379 - removed listener: 1 listeners -[main (2) ] INFO - 0:08:19.725 - onStop()@ea019b3:5238 -[main (2) ] INFO - 0:08:19.729 - onStop()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:08:19.731 - onStop()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:08:19.734 - onStop()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:19.735 - onSaveInstanceState(outState)@ea019b3:5238 -[main (2) ] INFO - 0:08:19.741 - onSaveInstanceState()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:08:19.755 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:08:19.769 - onSaveInstanceState()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:08:43.95 - pizzicato-Music: notify fake TransportState=Stopped on auto track change -[main (2) ] INFO - 0:08:43.96 - stopping task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:08:43.97 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:08:43.98 - SETACTIVE: onTransportStateChanged: post STOP callback -[main (2) ] INFO - 0:08:43.151 - .b : selected item (track id): Slow Sun -[main (2) ] INFO - 0:08:43.152 - selected item changed (service): Slow Sun -[main (2) ] INFO - 0:08:43.203 - pizzicato-Music: notify fake TransportState=Playing on auto track change -[main (2) ] INFO - 0:08:43.204 - started task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:08:43.210 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true -[main (2) ] INFO - 0:08:43.211 - dynamic shortcuts: added 'pizzicato-Music' -[main (2) ] INFO - 0:08:43.215 - renderer chooser target: saved 1 targets -[Main #16 (419) ] INFO - 0:08:43.221 - task: start: publishRendererChooserTargets -[Main #16 (419) ] INFO - 0:08:43.246 - task: end, 25ms: publishRendererChooserTargets -[AsyncTask #5 (418) ] INFO - 0:08:43.247 - saved file /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/files/playlists/recent.dpl ok: 100 items -[main (2) ] INFO - 0:09:24.644 - ACTION_SCREEN_OFF -[main (2) ] SEVERE - 0:09:24.647 - watchdog: schedule inactivity action in 15 mins -[main (2) ] SEVERE - 0:09:24.648 - watchdog: enabled -[main (2) ] INFO - 0:09:26.698 - ACTION_SCREEN_ON -[main (2) ] SEVERE - 0:09:26.699 - watchdog: cancelled inactivity action -[main (2) ] SEVERE - 0:09:26.699 - watchdog: disabled -[main (2) ] INFO - 0:09:27.583 - onRouteRemoved 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:09:27.585 - not removing cast device due to recent screen on or off -[main (2) ] INFO - 0:09:29.814 - onRouteAdded 3d57e3df7b480b761c03a9d89520d61b => MediaRouter.RouteInfo{ uniqueId=com.google.android.gms/.cast.media.CastMediaRoute2ProviderService_Persistent:3d57e3df7b480b761c03a9d89520d61b, name=Glouglou Box, description=JBL Authentics 300, iconUri=null, enabled=true, isSystemRoute=false, connectionState=0, canDisconnect=false, playbackType=1, playbackStream=-1, deviceType=2, volumeHandling=0, volume=0, volumeMax=50, presentationDisplayId=-1, extras=Bundle[{com.google.android.gms.cast.EXTRA_CAST_DEVICE="G10x" (3d57e3df7b480b761c03a9d89520d61b) }], settingsIntent=null, providerPackageName=com.google.android.gms } -[main (2) ] INFO - 0:09:29.815 - not adding already added cast device -[main (2) ] INFO - 0:09:54.448 - onRestart()@ea019b3:5238 -[main (2) ] INFO - 0:09:54.450 - onStart()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:09:54.452 - onStart()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:09:54.454 - onStart()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:54.459 - onStart()@ea019b3:5238 -[main (2) ] INFO - 0:09:54.466 - onResume()@ea019b3:5238 -[main (2) ] INFO - 0:09:54.467 - added listener: 2 listeners -[main (2) ] INFO - 0:09:54.468 - sorted 2 items took: 0 ms -[main (2) ] INFO - 0:09:54.469 - onResume()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:54.470 - added listener: 3 listeners -[main (2) ] INFO - 0:09:54.470 - refreshLocalMediaServerLibraryList: removed: fenice -[main (2) ] INFO - 0:09:54.470 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:09:54.470 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:09:54.470 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:09:54.471 - refreshLocalMediaServerLibraryList: added: fenice -[main (2) ] INFO - 0:09:54.471 - refreshLocalMediaServerLibraryList: added: Freebox Server -[main (2) ] INFO - 0:09:54.471 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:09:54.474 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server -[main (2) ] INFO - 0:09:54.474 - pizzicato-Music: TimeTask already launched! -[main (2) ] INFO - 0:09:54.475 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:09:54.475 - onStandbyChange: standby=false, ignore=true -[main (2) ] INFO - 0:09:54.476 - pizzicato-Music: MainFragmentBase.onVolumeChange: 95 -[main (2) ] INFO - 0:09:54.478 - onCreateOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:54.479 - onPrepareOptionsMenu()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:54.512 - Insets: Insets{left=0, top=88, right=0, bottom=45} -[main (2) ] INFO - 0:09:54.706 - Insets: Insets{left=0, top=88, right=0, bottom=45} -[main (2) ] INFO - 0:09:57.314 - onPause()@ea019b3:5238 -[main (2) ] INFO - 0:09:57.315 - onPause()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:57.316 - removed listener: 2 listeners -[main (2) ] INFO - 0:09:57.318 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:09:57.318 - removed listener: 1 listeners -[main (2) ] INFO - 0:09:57.554 - onStop()@ea019b3:5238 -[main (2) ] INFO - 0:09:57.560 - onStop()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:09:57.575 - onStop()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:09:57.577 - onStop()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:57.586 - onSaveInstanceState(outState)@ea019b3:5238 -[main (2) ] INFO - 0:09:57.591 - onSaveInstanceState()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:09:57.594 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:57.601 - onSaveInstanceState()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:09:58.152 - onDestroy()@ea019b3:5238 -[main (2) ] INFO - 0:09:58.154 - onDestroyView()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:09:58.157 - onDestroy()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:09:58.160 - onDetach()@914ef69/ea019b3:5238 -[main (2) ] INFO - 0:09:58.161 - onDestroyView()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:09:58.163 - onDestroy()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:09:58.164 - removed listener: 0 listeners -[main (2) ] INFO - 0:09:58.166 - onDetach()@b163faf/ea019b3:5238 -[main (2) ] INFO - 0:09:58.168 - onDestroyView()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:58.169 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@ea019b3) -[main (2) ] INFO - 0:09:58.170 - onSaveInstanceState()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:58.171 - saveMediaServerState: PMOMusic Media Server -[main (2) ] INFO - 0:09:58.172 - positionStack: [3, 3, 3, 0, 0] -[main (2) ] INFO - 0:09:58.173 - itemList: Bundle[{firstVisiblePosition=0}] -[main (2) ] INFO - 0:09:58.173 - containerPath: [radio-paradise:channel:main, radio-paradise:channel:main:history] -[main (2) ] INFO - 0:09:58.174 - refreshLocalMediaServerLibraryList: removed: fenice -[main (2) ] INFO - 0:09:58.175 - refreshLocalMediaServerLibraryList: removed: Freebox Server -[main (2) ] INFO - 0:09:58.175 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver -[main (2) ] INFO - 0:09:58.175 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server -[main (2) ] INFO - 0:09:58.177 - onDestroy()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:58.179 - onDetach()@df8ac1c/ea019b3:5238 -[main (2) ] INFO - 0:09:58.202 - onTaskRemoved: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 xflg=0x4 cmp=com.bubblesoft.android.bubbleupnp/.MainActivity }, mode: 2 -[main (2) ] INFO - 0:09:58.203 - onTaskRemoved: stopping service -[main (2) ] INFO - 0:09:58.211 - onDestroy: start -[main (2) ] INFO - 0:09:58.267 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Product -[main (2) ] INFO - 0:09:58.268 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Playlist -[main (2) ] INFO - 0:09:58.268 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Info -[main (2) ] INFO - 0:09:58.269 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Credentials -[main (2) ] INFO - 0:09:58.270 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Volume -[main (2) ] INFO - 0:09:58.271 - stopping task TimeTask: pizzicato-Music -[main (2) ] INFO - 0:09:58.273 - task: executor 'PlaybackActions': shutdown, wait for running tasks completion -[main (2) ] INFO - 0:09:58.274 - qobuz: user auth token: unset -[main (2) ] INFO - 0:09:58.275 - qobuz: cleared credentials -[main (2) ] INFO - 0:09:58.275 - qobuz: username: set -[main (2) ] INFO - 0:09:58.276 - tidal: session: unset -[main (2) ] INFO - 0:09:58.276 - tidal: reset -[main (2) ] INFO - 0:09:58.277 - active renderer: none -[main (2) ] INFO - 0:09:58.281 - VolumeProvider: ignoring: null renderer -[main (2) ] INFO - 0:09:58.284 - audio cast (tid: 2): not aborting audio cast (not busy) -[main (2) ] INFO - 0:09:58.286 - task: waiting for completion (timeout: 3000 ms)...: Jetty-Stop -[Main #17 (424) ] INFO - 0:09:58.287 - task: start: Jetty-Stop -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.292 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.293 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.294 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.295 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.295 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.296 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.296 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.297 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.303 - stopped {} -[Main #17: Jetty-Stop (424) ] INFO - 0:09:58.305 - task: executor 'Jetty #%d': shutdown now, cancelling running tasks -[Main #17 (424) ] INFO - 0:09:58.312 - task: end, 24ms: Jetty-Stop -[main (2) ] INFO - 0:09:58.315 - removed local media server -[main (2) ] INFO - 0:09:58.316 - MediaPlayerRenderer.stop() -[Main #2: MediaRenderer-LastChange (199) ] INFO - 0:09:58.317 - MediaRenderer LastChange thread: interrupted -[Main #2 (199) ] INFO - 0:09:58.318 - task: end, 597574ms: MediaRenderer-LastChange -[main (2) ] INFO - 0:09:58.318 - Current state is: STOPPED, changing to new state: STOPPED -[main (2) ] INFO - 0:09:58.323 - MediaPlayerRenderer shutdown -[main (2) ] INFO - 0:09:58.325 - removed local renderer -[main (2) ] WARNING - 0:09:58.328 - discovery maintenance: executor already stopped -[main (2) ] INFO - 0:09:58.329 - task: waiting for completion (timeout: 3000 ms)...: AndroidUpnpService-Shutdown -[Main #2 (199) ] INFO - 0:09:58.329 - task: start: AndroidUpnpService-Shutdown -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.330 - .d : >>> Shutting down UPnP service... -[Main #1 (179) ] INFO - 0:09:58.330 - task: end, 597630ms: DownloadManager -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.845 - .b : WiFi multicast lock released -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.847 - .b : WiFi lock released -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.850 - .a : Shutting down network services -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.850 - .a : Stopping stream client connection management/pool -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.855 - .a : Stopping stream server on address: /127.0.0.1 -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.855 - .a : Stopping stream server on address: /192.168.0.98 -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.857 - .a : Stopping multicast receiver on interface: wlan0 -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.858 - .a : Stopping multicast receiver on interface: lo -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.859 - .a : Stopping datagram I/O on address: /127.0.0.1 -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.861 - .a : Stopping datagram I/O on address: /192.168.0.98 -[Main #2: AndroidUpnpService-Shutdown (19] INFO - 0:09:58.866 - .d : <<< UPnP service shutdown completed -[Main #2 (199) ] INFO - 0:09:58.869 - task: end, 540ms: AndroidUpnpService-Shutdown -[main (2) ] INFO - 0:09:58.870 - removed LAN BubbleUPnP Server -[main (2) ] INFO - 0:09:58.871 - wake lock released -[main (2) ] INFO - 0:09:58.901 - App shutdown -[main (2) ] INFO - 0:09:58.903 - task: shutting down executor 'Main #%d', cancelling tasks -[main (2) ] INFO - 0:09:58.904 - task: executor 'Main #%d': shutdown now, cancelling running tasks -[main (2) ] INFO - 0:09:58.904 - AndroidUpnpService.onDestroy() took: 693 ms -[main (2) ] INFO - 0:09:58.937 - System.exit() diff --git a/pmocontrol/examples/event_demo.rs b/pmocontrol/examples/event_demo.rs index d9875ad1..bf3e7ac5 100644 --- a/pmocontrol/examples/event_demo.rs +++ b/pmocontrol/examples/event_demo.rs @@ -23,6 +23,7 @@ use pmocontrol::{ ControlPoint, DeviceRegistryRead, PlaybackPositionInfo, PlaybackState, RendererEvent, RendererId, RendererInfo, }; +use pmocontrol::openhome_renderer::{format_seconds, map_openhome_state}; fn main() -> io::Result<()> { // Logging simple (tracing_subscriber est déjà utilisé dans les autres exemples) @@ -53,6 +54,7 @@ fn main() -> io::Result<()> { " [{}] {} | model={} | udn={} | location={} | online={}", idx, info.friendly_name, info.model_name, info.udn, info.location, info.online ); + print_openhome_summary(" ", info, &cp); } // 3. Optionnel : sélection d'un renderer par index (filtrage des événements) @@ -126,6 +128,7 @@ fn event_matches_id(event: &RendererEvent, id: &RendererId) -> bool { RendererEvent::MuteChanged { id: eid, .. } => eid == id, RendererEvent::MetadataChanged { id: eid, .. } => eid == id, RendererEvent::QueueUpdated { id: eid, .. } => eid == id, + RendererEvent::BindingChanged { id: eid, .. } => eid == id, } } @@ -165,6 +168,60 @@ fn format_position(pos: &PlaybackPositionInfo) -> String { format!("track={} rel_time={} duration={}", track, rel, dur) } +fn print_openhome_summary(prefix: &str, info: &RendererInfo, cp: &ControlPoint) { + if !info.capabilities.has_oh_playlist + && !info.capabilities.has_oh_info + && !info.capabilities.has_oh_time + { + return; + } + + let registry = cp.registry(); + let reg = registry.read().unwrap(); + let playlist_client = reg.oh_playlist_client_for_renderer(&info.id); + let info_client = reg.oh_info_client_for_renderer(&info.id); + let time_client = reg.oh_time_client_for_renderer(&info.id); + drop(reg); + + if playlist_client.is_none() && info_client.is_none() && time_client.is_none() { + return; + } + + println!("{prefix}OpenHome:"); + + if let Some(client) = playlist_client { + match client.id_array() { + Ok(ids) => println!("{prefix} Playlist tracks : {}", ids.len()), + Err(err) => println!("{prefix} Playlist tracks : "), + } + } + + if let Some(client) = info_client { + match client.transport_state() { + Ok(state) => { + let logical = map_openhome_state(&state); + println!( + "{prefix} Transport state : {} ({:?})", + state, logical + ); + } + Err(err) => println!("{prefix} Transport state : "), + } + } + + if let Some(client) = time_client { + match client.position() { + Ok(pos) => println!( + "{prefix} Position : {}/{} (tracks={})", + format_seconds(pos.elapsed_secs), + format_seconds(pos.duration_secs), + pos.track_count + ), + Err(err) => println!("{prefix} Position : "), + } + } +} + /// Affiche un RendererEvent avec horodatage. fn print_event(event: &RendererEvent) { let ts = now_hms(); diff --git a/pmocontrol/examples/live_pmomusic_demo.rs b/pmocontrol/examples/live_pmomusic_demo.rs index f9fdafec..be7f02de 100644 --- a/pmocontrol/examples/live_pmomusic_demo.rs +++ b/pmocontrol/examples/live_pmomusic_demo.rs @@ -329,13 +329,7 @@ impl CliConfig { } fn pick_renderer(renderers: Vec) -> Option { - let mut candidates: Vec = renderers - .into_iter() - .filter(|info| match info.protocol { - RendererProtocol::OpenHomeOnly => false, - RendererProtocol::UpnpAvOnly | RendererProtocol::Hybrid => true, - }) - .collect(); + let mut candidates: Vec = renderers; if candidates.is_empty() { return None; diff --git a/pmocontrol/examples/queue_pmomusic_demo.rs b/pmocontrol/examples/queue_pmomusic_demo.rs index e6bf56a0..5a6f9196 100644 --- a/pmocontrol/examples/queue_pmomusic_demo.rs +++ b/pmocontrol/examples/queue_pmomusic_demo.rs @@ -302,13 +302,7 @@ impl CliConfig { } fn pick_renderer(renderers: Vec) -> Option { - let mut candidates: Vec = renderers - .into_iter() - .filter(|info| match info.protocol { - RendererProtocol::OpenHomeOnly => false, - RendererProtocol::UpnpAvOnly | RendererProtocol::Hybrid => true, - }) - .collect(); + let mut candidates: Vec = renderers; if candidates.is_empty() { return None; diff --git a/pmocontrol/examples/renderer_demo.rs b/pmocontrol/examples/renderer_demo.rs index edd8aa92..d1741b34 100644 --- a/pmocontrol/examples/renderer_demo.rs +++ b/pmocontrol/examples/renderer_demo.rs @@ -18,6 +18,8 @@ use pmocontrol::{ ControlPoint, MusicRenderer, PlaybackState, PlaybackStatus, RendererCapabilities, RendererProtocol, TransportControl, VolumeControl, }; +use pmocontrol::model::RendererInfo; +use pmocontrol::openhome_renderer::{format_seconds, map_openhome_state}; use std::env; use std::thread; use std::time::Duration; @@ -83,6 +85,7 @@ fn main() -> Result<()> { ); print_backend(" ", r); print_capabilities(" ", &info.capabilities, &info.protocol); + print_openhome_details(" ", info, &cp); } // 5. Select renderer @@ -98,6 +101,7 @@ fn main() -> Result<()> { println!(" Protocol : {:?}", info.protocol); print_backend(" ", renderer); print_capabilities(" ", &info.capabilities, &info.protocol); + print_openhome_details(" ", info, &cp); if let Some(upnp) = renderer.as_upnp() { println!( @@ -224,6 +228,60 @@ fn print_capabilities(prefix: &str, caps: &RendererCapabilities, proto: &Rendere println!("{prefix} OH Radio : {}", caps.has_oh_radio); } +fn print_openhome_details(prefix: &str, info: &RendererInfo, cp: &ControlPoint) { + if !info.capabilities.has_oh_playlist + && !info.capabilities.has_oh_info + && !info.capabilities.has_oh_time + { + return; + } + + let registry = cp.registry(); + let reg = registry.read().unwrap(); + let playlist_client = reg.oh_playlist_client_for_renderer(&info.id); + let info_client = reg.oh_info_client_for_renderer(&info.id); + let time_client = reg.oh_time_client_for_renderer(&info.id); + drop(reg); + + if playlist_client.is_none() && info_client.is_none() && time_client.is_none() { + return; + } + + println!("{prefix}OpenHome:"); + + if let Some(client) = playlist_client { + match client.id_array() { + Ok(ids) => println!("{prefix} Playlist tracks : {}", ids.len()), + Err(err) => println!("{prefix} Playlist tracks : "), + } + } + + if let Some(client) = info_client { + match client.transport_state() { + Ok(state) => { + let logical = map_openhome_state(&state); + println!( + "{prefix} Transport state : {} ({:?})", + state, logical + ); + } + Err(err) => println!("{prefix} Transport state : "), + } + } + + if let Some(client) = time_client { + match client.position() { + Ok(pos) => println!( + "{prefix} Position : {}/{} (tracks={})", + format_seconds(pos.elapsed_secs), + format_seconds(pos.duration_secs), + pos.track_count + ), + Err(err) => println!("{prefix} Position : "), + } + } +} + fn print_backend(prefix: &str, renderer: &MusicRenderer) { let backend = match renderer { MusicRenderer::Upnp(_) => "UpnpRenderer (UPnP AV / DLNA)", diff --git a/pmocontrol/src/control_point.rs b/pmocontrol/src/control_point.rs index 1f7b2bd0..6476795b 100644 --- a/pmocontrol/src/control_point.rs +++ b/pmocontrol/src/control_point.rs @@ -1,13 +1,17 @@ -use std::collections::HashMap; -use std::io; +use std::collections::{HashMap, HashSet}; +use std::hash::{DefaultHasher, Hash, Hasher}; +use std::io::{self, BufRead, BufReader, Read, Write}; +use std::net::{IpAddr, TcpListener, TcpStream, UdpSocket}; use std::sync::{Arc, Mutex, RwLock}; use std::thread; -use std::time::Duration; +use std::time::{Duration, Instant}; -use anyhow::anyhow; -use crossbeam_channel::Receiver; +use anyhow::{anyhow, Context}; +use crossbeam_channel::{Receiver, Sender, unbounded}; use pmoupnp::ssdp::SsdpClient; use tracing::{debug, error, info, warn}; +use ureq::{Agent, http}; +use xmltree::{Element, XMLNode}; use crate::MusicRenderer; use crate::capabilities::{ @@ -21,8 +25,9 @@ use crate::media_server::{ }; use crate::media_server_events::spawn_media_server_event_runtime; use crate::model::TrackMetadata; -use crate::model::{MediaServerEvent, RendererEvent, RendererId, RendererProtocol}; -use crate::music_renderer::op_not_supported; +use crate::model::{MediaServerEvent, RendererEvent, RendererId, RendererInfo}; +use crate::openhome_client::{OhPlaylistClient, OhTrackEntry, parse_track_metadata_from_didl}; +use crate::openhome_renderer::{format_seconds, map_openhome_state}; use crate::playback_queue::{PlaybackItem, PlaybackQueue}; use crate::provider::HttpXmlDescriptionProvider; use crate::registry::{DeviceRegistry, DeviceRegistryRead, DeviceUpdate}; @@ -152,9 +157,30 @@ impl ControlPoint { continue; } - match info.protocol { - RendererProtocol::UpnpAvOnly | RendererProtocol::Hybrid => {} - RendererProtocol::OpenHomeOnly => continue, + let backend = if info.capabilities.has_oh_playlist { + PlaylistBackend::OpenHome + } else { + PlaylistBackend::PMOQueue + }; + let previous_backend = runtime_cp.runtime.playlist_backend(&info.id); + if previous_backend != backend { + runtime_cp + .runtime + .set_playlist_backend(&info.id, backend); + if matches!(backend, PlaylistBackend::OpenHome) { + if let Err(err) = sync_openhome_playlist( + &runtime_cp.registry, + &runtime_cp.runtime, + &runtime_cp.event_bus, + &info.id, + ) { + debug!( + renderer = info.id.0.as_str(), + error = %err, + "Initial OpenHome playlist sync failed" + ); + } + } } let renderer_id = info.id.clone(); @@ -278,6 +304,30 @@ impl ControlPoint { timeout_secs, )?; + let (oh_event_tx, oh_event_rx) = unbounded::(); + let event_forwarder_cp = ControlPoint { + registry: Arc::clone(®istry), + event_bus: event_bus.clone(), + media_event_bus: media_event_bus.clone(), + runtime: Arc::clone(&runtime), + playlist_bindings: Arc::clone(&playlist_bindings), + }; + + thread::Builder::new() + .name("cp-openhome-event-forwarder".into()) + .spawn(move || { + while let Ok(event) = oh_event_rx.recv() { + event_forwarder_cp.emit_renderer_event(event); + } + })?; + + spawn_openhome_event_runtime( + Arc::clone(®istry), + Arc::clone(&runtime), + event_bus.clone(), + oh_event_tx, + )?; + // Worker thread to process MediaServerEvent and trigger queue refreshes // for renderers bound to updated playlist containers let registry_for_media_worker = Arc::clone(®istry); @@ -458,10 +508,6 @@ impl ControlPoint { } /// Snapshot list of music renderers (protocol-agnostic view). - /// - /// For now, only UPnP AV / hybrid renderers are wrapped as - /// [`MusicRenderer::Upnp`]. OpenHome-only devices will be - /// ignored until an OpenHome backend is implemented. pub fn list_music_renderers(&self) -> Vec { let infos = { let reg = self.registry.read().unwrap(); @@ -521,6 +567,17 @@ impl ControlPoint { // User-driven mutation: detach any playlist binding self.detach_binding_on_user_mutation(renderer_id, "clear_queue"); + if self.runtime.uses_openhome_playlist(renderer_id) { + let client = self.openhome_playlist_client(renderer_id)?; + client.delete_all()?; + self.sync_openhome_playlist_for(renderer_id)?; + debug!( + renderer = renderer_id.0.as_str(), + "Cleared OpenHome playlist" + ); + return Ok(()); + } + let removed = self .runtime .with_queue_mut(renderer_id, |queue| { @@ -563,6 +620,11 @@ impl ControlPoint { // User-driven mutation: detach any playlist binding self.detach_binding_on_user_mutation(renderer_id, "enqueue_items"); + if self.runtime.uses_openhome_playlist(renderer_id) { + self.enqueue_items_openhome(renderer_id, items)?; + return Ok(()); + } + let item_count = items.len(); let new_len = self .runtime @@ -625,6 +687,14 @@ impl ControlPoint { .ok_or_else(|| Self::runtime_entry_missing(renderer_id)) } + /// Force a resynchronization of the OpenHome playlist cache for a renderer. + /// + /// This is used by external APIs after mutating the native playlist so that + /// the local queue mirrors the renderer state. + pub fn refresh_openhome_playlist(&self, renderer_id: &RendererId) -> anyhow::Result<()> { + self.sync_openhome_playlist_for(renderer_id) + } + /// Play the current item from the queue without advancing the index. /// /// This is useful after a Stop operation to resume playback from the current @@ -639,6 +709,10 @@ impl ControlPoint { return Err(err); } + if self.runtime.uses_openhome_playlist(renderer_id) { + return self.play_current_openhome(renderer_id); + } + let Some((item, remaining)) = self.runtime.peek_current(renderer_id) else { debug!( renderer = renderer_id.0.as_str(), @@ -664,15 +738,6 @@ impl ControlPoint { anyhow!("Renderer {} not found", renderer_id.0) })?; - if matches!(renderer.info().protocol, RendererProtocol::OpenHomeOnly) { - self.runtime - .set_playback_source(renderer_id, PlaybackSource::None); - return Err(op_not_supported( - "play_current_from_queue", - "OpenHomeOnly renderer", - )); - } - let playback = (|| -> anyhow::Result<()> { let didl_metadata = item.to_didl_metadata(); renderer.play_uri(&item.uri, &didl_metadata)?; @@ -713,6 +778,11 @@ impl ControlPoint { return Err(err); } + if self.runtime.uses_openhome_playlist(renderer_id) { + self.play_next_openhome(renderer_id)?; + return Ok(()); + } + let Some((item, remaining_after)) = self.runtime.dequeue_next(renderer_id) else { debug!( renderer = renderer_id.0.as_str(), @@ -740,18 +810,6 @@ impl ControlPoint { anyhow!("Renderer {} not found", renderer_id.0) })?; - if matches!(renderer.info().protocol, RendererProtocol::OpenHomeOnly) { - self.runtime - .with_queue_mut(renderer_id, |queue| queue.enqueue_front(item)) - .ok_or_else(|| Self::runtime_entry_missing(renderer_id))?; - self.runtime - .set_playback_source(renderer_id, PlaybackSource::None); - return Err(op_not_supported( - "play_next_from_queue", - "OpenHomeOnly renderer", - )); - } - let playback = (|| -> anyhow::Result<()> { let didl_metadata = item.to_didl_metadata(); renderer.play_uri(&item.uri, &didl_metadata)?; @@ -1082,6 +1140,83 @@ impl ControlPoint { renderer_id.0 ) } + + fn sync_openhome_playlist_for(&self, renderer_id: &RendererId) -> anyhow::Result<()> { + sync_openhome_playlist(&self.registry, &self.runtime, &self.event_bus, renderer_id) + } + + fn openhome_playlist_client( + &self, + renderer_id: &RendererId, + ) -> anyhow::Result { + let reg = self.registry.read().unwrap(); + reg.oh_playlist_client_for_renderer(renderer_id) + .ok_or_else(|| anyhow!("Renderer {} has no OpenHome playlist", renderer_id.0)) + } + + fn enqueue_items_openhome( + &self, + renderer_id: &RendererId, + items: Vec, + ) -> anyhow::Result<()> { + if items.is_empty() { + return Ok(()); + } + + let client = self.openhome_playlist_client(renderer_id)?; + let mut after_id = self + .runtime + .queue_full_snapshot(renderer_id) + .and_then(|(queue, _)| queue.last().and_then(openhome_track_id_from_item)) + .unwrap_or(0); + + for item in items.iter() { + let metadata = item.to_didl_metadata(); + after_id = client.insert(after_id, &item.uri, &metadata)?; + } + + self.sync_openhome_playlist_for(renderer_id)?; + Ok(()) + } + + fn play_current_openhome(&self, renderer_id: &RendererId) -> anyhow::Result<()> { + let Some((item, _)) = self.runtime.peek_current(renderer_id) else { + debug!( + renderer = renderer_id.0.as_str(), + "OpenHome playlist is empty or no current item" + ); + self.runtime + .set_playback_source(renderer_id, PlaybackSource::None); + return Ok(()); + }; + + let track_id = openhome_track_id_from_item(&item) + .ok_or_else(|| anyhow!("Current OpenHome item has no track id"))?; + let client = self.openhome_playlist_client(renderer_id)?; + client.play_id(track_id)?; + self.runtime + .set_playback_source(renderer_id, PlaybackSource::FromQueue); + self.sync_openhome_playlist_for(renderer_id)?; + info!( + renderer = renderer_id.0.as_str(), + track_id, + "Started OpenHome playlist playback (current item)" + ); + Ok(()) + } + + fn play_next_openhome(&self, renderer_id: &RendererId) -> anyhow::Result<()> { + let client = self.openhome_playlist_client(renderer_id)?; + client.next()?; + self.runtime + .set_playback_source(renderer_id, PlaybackSource::FromQueue); + self.sync_openhome_playlist_for(renderer_id)?; + info!( + renderer = renderer_id.0.as_str(), + "Advanced OpenHome playlist to next track" + ); + Ok(()) + } } #[derive(Clone, Default)] @@ -1101,12 +1236,30 @@ enum PlaybackSource { External, } -#[derive(Default)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +enum PlaylistBackend { + PMOQueue, + OpenHome, +} + struct RendererRuntimeEntry { snapshot: RendererRuntimeSnapshot, queue: PlaybackQueue, playback_source: PlaybackSource, user_stop_requested: bool, + playlist_backend: PlaylistBackend, +} + +impl Default for RendererRuntimeEntry { + fn default() -> Self { + Self { + snapshot: RendererRuntimeSnapshot::default(), + queue: PlaybackQueue::default(), + playback_source: PlaybackSource::None, + user_stop_requested: false, + playlist_backend: PlaylistBackend::PMOQueue, + } + } } struct RuntimeState { @@ -1134,6 +1287,15 @@ impl RuntimeState { }); } + fn update_snapshot_with(&self, id: &RendererId, f: F) + where + F: FnOnce(&mut RendererRuntimeSnapshot), + { + self.with_entry(id, |entry| { + f(&mut entry.snapshot); + }); + } + fn has_entry(&self, id: &RendererId) -> bool { let entries = self.entries.lock().unwrap(); entries.contains_key(id) @@ -1212,6 +1374,27 @@ impl RuntimeState { f(entry) } + fn set_playlist_backend(&self, id: &RendererId, backend: PlaylistBackend) { + self.with_entry(id, |entry| { + entry.playlist_backend = backend; + }); + } + + fn playlist_backend(&self, id: &RendererId) -> PlaylistBackend { + let entries = self.entries.lock().unwrap(); + entries + .get(id) + .map(|entry| entry.playlist_backend) + .unwrap_or(PlaylistBackend::PMOQueue) + } + + fn uses_openhome_playlist(&self, id: &RendererId) -> bool { + matches!( + self.playlist_backend(id), + PlaylistBackend::OpenHome + ) + } + fn mark_user_stop_requested(&self, id: &RendererId) { let mut entries = self.entries.lock().unwrap(); if let Some(entry) = entries.get_mut(id) { @@ -1503,6 +1686,946 @@ fn playback_item_from_entry(server: &MusicServer, entry: &MediaEntry) -> Option< Some(item) } +const OPENHOME_TRACK_PREFIX: &str = "openhome:"; + +fn playback_item_from_openhome_entry(entry: &OhTrackEntry) -> PlaybackItem { + let mut item = PlaybackItem::new(entry.uri.clone()); + item.object_id = Some(format!("{}{}", OPENHOME_TRACK_PREFIX, entry.id)); + + if let Some(metadata) = parse_track_metadata_from_didl(&entry.metadata_xml) { + item.title = metadata.title; + item.artist = metadata.artist; + item.album = metadata.album; + item.genre = metadata.genre; + item.album_art_uri = metadata.album_art_uri; + item.date = metadata.date; + item.track_number = metadata.track_number; + item.creator = metadata.creator; + } + + item +} + +fn openhome_track_id_from_item(item: &PlaybackItem) -> Option { + let object_id = item.object_id.as_ref()?; + let raw = object_id.strip_prefix(OPENHOME_TRACK_PREFIX)?; + raw.parse::().ok() +} + +fn sync_openhome_playlist( + registry: &Arc>, + runtime: &Arc, + event_bus: &RendererEventBus, + renderer_id: &RendererId, +) -> anyhow::Result<()> { + let (playlist_client, info_client) = { + let reg = registry.read().unwrap(); + let playlist = reg + .oh_playlist_client_for_renderer(renderer_id) + .ok_or_else(|| anyhow!("Renderer has no OpenHome playlist service"))?; + let info = reg.oh_info_client_for_renderer(renderer_id); + (playlist, info) + }; + + let track_entries = playlist_client.read_all_tracks()?; + let playback_items: Vec = track_entries + .iter() + .map(playback_item_from_openhome_entry) + .collect(); + + let current_id = info_client + .and_then(|client| client.id().ok()); + + let current_index = current_id.and_then(|id| { + playback_items + .iter() + .position(|item| openhome_track_id_from_item(item) == Some(id)) + }); + + let queue_len = runtime + .with_queue_mut(renderer_id, |queue| { + queue.clear(); + queue.enqueue_many(playback_items.iter().cloned()); + queue.set_current_index(current_index); + queue.len() + }) + .unwrap_or(0); + + event_bus.broadcast(RendererEvent::QueueUpdated { + id: renderer_id.clone(), + queue_length: queue_len, + }); + + Ok(()) +} + +const OPENHOME_SUBSCRIPTION_TIMEOUT_SECS: u64 = 300; +const OPENHOME_RENEWAL_MARGIN_SECS: u64 = 60; + +fn spawn_openhome_event_runtime( + registry: Arc>, + runtime: Arc, + event_bus: RendererEventBus, + event_tx: Sender, +) -> io::Result<()> { + let listener = TcpListener::bind("0.0.0.0:0")?; + let listener_addr = listener + .local_addr() + .map_err(|err| io::Error::new(io::ErrorKind::Other, err))?; + + info!("OpenHome event listener bound on {}", listener_addr); + + let (notify_tx, notify_rx) = unbounded::(); + thread::Builder::new() + .name("openhome-event-http".into()) + .spawn(move || run_openhome_http_listener(listener, notify_tx))?; + + let worker = OpenHomeEventRuntime::new( + registry, + runtime, + event_bus, + notify_rx, + event_tx, + listener_addr.port(), + ); + + thread::Builder::new() + .name("openhome-event-worker".into()) + .spawn(move || worker.run()) + .map(|_| ()) +} + +struct OpenHomeEventRuntime { + registry: Arc>, + runtime: Arc, + event_bus: RendererEventBus, + notify_rx: Receiver, + event_tx: Sender, + listener_port: u16, + http_timeout: Duration, + subscriptions: HashMap, + path_index: HashMap, +} + +impl OpenHomeEventRuntime { + fn new( + registry: Arc>, + runtime: Arc, + event_bus: RendererEventBus, + notify_rx: Receiver, + event_tx: Sender, + listener_port: u16, + ) -> Self { + Self { + registry, + runtime, + event_bus, + notify_rx, + event_tx, + listener_port, + http_timeout: Duration::from_secs(5), + subscriptions: HashMap::new(), + path_index: HashMap::new(), + } + } + + fn run(mut self) { + loop { + self.drain_notifications(); + self.refresh_renderers(); + self.renew_expiring(); + thread::sleep(Duration::from_millis(250)); + } + } + + fn drain_notifications(&mut self) { + while let Ok(notify) = self.notify_rx.try_recv() { + self.handle_notification(notify); + } + } + + fn refresh_renderers(&mut self) { + let renderer_infos = { + let reg = self.registry.read().unwrap(); + reg.list_renderers() + }; + + let mut active: HashSet = HashSet::new(); + + for info in renderer_infos { + if !info.online { + continue; + } + + if let Some(url) = info.oh_playlist_event_sub_url.clone() { + let key = OpenHomeSubscriptionKey::new(&info.id, OpenHomeServiceKind::Playlist); + active.insert(key.clone()); + self.ensure_subscription(key, info.clone(), url); + } + + if let Some(url) = info.oh_info_event_sub_url.clone() { + let key = OpenHomeSubscriptionKey::new(&info.id, OpenHomeServiceKind::Info); + active.insert(key.clone()); + self.ensure_subscription(key, info.clone(), url); + } + + if let Some(url) = info.oh_time_event_sub_url.clone() { + let key = OpenHomeSubscriptionKey::new(&info.id, OpenHomeServiceKind::Time); + active.insert(key.clone()); + self.ensure_subscription(key, info.clone(), url); + } + } + + let stale: Vec = self + .subscriptions + .keys() + .filter(|key| !active.contains(*key)) + .cloned() + .collect(); + + for key in stale { + if let Some(mut entry) = self.subscriptions.remove(&key) { + self.path_index.remove(&entry.callback_path); + if let Err(err) = Self::unsubscribe_entry(self.http_timeout, &mut entry) { + warn!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + error = %err, + "Failed to unsubscribe from OpenHome events" + ); + } + } + } + } + + fn ensure_subscription( + &mut self, + key: OpenHomeSubscriptionKey, + info: RendererInfo, + event_url: String, + ) { + let entry = self + .subscriptions + .entry(key.clone()) + .or_insert_with(|| OpenHomeSubscriptionState::new(info.clone(), key.service, event_url.clone())); + + entry.update(info, event_url); + self.path_index + .insert(entry.callback_path.clone(), key.clone()); + + if entry.sid.is_none() && entry.should_retry() { + if let Err(err) = + Self::subscribe_entry(self.listener_port, self.http_timeout, entry) + { + warn!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + error = %err, + "OpenHome SUBSCRIBE failed" + ); + entry.defer_retry(); + } + } + } + + fn renew_expiring(&mut self) { + let now = Instant::now(); + let mut to_renew = Vec::new(); + for (key, entry) in self.subscriptions.iter() { + if let Some(exp) = entry.expires_at { + if exp <= now + Duration::from_secs(OPENHOME_RENEWAL_MARGIN_SECS) { + to_renew.push(key.clone()); + } + } + } + + for key in to_renew { + if let Some(entry) = self.subscriptions.get_mut(&key) { + if let Err(err) = Self::renew_entry(self.http_timeout, entry) { + warn!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + error = %err, + "Failed to renew OpenHome subscription" + ); + entry.reset_subscription(); + } + } + } + } + + fn handle_notification(&mut self, notify: OpenHomeIncomingNotify) { + let Some(key) = self.path_index.get(¬ify.path).cloned() else { + debug!("Dropping OpenHome notify for unknown path {}", notify.path); + return; + }; + + let Some(entry) = self.subscriptions.get(&key) else { + return; + }; + + if let (Some(expected), Some(received)) = (&entry.sid, ¬ify.sid) { + if !expected.eq_ignore_ascii_case(received) { + debug!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + expected_sid = expected.as_str(), + received_sid = received.as_str(), + "Ignoring OpenHome notify with mismatched SID" + ); + return; + } + } + + let properties = parse_openhome_propertyset(&entry.renderer.id, &entry.service, ¬ify.body); + if properties.is_empty() { + return; + } + + match entry.service { + OpenHomeServiceKind::Playlist => { + if properties.iter().any(|(name, _)| is_id_array_property(name)) { + if self + .runtime + .uses_openhome_playlist(&entry.renderer.id) + { + if let Err(err) = sync_openhome_playlist( + &self.registry, + &self.runtime, + &self.event_bus, + &entry.renderer.id, + ) { + warn!( + renderer = entry.renderer.friendly_name.as_str(), + error = %err, + "Failed to sync OpenHome playlist after IdArray event" + ); + } + } + } + } + OpenHomeServiceKind::Info => { + self.handle_info_properties(&entry.renderer.id, properties); + } + OpenHomeServiceKind::Time => { + self.handle_time_properties(&entry.renderer.id, properties); + } + } + } + + fn handle_info_properties( + &self, + renderer_id: &RendererId, + properties: Vec<(String, String)>, + ) { + let mut metadata_xml: Option = None; + let mut transport_state: Option = None; + let mut track_id: Option = None; + let mut track_uri: Option = None; + + for (name, value) in properties { + match name.as_str() { + "Metadata" | "TrackMetadata" => { + if !value.trim().is_empty() { + metadata_xml = Some(value); + } + } + "TransportState" => { + transport_state = Some(value); + } + "Id" | "TrackId" => { + if let Ok(id) = value.trim().parse::() { + track_id = Some(id); + } + } + "Uri" | "TrackUri" => { + if !value.trim().is_empty() { + track_uri = Some(value); + } + } + _ => {} + } + } + + if let Some(xml) = metadata_xml { + if let Some(metadata) = parse_track_metadata_from_didl(&xml) { + self.runtime.update_snapshot_with(renderer_id, |snapshot| { + snapshot.last_metadata = Some(metadata.clone()); + let mut position = snapshot + .position + .clone() + .unwrap_or_else(|| empty_playback_position()); + position.track_metadata = Some(xml.clone()); + snapshot.position = Some(position); + }); + let _ = self.event_tx.send(RendererEvent::MetadataChanged { + id: renderer_id.clone(), + metadata, + }); + } + } + + if track_id.is_some() || track_uri.is_some() { + self.runtime.update_snapshot_with(renderer_id, |snapshot| { + let mut position = snapshot + .position + .clone() + .unwrap_or_else(|| empty_playback_position()); + if let Some(id) = track_id { + position.track = Some(id); + } + if let Some(uri) = track_uri.clone() { + position.track_uri = Some(uri); + } + snapshot.position = Some(position); + }); + } + + if let Some(state_str) = transport_state { + let playback_state = map_openhome_state(&state_str); + let _ = self.event_tx.send(RendererEvent::StateChanged { + id: renderer_id.clone(), + state: playback_state, + }); + } + } + + fn handle_time_properties( + &self, + renderer_id: &RendererId, + properties: Vec<(String, String)>, + ) { + let mut duration: Option = None; + let mut seconds: Option = None; + + for (name, value) in properties { + match name.as_str() { + "Duration" => { + duration = value.trim().parse::().ok(); + } + "Seconds" => { + seconds = value.trim().parse::().ok(); + } + _ => {} + } + } + + if duration.is_none() && seconds.is_none() { + return; + } + + let position = self.runtime.snapshot_for(renderer_id).position; + let mut new_position = position.unwrap_or_else(|| empty_playback_position()); + if let Some(d) = duration { + new_position.track_duration = Some(format_seconds(d)); + } + if let Some(s) = seconds { + new_position.rel_time = Some(format_seconds(s)); + } + + self.runtime + .update_snapshot_with(renderer_id, |snapshot| { + snapshot.position = Some(new_position.clone()); + }); + + let _ = self.event_tx.send(RendererEvent::PositionChanged { + id: renderer_id.clone(), + position: new_position, + }); + } + + fn subscribe_entry( + listener_port: u16, + http_timeout: Duration, + entry: &mut OpenHomeSubscriptionState, + ) -> anyhow::Result<()> { + let event_url = entry.event_sub_url.clone(); + let (remote_host, remote_port) = + parse_host_port(&event_url).context("Cannot extract host for SUBSCRIBE")?; + let local_ip = determine_local_ip(&remote_host, remote_port) + .context("Cannot determine local IP for callback")?; + + let callback_url = format!( + "http://{}:{}{}", + format_ip(&local_ip), + listener_port, + entry.callback_path + ); + + debug!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + callback = callback_url.as_str(), + "Subscribing to OpenHome events" + ); + + let host_header = format!("{}:{}", remote_host, remote_port); + let timeout_header = format!("Second-{}", OPENHOME_SUBSCRIPTION_TIMEOUT_SECS); + let callback_header = format!("<{}>", callback_url); + + let request = http::Request::builder() + .method("SUBSCRIBE") + .uri(&event_url) + .header("HOST", host_header) + .header("CALLBACK", callback_header) + .header("NT", "upnp:event") + .header("TIMEOUT", timeout_header) + .body(()) + .map_err(anyhow::Error::new)?; + + let response = build_agent(http_timeout).run(request)?; + if !response.status().is_success() { + anyhow::bail!( + "SUBSCRIBE returned HTTP {}", + response.status() + ); + } + + let sid = response + .headers() + .get("SID") + .and_then(|value| value.to_str().ok()) + .map(|s| s.to_string()) + .ok_or_else(|| anyhow::anyhow!("SUBSCRIBE response missing SID"))?; + let timeout = parse_timeout( + response + .headers() + .get("TIMEOUT") + .and_then(|value| value.to_str().ok()), + ) + .unwrap_or(Duration::from_secs(OPENHOME_SUBSCRIPTION_TIMEOUT_SECS)); + + entry.sid = Some(sid); + entry.expires_at = Some(Instant::now() + timeout); + entry.retry_after = Instant::now() + Duration::from_secs(5); + + info!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + "Subscribed to OpenHome events (timeout {}s)", + timeout.as_secs() + ); + + Ok(()) + } + + fn renew_entry( + http_timeout: Duration, + entry: &mut OpenHomeSubscriptionState, + ) -> anyhow::Result<()> { + let sid = entry.sid.clone().context("Cannot renew without SID")?; + let request = http::Request::builder() + .method("SUBSCRIBE") + .uri(&entry.event_sub_url) + .header("SID", sid) + .header( + "TIMEOUT", + format!("Second-{}", OPENHOME_SUBSCRIPTION_TIMEOUT_SECS), + ) + .body(()) + .map_err(anyhow::Error::new)?; + let response = build_agent(http_timeout).run(request)?; + if !response.status().is_success() { + anyhow::bail!( + "SUBSCRIBE renewal failed with {}", + response.status() + ); + } + let timeout = parse_timeout( + response + .headers() + .get("TIMEOUT") + .and_then(|value| value.to_str().ok()), + ) + .unwrap_or(Duration::from_secs(OPENHOME_SUBSCRIPTION_TIMEOUT_SECS)); + entry.expires_at = Some(Instant::now() + timeout); + info!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + "Renewed OpenHome subscription (timeout {}s)", + timeout.as_secs() + ); + Ok(()) + } + + fn unsubscribe_entry( + http_timeout: Duration, + entry: &mut OpenHomeSubscriptionState, + ) -> anyhow::Result<()> { + let sid = match entry.sid.take() { + Some(sid) => sid, + None => return Ok(()), + }; + + let request = http::Request::builder() + .method("UNSUBSCRIBE") + .uri(&entry.event_sub_url) + .header("SID", sid) + .body(()) + .map_err(anyhow::Error::new)?; + let response = build_agent(http_timeout).run(request)?; + if !response.status().is_success() { + warn!( + renderer = entry.renderer.friendly_name.as_str(), + service = entry.service.as_str(), + status = response.status().as_u16(), + "UNSUBSCRIBE returned non-success status" + ); + } + Ok(()) + } +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +struct OpenHomeSubscriptionKey { + renderer_id: RendererId, + service: OpenHomeServiceKind, +} + +impl OpenHomeSubscriptionKey { + fn new(renderer_id: &RendererId, service: OpenHomeServiceKind) -> Self { + Self { + renderer_id: renderer_id.clone(), + service, + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +enum OpenHomeServiceKind { + Playlist, + Info, + Time, +} + +impl OpenHomeServiceKind { + fn as_str(&self) -> &'static str { + match self { + OpenHomeServiceKind::Playlist => "playlist", + OpenHomeServiceKind::Info => "info", + OpenHomeServiceKind::Time => "time", + } + } +} + +struct OpenHomeSubscriptionState { + renderer: RendererInfo, + service: OpenHomeServiceKind, + event_sub_url: String, + callback_path: String, + sid: Option, + expires_at: Option, + retry_after: Instant, +} + +impl OpenHomeSubscriptionState { + fn new(renderer: RendererInfo, service: OpenHomeServiceKind, event_sub_url: String) -> Self { + Self { + callback_path: build_openhome_callback_path(&renderer.id, service), + renderer, + service, + event_sub_url, + sid: None, + expires_at: None, + retry_after: Instant::now(), + } + } + + fn update(&mut self, renderer: RendererInfo, event_url: String) { + if self.renderer.location != renderer.location + || self.event_sub_url != event_url + { + self.event_sub_url = event_url; + self.sid = None; + self.expires_at = None; + self.retry_after = Instant::now(); + } + self.renderer = renderer; + } + + fn should_retry(&self) -> bool { + Instant::now() >= self.retry_after + } + + fn defer_retry(&mut self) { + self.retry_after = Instant::now() + Duration::from_secs(15); + } + + fn reset_subscription(&mut self) { + self.sid = None; + self.expires_at = None; + self.retry_after = Instant::now() + Duration::from_secs(5); + } +} + +struct OpenHomeIncomingNotify { + path: String, + sid: Option, + body: Vec, +} + +fn run_openhome_http_listener( + listener: TcpListener, + notify_tx: Sender, +) { + for stream in listener.incoming() { + match stream { + Ok(mut stream) => { + if let Err(err) = stream.set_read_timeout(Some(Duration::from_secs(5))) { + warn!("Failed to set read timeout on OpenHome notify connection: {}", err); + } + + match read_openhome_http_request(&mut stream) { + Ok(request) => { + if request.method != "NOTIFY" { + let _ = write_openhome_http_response( + &mut stream, + 405, + "Method Not Allowed", + ); + continue; + } + + let notify = OpenHomeIncomingNotify { + path: request.path, + sid: request.headers.get("sid").cloned(), + body: request.body, + }; + + if notify_tx.send(notify).is_err() { + warn!("Dropping OpenHome notify because worker channel is closed"); + } + let _ = write_openhome_http_response(&mut stream, 200, "OK"); + } + Err(err) => { + warn!("Failed to parse OpenHome notify request: {}", err); + let _ = write_openhome_http_response(&mut stream, 400, "Bad Request"); + } + } + } + Err(err) => { + warn!("Incoming OpenHome notify connection failed: {}", err); + } + } + } +} + +struct OpenHomeHttpRequest { + method: String, + path: String, + headers: HashMap, + body: Vec, +} + +fn read_openhome_http_request(stream: &mut TcpStream) -> io::Result { + let mut reader = BufReader::new(stream.try_clone()?); + let mut request_line = String::new(); + if reader.read_line(&mut request_line)? == 0 { + return Err(io::Error::new( + io::ErrorKind::UnexpectedEof, + "missing request line", + )); + } + + let request_line = request_line.trim_end_matches(&['\r', '\n'][..]); + let mut parts = request_line.split_whitespace(); + let method = parts + .next() + .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "missing method"))? + .to_ascii_uppercase(); + let path = parts + .next() + .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "missing path"))? + .to_string(); + + let mut headers = HashMap::new(); + loop { + let mut line = String::new(); + let len = reader.read_line(&mut line)?; + if len == 0 { + break; + } + let trimmed = line.trim_end_matches(&['\r', '\n'][..]); + if trimmed.is_empty() { + break; + } + if let Some((name, value)) = trimmed.split_once(':') { + headers.insert(name.trim().to_ascii_lowercase(), value.trim().to_string()); + } + } + + let content_length: usize = headers + .get("content-length") + .and_then(|v| v.parse().ok()) + .unwrap_or(0); + + let mut body = vec![0u8; content_length]; + reader.read_exact(&mut body)?; + + Ok(OpenHomeHttpRequest { + method, + path, + headers, + body, + }) +} + +fn write_openhome_http_response( + stream: &mut TcpStream, + status: u16, + message: &str, +) -> io::Result<()> { + let response = format!( + "HTTP/1.1 {} {}\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", + status, message + ); + stream.write_all(response.as_bytes()) +} + +fn build_openhome_callback_path(id: &RendererId, service: OpenHomeServiceKind) -> String { + let mut sanitized = String::new(); + for ch in id.0.chars() { + if ch.is_ascii_alphanumeric() { + sanitized.push(ch); + } else { + sanitized.push('_'); + } + } + let mut hasher = DefaultHasher::new(); + id.hash(&mut hasher); + service.hash(&mut hasher); + let suffix = hasher.finish(); + format!( + "/openhome-events/{}/{:x}", + service.as_str(), + suffix + ) +} + +fn parse_openhome_propertyset( + renderer_id: &RendererId, + service: &OpenHomeServiceKind, + body: &[u8], +) -> Vec<(String, String)> { + let mut properties = Vec::new(); + let reader = std::io::Cursor::new(body); + let Ok(root) = Element::parse(reader) else { + warn!( + renderer = renderer_id.0.as_str(), + service = service.as_str(), + "Failed to parse OpenHome notify payload" + ); + return properties; + }; + + for property in root.children.iter().filter_map(|node| match node { + XMLNode::Element(elem) => Some(elem), + _ => None, + }) { + for child in property.children.iter().filter_map(|node| match node { + XMLNode::Element(elem) => Some(elem), + _ => None, + }) { + if let Some(text) = child.get_text() { + properties.push((child.name.clone(), text.into_owned())); + } + } + } + + properties +} + +fn is_id_array_property(name: &str) -> bool { + name.trim() + .to_ascii_lowercase() + .ends_with("idarray") +} + +fn empty_playback_position() -> PlaybackPositionInfo { + PlaybackPositionInfo { + track: None, + rel_time: None, + abs_time: None, + track_duration: None, + track_metadata: None, + track_uri: None, + } +} + +fn parse_timeout(raw: Option<&str>) -> Option { + let value = raw?; + let lower = value.trim().to_ascii_lowercase(); + if lower == "second-infinite" { + return Some(Duration::from_secs(OPENHOME_SUBSCRIPTION_TIMEOUT_SECS)); + } + if let Some(idx) = lower.find("second-") { + let number = &lower[idx + 7..]; + if let Ok(seconds) = number.parse::() { + return Some(Duration::from_secs(seconds)); + } + } + None +} + +fn parse_host_port(url: &str) -> Option<(String, u16)> { + let default_port = if url.to_ascii_lowercase().starts_with("https://") { + 443 + } else { + 80 + }; + let (_, rest) = url.split_once("://")?; + let mut parts = rest.splitn(2, '/'); + let authority = parts.next()?.trim(); + if authority.starts_with('[') { + let end = authority.find(']')?; + let host = &authority[1..end]; + let remainder = authority.get(end + 1..).unwrap_or(""); + let port = if let Some(stripped) = remainder.strip_prefix(':') { + stripped.parse().unwrap_or(default_port) + } else { + default_port + }; + Some((host.to_string(), port)) + } else if let Some((host, port)) = authority.split_once(':') { + Some((host.to_string(), port.parse().ok()?)) + } else { + Some((authority.to_string(), default_port)) + } +} + +fn determine_local_ip(remote_host: &str, remote_port: u16) -> io::Result { + let is_ipv6 = remote_host.contains(':') && !remote_host.contains('.'); + let target = if is_ipv6 { + format!( + "[{}]:{}", + remote_host.trim_matches(|c| c == '[' || c == ']'), + remote_port + ) + } else { + format!("{}:{}", remote_host, remote_port) + }; + let bind_addr = if is_ipv6 { "[::]:0" } else { "0.0.0.0:0" }; + let socket = UdpSocket::bind(bind_addr)?; + socket.connect(&target)?; + Ok(socket.local_addr()?.ip()) +} + +fn format_ip(ip: &IpAddr) -> String { + match ip { + IpAddr::V4(v4) => v4.to_string(), + IpAddr::V6(v6) => format!("[{}]", v6), + } +} + +fn build_agent(timeout: Duration) -> Agent { + Agent::config_builder() + .timeout_global(Some(timeout)) + .http_status_as_error(false) + .allow_non_standard_methods(true) + .build() + .into() +} + /// Parse "HH:MM:SS" style time strings to seconds. /// /// Returns None for empty or sentinel values such as "NOT_IMPLEMENTED" or "-:--:--". diff --git a/pmocontrol/src/lib.rs b/pmocontrol/src/lib.rs index 9014cdea..a738b196 100644 --- a/pmocontrol/src/lib.rs +++ b/pmocontrol/src/lib.rs @@ -11,6 +11,8 @@ pub mod linkplay; pub mod media_server; pub mod model; pub mod music_renderer; +pub mod openhome_client; +pub mod openhome_renderer; pub mod playback_queue; pub mod provider; pub mod registry; @@ -43,6 +45,7 @@ pub use media_server::{ UpnpMediaServer, }; pub use music_renderer::MusicRenderer; +pub use openhome_renderer::OpenHomeRenderer; pub use playback_queue::{PlaybackItem, PlaybackQueue}; pub use rendering_control_client::RenderingControlClient; pub use upnp_renderer::UpnpRenderer; diff --git a/pmocontrol/src/model.rs b/pmocontrol/src/model.rs index 89d4c74e..8b4e5baa 100644 --- a/pmocontrol/src/model.rs +++ b/pmocontrol/src/model.rs @@ -72,6 +72,19 @@ pub struct RendererInfo { pub rendering_control_control_url: Option, pub connection_manager_service_type: Option, pub connection_manager_control_url: Option, + pub oh_playlist_service_type: Option, + pub oh_playlist_control_url: Option, + pub oh_playlist_event_sub_url: Option, + pub oh_info_service_type: Option, + pub oh_info_control_url: Option, + pub oh_info_event_sub_url: Option, + pub oh_time_service_type: Option, + pub oh_time_control_url: Option, + pub oh_time_event_sub_url: Option, + pub oh_volume_service_type: Option, + pub oh_volume_control_url: Option, + pub oh_radio_service_type: Option, + pub oh_radio_control_url: Option, } #[derive(Clone, Debug)] diff --git a/pmocontrol/src/music_renderer.rs b/pmocontrol/src/music_renderer.rs index 7b77319c..cd63cdfe 100644 --- a/pmocontrol/src/music_renderer.rs +++ b/pmocontrol/src/music_renderer.rs @@ -1,18 +1,18 @@ //! Backend-agnostic music renderer façade for PMOMusic. //! -//! `MusicRenderer` wraps every supported backend (UPnP AV/DLNA, LinkPlay HTTP, -//! Arylic TCP, and the hybrid UPnP + Arylic pairing) behind a single control -//! surface. Higher layers in PMOMusic must only interact with renderers through -//! this type so that transport, volume, and state queries stay backend-neutral. -//! OpenHome-only renderers are intentionally unsupported for now. +//! `MusicRenderer` wraps every supported backend (UPnP AV/DLNA, OpenHome, +//! LinkPlay HTTP, Arylic TCP, and the hybrid UPnP + Arylic pairing) behind a +//! single control surface. Higher layers in PMOMusic must only interact with +//! renderers through this type so that transport, volume, and state queries +//! stay backend-neutral. use std::sync::{Arc, RwLock}; use crate::capabilities::{PlaybackPositionInfo, PlaybackStatus}; use crate::model::{RendererId, RendererInfo, RendererProtocol}; use crate::{ - ArylicTcpRenderer, DeviceRegistry, LinkPlayRenderer, PlaybackPosition, PlaybackState, - TransportControl, UpnpRenderer, VolumeControl, + ArylicTcpRenderer, DeviceRegistry, LinkPlayRenderer, OpenHomeRenderer, PlaybackPosition, + PlaybackState, TransportControl, UpnpRenderer, VolumeControl, }; use anyhow::{Result, anyhow}; use tracing::warn; @@ -22,6 +22,8 @@ use tracing::warn; pub enum MusicRenderer { /// Classic UPnP AV / DLNA renderer (AVTransport + RenderingControl). Upnp(UpnpRenderer), + /// Renderer powered by OpenHome services. + OpenHome(OpenHomeRenderer), /// Renderer controlled via the LinkPlay HTTP API. LinkPlay(LinkPlayRenderer), /// Renderer reachable through the Arylic TCP control protocol (port 8899). @@ -48,6 +50,7 @@ impl MusicRenderer { pub fn id(&self) -> &RendererId { match self { MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.id(), + MusicRenderer::OpenHome(r) => r.id(), MusicRenderer::Upnp(r) => r.id(), MusicRenderer::LinkPlay(r) => r.id(), MusicRenderer::ArylicTcp(r) => r.id(), @@ -58,6 +61,7 @@ impl MusicRenderer { pub fn friendly_name(&self) -> &str { match self { MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.friendly_name(), + MusicRenderer::OpenHome(r) => r.friendly_name(), MusicRenderer::Upnp(r) => r.friendly_name(), MusicRenderer::LinkPlay(r) => r.friendly_name(), MusicRenderer::ArylicTcp(r) => r.friendly_name(), @@ -73,6 +77,7 @@ impl MusicRenderer { pub fn info(&self) -> &RendererInfo { match self { MusicRenderer::HybridUpnpArylic { arylic, .. } => &arylic.info, + MusicRenderer::OpenHome(r) => &r.info, MusicRenderer::Upnp(r) => &r.info, MusicRenderer::LinkPlay(r) => &r.info, MusicRenderer::ArylicTcp(r) => &r.info, @@ -96,6 +101,24 @@ impl MusicRenderer { info: RendererInfo, registry: &Arc>, ) -> Option { + if matches!(info.protocol, RendererProtocol::OpenHomeOnly | RendererProtocol::Hybrid) { + if let Some(renderer) = { + let reg = registry.read().unwrap(); + let renderer = OpenHomeRenderer::new(info.clone(), &*reg); + renderer.has_any_openhome_service().then_some(renderer) + } { + return Some(MusicRenderer::OpenHome(renderer)); + } + + if matches!(info.protocol, RendererProtocol::OpenHomeOnly) { + warn!( + renderer = info.friendly_name.as_str(), + "Renderer advertises OpenHome only but exposes no usable services" + ); + return None; + } + } + match info.protocol { RendererProtocol::UpnpAvOnly | RendererProtocol::Hybrid => { let has_arylic = info.capabilities.has_arylic_tcp; @@ -131,10 +154,7 @@ impl MusicRenderer { info, registry, ))) } - RendererProtocol::OpenHomeOnly => { - // TODO: OH plus tard - None - } + RendererProtocol::OpenHomeOnly => None, } } } @@ -145,6 +165,7 @@ impl TransportControl for MusicRenderer { fn play_uri(&self, uri: &str, meta: &str) -> Result<()> { match self { MusicRenderer::Upnp(upnp) => upnp.play_uri(uri, meta), + MusicRenderer::OpenHome(oh) => oh.play_uri(uri, meta), MusicRenderer::LinkPlay(lp) => lp.play_uri(uri, meta), MusicRenderer::ArylicTcp(_) => Err(op_not_supported("play_uri", "ArylicTcp")), MusicRenderer::HybridUpnpArylic { upnp, .. } => upnp.play_uri(uri, meta), @@ -154,6 +175,7 @@ impl TransportControl for MusicRenderer { fn play(&self) -> Result<()> { match self { MusicRenderer::Upnp(upnp) => upnp.play(), + MusicRenderer::OpenHome(oh) => oh.play(), MusicRenderer::LinkPlay(lp) => lp.play(), MusicRenderer::ArylicTcp(ary) => ary.play(), MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.play(), @@ -163,6 +185,7 @@ impl TransportControl for MusicRenderer { fn pause(&self) -> Result<()> { match self { MusicRenderer::Upnp(upnp) => upnp.pause(), + MusicRenderer::OpenHome(oh) => oh.pause(), MusicRenderer::LinkPlay(lp) => lp.pause(), MusicRenderer::ArylicTcp(ary) => ary.pause(), MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.pause(), @@ -172,6 +195,7 @@ impl TransportControl for MusicRenderer { fn stop(&self) -> Result<()> { match self { MusicRenderer::Upnp(upnp) => upnp.stop(), + MusicRenderer::OpenHome(oh) => oh.stop(), MusicRenderer::LinkPlay(lp) => lp.stop(), MusicRenderer::ArylicTcp(ary) => ary.stop(), MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.stop(), @@ -181,6 +205,7 @@ impl TransportControl for MusicRenderer { fn seek_rel_time(&self, hhmmss: &str) -> Result<()> { match self { MusicRenderer::Upnp(upnp) => upnp.seek_rel_time(hhmmss), + MusicRenderer::OpenHome(oh) => oh.seek_rel_time(hhmmss), MusicRenderer::LinkPlay(lp) => lp.seek_rel_time(hhmmss), MusicRenderer::ArylicTcp(_) => Err(op_not_supported("seek_rel_time", "ArylicTcp")), MusicRenderer::HybridUpnpArylic { upnp, .. } => upnp.seek_rel_time(hhmmss), @@ -197,6 +222,7 @@ impl VolumeControl for MusicRenderer { match self { MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.volume(), MusicRenderer::ArylicTcp(ary) => ary.volume(), + MusicRenderer::OpenHome(oh) => oh.volume(), MusicRenderer::Upnp(upnp) => upnp.volume(), MusicRenderer::LinkPlay(lp) => lp.volume(), } @@ -206,6 +232,7 @@ impl VolumeControl for MusicRenderer { match self { MusicRenderer::HybridUpnpArylic { upnp, .. } => upnp.set_volume(vol), MusicRenderer::ArylicTcp(ary) => ary.set_volume(vol), + MusicRenderer::OpenHome(oh) => oh.set_volume(vol), MusicRenderer::Upnp(upnp) => upnp.set_volume(vol), MusicRenderer::LinkPlay(lp) => lp.set_volume(vol), } @@ -214,6 +241,7 @@ impl VolumeControl for MusicRenderer { fn mute(&self) -> Result { match self { MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.mute(), + MusicRenderer::OpenHome(r) => r.mute(), MusicRenderer::Upnp(r) => r.get_master_mute(), MusicRenderer::LinkPlay(r) => r.mute(), MusicRenderer::ArylicTcp(r) => r.mute(), @@ -223,6 +251,7 @@ impl VolumeControl for MusicRenderer { fn set_mute(&self, m: bool) -> Result<()> { match self { MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.set_mute(m), + MusicRenderer::OpenHome(r) => r.set_mute(m), MusicRenderer::Upnp(r) => r.set_master_mute(m), MusicRenderer::LinkPlay(r) => r.set_mute(m), MusicRenderer::ArylicTcp(r) => r.set_mute(m), @@ -238,6 +267,7 @@ impl PlaybackStatus for MusicRenderer { fn playback_state(&self) -> Result { match self { MusicRenderer::Upnp(r) => PlaybackStatus::playback_state(r), + MusicRenderer::OpenHome(r) => PlaybackStatus::playback_state(r), MusicRenderer::LinkPlay(r) => r.playback_state(), MusicRenderer::ArylicTcp(r) => r.playback_state(), MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.playback_state(), @@ -251,6 +281,7 @@ impl PlaybackPosition for MusicRenderer { fn playback_position(&self) -> Result { match self { MusicRenderer::Upnp(r) => r.playback_position(), + MusicRenderer::OpenHome(r) => r.playback_position(), MusicRenderer::LinkPlay(r) => r.playback_position(), MusicRenderer::ArylicTcp(r) => r.playback_position(), MusicRenderer::HybridUpnpArylic { arylic, .. } => arylic.playback_position(), diff --git a/pmocontrol/src/openapi.rs b/pmocontrol/src/openapi.rs index 82c1f6fc..e2dfc3e7 100644 --- a/pmocontrol/src/openapi.rs +++ b/pmocontrol/src/openapi.rs @@ -22,12 +22,41 @@ pub struct RendererSummary { pub friendly_name: String, /// Modèle du renderer pub model_name: String, - /// Protocole (Upnp, Hybrid, etc.) - pub protocol: String, + /// Protocole (UPnP pur, OpenHome pur, hybride) + pub protocol: RendererProtocolSummary, + /// Capacités détectées + pub capabilities: RendererCapabilitiesSummary, /// Renderer en ligne pub online: bool, } +/// Protocole exposé par le renderer +#[cfg(feature = "pmoserver")] +#[derive(Debug, Clone, Serialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum RendererProtocolSummary { + Upnp, + Openhome, + Hybrid, +} + +/// Drapeaux de capacités renderer (transport, volume, services OpenHome, etc.) +#[cfg(feature = "pmoserver")] +#[derive(Debug, Clone, Serialize, ToSchema)] +pub struct RendererCapabilitiesSummary { + pub has_avtransport: bool, + pub has_avtransport_set_next: bool, + pub has_rendering_control: bool, + pub has_connection_manager: bool, + pub has_linkplay_http: bool, + pub has_arylic_tcp: bool, + pub has_oh_playlist: bool, + pub has_oh_volume: bool, + pub has_oh_info: bool, + pub has_oh_time: bool, + pub has_oh_radio: bool, +} + /// État détaillé d'un renderer #[cfg(feature = "pmoserver")] #[derive(Debug, Clone, Serialize, ToSchema)] @@ -100,6 +129,55 @@ pub struct QueueSnapshot { pub current_index: Option, } +// ============================================================================ +// OPENHOME PLAYLIST +// ============================================================================ + +/// Snapshot de la playlist native OpenHome +#[cfg(feature = "pmoserver")] +#[derive(Debug, Clone, Serialize, ToSchema)] +pub struct OpenHomePlaylistSnapshot { + /// ID du renderer concerné + pub renderer_id: String, + /// ID courant dans la playlist (si connu) + pub current_id: Option, + /// Tracks présents dans la playlist native + pub tracks: Vec, +} + +/// Track issue de la playlist native OpenHome +#[cfg(feature = "pmoserver")] +#[derive(Debug, Clone, Serialize, ToSchema)] +pub struct OpenHomePlaylistTrack { + /// ID interne OpenHome + pub id: u32, + /// URI du flux + pub uri: String, + /// Titre + pub title: Option, + /// Artiste + pub artist: Option, + /// Album + pub album: Option, + /// Pochette (si disponible) + pub album_art_uri: Option, +} + +/// Requête pour ajouter un track à la playlist OpenHome +#[cfg(feature = "pmoserver")] +#[derive(Debug, Clone, Deserialize, ToSchema)] +pub struct OpenHomePlaylistAddRequest { + /// URI du flux à insérer + pub uri: String, + /// Métadonnées DIDL-Lite complètes + pub metadata: String, + /// ID devant lequel insérer (None => fin de playlist) + pub after_id: Option, + /// Si true, démarre immédiatement la lecture du track inséré + #[serde(default)] + pub play: bool, +} + // ============================================================================ // MEDIA SERVERS // ============================================================================ @@ -280,6 +358,10 @@ GET /control/servers/{server_id}/containers/{container_id} crate::pmoserver_ext::get_renderer_state, crate::pmoserver_ext::get_renderer_queue, crate::pmoserver_ext::get_renderer_binding, + crate::pmoserver_ext::get_openhome_playlist, + crate::pmoserver_ext::clear_openhome_playlist, + crate::pmoserver_ext::add_openhome_playlist_item, + crate::pmoserver_ext::play_openhome_track, crate::pmoserver_ext::play_renderer, crate::pmoserver_ext::pause_renderer, crate::pmoserver_ext::stop_renderer, @@ -300,10 +382,15 @@ GET /control/servers/{server_id}/containers/{container_id} ), components(schemas( RendererSummary, + RendererProtocolSummary, + RendererCapabilitiesSummary, RendererState, AttachedPlaylistInfo, QueueItem, QueueSnapshot, + OpenHomePlaylistSnapshot, + OpenHomePlaylistTrack, + OpenHomePlaylistAddRequest, MediaServerSummary, ContainerEntry, BrowseResponse, diff --git a/pmocontrol/src/openhome_client.rs b/pmocontrol/src/openhome_client.rs new file mode 100644 index 00000000..bbb0fa45 --- /dev/null +++ b/pmocontrol/src/openhome_client.rs @@ -0,0 +1,693 @@ +use anyhow::{Result, anyhow}; +use crate::model::TrackMetadata; +use crate::soap_client::{SoapCallResult, invoke_upnp_action}; +use pmoupnp::soap::SoapEnvelope; +use xmltree::{Element, XMLNode}; + +#[derive(Debug, Clone)] +pub struct OhTrackEntry { + pub id: u32, + pub uri: String, + pub metadata_xml: String, +} + +#[derive(Debug, Clone)] +pub struct OhInfoTrack { + pub uri: String, + pub metadata_xml: Option, +} + +impl OhInfoTrack { + pub fn metadata(&self) -> Option { + self.metadata_xml + .as_deref() + .and_then(parse_track_metadata_from_didl) + } +} + +#[derive(Debug, Clone)] +pub struct OhTimePosition { + pub track_count: u32, + pub duration_secs: u32, + pub elapsed_secs: u32, +} + +#[derive(Debug, Clone)] +pub struct OhRadioChannel { + pub uri: String, + pub metadata_xml: Option, +} + +#[derive(Debug, Clone)] +pub struct OhPlaylistClient { + pub control_url: String, + pub service_type: String, +} + +impl OhPlaylistClient { + pub fn new(control_url: String, service_type: String) -> Self { + Self { + control_url, + service_type, + } + } + + pub fn read_list(&self, id_list: &[u32]) -> Result> { + if id_list.is_empty() { + return Ok(Vec::new()); + } + + let id_list_csv = id_list + .iter() + .map(|id| id.to_string()) + .collect::>() + .join(","); + let args = [("aIdList", id_list_csv.as_str())]; + + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "ReadList", + &args, + )?; + + let envelope = ensure_success("ReadList", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "ReadListResponse") + .ok_or_else(|| anyhow!("Missing ReadListResponse element in SOAP body"))?; + + let track_list_xml = extract_child_text(response, "aTrackList")?; + parse_track_list(&track_list_xml) + } + + pub fn insert(&self, after_id: u32, uri: &str, metadata: &str) -> Result { + let after_id_str = after_id.to_string(); + let args = [ + ("aAfterId", after_id_str.as_str()), + ("aUri", uri), + ("aMetadata", metadata), + ]; + + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "Insert", + &args, + )?; + + let envelope = ensure_success("Insert", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "InsertResponse") + .ok_or_else(|| anyhow!("Missing InsertResponse element in SOAP body"))?; + let new_id_text = extract_child_text(response, "aNewId")?; + let new_id = new_id_text + .parse::() + .map_err(|_| anyhow!("Invalid aNewId value: {}", new_id_text))?; + + Ok(new_id) + } + + pub fn play_id(&self, id: u32) -> Result<()> { + let id_str = id.to_string(); + let args = [("aId", id_str.as_str())]; + + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "PlayId", + &args, + )?; + + handle_action_response("PlayId", &call_result) + } + + pub fn play(&self) -> Result<()> { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Play", &[])?; + handle_action_response("Play", &call_result) + } + + pub fn pause(&self) -> Result<()> { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Pause", &[])?; + handle_action_response("Pause", &call_result) + } + + pub fn stop(&self) -> Result<()> { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Stop", &[])?; + handle_action_response("Stop", &call_result) + } + + pub fn next(&self) -> Result<()> { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Next", &[])?; + handle_action_response("Next", &call_result) + } + + pub fn previous(&self) -> Result<()> { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Previous", &[])?; + handle_action_response("Previous", &call_result) + } + + pub fn seek_second_absolute(&self, second: u32) -> Result<()> { + let second_str = second.to_string(); + let args = [("aSecond", second_str.as_str())]; + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "SeekSecondAbsolute", + &args, + )?; + + handle_action_response("SeekSecondAbsolute", &call_result) + } + + pub fn delete_id(&self, id: u32) -> Result<()> { + let id_str = id.to_string(); + let args = [("aId", id_str.as_str())]; + + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "DeleteId", + &args, + )?; + + handle_action_response("DeleteId", &call_result) + } + + pub fn delete_all(&self) -> Result<()> { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "DeleteAll", &[])?; + handle_action_response("DeleteAll", &call_result) + } + + pub fn tracks_max(&self) -> Result { + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "TracksMax", + &[], + )?; + + let envelope = ensure_success("TracksMax", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "TracksMaxResponse") + .ok_or_else(|| anyhow!("Missing TracksMaxResponse element in SOAP body"))?; + let value_text = extract_child_text(response, "aValue")?; + let value = value_text + .parse::() + .map_err(|_| anyhow!("Invalid TracksMax value: {}", value_text))?; + + Ok(value) + } + + pub fn id_array(&self) -> Result> { + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "IdArray", + &[], + )?; + let envelope = ensure_success("IdArray", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "IdArrayResponse") + .ok_or_else(|| anyhow!("Missing IdArrayResponse element in SOAP body"))?; + + let array_text = extract_child_text_any(response, &["aArray", "aIdArray"])?; + let bytes = decode_base64(&array_text)?; + if bytes.len() % 4 != 0 { + return Err(anyhow!( + "Invalid IdArray payload length {} (expected multiple of 4)", + bytes.len() + )); + } + + let mut ids = Vec::with_capacity(bytes.len() / 4); + for chunk in bytes.chunks_exact(4) { + ids.push(u32::from_be_bytes([chunk[0], chunk[1], chunk[2], chunk[3]])); + } + Ok(ids) + } + + pub fn read_all_tracks(&self) -> Result> { + let ids = self.id_array()?; + if ids.is_empty() { + return Ok(Vec::new()); + } + + const MAX_BATCH: usize = 64; + let mut entries = Vec::with_capacity(ids.len()); + for chunk in ids.chunks(MAX_BATCH) { + let mut batch = self.read_list(chunk)?; + entries.append(&mut batch); + } + Ok(entries) + } +} + +#[derive(Debug, Clone)] +pub struct OhInfoClient { + pub control_url: String, + pub service_type: String, +} + +impl OhInfoClient { + pub fn new(control_url: String, service_type: String) -> Self { + Self { + control_url, + service_type, + } + } + + pub fn track(&self) -> Result { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Track", &[])?; + + let envelope = ensure_success("Track", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "TrackResponse") + .ok_or_else(|| anyhow!("Missing TrackResponse element in SOAP body"))?; + + let uri = extract_child_text(response, "aUri")?; + let metadata_xml = extract_child_text_optional(response, "aMetadata") + .unwrap_or(None) + .filter(|s| !s.is_empty()); + + Ok(OhInfoTrack { uri, metadata_xml }) + } + + pub fn next(&self) -> Result { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Next", &[])?; + + let envelope = ensure_success("Next", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "NextResponse") + .ok_or_else(|| anyhow!("Missing NextResponse element in SOAP body"))?; + + let uri = extract_child_text(response, "aUri")?; + let metadata_xml = extract_child_text_optional(response, "aMetadata") + .unwrap_or(None) + .filter(|s| !s.is_empty()); + + Ok(OhInfoTrack { uri, metadata_xml }) + } + + pub fn id(&self) -> Result { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Id", &[])?; + + let envelope = ensure_success("Id", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "IdResponse") + .ok_or_else(|| anyhow!("Missing IdResponse element in SOAP body"))?; + let id_text = extract_child_text(response, "aId")?; + let id = id_text + .parse::() + .map_err(|_| anyhow!("Invalid Info.Id value: {}", id_text))?; + Ok(id) + } + + pub fn transport_state(&self) -> Result { + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "TransportState", + &[], + )?; + + let envelope = ensure_success("TransportState", &call_result)?; + let response = + find_child_with_suffix(&envelope.body.content, "TransportStateResponse") + .ok_or_else(|| anyhow!("Missing TransportStateResponse element in SOAP body"))?; + let state = extract_child_text(response, "aState")?; + Ok(state) + } + + pub fn read_current_metadata(&self) -> Result> { + let track = self.track()?; + Ok(track.metadata()) + } +} + +#[derive(Debug, Clone)] +pub struct OhTimeClient { + pub control_url: String, + pub service_type: String, +} + +impl OhTimeClient { + pub fn new(control_url: String, service_type: String) -> Self { + Self { + control_url, + service_type, + } + } + + pub fn position(&self) -> Result { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Time", &[])?; + + let envelope = ensure_success("Time", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "TimeResponse") + .ok_or_else(|| anyhow!("Missing TimeResponse element in SOAP body"))?; + + let track_count = extract_child_text(response, "aTrackCount")? + .parse::() + .map_err(|_| anyhow!("Invalid aTrackCount value in Time response"))?; + let duration_secs = extract_child_text(response, "aDuration")? + .parse::() + .map_err(|_| anyhow!("Invalid aDuration value in Time response"))?; + let elapsed_secs = extract_child_text(response, "aSeconds")? + .parse::() + .map_err(|_| anyhow!("Invalid aSeconds value in Time response"))?; + + Ok(OhTimePosition { + track_count, + duration_secs, + elapsed_secs, + }) + } +} + +#[derive(Debug, Clone)] +pub struct OhVolumeClient { + pub control_url: String, + pub service_type: String, +} + +impl OhVolumeClient { + pub fn new(control_url: String, service_type: String) -> Self { + Self { + control_url, + service_type, + } + } + + pub fn volume(&self) -> Result { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Volume", &[])?; + let envelope = ensure_success("Volume", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "VolumeResponse") + .ok_or_else(|| anyhow!("Missing VolumeResponse element in SOAP body"))?; + let value = extract_child_text(response, "aVolume")?; + let parsed = value + .parse::() + .map_err(|_| anyhow!("Invalid volume value: {}", value))?; + Ok(parsed.min(u16::MAX as u32) as u16) + } + + pub fn set_volume(&self, vol: u16) -> Result<()> { + let vol_str = vol.to_string(); + let args = [("aVolume", vol_str.as_str())]; + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "SetVolume", + &args, + )?; + handle_action_response("SetVolume", &call_result) + } + + pub fn mute(&self) -> Result { + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Mute", &[])?; + let envelope = ensure_success("Mute", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "MuteResponse") + .ok_or_else(|| anyhow!("Missing MuteResponse element in SOAP body"))?; + let value = extract_child_text(response, "aMute")?; + parse_bool(&value) + } + + pub fn set_mute(&self, mute: bool) -> Result<()> { + let mute_str = if mute { "1" } else { "0" }; + let args = [("aMute", mute_str)]; + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "SetMute", + &args, + )?; + handle_action_response("SetMute", &call_result) + } +} + +#[derive(Debug, Clone)] +pub struct OhRadioClient { + pub control_url: String, + pub service_type: String, +} + +impl OhRadioClient { + pub fn new(control_url: String, service_type: String) -> Self { + Self { + control_url, + service_type, + } + } + + pub fn play_channel(&self, id: u32) -> Result<()> { + let id_str = id.to_string(); + let args = [("aId", id_str.as_str())]; + let call_result = invoke_upnp_action( + &self.control_url, + &self.service_type, + "PlayChannel", + &args, + )?; + handle_action_response("PlayChannel", &call_result) + } + + pub fn channel(&self, id: u32) -> Result { + let id_str = id.to_string(); + let args = [("aId", id_str.as_str())]; + let call_result = + invoke_upnp_action(&self.control_url, &self.service_type, "Channel", &args)?; + + let envelope = ensure_success("Channel", &call_result)?; + let response = find_child_with_suffix(&envelope.body.content, "ChannelResponse") + .ok_or_else(|| anyhow!("Missing ChannelResponse element in SOAP body"))?; + + let uri = extract_child_text(response, "aUri")?; + let metadata_xml = extract_child_text_optional(response, "aMetadata") + .unwrap_or(None) + .filter(|s| !s.is_empty()); + + Ok(OhRadioChannel { uri, metadata_xml }) + } +} + +pub fn parse_track_metadata_from_didl(xml: &str) -> Option { + if xml.trim().is_empty() { + return None; + } + + let parsed = pmodidl::parse_metadata::(xml).ok()?; + let item = parsed.data.items.first()?; + + Some(TrackMetadata { + title: Some(item.title.clone()), + artist: item.artist.clone(), + album: item.album.clone(), + genre: item.genre.clone(), + album_art_uri: item.album_art.clone(), + date: item.date.clone(), + track_number: item.original_track_number.clone(), + creator: item.creator.clone(), + }) +} + +fn parse_track_list(xml: &str) -> Result> { + if xml.trim().is_empty() { + return Ok(Vec::new()); + } + + let mut reader = std::io::Cursor::new(xml.as_bytes()); + let root = Element::parse(&mut reader) + .map_err(|err| anyhow!("Failed to parse OpenHome TrackList XML: {}", err))?; + let mut entries = Vec::new(); + + for node in &root.children { + if let XMLNode::Element(elem) = node { + if elem.name.ends_with("Entry") { + entries.push(parse_track_entry(elem)?); + } + } + } + + Ok(entries) +} + +fn parse_track_entry(elem: &Element) -> Result { + let id_text = extract_child_text(elem, "Id")?; + let id = id_text + .parse::() + .map_err(|_| anyhow!("Invalid OpenHome Entry Id: {}", id_text))?; + let uri = extract_child_text(elem, "Uri")?; + let metadata_xml = extract_child_text_optional(elem, "Metadata")?.unwrap_or_default(); + + Ok(OhTrackEntry { + id, + uri, + metadata_xml, + }) +} + +fn ensure_success<'a>( + action: &str, + call_result: &'a SoapCallResult, +) -> Result<&'a SoapEnvelope> { + if !call_result.status.is_success() { + if let Some(env) = &call_result.envelope { + if let Some(err) = parse_upnp_error(env) { + return Err(anyhow!( + "{action} failed with UPnP error {}: {} (HTTP status {})", + err.error_code, + err.error_description, + call_result.status + )); + } + } + + return Err(anyhow!( + "{action} failed with HTTP status {} and body: {}", + call_result.status, + call_result.raw_body + )); + } + + let envelope = call_result + .envelope + .as_ref() + .ok_or_else(|| anyhow!("Missing SOAP envelope in {action} response"))?; + + if let Some(err) = parse_upnp_error(envelope) { + return Err(anyhow!( + "{action} returned UPnP error {}: {} (HTTP status {})", + err.error_code, + err.error_description, + call_result.status + )); + } + + Ok(envelope) +} + +fn handle_action_response(action: &str, call_result: &SoapCallResult) -> Result<()> { + ensure_success(action, call_result)?; + Ok(()) +} + +#[derive(Debug, Clone)] +struct UpnpError { + pub error_code: u32, + pub error_description: String, +} + +fn parse_upnp_error(envelope: &SoapEnvelope) -> Option { + let fault = find_child_with_suffix(&envelope.body.content, "Fault")?; + let detail = find_child_with_suffix(fault, "detail")?; + let upnp_error = find_child_with_suffix(detail, "UPnPError")?; + + let error_code_elem = upnp_error.children.iter().find_map(|node| match node { + XMLNode::Element(elem) if elem.name.ends_with("errorCode") => Some(elem), + _ => None, + })?; + + let error_code_text = error_code_elem.get_text()?.trim().to_string(); + let error_code = error_code_text.parse::().ok()?; + + let error_description = upnp_error + .children + .iter() + .find_map(|node| match node { + XMLNode::Element(elem) if elem.name.ends_with("errorDescription") => { + elem.get_text().map(|t| t.trim().to_string()) + } + _ => None, + }) + .unwrap_or_default(); + + Some(UpnpError { + error_code, + error_description, + }) +} + +fn find_child_with_suffix<'a>(parent: &'a Element, suffix: &str) -> Option<&'a Element> { + parent.children.iter().find_map(|node| match node { + XMLNode::Element(elem) if elem.name.ends_with(suffix) => Some(elem), + _ => None, + }) +} + +fn extract_child_text(parent: &Element, suffix: &str) -> Result { + let child = find_child_with_suffix(parent, suffix) + .ok_or_else(|| anyhow!("Missing {suffix} element in response"))?; + + let text = child + .get_text() + .map(|t| t.trim().to_string()) + .ok_or_else(|| anyhow!("{suffix} element missing text in response"))?; + + Ok(text) +} + +fn extract_child_text_optional(parent: &Element, suffix: &str) -> Result> { + if let Some(child) = find_child_with_suffix(parent, suffix) { + let text = child.get_text().map(|t| t.trim().to_string()).unwrap_or_default(); + Ok(Some(text)) + } else { + Ok(None) + } +} + +fn extract_child_text_any(parent: &Element, suffixes: &[&str]) -> Result { + for suffix in suffixes { + if let Ok(text) = extract_child_text(parent, suffix) { + return Ok(text); + } + } + Err(anyhow!("Missing {} element in response", suffixes.join(" or "))) +} + +fn parse_bool(value: &str) -> Result { + match value.trim() { + "0" => Ok(false), + "1" => Ok(true), + other => Err(anyhow!("Invalid boolean value '{}'", other)), + } +} + +pub(crate) fn decode_base64(input: &str) -> Result> { + fn value(byte: u8) -> Option { + match byte { + b'A'..=b'Z' => Some(byte - b'A'), + b'a'..=b'z' => Some(byte - b'a' + 26), + b'0'..=b'9' => Some(byte - b'0' + 52), + b'+' => Some(62), + b'/' => Some(63), + _ => None, + } + } + + let mut output = Vec::new(); + let mut buffer: u32 = 0; + let mut bits_collected: u8 = 0; + + for byte in input.bytes() { + if byte == b'=' { + break; + } + if byte == b'\r' || byte == b'\n' || byte == b' ' || byte == b'\t' { + continue; + } + let val = value(byte) + .ok_or_else(|| anyhow!("Invalid base64 character '{}'", byte as char))?; + buffer = (buffer << 6) | (val as u32); + bits_collected += 6; + if bits_collected >= 8 { + bits_collected -= 8; + let out = (buffer >> bits_collected) & 0xFF; + output.push(out as u8); + } + } + + Ok(output) +} diff --git a/pmocontrol/src/openhome_renderer.rs b/pmocontrol/src/openhome_renderer.rs new file mode 100644 index 00000000..482f595e --- /dev/null +++ b/pmocontrol/src/openhome_renderer.rs @@ -0,0 +1,239 @@ +use anyhow::{Result, anyhow}; +use crate::capabilities::{ + PlaybackPosition, PlaybackPositionInfo, PlaybackState, PlaybackStatus, TransportControl, + VolumeControl, +}; +use crate::model::{RendererId, RendererInfo, RendererProtocol}; +use crate::music_renderer::op_not_supported; +use crate::openhome_client::{ + OhInfoClient, OhPlaylistClient, OhRadioClient, OhTimeClient, OhVolumeClient, +}; +use crate::registry::DeviceRegistry; +use tracing::debug; + +#[derive(Clone, Debug)] +pub struct OpenHomeRenderer { + pub info: RendererInfo, + playlist: Option, + info_client: Option, + time_client: Option, + volume_client: Option, + #[allow(dead_code)] + radio_client: Option, +} + +impl OpenHomeRenderer { + pub fn new(info: RendererInfo, registry: &DeviceRegistry) -> Self { + let id = info.id.clone(); + Self { + playlist: registry.oh_playlist_client_for_renderer(&id), + info_client: registry.oh_info_client_for_renderer(&id), + time_client: registry.oh_time_client_for_renderer(&id), + volume_client: registry.oh_volume_client_for_renderer(&id), + radio_client: registry.oh_radio_client_for_renderer(&id), + info, + } + } + + pub fn id(&self) -> &RendererId { + &self.info.id + } + + pub fn friendly_name(&self) -> &str { + &self.info.friendly_name + } + + pub fn protocol(&self) -> &RendererProtocol { + &self.info.protocol + } + + pub fn has_playlist(&self) -> bool { + self.playlist.is_some() + } + + pub fn has_info(&self) -> bool { + self.info_client.is_some() + } + + pub fn has_time(&self) -> bool { + self.time_client.is_some() + } + + pub fn has_volume(&self) -> bool { + self.volume_client.is_some() + } + + pub fn has_any_openhome_service(&self) -> bool { + self.has_playlist() || self.has_info() || self.has_time() || self.has_volume() + } + + fn playlist_client_for(&self, op: &str) -> Result<&OhPlaylistClient> { + self.playlist + .as_ref() + .ok_or_else(|| op_not_supported(op, "OpenHome Playlist")) + } + + fn info_client_for(&self, op: &str) -> Result<&OhInfoClient> { + self.info_client + .as_ref() + .ok_or_else(|| op_not_supported(op, "OpenHome Info")) + } + + fn time_client_for(&self, op: &str) -> Result<&OhTimeClient> { + self.time_client + .as_ref() + .ok_or_else(|| op_not_supported(op, "OpenHome Time")) + } + + fn volume_client_for(&self, op: &str) -> Result<&OhVolumeClient> { + self.volume_client + .as_ref() + .ok_or_else(|| op_not_supported(op, "OpenHome Volume")) + } +} + +impl TransportControl for OpenHomeRenderer { + fn play_uri(&self, uri: &str, meta: &str) -> Result<()> { + let playlist = self.playlist_client_for("play_uri")?; + + if let Err(err) = playlist.delete_all() { + debug!( + renderer = self.info.id.0.as_str(), + error = %err, + "Failed to clear OpenHome playlist before insert" + ); + } + + let new_id = playlist.insert(0, uri, meta)?; + playlist.play_id(new_id) + } + + fn play(&self) -> Result<()> { + let playlist = self.playlist_client_for("play")?; + playlist.play() + } + + fn pause(&self) -> Result<()> { + let playlist = self.playlist_client_for("pause")?; + playlist.pause() + } + + fn stop(&self) -> Result<()> { + let playlist = self.playlist_client_for("stop")?; + playlist.stop() + } + + fn seek_rel_time(&self, hhmmss: &str) -> Result<()> { + let seconds = parse_hms(hhmmss).ok_or_else(|| { + anyhow!( + "Invalid HH:MM:SS format for OpenHome SeekSecondAbsolute: {}", + hhmmss + ) + })?; + let playlist = self.playlist_client_for("seek_rel_time")?; + playlist.seek_second_absolute(seconds) + } +} + +impl VolumeControl for OpenHomeRenderer { + fn volume(&self) -> Result { + let client = self.volume_client_for("volume")?; + client.volume() + } + + fn set_volume(&self, v: u16) -> Result<()> { + let client = self.volume_client_for("set_volume")?; + client.set_volume(v) + } + + fn mute(&self) -> Result { + let client = self.volume_client_for("mute")?; + client.mute() + } + + fn set_mute(&self, m: bool) -> Result<()> { + let client = self.volume_client_for("set_mute")?; + client.set_mute(m) + } +} + +impl PlaybackStatus for OpenHomeRenderer { + fn playback_state(&self) -> Result { + let client = self.info_client_for("playback_state")?; + let state = client.transport_state()?; + Ok(map_openhome_state(&state)) + } +} + +impl PlaybackPosition for OpenHomeRenderer { + fn playback_position(&self) -> Result { + let time_info = self.time_client_for("playback_position")?.position()?; + + let mut track_id = None; + let mut track_uri = None; + let mut track_metadata_xml = None; + + if let Some(info_client) = &self.info_client { + match info_client.id() { + Ok(id) => track_id = Some(id), + Err(err) => debug!( + renderer = self.info.id.0.as_str(), + error = %err, + "Failed to read OpenHome track id" + ), + } + + match info_client.track() { + Ok(track) => { + track_uri = Some(track.uri); + track_metadata_xml = track.metadata_xml; + } + Err(err) => debug!( + renderer = self.info.id.0.as_str(), + error = %err, + "Failed to read OpenHome track metadata" + ), + } + } + + Ok(PlaybackPositionInfo { + track: track_id, + rel_time: Some(format_seconds(time_info.elapsed_secs)), + abs_time: None, + track_duration: Some(format_seconds(time_info.duration_secs)), + track_metadata: track_metadata_xml, + track_uri, + }) + } +} + +fn parse_hms(input: &str) -> Option { + let parts: Vec<&str> = input.split(':').collect(); + if parts.is_empty() || parts.len() > 3 { + return None; + } + + let mut total = 0u32; + for part in parts { + let value = part.parse::().ok()?; + total = total * 60 + value; + } + Some(total) +} + +pub(crate) fn map_openhome_state(raw: &str) -> PlaybackState { + match raw.trim().to_ascii_uppercase().as_str() { + "PLAYING" => PlaybackState::Playing, + "PAUSED" | "PAUSED_PLAYBACK" => PlaybackState::Paused, + "STOPPED" => PlaybackState::Stopped, + "BUFFERING" | "TRANSITIONING" => PlaybackState::Transitioning, + other => PlaybackState::Unknown(other.to_string()), + } +} + +pub(crate) fn format_seconds(seconds: u32) -> String { + let hours = seconds / 3600; + let minutes = (seconds % 3600) / 60; + let secs = seconds % 60; + format!("{hours:02}:{minutes:02}:{secs:02}") +} diff --git a/pmocontrol/src/pmoserver_ext.rs b/pmocontrol/src/pmoserver_ext.rs index 56f18816..ae126130 100644 --- a/pmocontrol/src/pmoserver_ext.rs +++ b/pmocontrol/src/pmoserver_ext.rs @@ -8,14 +8,20 @@ use crate::control_point::ControlPoint; #[cfg(feature = "pmoserver")] use crate::media_server::{MediaBrowser, MediaEntry, MediaResource, MusicServer, ServerId}; #[cfg(feature = "pmoserver")] -use crate::model::{RendererId, RendererProtocol}; +use crate::model::{RendererCapabilities, RendererId, RendererProtocol}; #[cfg(feature = "pmoserver")] use crate::playback_queue::PlaybackItem; #[cfg(feature = "pmoserver")] use crate::openapi::{ AttachPlaylistRequest, AttachedPlaylistInfo, BrowseResponse, ContainerEntry, ErrorResponse, - MediaServerSummary, PlayContentRequest, QueueItem, QueueSnapshot, RendererState, - RendererSummary, SuccessResponse, VolumeSetRequest, + MediaServerSummary, OpenHomePlaylistAddRequest, OpenHomePlaylistSnapshot, + OpenHomePlaylistTrack, PlayContentRequest, QueueItem, QueueSnapshot, + RendererCapabilitiesSummary, RendererProtocolSummary, RendererState, RendererSummary, + SuccessResponse, VolumeSetRequest, +}; +#[cfg(feature = "pmoserver")] +use crate::openhome_client::{ + OhInfoClient, OhPlaylistClient, OhTrackEntry, parse_track_metadata_from_didl, }; #[cfg(feature = "pmoserver")] use crate::{PlaybackPosition, PlaybackStatus, TransportControl, VolumeControl}; @@ -106,7 +112,8 @@ async fn list_renderers(State(state): State) -> Json, + Path(renderer_id): Path, +) -> Result, (StatusCode, Json)> { + let rid = RendererId(renderer_id.clone()); + let (playlist_client, info_client) = + openhome_clients_for_renderer(&state.control_point, &rid)?; + + let fetch_task = tokio::task::spawn_blocking(move || -> anyhow::Result { + let entries = playlist_client.read_all_tracks()?; + let current_id = info_client + .and_then(|client| client.id().ok()); + let tracks: Vec = + entries.iter().map(convert_openhome_track).collect(); + Ok(OpenHomePlaylistSnapshot { + renderer_id: rid.0, + current_id, + tracks, + }) + }); + + let snapshot = fetch_task + .await + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + "Join error while fetching OpenHome playlist" + ); + ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(ErrorResponse { + error: format!("Internal task error: {}", e), + }), + ) + })? + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + "Failed to read OpenHome playlist" + ); + ( + StatusCode::BAD_GATEWAY, + Json(ErrorResponse { + error: format!("Failed to read OpenHome playlist: {}", e), + }), + ) + })?; + + Ok(Json(snapshot)) +} + +/// POST /control/renderers/{renderer_id}/oh/playlist/clear - Vide la playlist OH +#[cfg(feature = "pmoserver")] +#[utoipa::path( + post, + path = "/renderers/{renderer_id}/oh/playlist/clear", + params( + ("renderer_id" = String, Path, description = "ID unique du renderer") + ), + responses( + (status = 200, description = "Playlist vidée", body = SuccessResponse), + (status = 404, description = "Renderer non trouvé ou sans service OH", body = ErrorResponse) + ), + tag = "control" +)] +async fn clear_openhome_playlist( + State(state): State, + Path(renderer_id): Path, +) -> Result, (StatusCode, Json)> { + let rid = RendererId(renderer_id.clone()); + let (playlist_client, _) = + openhome_clients_for_renderer(&state.control_point, &rid)?; + + let clear_task = + tokio::task::spawn_blocking(move || playlist_client.delete_all()); + + time::timeout(QUEUE_COMMAND_TIMEOUT, clear_task) + .await + .map_err(|_| { + warn!( + renderer = renderer_id.as_str(), + timeout = QUEUE_COMMAND_TIMEOUT.as_secs(), + "Clearing OpenHome playlist timed out" + ); + ( + StatusCode::GATEWAY_TIMEOUT, + Json(ErrorResponse { + error: format!( + "Clear playlist timed out after {}s", + QUEUE_COMMAND_TIMEOUT.as_secs() + ), + }), + ) + })? + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + "Join error while clearing OpenHome playlist" + ); + ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(ErrorResponse { + error: format!("Internal task error: {}", e), + }), + ) + })? + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + "Failed to clear OpenHome playlist" + ); + ( + StatusCode::BAD_GATEWAY, + Json(ErrorResponse { + error: format!("Failed to clear OpenHome playlist: {}", e), + }), + ) + })?; + + if let Err(err) = state.control_point.refresh_openhome_playlist(&rid) { + warn!( + renderer = renderer_id.as_str(), + error = %err, + "Failed to refresh queue after OpenHome clear" + ); + } + + Ok(Json(SuccessResponse { + message: "OpenHome playlist cleared".to_string(), + })) +} + +/// POST /control/renderers/{renderer_id}/oh/playlist/add - Ajoute un track OH +#[cfg(feature = "pmoserver")] +#[utoipa::path( + post, + path = "/renderers/{renderer_id}/oh/playlist/add", + params( + ("renderer_id" = String, Path, description = "ID unique du renderer") + ), + request_body = OpenHomePlaylistAddRequest, + responses( + (status = 200, description = "Track ajouté", body = SuccessResponse), + (status = 404, description = "Renderer non trouvé ou sans service OH", body = ErrorResponse) + ), + tag = "control" +)] +async fn add_openhome_playlist_item( + State(state): State, + Path(renderer_id): Path, + Json(req): Json, +) -> Result, (StatusCode, Json)> { + let rid = RendererId(renderer_id.clone()); + let (playlist_client, _) = + openhome_clients_for_renderer(&state.control_point, &rid)?; + + let add_task = tokio::task::spawn_blocking(move || -> anyhow::Result<()> { + let mut after_id = if let Some(id) = req.after_id { + id + } else { + playlist_client + .id_array()? + .last() + .copied() + .unwrap_or(0) + }; + let new_id = + playlist_client.insert(after_id, &req.uri, &req.metadata)?; + after_id = new_id; + if req.play { + playlist_client.play_id(after_id)?; + } + Ok(()) + }); + + time::timeout(QUEUE_COMMAND_TIMEOUT, add_task) + .await + .map_err(|_| { + warn!( + renderer = renderer_id.as_str(), + timeout = QUEUE_COMMAND_TIMEOUT.as_secs(), + "Adding OpenHome track timed out" + ); + ( + StatusCode::GATEWAY_TIMEOUT, + Json(ErrorResponse { + error: format!( + "Add track timed out after {}s", + QUEUE_COMMAND_TIMEOUT.as_secs() + ), + }), + ) + })? + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + "Join error while adding OpenHome track" + ); + ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(ErrorResponse { + error: format!("Internal task error: {}", e), + }), + ) + })? + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + "Failed to add OpenHome track" + ); + ( + StatusCode::BAD_GATEWAY, + Json(ErrorResponse { + error: format!("Failed to add OpenHome track: {}", e), + }), + ) + })?; + + if let Err(err) = state.control_point.refresh_openhome_playlist(&rid) { + warn!( + renderer = renderer_id.as_str(), + error = %err, + "Failed to refresh queue after OpenHome add" + ); + } + + Ok(Json(SuccessResponse { + message: "Track added to OpenHome playlist".to_string(), + })) +} + +/// POST /control/renderers/{renderer_id}/oh/playlist/play/{track_id} - PlayId OH +#[cfg(feature = "pmoserver")] +#[utoipa::path( + post, + path = "/renderers/{renderer_id}/oh/playlist/play/{track_id}", + params( + ("renderer_id" = String, Path, description = "ID unique du renderer"), + ("track_id" = String, Path, description = "ID OpenHome du morceau") + ), + responses( + (status = 200, description = "Lecture démarrée", body = SuccessResponse), + (status = 404, description = "Renderer non trouvé ou sans service OH", body = ErrorResponse) + ), + tag = "control" +)] +async fn play_openhome_track( + State(state): State, + Path((renderer_id, track_id)): Path<(String, String)>, +) -> Result, (StatusCode, Json)> { + let rid = RendererId(renderer_id.clone()); + let (playlist_client, _) = + openhome_clients_for_renderer(&state.control_point, &rid)?; + + let parsed_id = track_id.parse::().map_err(|e| { + ( + StatusCode::BAD_REQUEST, + Json(ErrorResponse { + error: format!("Invalid track id '{}': {}", track_id, e), + }), + ) + })?; + + let play_task = + tokio::task::spawn_blocking(move || playlist_client.play_id(parsed_id)); + + time::timeout(QUEUE_COMMAND_TIMEOUT, play_task) + .await + .map_err(|_| { + warn!( + renderer = renderer_id.as_str(), + timeout = QUEUE_COMMAND_TIMEOUT.as_secs(), + "PlayId command timed out" + ); + ( + StatusCode::GATEWAY_TIMEOUT, + Json(ErrorResponse { + error: format!( + "Play track timed out after {}s", + QUEUE_COMMAND_TIMEOUT.as_secs() + ), + }), + ) + })? + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + "Join error while playing OpenHome track" + ); + ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(ErrorResponse { + error: format!("Internal task error: {}", e), + }), + ) + })? + .map_err(|e| { + warn!( + renderer = renderer_id.as_str(), + error = %e, + track_id = parsed_id, + "Failed to start OpenHome track" + ); + ( + StatusCode::BAD_GATEWAY, + Json(ErrorResponse { + error: format!("Failed to play OpenHome track: {}", e), + }), + ) + })?; + + Ok(Json(SuccessResponse { + message: format!("Playing OpenHome track {}", parsed_id), + })) +} + // ============================================================================ // HANDLERS - QUEUE CONTENT // ============================================================================ @@ -1644,11 +1992,64 @@ fn is_audio_resource(res: &MediaResource) -> bool { } #[cfg(feature = "pmoserver")] -fn protocol_to_string(protocol: &RendererProtocol) -> String { +fn protocol_summary(protocol: &RendererProtocol) -> RendererProtocolSummary { match protocol { - RendererProtocol::UpnpAvOnly => "UpnpAvOnly".to_string(), - RendererProtocol::OpenHomeOnly => "OpenHomeOnly".to_string(), - RendererProtocol::Hybrid => "Hybrid".to_string(), + RendererProtocol::UpnpAvOnly => RendererProtocolSummary::Upnp, + RendererProtocol::OpenHomeOnly => RendererProtocolSummary::Openhome, + RendererProtocol::Hybrid => RendererProtocolSummary::Hybrid, + } +} + +#[cfg(feature = "pmoserver")] +fn capability_summary(caps: &RendererCapabilities) -> RendererCapabilitiesSummary { + RendererCapabilitiesSummary { + has_avtransport: caps.has_avtransport, + has_avtransport_set_next: caps.has_avtransport_set_next, + has_rendering_control: caps.has_rendering_control, + has_connection_manager: caps.has_connection_manager, + has_linkplay_http: caps.has_linkplay_http, + has_arylic_tcp: caps.has_arylic_tcp, + has_oh_playlist: caps.has_oh_playlist, + has_oh_volume: caps.has_oh_volume, + has_oh_info: caps.has_oh_info, + has_oh_time: caps.has_oh_time, + has_oh_radio: caps.has_oh_radio, + } +} + +#[cfg(feature = "pmoserver")] +fn openhome_clients_for_renderer( + control_point: &ControlPoint, + renderer_id: &RendererId, +) -> Result<(OhPlaylistClient, Option), (StatusCode, Json)> { + let registry = control_point.registry(); + let reg = registry.read().unwrap(); + let Some(client) = reg.oh_playlist_client_for_renderer(renderer_id) else { + return Err(( + StatusCode::NOT_FOUND, + Json(ErrorResponse { + error: format!( + "Renderer {} has no OpenHome playlist service", + renderer_id.0 + ), + }), + )); + }; + let info_client = reg.oh_info_client_for_renderer(renderer_id); + Ok((client, info_client)) +} + +#[cfg(feature = "pmoserver")] +fn convert_openhome_track(entry: &OhTrackEntry) -> OpenHomePlaylistTrack { + let metadata = parse_track_metadata_from_didl(&entry.metadata_xml); + OpenHomePlaylistTrack { + id: entry.id, + uri: entry.uri.clone(), + title: metadata.as_ref().and_then(|m| m.title.clone()), + artist: metadata.as_ref().and_then(|m| m.artist.clone()), + album: metadata.as_ref().and_then(|m| m.album.clone()), + album_art_uri: metadata + .and_then(|m| m.album_art_uri), } } @@ -1728,6 +2129,23 @@ pub fn create_api_router(state: ControlPointState, control_point: Arc, content_directory_control_url: Option, + + // OpenHome endpoints (if present in serviceList) + oh_playlist_service_type: Option, + oh_playlist_control_url: Option, + oh_playlist_event_sub_url: Option, + oh_info_service_type: Option, + oh_info_control_url: Option, + oh_info_event_sub_url: Option, + oh_time_service_type: Option, + oh_time_control_url: Option, + oh_time_event_sub_url: Option, + oh_volume_service_type: Option, + oh_volume_control_url: Option, + oh_radio_service_type: Option, + oh_radio_control_url: Option, } impl ParsedDeviceDescription { @@ -122,6 +137,7 @@ impl HttpXmlDescriptionProvider { // New: track current serviceType + controlURL while inside ... let mut current_service_type: Option = None; let mut current_control_url: Option = None; + let mut current_event_sub_url: Option = None; loop { match reader.read_event_into(&mut buf)? { @@ -218,11 +234,79 @@ impl HttpXmlDescriptionProvider { ); } } + + if lower.contains("urn:av-openhome-org:service:playlist:") { + if parsed.oh_playlist_service_type.is_none() { + parsed.oh_playlist_service_type = Some(st.clone()); + parsed.oh_playlist_control_url = Some(ctrl.clone()); + if parsed.oh_playlist_event_sub_url.is_none() { + parsed.oh_playlist_event_sub_url = + current_event_sub_url.clone(); + } + debug!( + "Found OpenHome Playlist for {}: type={} controlURL={}", + endpoint.udn, st, ctrl + ); + } + } + + if lower.contains("urn:av-openhome-org:service:info:") { + if parsed.oh_info_service_type.is_none() { + parsed.oh_info_service_type = Some(st.clone()); + parsed.oh_info_control_url = Some(ctrl.clone()); + if parsed.oh_info_event_sub_url.is_none() { + parsed.oh_info_event_sub_url = + current_event_sub_url.clone(); + } + debug!( + "Found OpenHome Info for {}: type={} controlURL={}", + endpoint.udn, st, ctrl + ); + } + } + + if lower.contains("urn:av-openhome-org:service:time:") { + if parsed.oh_time_service_type.is_none() { + parsed.oh_time_service_type = Some(st.clone()); + parsed.oh_time_control_url = Some(ctrl.clone()); + if parsed.oh_time_event_sub_url.is_none() { + parsed.oh_time_event_sub_url = + current_event_sub_url.clone(); + } + debug!( + "Found OpenHome Time for {}: type={} controlURL={}", + endpoint.udn, st, ctrl + ); + } + } + + if lower.contains("urn:av-openhome-org:service:volume:") { + if parsed.oh_volume_service_type.is_none() { + parsed.oh_volume_service_type = Some(st.clone()); + parsed.oh_volume_control_url = Some(ctrl.clone()); + debug!( + "Found OpenHome Volume for {}: type={} controlURL={}", + endpoint.udn, st, ctrl + ); + } + } + + if lower.contains("urn:av-openhome-org:service:radio:") { + if parsed.oh_radio_service_type.is_none() { + parsed.oh_radio_service_type = Some(st.clone()); + parsed.oh_radio_control_url = Some(ctrl.clone()); + debug!( + "Found OpenHome Radio for {}: type={} controlURL={}", + endpoint.udn, st, ctrl + ); + } + } } in_service = false; current_service_type = None; current_control_url = None; + current_event_sub_url = None; } } _ => {} @@ -258,6 +342,9 @@ impl HttpXmlDescriptionProvider { "controlURL" if in_service => { current_control_url = Some(text); } + "eventSubURL" if in_service => { + current_event_sub_url = Some(text); + } _ => {} } } @@ -339,6 +426,43 @@ impl HttpXmlDescriptionProvider { .connection_manager_control_url .as_ref() .map(|ctrl| resolve_control_url(&endpoint.location, ctrl)), + oh_playlist_service_type: parsed.oh_playlist_service_type.clone(), + oh_playlist_control_url: parsed + .oh_playlist_control_url + .as_ref() + .map(|ctrl| resolve_control_url(&endpoint.location, ctrl)), + oh_playlist_event_sub_url: parsed + .oh_playlist_event_sub_url + .as_ref() + .map(|url| resolve_control_url(&endpoint.location, url)), + oh_info_service_type: parsed.oh_info_service_type.clone(), + oh_info_control_url: parsed + .oh_info_control_url + .as_ref() + .map(|ctrl| resolve_control_url(&endpoint.location, ctrl)), + oh_info_event_sub_url: parsed + .oh_info_event_sub_url + .as_ref() + .map(|url| resolve_control_url(&endpoint.location, url)), + oh_time_service_type: parsed.oh_time_service_type.clone(), + oh_time_control_url: parsed + .oh_time_control_url + .as_ref() + .map(|ctrl| resolve_control_url(&endpoint.location, ctrl)), + oh_time_event_sub_url: parsed + .oh_time_event_sub_url + .as_ref() + .map(|url| resolve_control_url(&endpoint.location, url)), + oh_volume_service_type: parsed.oh_volume_service_type.clone(), + oh_volume_control_url: parsed + .oh_volume_control_url + .as_ref() + .map(|ctrl| resolve_control_url(&endpoint.location, ctrl)), + oh_radio_service_type: parsed.oh_radio_service_type.clone(), + oh_radio_control_url: parsed + .oh_radio_control_url + .as_ref() + .map(|ctrl| resolve_control_url(&endpoint.location, ctrl)), }) } diff --git a/pmocontrol/src/registry.rs b/pmocontrol/src/registry.rs index c8e54eca..d4490e3b 100644 --- a/pmocontrol/src/registry.rs +++ b/pmocontrol/src/registry.rs @@ -5,6 +5,9 @@ use crate::avtransport_client::AvTransportClient; use crate::connection_manager_client::ConnectionManagerClient; use crate::media_server::{MediaServerInfo, ServerId}; use crate::model::{RendererId, RendererInfo}; +use crate::openhome_client::{ + OhInfoClient, OhPlaylistClient, OhRadioClient, OhTimeClient, OhVolumeClient, +}; use crate::rendering_control_client::RenderingControlClient; use tracing::debug; @@ -203,4 +206,54 @@ impl DeviceRegistry { } } } + + pub fn oh_playlist_client_for_renderer(&self, id: &RendererId) -> Option { + let info = self.renderers.get(id)?; + let service_type = info.oh_playlist_service_type.as_ref()?; + let control_url = info.oh_playlist_control_url.as_ref()?; + Some(OhPlaylistClient::new( + control_url.clone(), + service_type.clone(), + )) + } + + pub fn oh_info_client_for_renderer(&self, id: &RendererId) -> Option { + let info = self.renderers.get(id)?; + let service_type = info.oh_info_service_type.as_ref()?; + let control_url = info.oh_info_control_url.as_ref()?; + Some(OhInfoClient::new( + control_url.clone(), + service_type.clone(), + )) + } + + pub fn oh_time_client_for_renderer(&self, id: &RendererId) -> Option { + let info = self.renderers.get(id)?; + let service_type = info.oh_time_service_type.as_ref()?; + let control_url = info.oh_time_control_url.as_ref()?; + Some(OhTimeClient::new( + control_url.clone(), + service_type.clone(), + )) + } + + pub fn oh_volume_client_for_renderer(&self, id: &RendererId) -> Option { + let info = self.renderers.get(id)?; + let service_type = info.oh_volume_service_type.as_ref()?; + let control_url = info.oh_volume_control_url.as_ref()?; + Some(OhVolumeClient::new( + control_url.clone(), + service_type.clone(), + )) + } + + pub fn oh_radio_client_for_renderer(&self, id: &RendererId) -> Option { + let info = self.renderers.get(id)?; + let service_type = info.oh_radio_service_type.as_ref()?; + let control_url = info.oh_radio_control_url.as_ref()?; + Some(OhRadioClient::new( + control_url.clone(), + service_type.clone(), + )) + } } diff --git a/pmocontrol/src/upnp_renderer.rs b/pmocontrol/src/upnp_renderer.rs index d7f4a85d..f50aa702 100644 --- a/pmocontrol/src/upnp_renderer.rs +++ b/pmocontrol/src/upnp_renderer.rs @@ -190,6 +190,19 @@ mod tests { rendering_control_control_url: None, connection_manager_service_type: None, connection_manager_control_url: None, + oh_playlist_service_type: None, + oh_playlist_control_url: None, + oh_playlist_event_sub_url: None, + oh_info_service_type: None, + oh_info_control_url: None, + oh_info_event_sub_url: None, + oh_time_service_type: None, + oh_time_control_url: None, + oh_time_event_sub_url: None, + oh_volume_service_type: None, + oh_volume_control_url: None, + oh_radio_service_type: None, + oh_radio_control_url: None, } }