From 7562801989621d76826261976e6201e940a8a602 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Fri, 28 Nov 2025 23:13:59 +0100 Subject: [PATCH] =?UTF-8?q?Bon,=20=C3=A0=20nouveau=20=C3=A7a=20marche=20pl?= =?UTF-8?q?us=20dans=20bubble=20UPNP.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bubble_upmpdcli.pcap | Bin 0 -> 439765 bytes com.bubblesoft.android.bubbleupnp_log.txt | 834 ++++++++++++++++++ pmomediaserver/src/content_handler.rs | 18 + pmoparadise/src/source.rs | 4 +- pmoupnp/src/actions/arg_inst_set_methods.rs | 1 + pmoupnp/src/actions/arg_instance_methods.rs | 1 + pmoupnp/src/lib.rs | 1 + pmoupnp/src/object_set.rs | 21 +- .../state_variables/var_inst_set_methods.rs | 1 + 9 files changed, 877 insertions(+), 4 deletions(-) create mode 100644 bubble_upmpdcli.pcap create mode 100644 com.bubblesoft.android.bubbleupnp_log.txt diff --git a/bubble_upmpdcli.pcap b/bubble_upmpdcli.pcap new file mode 100644 index 0000000000000000000000000000000000000000..0d3d2c54962c3f1d52575ff68eb205e49baddb6b GIT binary patch literal 439765 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

kWmVSd5@}6wI9tiZyE9 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 E4|1M7!T>> Starting UPnP service... +[main (2) ] INFO - 0:00:01.78 - .d : Using configuration: com.bubblesoft.android.bubbleupnp.AndroidUpnpService$u0 +[main (2) ] INFO - 0:00:01.81 - .d : <<< UPnP service started successfully +[main (2) ] INFO - 0:00:01.85 - local renderer gapless support: false +[Main #1 (179) ] INFO - 0:00:01.86 - task: end, 26ms: publishRendererChooserTargets +[main (2) ] INFO - 0:00:01.109 - MediaPlayerRenderer.setVolume(): 14 +[main (2) ] INFO - 0:00:01.115 - local renderer audio session id: 2033, send intent delay: 500 +[main (2) ] INFO - 0:00:01.128 - local renderer: RenderingControl service max volume: 15 +[main (2) ] INFO - 0:00:01.129 - MediaRenderer LastChange thread: initial last change running: false +[Main #1 (179) ] INFO - 0:00:01.129 - task: start: MediaRenderer-LastChange +[Main #1: MediaRenderer-LastChange (179) ] INFO - 0:00:01.130 - MediaRenderer LastChange thread: stopped +[main (2) ] INFO - 0:00:01.131 - created local renderer +[main (2) ] INFO - 0:00:01.132 - OpenHome local renderer is disabled +[main (2) ] INFO - 0:00:01.139 - starting Jetty... +[main (2) ] INFO - 0:00:01.139 - createConnector: type: 3 +[main (2) ] INFO - 0:00:01.143 - external storage available: true, root directory: /storage/emulated/0, state: mounted, path: null +[Main #3 (202) ] INFO - 0:00:01.145 - task: start: checkAlbumArtistColumnSupport +[Main #3: checkAlbumArtistColumnSupport (] INFO - 0:00:01.145 - Album Artist column supported (from pref): false +[Main #3 (202) ] INFO - 0:00:01.146 - task: end, 1ms: checkAlbumArtistColumnSupport +[main (2) ] INFO - 0:00:01.146 - audio cast fifo exists: /data/data/com.bubblesoft.android.bubbleupnp/audiocast +[main (2) ] INFO - 0:00:01.149 - audio cast fifo exists: /data/data/com.bubblesoft.android.bubbleupnp/audiocast +[main (2) ] INFO - 0:00:01.150 - excluded remote directories: [] +[main (2) ] INFO - 0:00:01.152 - jetty-7.x.y-SNAPSHOT +[main (2) ] INFO - 0:00:01.159 - started {} +[main (2) ] INFO - 0:00:01.159 - started {} +[main (2) ] INFO - 0:00:01.160 - started {} +[main (2) ] INFO - 0:00:01.160 - started {} +[main (2) ] INFO - 0:00:01.160 - started {} +[main (2) ] INFO - 0:00:01.161 - started {} +[main (2) ] INFO - 0:00:01.161 - started {} +[main (2) ] INFO - 0:00:01.161 - started {} +[main (2) ] INFO - 0:00:01.161 - started {} +[main (2) ] INFO - 0:00:01.165 - Started {} +[main (2) ] INFO - 0:00:01.165 - started Jetty +[main (2) ] WARNING - 0:00:01.167 - 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:01.168 - smb: setLocalIpAddress: null +[main (2) ] INFO - 0:00:01.168 - added local media server to registry +[main (2) ] INFO - 0:00:01.168 - created local media server +[main (2) ] INFO - 0:00:01.169 - initBatterySavingMode: false +[main (2) ] WARNING - 0:00:01.169 - discovery maintenance: executor already stopped +[main (2) ] INFO - 0:00:01.169 - .b : WiFi lock acquired +[main (2) ] INFO - 0:00:01.187 - wake lock acquired +[main (2) ] INFO - 0:00:01.189 - initBatterySavingMode: added MediaRouter callback +[main (2) ] INFO - 0:00:01.201 - .b : network type changed => WIFI +[main (2) ] WARNING - 0:00:01.201 - .b : WiFi multicast lock already released +[main (2) ] INFO - 0:00:01.201 - .b : WiFi lock released +[main (2) ] INFO - 0:00:01.217 - .a : Creating Router: xr.b$a +[main (2) ] WARNING - 0:00:01.218 - .f : Network interface reports it is not multicast capable: dummy0 +[main (2) ] WARNING - 0:00:01.219 - .f : Network interface reports it is not multicast capable: lo +[main (2) ] INFO - 0:00:01.219 - .f : Skipping unsupported non-IPv4 address: /fe80::6aba:a4eb:8bbb:193e%epdg1 +[main (2) ] INFO - 0:00:01.220 - .f : Skipping unsupported non-IPv4 address: /fe80::24a5:caff:fecb:20a%dummy0 +[main (2) ] INFO - 0:00:01.220 - .f : Skipping unsupported non-IPv4 address: /fe80::1c35:9cff:fe48:4f02%wlan0 +[main (2) ] INFO - 0:00:01.220 - .f : Skipping unsupported non-IPv4 address: /2a01:e0a:db2:76f0:1c35:9cff:fe48:4f02 +[main (2) ] INFO - 0:00:01.220 - .f : Skipping unsupported non-IPv4 address: /2a01:e0a:db2:76f0:2459:6fe5:13c0:a045 +[main (2) ] INFO - 0:00:01.220 - .f : Skipping unsupported non-IPv4 address: /fdde:0:31df:4f52::1288:da64 +[main (2) ] INFO - 0:00:01.220 - .f : Skipping unsupported non-IPv4 address: /::1 +[main (2) ] INFO - 0:00:01.220 - .f : Display name: wlan0 +[main (2) ] INFO - 0:00:01.220 - .f : Name: wlan0 +[main (2) ] INFO - 0:00:01.221 - .f : InetAddress: /fe80::1c35:9cff:fe48:4f02%wlan0 +[main (2) ] INFO - 0:00:01.221 - .f : InetAddress: /2a01:e0a:db2:76f0:1c35:9cff:fe48:4f02 +[main (2) ] INFO - 0:00:01.221 - .f : InetAddress: /2a01:e0a:db2:76f0:2459:6fe5:13c0:a045 +[main (2) ] INFO - 0:00:01.221 - .f : InetAddress: /192.168.0.98 +[main (2) ] INFO - 0:00:01.221 - .f : Interface Address +[main (2) ] INFO - 0:00:01.221 - .f : Address: /fe80::1c35:9cff:fe48:4f02%wlan0 +[main (2) ] INFO - 0:00:01.221 - .f : Broadcast: null +[main (2) ] INFO - 0:00:01.221 - .f : Prefix length: 64 +[main (2) ] INFO - 0:00:01.221 - .f : Interface Address +[main (2) ] INFO - 0:00:01.221 - .f : Address: /2a01:e0a:db2:76f0:1c35:9cff:fe48:4f02 +[main (2) ] INFO - 0:00:01.222 - .f : Broadcast: null +[main (2) ] INFO - 0:00:01.222 - .f : Prefix length: 64 +[main (2) ] INFO - 0:00:01.222 - .f : Interface Address +[main (2) ] INFO - 0:00:01.222 - .f : Address: /2a01:e0a:db2:76f0:2459:6fe5:13c0:a045 +[main (2) ] INFO - 0:00:01.222 - .f : Broadcast: null +[main (2) ] INFO - 0:00:01.222 - .f : Prefix length: 64 +[main (2) ] INFO - 0:00:01.222 - .f : Interface Address +[main (2) ] INFO - 0:00:01.222 - .f : Address: /192.168.0.98 +[main (2) ] INFO - 0:00:01.222 - .f : Broadcast: /192.168.0.255 +[main (2) ] INFO - 0:00:01.222 - .f : Prefix length: 24 +[main (2) ] INFO - 0:00:01.222 - .f : Up? true +[main (2) ] INFO - 0:00:01.223 - .f : Loopback? false +[main (2) ] INFO - 0:00:01.223 - .f : PointToPoint? false +[main (2) ] INFO - 0:00:01.223 - .f : Supports multicast? true +[main (2) ] INFO - 0:00:01.223 - .f : Virtual? false +[main (2) ] INFO - 0:00:01.224 - .f : Hardware address: null +[main (2) ] INFO - 0:00:01.224 - .f : MTU: 1500 +[main (2) ] INFO - 0:00:01.224 - .f : Display name: lo +[main (2) ] INFO - 0:00:01.224 - .f : Name: lo +[main (2) ] INFO - 0:00:01.224 - .f : InetAddress: /::1 +[main (2) ] INFO - 0:00:01.224 - .f : InetAddress: /127.0.0.1 +[main (2) ] INFO - 0:00:01.225 - .f : Interface Address +[main (2) ] INFO - 0:00:01.225 - .f : Address: /::1 +[main (2) ] INFO - 0:00:01.225 - .f : Broadcast: null +[main (2) ] INFO - 0:00:01.225 - .f : Prefix length: 128 +[main (2) ] INFO - 0:00:01.225 - .f : Interface Address +[main (2) ] INFO - 0:00:01.225 - .f : Address: /127.0.0.1 +[main (2) ] INFO - 0:00:01.225 - .f : Broadcast: null +[main (2) ] INFO - 0:00:01.225 - .f : Prefix length: 8 +[main (2) ] INFO - 0:00:01.225 - .f : Up? true +[main (2) ] INFO - 0:00:01.225 - .f : Loopback? true +[main (2) ] INFO - 0:00:01.226 - .f : PointToPoint? false +[main (2) ] INFO - 0:00:01.226 - .f : Supports multicast? false +[main (2) ] INFO - 0:00:01.226 - .f : Virtual? false +[main (2) ] INFO - 0:00:01.226 - .f : Hardware address: null +[main (2) ] INFO - 0:00:01.227 - .f : MTU: 65536 +[main (2) ] INFO - 0:00:01.227 - .i : /127.0.0.1:58645: created socket (for receiving TCP streams) +[main (2) ] INFO - 0:00:01.227 - .i : /192.168.0.98:58645: created socket (for receiving TCP streams) +[main (2) ] INFO - 0:00:01.228 - .e : wlan0: Creating wildcard socket (for receiving multicast datagrams) on port: 1900 +[main (2) ] INFO - 0:00:01.228 - .e : wlan0: Joining multicast group: /239.255.255.250:1900 +[main (2) ] INFO - 0:00:01.229 - .e : lo: Creating wildcard socket (for receiving multicast datagrams) on port: 1900 +[main (2) ] INFO - 0:00:01.229 - .e : lo: Joining multicast group: /239.255.255.250:1900 +[main (2) ] INFO - 0:00:01.229 - .a : Creating bound socket (for datagram input/output) on: /127.0.0.1 +[main (2) ] INFO - 0:00:01.230 - .a : Creating bound socket (for datagram input/output) on: /192.168.0.98 +[main (2) ] INFO - 0:00:01.231 - .b : WiFi multicast lock acquired +[main (2) ] INFO - 0:00:01.244 - .b : WiFi lock acquired +[main (2) ] INFO - 0:00:01.250 - .b : enabled router on network type change (new network: WIFI) +[main (2) ] INFO - 0:00:01.250 - inspecting new device: La glouglou mobile +[main (2) ] INFO - 0:00:01.251 - La glouglou mobile : No product service found +[main (2) ] INFO - 0:00:01.251 - La glouglou mobile : volume range: 0..15 +[main (2) ] INFO - 0:00:01.251 - La glouglou mobile : supports SetNextAVTransportURI: false +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.315 - codec name: c2.sec.amrnb.decoder, supported types: audio/3gpp +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.315 - codec name: c2.sec.amrwb.decoder, supported types: audio/amr-wb +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.flac.decoder, supported types: audio/flac +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.ima.decoder, supported types: audio/x-ima +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.mp3.decoder.mpeg, supported types: audio/mpeg +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.mp3.decoder, supported types: audio/mpeg +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.mp3.decoder.mpeg-L1, supported types: audio/mpeg-L1 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.mp3.decoder.mpeg-L2, supported types: audio/mpeg-L2 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.vc1.decoder.wvc1, supported types: video/wvc1 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.vc1.decoder, supported types: video/wvc1 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.316 - codec name: c2.sec.vc1.decoder.x-ms-wmv, supported types: video/x-ms-wmv +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: c2.dolby.ac4.decoder, supported types: audio/ac4 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: OMX.dolby.ac4.decoder, supported types: audio/ac4 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: c2.dolby.eac3.decoder.ac3, supported types: audio/ac3 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: c2.dolby.eac3.decoder, supported types: audio/ac3 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: c2.dolby.eac3.decoder.eac3, supported types: audio/eac3 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: c2.dolby.eac3.decoder.eac3-joc, supported types: audio/eac3-joc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: c2.android.aac.decoder, supported types: audio/mp4a-latm +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: OMX.google.aac.decoder, supported types: audio/mp4a-latm +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: c2.android.amrnb.decoder, supported types: audio/3gpp +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.317 - codec name: OMX.google.amrnb.decoder, supported types: audio/3gpp +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.318 - codec name: c2.android.amrwb.decoder, supported types: audio/amr-wb +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.318 - codec name: OMX.google.amrwb.decoder, supported types: audio/amr-wb +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.318 - codec name: c2.android.flac.decoder, supported types: audio/flac +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.318 - codec name: OMX.google.flac.decoder, supported types: audio/flac +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.318 - codec name: c2.android.g711.alaw.decoder, supported types: audio/g711-alaw +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.318 - codec name: OMX.google.g711.alaw.decoder, supported types: audio/g711-alaw +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.318 - codec name: c2.android.g711.mlaw.decoder, supported types: audio/g711-mlaw +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.319 - codec name: OMX.google.g711.mlaw.decoder, supported types: audio/g711-mlaw +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.319 - codec name: c2.android.gsm.decoder, supported types: audio/gsm +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.319 - codec name: OMX.google.gsm.decoder, supported types: audio/gsm +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.319 - codec name: c2.android.mp3.decoder, supported types: audio/mpeg +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.319 - codec name: OMX.google.mp3.decoder, supported types: audio/mpeg +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.319 - codec name: c2.android.opus.decoder, supported types: audio/opus +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: OMX.google.opus.decoder, supported types: audio/opus +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: c2.android.raw.decoder, supported types: audio/raw +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: OMX.google.raw.decoder, supported types: audio/raw +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: c2.android.vorbis.decoder, supported types: audio/vorbis +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: OMX.google.vorbis.decoder, supported types: audio/vorbis +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: c2.exynos.h264.decoder, supported types: video/avc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: OMX.Exynos.avc.dec, supported types: video/avc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: c2.exynos.h264.decoder.secure, supported types: video/avc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: c2.exynos.hevc.decoder, supported types: video/hevc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.320 - codec name: OMX.Exynos.hevc.dec, supported types: video/hevc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: c2.exynos.hevc.decoder.secure, supported types: video/hevc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: c2.exynos.vp8.decoder, supported types: video/x-vnd.on2.vp8 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: OMX.Exynos.vp8.dec, supported types: video/x-vnd.on2.vp8 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: c2.sec.mpeg4.decoder, supported types: video/mp4v-es +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: c2.android.apv.decoder, supported types: video/apv +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: c2.android.av1-dav1d.decoder, supported types: video/av01 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: c2.android.avc.decoder, supported types: video/avc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.321 - codec name: OMX.google.h264.decoder, supported types: video/avc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: c2.android.h263.decoder, supported types: video/3gpp +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: OMX.google.h263.decoder, supported types: video/3gpp +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: c2.android.hevc.decoder, supported types: video/hevc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: OMX.google.hevc.decoder, supported types: video/hevc +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: c2.android.mpeg4.decoder, supported types: video/mp4v-es +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: OMX.google.mpeg4.decoder, supported types: video/mp4v-es +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: c2.android.vp8.decoder, supported types: video/x-vnd.on2.vp8 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: OMX.google.vp8.decoder, supported types: video/x-vnd.on2.vp8 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: c2.android.vp9.decoder, supported types: video/x-vnd.on2.vp9 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.322 - codec name: OMX.google.vp9.decoder, supported types: video/x-vnd.on2.vp9 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.323 - codec name: c2.android.av1.decoder, supported types: video/av01 +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.323 - stock audio codecs: OPUS, FLAC, WAV, MP3, MP2, MP1, AAC, M4A, OGG, DFF, DSF, DSD +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.324 - non-stock audio codecs: AIFF, L16, L24, Musepack, WavPack, TAK, AMR, AC3, MKA, MPEG-DASH, DTS, Monkey's Audio, WMA +[cling-8 (GetProtocolInfo) (211) ] INFO - 0:00:01.324 - StockAudioSupport initialization took: 72 ms +[main (2) ] INFO - 0:00:01.325 - 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:01.326 - La glouglou mobile : discarding problematic mime-type: audio/l24 +[main (2) ] INFO - 0:00:01.326 - La glouglou mobile : discarding problematic mime-type: audio/l24 +[main (2) ] INFO - 0:00:01.327 - La glouglou mobile : adding all DSD mime-types +[main (2) ] INFO - 0:00:01.327 - La glouglou mobile : max samplerate: -1, supports 24-bit: true, supports multichannel: true +[main (2) ] INFO - 0:00:01.328 - 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:01.328 - La glouglou mobile : hasSetNextPlayItem: false, supportsSetNextPlayItem: false +[main (2) ] INFO - 0:00:01.329 - added renderer: La glouglou mobile (ip: null) +[AsyncTask #1 (188) ] INFO - 0:00:01.331 - loadPlaylist: loaded /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/files/playlists/playlist.dpl +[main (2) ] INFO - 0:00:01.332 - found renderer: La glouglou mobile +[main (2) ] INFO - 0:00:01.335 - .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:01.336 - La glouglou mobile : not a Media Server: java.lang.Exception: La glouglou mobile : cannot find service ContentDirectory +[main (2) ] INFO - 0:00:01.336 - inspecting new device: BubbleUPnP Media Server (SM-A536B) +[main (2) ] INFO - 0:00:01.337 - BubbleUPnP Media Server (SM-A536B): No product service found +[main (2) ] WARNING - 0:00:01.337 - BubbleUPnP Media Server (SM-A536B): no RenderingControl service found +[main (2) ] INFO - 0:00:01.337 - BubbleUPnP Media Server (SM-A536B): constructed successfully +[Main #3 (202) ] INFO - 0:00:01.337 - task: start: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:01.338 - active media server: Local et Cloud +[Main #3: MediaServer-FetchSupportedMimeT] INFO - 0:00:01.340 - 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:01.340 - found Media Server: BubbleUPnP Media Server (SM-A536B) +[main (2) ] INFO - 0:00:01.341 - .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 (202) ] INFO - 0:00:01.341 - task: end, 3ms: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:01.341 - createConnector: type: 3 +[main (2) ] INFO - 0:00:01.344 - Started {} +[main (2) ] INFO - 0:00:01.345 - started Jetty connector on 192.168.0.98:57645 +[main (2) ] INFO - 0:00:01.346 - smb: setLocalIpAddress: /192.168.0.98 +[main (2) ] SEVERE - 0:00:01.346 - watchdog: device search++: 1 +[main (2) ] INFO - 0:00:01.346 - performDeviceSearch: searching... +[main (2) ] INFO - 0:00:01.351 - play mode: -1 +[main (2) ] INFO - 0:00:01.354 - play mode: -3.5 +[main (2) ] INFO - 0:00:01.358 - set scrobbler: 0 +[main (2) ] INFO - 0:00:01.358 - Trakt resume: cleared progressed entities +[main (2) ] INFO - 0:00:01.360 - registered receiver for 'mute on phone call' +[cling-21 (226) ] INFO - 0:00:01.368 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.233:49152/description.xml +[main (2) ] INFO - 0:00:01.371 - setUsingBattery: true => false +[main (2) ] WARNING - 0:00:01.372 - watchdog: already disabled +[Main #3 (202) ] INFO - 0:00:01.373 - task: start: AndroidUpnpService-LoadResumePositions +[main (2) ] INFO - 0:00:01.373 - isGMSAvailable: true, hasTunInterface: false, isGoogleCastDiscoveryAlwaysStarted: false +[main (2) ] INFO - 0:00:01.375 - AndroidUpnpService.onCreate() took: 802 ms +[Main #3: AndroidUpnpService-LoadResumePo] INFO - 0:00:01.375 - loaded 10 resume positions +[Main #3 (202) ] INFO - 0:00:01.376 - task: end, 3ms: AndroidUpnpService-LoadResumePositions +[main (2) ] INFO - 0:00:01.376 - doStartForeground: calling startForeground(), fromOnStartCommand: true, serviceType: 2 +[Main #4 (228) ] INFO - 0:00:01.376 - task: start: clearTempVLCSubFiles +[Main #5 (229) ] INFO - 0:00:01.377 - task: start: processAppExitReasons +[Main #6 (230) ] INFO - 0:00:01.378 - task: start: clear transcode tmp files +[Main #6 (230) ] INFO - 0:00:01.380 - task: end, 2ms: clear transcode tmp files +[Main #7 (231) ] INFO - 0:00:01.380 - task: start: clear older HLS remux files +[Main #7 (231) ] INFO - 0:00:01.381 - task: end, 1ms: clear older HLS remux files +[main (2) ] INFO - 0:00:01.386 - toast: AVERTISSEMENT: + +Le logging est activé + +[Main #5 (229) ] INFO - 0:00:01.396 - task: end, 19ms: processAppExitReasons +[main (2) ] INFO - 0:00:01.403 - warning toast: Le logging est activé + +[main (2) ] INFO - 0:00:01.405 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:01.406 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:01.407 - Insets: Insets{left=0, top=88, right=0, bottom=45} +[main (2) ] INFO - 0:00:01.412 - setSeekBarDetailsText: +[cling-22 (232) ] INFO - 0:00:01.432 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.137:49152/description.xml +[cling-20 (225) ] INFO - 0:00:01.436 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.138:8080/device/4b5d30eb-34cb-4bcc-806e-a075eebf9cd7/desc.xml +[cling-24 (234) ] INFO - 0:00:01.439 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.138:8080/device/63623ff4-ee41-4850-90aa-2d39395df981/desc.xml +[Main #4 (228) ] INFO - 0:00:01.441 - task: end, 66ms: clearTempVLCSubFiles +[main (2) ] INFO - 0:00:01.443 - onDestroy()@9e5576d:5234 +[main (2) ] INFO - 0:00:01.443 - installed security provider +[main (2) ] INFO - 0:00:01.444 - 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:01.445 - 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:01.447 - .b : selected item: France Culture +[main (2) ] INFO - 0:00:01.448 - .b : selected item: France Culture +[main (2) ] INFO - 0:00:01.448 - .b : CONNECTIVITY_ACTION +[main (2) ] INFO - 0:00:01.448 - .b : EXTRA_NO_CONNECTIVITY: false +[main (2) ] INFO - 0:00:01.448 - .b : EXTRA_REASON: null +[main (2) ] INFO - 0:00:01.449 - .b : EXTRA_IS_FAILOVER: false +[main (2) ] INFO - 0:00:01.449 - .b : EXTRA_NETWORK_INFO: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: , failover: false, available: true, roaming: false] +[main (2) ] INFO - 0:00:01.449 - .b : EXTRA_OTHER_NETWORK_INFO: none +[main (2) ] INFO - 0:00:01.449 - .b : EXTRA_EXTRA_INFO: +[main (2) ] INFO - 0:00:01.449 - .b : No network change...ignoring event +[main (2) ] INFO - 0:00:01.454 - created mini-player (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) +[main (2) ] INFO - 0:00:01.455 - added listener: 1 listeners +[main (2) ] WARNING - 0:00:01.455 - refreshLocalMediaServerLibraryList: failed to find separator container (1) +[main (2) ] INFO - 0:00:01.455 - active renderer: none +[main (2) ] INFO - 0:00:01.462 - onSaveInstanceState()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:01.462 - saveMediaServerState: Local et Cloud +[main (2) ] INFO - 0:00:01.464 - onSaveInstanceState()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:01.465 - saveMediaServerState: Local et Cloud +[main (2) ] INFO - 0:00:01.465 - positionStack: [] +[main (2) ] INFO - 0:00:01.465 - itemList: Bundle[{firstVisiblePosition=0}] +[main (2) ] INFO - 0:00:01.466 - containerPath: [] +[main (2) ] INFO - 0:00:01.470 - added listener: 2 listeners +[main (2) ] INFO - 0:00:01.471 - added listener: 3 listeners +[main (2) ] INFO - 0:00:01.471 - active renderer: none +[main (2) ] INFO - 0:00:01.471 - onNetworkSearchStarted +[AsyncTask #1 (188) ] INFO - 0:00:01.477 - BrowseTask.doInBackground(): enter +[AsyncTask #1 (188) ] INFO - 0:00:01.477 - BrowseTask.doInBackground(): loading container 'Local et Cloud' +[cling-23 (Browse) (233) ] INFO - 0:00:01.478 - ObjectID: 0 +[cling-23 (Browse) (233) ] INFO - 0:00:01.478 - BrowseFlag: BrowseDirectChildren +[cling-23 (Browse) (233) ] INFO - 0:00:01.480 - StartingIndex: 0 +[cling-23 (Browse) (233) ] INFO - 0:00:01.481 - RequestedCount: 0 +[cling-23 (Browse) (233) ] INFO - 0:00:01.481 - Filter: * +[cling-23 (Browse) (233) ] INFO - 0:00:01.482 - sorted 0 items took: 0 ms +[cling-23 (Browse) (233) ] WARNING - 0:00:01.483 - 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-27 (238) ] INFO - 0:00:01.497 - .f : Sending device descriptor retrieval message: (c) GET http://192.168.0.254:52424/device.xml +[cling-23 (Browse) (233) ] INFO - 0:00:01.500 - browsed 10/10 items in 19ms +[main (2) ] INFO - 0:00:01.569 - added listener: 4 listeners +[main (2) ] INFO - 0:00:01.569 - remote config: fetch succeeded, activated: false +[main (2) ] INFO - 0:00:01.632 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:01.633 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:01.706 - inspecting new device: PMOMusic Media Server +[main (2) ] INFO - 0:00:01.706 - PMOMusic Media Server: No product service found +[main (2) ] WARNING - 0:00:01.706 - PMOMusic Media Server: no RenderingControl service found +[main (2) ] INFO - 0:00:01.707 - PMOMusic Media Server: constructed successfully +[Main #4 (228) ] INFO - 0:00:01.707 - task: start: MediaServer-FetchSupportedMimeType +[main (2) ] WARNING - 0:00:01.707 - refreshLocalMediaServerLibraryList: failed to find separator container (1) +[main (2) ] INFO - 0:00:01.707 - no icon for PMOMusic Media Server +[main (2) ] INFO - 0:00:01.707 - found Media Server: PMOMusic Media Server +[main (2) ] INFO - 0:00:01.708 - .c : + + Manufacturer: PMOMusic + Model name: PMOMusic Media Server + UDN: 63623ff4-ee41-4850-90aa-2d39395df981 + +[main (2) ] INFO - 0:00:01.708 - inspecting new device: Chambre +[main (2) ] INFO - 0:00:01.708 - Chambre: No product service found +[main (2) ] INFO - 0:00:01.708 - Chambre: volume range: 0..100 +[main (2) ] INFO - 0:00:01.708 - Chambre: supports SetNextAVTransportURI: true +[Main #4: MediaServer-FetchSupportedMimeT] WARNING - 0:00:01.722 - PMOMusic Media Server: cannot get ProtocolInfo: null source value +[Main #4 (228) ] INFO - 0:00:01.722 - task: end, 15ms: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:01.724 - 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.724 - Chambre: max samplerate: 192000, supports 24-bit: true, supports multichannel: true +[main (2) ] INFO - 0:00:01.724 - 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.725 - Chambre: hasSetNextPlayItem: true, supportsSetNextPlayItem: true +[main (2) ] INFO - 0:00:01.725 - added renderer: Chambre (ip: 192.168.0.233) +[main (2) ] INFO - 0:00:01.731 - found renderer: Chambre +[main (2) ] INFO - 0:00:01.731 - .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.732 - Chambre: not a Media Server: java.lang.Exception: Chambre: cannot find service ContentDirectory +[main (2) ] INFO - 0:00:01.733 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server +[main (2) ] INFO - 0:00:01.734 - sorted 0 items took: 0 ms +[main (2) ] INFO - 0:00:01.735 - sorted 0 items took: 0 ms +[main (2) ] INFO - 0:00:01.736 - loaded file d38a2dc7-13c1-4a39-ab36-513490cf6766-Bookmarks ok: 0 items, 1 ms +[main (2) ] INFO - 0:00:01.736 - sorted 0 items took: 0 ms +[main (2) ] INFO - 0:00:01.739 - sorted 2 items took: 2 ms +[main (2) ] INFO - 0:00:01.740 - sorted 2 items took: 0 ms +[AsyncTask #1 (188) ] INFO - 0:00:01.743 - finished browsing: got 10 objects +[AsyncTask #1 (188) ] INFO - 0:00:01.743 - BrowseTask.doInBackground(): no item +[main (2) ] INFO - 0:00:01.744 - inspecting new device: PMOMusic Audio Renderer +[main (2) ] INFO - 0:00:01.744 - PMOMusic Audio Renderer: No product service found +[main (2) ] WARNING - 0:00:01.744 - PMOMusic Audio Renderer: Volume state variable has no range, using default +[main (2) ] INFO - 0:00:01.745 - PMOMusic Audio Renderer: volume range: 0..100 +[main (2) ] INFO - 0:00:01.745 - PMOMusic Audio Renderer: supports SetNextAVTransportURI: true +[main (2) ] WARNING - 0:00:01.753 - PMOMusic Audio Renderer: cannot get ProtocolInfo: null sink value, source value: null +[main (2) ] INFO - 0:00:01.753 - PMOMusic Audio Renderer: supported mime-types: [] +[main (2) ] INFO - 0:00:01.753 - PMOMusic Audio Renderer: hasSetNextPlayItem: true, supportsSetNextPlayItem: true +[main (2) ] INFO - 0:00:01.753 - added renderer: PMOMusic Audio Renderer (ip: 192.168.0.138) +[main (2) ] INFO - 0:00:01.754 - no icon for PMOMusic Audio Renderer +[main (2) ] INFO - 0:00:01.754 - found renderer: PMOMusic Audio Renderer +[main (2) ] INFO - 0:00:01.754 - .c : + + Manufacturer: PMOMusic + Model name: PMOMusic Audio Renderer + UDN: 4b5d30eb-34cb-4bcc-806e-a075eebf9cd7 + +[main (2) ] INFO - 0:00:01.754 - PMOMusic Audio Renderer: not a Media Server: java.lang.Exception: PMOMusic Audio Renderer: cannot find service ContentDirectory +[main (2) ] INFO - 0:00:01.755 - inspecting new device: Freebox Server +[main (2) ] INFO - 0:00:01.755 - Freebox Server: No product service found +[main (2) ] WARNING - 0:00:01.755 - Freebox Server: no RenderingControl service found +[main (2) ] INFO - 0:00:01.755 - Freebox Server: constructed successfully +[Main #4 (228) ] INFO - 0:00:01.755 - task: start: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:01.756 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server +[main (2) ] INFO - 0:00:01.756 - refreshLocalMediaServerLibraryList: added: Freebox Server +[main (2) ] INFO - 0:00:01.756 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server +[main (2) ] INFO - 0:00:01.757 - sorted 2 items took: 0 ms +[main (2) ] INFO - 0:00:01.758 - found Media Server: Freebox Server +[main (2) ] INFO - 0:00:01.758 - .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.758 - inspecting new device: Glouglou Box +[main (2) ] INFO - 0:00:01.759 - Glouglou Box: No product service found +[main (2) ] INFO - 0:00:01.759 - Glouglou Box: volume range: 0..100 +[main (2) ] INFO - 0:00:01.759 - Glouglou Box: supports SetNextAVTransportURI: false +[Main #4: MediaServer-FetchSupportedMimeT] INFO - 0:00:01.766 - 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 (228) ] INFO - 0:00:01.767 - task: end, 11ms: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:01.777 - 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.777 - Glouglou Box: max samplerate: 192000, supports 24-bit: true, supports multichannel: true +[main (2) ] INFO - 0:00:01.778 - 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.778 - Glouglou Box: hasSetNextPlayItem: false, supportsSetNextPlayItem: false +[main (2) ] INFO - 0:00:01.779 - added renderer: Glouglou Box (ip: 192.168.0.137) +[main (2) ] INFO - 0:00:01.779 - found renderer: Glouglou Box +[main (2) ] INFO - 0:00:01.779 - .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.780 - Glouglou Box: not a Media Server: java.lang.Exception: Glouglou Box: cannot find service ContentDirectory +[main (2) ] INFO - 0:00:01.783 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:01.784 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[glide-disk-cache-thread-0 (243) ] INFO - 0:00:01.813 - Glide: registered GlideUrl loader +[glide-disk-cache-thread-0 (243) ] INFO - 0:00:01.813 - created okhttp/5.3.2 client +[cling-23 (233) ] INFO - 0:00:01.814 - .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.965 - inspecting new device: pizzicato-Music +[main (2) ] INFO - 0:00:01.965 - pizzicato-Music: found OpenHome device +[main (2) ] INFO - 0:00:01.966 - pizzicato-Music: Found Product service +[main (2) ] INFO - 0:00:01.966 - pizzicato-Music: Found Playlist service +[main (2) ] INFO - 0:00:01.966 - pizzicato-Music: Found Time service +[main (2) ] INFO - 0:00:01.967 - pizzicato-Music: Found Volume service +[main (2) ] INFO - 0:00:01.981 - pizzicato-Music: Found Info service +[main (2) ] INFO - 0:00:01.982 - pizzicato-Music: Found Credentials service +[main (2) ] INFO - 0:00:02.33 - pizzicato-Music: adding audio/x-dsf and audio/x-dff due to audio/x-dsd presence +[main (2) ] INFO - 0:00:02.33 - 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:02.33 - 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:02.34 - pizzicato-Music: volume range: 0..100 +[main (2) ] INFO - 0:00:02.34 - added renderer: pizzicato-Music (ip: 192.168.0.200) +[main (2) ] INFO - 0:00:02.35 - qobuz: user auth token: unset +[main (2) ] INFO - 0:00:02.35 - qobuz: cleared credentials +[main (2) ] INFO - 0:00:02.35 - qobuz: username: set +[main (2) ] INFO - 0:00:02.36 - tidal: session: unset +[main (2) ] INFO - 0:00:02.36 - tidal: reset +[main (2) ] INFO - 0:00:02.36 - fireRootContentChanged +[main (2) ] INFO - 0:00:02.37 - onSaveInstanceState()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:02.38 - saveMediaServerState: Local et Cloud +[main (2) ] INFO - 0:00:02.38 - positionStack: [] +[main (2) ] INFO - 0:00:02.38 - itemList: Bundle[{firstVisiblePosition=0}] +[main (2) ] INFO - 0:00:02.39 - containerPath: [] +[main (2) ] INFO - 0:00:02.40 - active renderer: pizzicato-Music +[AsyncTask #1 (188) ] INFO - 0:00:02.40 - BrowseTask.doInBackground(): enter +[main (2) ] INFO - 0:00:02.41 - supports video: false +[AsyncTask #1 (188) ] INFO - 0:00:02.41 - BrowseTask.doInBackground(): loading container 'Local et Cloud' +[main (2) ] INFO - 0:00:02.41 - tidal: OH token id: null +[main (2) ] INFO - 0:00:02.41 - pizzicato-Music: control volume with pizzicato-Music +[cling-23 (Browse) (233) ] INFO - 0:00:02.41 - ObjectID: 0 +[cling-23 (Browse) (233) ] INFO - 0:00:02.42 - BrowseFlag: BrowseDirectChildren +[cling-23 (Browse) (233) ] INFO - 0:00:02.42 - StartingIndex: 0 +[cling-23 (Browse) (233) ] INFO - 0:00:02.42 - RequestedCount: 0 +[cling-23 (Browse) (233) ] INFO - 0:00:02.42 - Filter: * +[cling-23 (Browse) (233) ] INFO - 0:00:02.43 - sorted 0 items took: 0 ms +[cling-23 (Browse) (233) ] INFO - 0:00:02.45 - browsed 10/10 items in 3ms +[main (2) ] INFO - 0:00:02.57 - pizzicato-Music: onSourceChange: Playlist +[main (2) ] INFO - 0:00:02.57 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Product +[main (2) ] INFO - 0:00:02.58 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Playlist +[main (2) ] INFO - 0:00:02.58 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Info +[main (2) ] INFO - 0:00:02.59 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Credentials +[main (2) ] INFO - 0:00:02.59 - pizzicato-Music: started subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Volume +[main (2) ] INFO - 0:00:02.60 - onSourceChange: Playlist +[main (2) ] INFO - 0:00:02.60 - selected item changed (service): +[main (2) ] INFO - 0:00:02.62 - image file cache is enabled: /storage/emulated/0/Android/data/com.bubblesoft.android.bubbleupnp/cache/images +[main (2) ] INFO - 0:00:02.63 - enabled image file cache +[cling-33 (249) ] INFO - 0:00:02.71 - pizzicato-Music: Established subscription uuid:f7dc376c-5f8d-8a98-7d14-71f0fa05c524 on service (n) ServiceId: urn:av-openhome-org:serviceId:Product +[cling-33 (249) ] INFO - 0:00:02.79 - pizzicato-Music: Established subscription uuid:b8a97f58-4648-e08f-afc9-b4705c681ad0 on service (n) ServiceId: urn:av-openhome-org:serviceId:Credentials +[main (2) ] INFO - 0:00:02.91 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true +[main (2) ] INFO - 0:00:02.92 - SETACTIVE: onTransportStateChanged: post STOP callback +[cling-28 (244) ] INFO - 0:00:02.97 - pizzicato-Music: Established subscription uuid:90204e20-0c37-40d8-bc3a-8d50647db5bb on service (n) ServiceId: urn:av-openhome-org:serviceId:Info +[cling-29 (245) ] INFO - 0:00:02.110 - pizzicato-Music: Established subscription uuid:172cf961-f52f-73b1-bfc7-8ba9f3904e95 on service (n) ServiceId: urn:av-openhome-org:serviceId:Playlist +[main (2) ] INFO - 0:00:02.124 - VolumeProvider: created for 'pizzicato-Music' +[cling-23 (233) ] INFO - 0:00:02.131 - pizzicato-Music: Established subscription uuid:05c4a4a9-fc16-b9e0-dcb9-f53368484a67 on service (n) ServiceId: urn:av-openhome-org:serviceId:Volume +[main (2) ] INFO - 0:00:02.145 - active renderer: pizzicato-Music +[main (2) ] INFO - 0:00:02.145 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) +[main (2) ] INFO - 0:00:02.146 - active renderer: pizzicato-Music +[main (2) ] INFO - 0:00:02.146 - onNetworkSearchEnded +[main (2) ] INFO - 0:00:02.158 - active renderer: pizzicato-Music +[main (2) ] INFO - 0:00:02.158 - source changed: Playlist +[main (2) ] INFO - 0:00:02.158 - selected item changed (now playing): +[main (2) ] INFO - 0:00:02.158 - setSeekBarDetailsText: +[main (2) ] INFO - 0:00:02.160 - no icon for pizzicato-Music +[main (2) ] INFO - 0:00:02.160 - found renderer: pizzicato-Music +[main (2) ] INFO - 0:00:02.161 - .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:02.161 - pizzicato-Music: not a Media Server: java.lang.Exception: pizzicato-Music: cannot find service ContentDirectory +[main (2) ] INFO - 0:00:02.162 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] WARNING - 0:00:02.163 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers +[main (2) ] INFO - 0:00:02.163 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:02.169 - refreshLocalMediaServerLibraryList: added: Freebox Server +[main (2) ] INFO - 0:00:02.170 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server +[main (2) ] INFO - 0:00:02.170 - sorted 0 items took: 0 ms +[main (2) ] INFO - 0:00:02.170 - sorted 0 items took: 0 ms +[main (2) ] INFO - 0:00:02.171 - loaded file d38a2dc7-13c1-4a39-ab36-513490cf6766-Bookmarks ok: 0 items, 1 ms +[main (2) ] INFO - 0:00:02.171 - sorted 0 items took: 0 ms +[main (2) ] INFO - 0:00:02.172 - sorted 2 items took: 0 ms +[main (2) ] INFO - 0:00:02.172 - sorted 2 items took: 0 ms +[main (2) ] INFO - 0:00:02.173 - pizzicato-Music: Credentials: supported ids: [qobuz.com] +[AsyncTask #1 (188) ] INFO - 0:00:02.174 - finished browsing: got 10 objects +[AsyncTask #1 (188) ] INFO - 0:00:02.175 - BrowseTask.doInBackground(): no item +[main (2) ] INFO - 0:00:02.188 - pizzicato-Music: CredentialsSubscriptionCallback.getAction(qobuz.com): username: unset, password: unset, enabled: true, status: null, data: set +[main (2) ] INFO - 0:00:02.189 - onStandbyChange: standby=false, ignore=true +[main (2) ] INFO - 0:00:02.189 - onStandbyChange: standby=false, ignore=true +[main (2) ] INFO - 0:00:02.189 - onStandbyChange: standby=false, ignore=true +[main (2) ] INFO - 0:00:02.189 - setSeekBarDetailsText: +[main (2) ] WARNING - 0:00:02.190 - .b : couldn't find item trackId = 22 +[main (2) ] INFO - 0:00:02.191 - selected item changed (service): +[Main #4 (228) ] INFO - 0:00:02.190 - task: start: AbstractPlaylistService-FirstIdArray +[Main #4: AbstractPlaylistService-FirstId] INFO - 0:00:02.191 - pizzicato-Music: reading 1 new items to insert: [22] +[Main #4: AbstractPlaylistService-FirstId] INFO - 0:00:02.192 - pizzicato-Music: getting [0..1[ +[main (2) ] INFO - 0:00:02.207 - selected item changed (now playing): +[main (2) ] INFO - 0:00:02.208 - setSeekBarDetailsText: +[main (2) ] INFO - 0:00:02.209 - ignoreTransportStateChangeForTrackAdvance: false, allowTrackAdvance: true +[Main #4 (228) ] INFO - 0:00:02.209 - task: end, 20ms: AbstractPlaylistService-FirstIdArray +[main (2) ] INFO - 0:00:02.224 - setSeekBarDetailsText: +[main (2) ] INFO - 0:00:02.225 - pizzicato-Music: AbstractRenderer.onVolumeChange: 100 +[main (2) ] INFO - 0:00:02.226 - VolumeProvider: onVolumeChanged: 100 +[main (2) ] INFO - 0:00:02.238 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 +[main (2) ] INFO - 0:00:02.238 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 +[main (2) ] INFO - 0:00:02.238 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 +[main (2) ] INFO - 0:00:02.239 - setSeekBarDetailsText: +[main (2) ] INFO - 0:00:02.239 - pizzicato-Music: AbstractRenderer.onMuteChange: false +[main (2) ] INFO - 0:00:02.252 - setSeekBarDetailsText: +[main (2) ] INFO - 0:00:02.253 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] WARNING - 0:00:02.253 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers +[main (2) ] INFO - 0:00:02.254 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:02.290 - qobuz: Linn status: null +[main (2) ] INFO - 0:00:02.290 - qobuz: username: unset +[main (2) ] INFO - 0:00:02.290 - qobuz: set custom app id +[main (2) ] INFO - 0:00:02.290 - qobuz: user auth token: unset +[main (2) ] INFO - 0:00:02.311 - .b : selected item (track id): The Curse +[main (2) ] INFO - 0:00:02.312 - selected item changed (service): The Curse +[main (2) ] INFO - 0:00:02.328 - selected item changed (now playing): The Curse +[main (2) ] INFO - 0:00:02.343 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] WARNING - 0:00:02.343 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers +[main (2) ] INFO - 0:00:02.347 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:02.885 - 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.887 - Glouglou Box: No product service found +[main (2) ] WARNING - 0:00:02.887 - Glouglou Box: no RenderingControl service found +[main (2) ] INFO - 0:00:02.888 - 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.888 - Glouglou Box: no video out support +[main (2) ] INFO - 0:00:02.894 - added renderer: Glouglou Box (ip: 192.168.0.137) +[Main #4 (228) ] INFO - 0:00:02.894 - task: start: ChromecastRenderer-FetchNetworkConnectionType +[main (2) ] INFO - 0:00:02.904 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] WARNING - 0:00:02.904 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers +[main (2) ] INFO - 0:00:02.905 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[Main #4: ChromecastRenderer-FetchNetwork] INFO - 0:00:02.917 - Glouglou Box: ethernet connected: false, isCCwGTV: false +[Main #4 (228) ] INFO - 0:00:02.917 - task: end, 24ms: ChromecastRenderer-FetchNetworkConnectionType +[cling-29 (245) ] INFO - 0:00:03.92 - .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:03.140 - inspecting new device: fenice +[main (2) ] INFO - 0:00:03.140 - fenice: No product service found +[main (2) ] WARNING - 0:00:03.140 - fenice: no RenderingControl service found +[main (2) ] INFO - 0:00:03.140 - fenice: constructed successfully +[main (2) ] INFO - 0:00:03.141 - refreshLocalMediaServerLibraryList: removed: Freebox Server +[main (2) ] INFO - 0:00:03.141 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server +[main (2) ] INFO - 0:00:03.141 - refreshLocalMediaServerLibraryList: added: fenice +[main (2) ] INFO - 0:00:03.141 - refreshLocalMediaServerLibraryList: added: Freebox Server +[main (2) ] INFO - 0:00:03.141 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server +[Main #4 (228) ] INFO - 0:00:03.142 - task: start: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:03.142 - sorted 2 items took: 0 ms +[main (2) ] INFO - 0:00:03.142 - found Media Server: fenice +[main (2) ] INFO - 0:00:03.143 - .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 + +[cling-29 (245) ] INFO - 0:00:03.143 - .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:03.153 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] WARNING - 0:00:03.154 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers +[main (2) ] INFO - 0:00:03.154 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[Main #4: MediaServer-FetchSupportedMimeT] INFO - 0:00:03.163 - 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 (228) ] INFO - 0:00:03.163 - task: end, 21ms: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:03.192 - inspecting new device: pizzicato-Music-mediaserver +[main (2) ] INFO - 0:00:03.192 - pizzicato-Music-mediaserver: No product service found +[main (2) ] WARNING - 0:00:03.193 - pizzicato-Music-mediaserver: no RenderingControl service found +[main (2) ] INFO - 0:00:03.193 - pizzicato-Music-mediaserver: constructed successfully +[Main #4 (228) ] INFO - 0:00:03.193 - task: start: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:03.193 - refreshLocalMediaServerLibraryList: removed: fenice +[main (2) ] INFO - 0:00:03.194 - refreshLocalMediaServerLibraryList: removed: Freebox Server +[main (2) ] INFO - 0:00:03.194 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server +[main (2) ] INFO - 0:00:03.194 - refreshLocalMediaServerLibraryList: added: fenice +[main (2) ] INFO - 0:00:03.194 - refreshLocalMediaServerLibraryList: added: Freebox Server +[main (2) ] INFO - 0:00:03.194 - refreshLocalMediaServerLibraryList: added: pizzicato-Music-mediaserver +[main (2) ] INFO - 0:00:03.194 - refreshLocalMediaServerLibraryList: added: PMOMusic Media Server +[main (2) ] INFO - 0:00:03.195 - sorted 2 items took: 0 ms +[main (2) ] INFO - 0:00:03.195 - found Media Server: pizzicato-Music-mediaserver +[main (2) ] INFO - 0:00:03.195 - .c : + + Manufacturer: lesbonscomptes.com/upmpdcli + Model name: Upmpdcli Media Server + UDN: c110358f-d885-b44a-d6d3-dca6329ead0d + +[main (2) ] INFO - 0:00:03.203 - onCreateOptionsMenu()@2af0cf8/2e41698:5234 +[main (2) ] WARNING - 0:00:03.204 - getBubbleUPnPServerFFmpegDecodeREST: not supported for OpenHome renderers +[main (2) ] INFO - 0:00:03.204 - onPrepareOptionsMenu()@2af0cf8/2e41698:5234 +[Main #4: MediaServer-FetchSupportedMimeT] WARNING - 0:00:03.210 - pizzicato-Music-mediaserver: cannot get ProtocolInfo: null source value +[Main #4 (228) ] INFO - 0:00:03.210 - task: end, 17ms: MediaServer-FetchSupportedMimeType +[main (2) ] INFO - 0:00:04.85 - onPause()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:04.86 - removed listener: 3 listeners +[main (2) ] INFO - 0:00:04.87 - onResume()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:04.88 - addListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) +[main (2) ] INFO - 0:00:04.89 - onStandbyChange: standby=false, ignore=true +[main (2) ] INFO - 0:00:04.89 - pizzicato-Music: MainFragmentBase.onVolumeChange: 100 +[main (2) ] INFO - 0:00:04.95 - onCreateOptionsMenu()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:04.97 - onPrepareOptionsMenu()@ec98be8/2e41698:5234 +[pool-13-thread-1 (261) ] INFO - 0:00:05.492 - ProfileInstaller: Compiled with profile +[main (2) ] INFO - 0:00:08.888 - path = [server://63623ff4-ee41-4850-90aa-2d39395df981] +[main (2) ] INFO - 0:00:08.889 - active media server: PMOMusic Media Server +[main (2) ] INFO - 0:00:08.890 - onSaveInstanceState()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:08.891 - saveMediaServerState: PMOMusic Media Server +[main (2) ] INFO - 0:00:08.892 - onSaveInstanceState()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:08.893 - saveMediaServerState: PMOMusic Media Server +[main (2) ] INFO - 0:00:08.893 - positionStack: [6] +[main (2) ] INFO - 0:00:08.893 - itemList: Bundle[{firstVisiblePosition=0}] +[main (2) ] INFO - 0:00:08.894 - containerPath: [] +[main (2) ] INFO - 0:00:08.897 - onCreateOptionsMenu()@ec98be8/2e41698:5234 +[AsyncTask #1 (188) ] INFO - 0:00:08.897 - BrowseTask.doInBackground(): enter +[AsyncTask #1 (188) ] INFO - 0:00:08.898 - BrowseTask.doInBackground(): loading container 'PMOMusic Media Server' +[main (2) ] INFO - 0:00:08.899 - onPrepareOptionsMenu()@ec98be8/2e41698:5234 +[cling-13 (Browse) (218) ] WARNING - 0:00:09.12 - .b : Action: Browse: didlXML=4: java.lang.IllegalArgumentException: field com.bubblesoft.upnp.mediaserver.MediaServer$BrowseResult.didlXML has type java.lang.String, got java.lang.Long, class=java.lang.Long +[cling-13 (Browse) (218) ] WARNING - 0:00:09.13 - .b : Action: Browse: numberReturned= + + + Main Mix + object.container + + + Mellow Mix + object.container + + + Rock Mix + object.container + + + Eclectic Mix + object.container + +: java.lang.IllegalArgumentException: field com.bubblesoft.upnp.mediaserver.MediaServer$BrowseResult.numberReturned has type long, got java.lang.String, class=java.lang.String +[AsyncTask #1 (188) ] WARNING - 0:00:09.18 - Server returned 0 items and totalMatches not 0 +[AsyncTask #1 (188) ] INFO - 0:00:09.19 - finished browsing: got 4 objects +[AsyncTask #1 (188) ] INFO - 0:00:09.20 - BrowseTask.doInBackground(): no item +[main (2) ] INFO - 0:00:20.194 - onPause()@2e41698:5234 +[main (2) ] INFO - 0:00:20.198 - onPause()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:20.198 - removed listener: 2 listeners +[main (2) ] INFO - 0:00:20.201 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) +[main (2) ] INFO - 0:00:20.201 - removed listener: 1 listeners +[main (2) ] INFO - 0:00:20.202 - SETACTIVE: onMainTabActivityPause: setInactive() +[main (2) ] INFO - 0:00:20.203 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Product +[main (2) ] INFO - 0:00:20.203 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Playlist +[main (2) ] INFO - 0:00:20.203 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Info +[main (2) ] INFO - 0:00:20.204 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Credentials +[main (2) ] INFO - 0:00:20.204 - pizzicato-Music: stopped subscription callback for service (n) ServiceId: urn:av-openhome-org:serviceId:Volume +[main (2) ] INFO - 0:00:20.394 - onStop()@2e41698:5234 +[main (2) ] INFO - 0:00:20.395 - onStop()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:20.396 - onStop()@5f65d35/2e41698:5234 +[main (2) ] INFO - 0:00:20.397 - onStop()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:20.398 - onSaveInstanceState(outState)@2e41698:5234 +[main (2) ] INFO - 0:00:20.401 - onSaveInstanceState()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:20.402 - onSaveInstanceState()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:20.404 - onSaveInstanceState()@5f65d35/2e41698:5234 +[main (2) ] INFO - 0:00:21.63 - onDestroy()@2e41698:5234 +[main (2) ] INFO - 0:00:21.64 - onDestroyView()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:21.65 - onDestroy()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:21.66 - onDetach()@2af0cf8/2e41698:5234 +[main (2) ] INFO - 0:00:21.67 - onDestroyView()@5f65d35/2e41698:5234 +[main (2) ] INFO - 0:00:21.68 - onDestroy()@5f65d35/2e41698:5234 +[main (2) ] INFO - 0:00:21.68 - removed listener: 0 listeners +[main (2) ] INFO - 0:00:21.69 - onDetach()@5f65d35/2e41698:5234 +[main (2) ] INFO - 0:00:21.70 - onDestroyView()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:21.70 - removeListener (context: com.bubblesoft.android.bubbleupnp.MainTabActivity@2e41698) +[main (2) ] INFO - 0:00:21.71 - onSaveInstanceState()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:21.71 - saveMediaServerState: PMOMusic Media Server +[main (2) ] INFO - 0:00:21.71 - positionStack: [] +[main (2) ] INFO - 0:00:21.71 - itemList: Bundle[{firstVisiblePosition=0}] +[main (2) ] INFO - 0:00:21.72 - containerPath: [] +[main (2) ] INFO - 0:00:21.72 - refreshLocalMediaServerLibraryList: removed: fenice +[main (2) ] INFO - 0:00:21.72 - refreshLocalMediaServerLibraryList: removed: Freebox Server +[main (2) ] INFO - 0:00:21.72 - refreshLocalMediaServerLibraryList: removed: pizzicato-Music-mediaserver +[main (2) ] INFO - 0:00:21.72 - refreshLocalMediaServerLibraryList: removed: PMOMusic Media Server +[main (2) ] INFO - 0:00:21.73 - onDestroy()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:21.74 - onDetach()@ec98be8/2e41698:5234 +[main (2) ] INFO - 0:00:21.81 - 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:00:31.347 - performDeviceSearch: search done +[main (2) ] SEVERE - 0:00:31.348 - watchdog: device search--: 0 +[main (2) ] INFO - 0:00:59.578 - ACTION_SCREEN_OFF diff --git a/pmomediaserver/src/content_handler.rs b/pmomediaserver/src/content_handler.rs index 42a67103..24e4bdbe 100644 --- a/pmomediaserver/src/content_handler.rs +++ b/pmomediaserver/src/content_handler.rs @@ -123,12 +123,20 @@ impl ContentHandler { container.child_count = None; // compatibilité CP let didl = to_didl_lite(&[container], &[])?; let update_id = source.update_id().await.max(1); + tracing::debug!( + "BrowseMetadata root (flatten) didl_len={}B", + didl.len() + ); return Ok((didl, 1, 1, update_id)); } // Sinon retourner le container racine agrégé let root = self.build_root_container().await; let didl = to_didl_lite(&[root], &[])?; + tracing::debug!( + "BrowseMetadata root (aggregate) didl_len={}B", + didl.len() + ); Ok((didl, 1, 1, 1)) } else { // Essayer de trouver l'objet dans les sources @@ -140,6 +148,11 @@ impl ContentHandler { .map_err(|e| format!("Failed to get root container: {}", e))?; let didl = to_didl_lite(&[container], &[])?; let update_id = source.update_id().await.max(1); + tracing::debug!( + "BrowseMetadata source_root id={} didl_len={}B", + object_id, + didl.len() + ); return Ok((didl, 1, 1, update_id)); } @@ -149,6 +162,11 @@ impl ContentHandler { Ok(item) => { let didl = to_didl_lite(&[], &[item])?; let update_id = source.update_id().await.max(1); + tracing::debug!( + "BrowseMetadata item id={} didl_len={}B", + object_id, + didl.len() + ); return Ok((didl, 1, 1, update_id)); } Err(MusicSourceError::ObjectNotFound(_)) diff --git a/pmoparadise/src/source.rs b/pmoparadise/src/source.rs index df135d97..6d4bc054 100644 --- a/pmoparadise/src/source.rs +++ b/pmoparadise/src/source.rs @@ -188,7 +188,7 @@ impl RadioParadiseSource { parent_id: "radio-paradise".to_string(), restricted: Some("1".to_string()), child_count: None, - searchable: Some("0".to_string()), + searchable: Some("1".to_string()), title: descriptor.display_name.to_string(), class: "object.container".to_string(), containers: vec![], @@ -357,7 +357,7 @@ impl MusicSource for RadioParadiseSource { restricted: Some("1".to_string()), // childCount retiré pour éviter les soucis de compatibilité côté CP child_count: None, - searchable: Some("0".to_string()), + searchable: Some("1".to_string()), title: "Radio Paradise".to_string(), class: "object.container".to_string(), containers: vec![], diff --git a/pmoupnp/src/actions/arg_inst_set_methods.rs b/pmoupnp/src/actions/arg_inst_set_methods.rs index d2b07966..619bdf22 100644 --- a/pmoupnp/src/actions/arg_inst_set_methods.rs +++ b/pmoupnp/src/actions/arg_inst_set_methods.rs @@ -29,6 +29,7 @@ impl UpnpInstance for ArgInstanceSet { fn new(_: &ArgumentSet) -> Self { Self { objects: RwLock::new(HashMap::new()), + order: RwLock::new(Vec::new()), } } } diff --git a/pmoupnp/src/actions/arg_instance_methods.rs b/pmoupnp/src/actions/arg_instance_methods.rs index 73429929..ef355f9b 100644 --- a/pmoupnp/src/actions/arg_instance_methods.rs +++ b/pmoupnp/src/actions/arg_instance_methods.rs @@ -259,6 +259,7 @@ impl UpnpInstance for ActionInstanceSet { fn new(_: &ActionSet) -> Self { Self { objects: RwLock::new(HashMap::new()), + order: RwLock::new(Vec::new()), } } } diff --git a/pmoupnp/src/lib.rs b/pmoupnp/src/lib.rs index 67af0ac0..8340a145 100644 --- a/pmoupnp/src/lib.rs +++ b/pmoupnp/src/lib.rs @@ -32,6 +32,7 @@ pub struct UpnpObjectType { #[derive(Debug)] pub struct UpnpObjectSet { objects: RwLock>>, + order: RwLock>, } #[derive(Debug)] diff --git a/pmoupnp/src/object_set.rs b/pmoupnp/src/object_set.rs index 79eb6a9d..3b22d1f6 100644 --- a/pmoupnp/src/object_set.rs +++ b/pmoupnp/src/object_set.rs @@ -12,6 +12,7 @@ use crate::{UpnpDeepClone, UpnpObjectSet, UpnpObjectSetError, UpnpTypedObject}; impl UpnpDeepClone for UpnpObjectSet { fn deep_clone(&self) -> Self { let guard = self.objects.read().unwrap(); + let order_guard = self.order.read().unwrap(); let cloned_map: HashMap> = guard .iter() @@ -20,6 +21,7 @@ impl UpnpDeepClone for UpnpObjectSet { Self { objects: RwLock::new(cloned_map), + order: RwLock::new(order_guard.clone()), } } } @@ -39,9 +41,11 @@ impl UpnpDeepClone for UpnpObjectSet { impl Clone for UpnpObjectSet { fn clone(&self) -> Self { let guard = self.objects.read().unwrap(); + let order_guard = self.order.read().unwrap(); Self { objects: RwLock::new(guard.clone()), + order: RwLock::new(order_guard.clone()), } } } @@ -57,6 +61,7 @@ impl UpnpObjectSet { pub fn new() -> Self { Self { objects: RwLock::new(HashMap::new()), + order: RwLock::new(Vec::new()), } } @@ -80,13 +85,15 @@ impl UpnpObjectSet { /// ``` pub fn insert(&mut self, object: Arc) -> Result<(), UpnpObjectSetError> { let mut guard = self.objects.write().unwrap(); + let mut order_guard = self.order.write().unwrap(); let key = object.get_name().to_string(); if guard.contains_key(&key) { return Err(UpnpObjectSetError::AlreadyExists(key)); } - guard.insert(key, object); + guard.insert(key.clone(), object); + order_guard.push(key); Ok(()) } @@ -110,8 +117,13 @@ impl UpnpObjectSet { /// ``` pub fn insert_or_replace(&mut self, object: Arc) { let mut guard = self.objects.write().unwrap(); + let mut order_guard = self.order.write().unwrap(); let key: String = object.get_name().to_string(); + if !guard.contains_key(&key) { + order_guard.push(key.clone()); + } + guard.insert(key, object); } @@ -192,6 +204,11 @@ impl UpnpObjectSet { /// appeler cette méthode simultanément sans blocage. pub fn all(&self) -> Vec> { let guard = self.objects.read().unwrap(); - guard.values().cloned().collect() + let order_guard = self.order.read().unwrap(); + + order_guard + .iter() + .filter_map(|k| guard.get(k).cloned()) + .collect() } } diff --git a/pmoupnp/src/state_variables/var_inst_set_methods.rs b/pmoupnp/src/state_variables/var_inst_set_methods.rs index 667f6030..21da19cf 100644 --- a/pmoupnp/src/state_variables/var_inst_set_methods.rs +++ b/pmoupnp/src/state_variables/var_inst_set_methods.rs @@ -29,6 +29,7 @@ impl UpnpInstance for StateVarInstanceSet { fn new(_: &StateVariableSet) -> Self { Self { objects: RwLock::new(HashMap::new()), + order: RwLock::new(Vec::new()), } } }