From 6bdd7ea905a0b11afd2e00e0f07fbca1700020a5 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sat, 31 Jan 2026 21:38:58 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20d=C3=A9tection=20des=20flux?= =?UTF-8?q?=20continus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout d'une nouvelle propriété `is_continuous_stream` pour identifier les flux continus (radio, stream) plutôt que les fichiers avec durée fixe. - Ajout de la propriété `is_continuous_stream` dans `TrackMetadata` - Implémentation de la détection dans plusieurs fichiers : control_point.rs, media_server.rs, music_renderer/watcher.rs et openhome_client.rs - Utilisation de la fonction `is_continuous_stream_url` pour déterminer si l'URI correspond à un flux continu --- pmocontrol/src/control_point.rs | 1 + pmocontrol/src/media_server.rs | 3 +++ pmocontrol/src/model.rs | 3 +++ pmocontrol/src/music_renderer/watcher.rs | 5 +++++ pmocontrol/src/upnp_clients/openhome_client.rs | 5 +++++ 5 files changed, 17 insertions(+) diff --git a/pmocontrol/src/control_point.rs b/pmocontrol/src/control_point.rs index ba623286..a66658f6 100644 --- a/pmocontrol/src/control_point.rs +++ b/pmocontrol/src/control_point.rs @@ -1690,6 +1690,7 @@ fn playback_item_track_metadata(item: &PlaybackItem) -> TrackMetadata { track_number: None, creator: None, duration: None, + is_continuous_stream: crate::music_renderer::is_continuous_stream_url(&item.uri), }) } diff --git a/pmocontrol/src/media_server.rs b/pmocontrol/src/media_server.rs index 41bea3c5..e1e56e4d 100644 --- a/pmocontrol/src/media_server.rs +++ b/pmocontrol/src/media_server.rs @@ -556,6 +556,8 @@ pub fn playback_item_from_entry( let resource = resource.unwrap(); + let is_continuous_stream = crate::music_renderer::is_continuous_stream_url(&resource.uri); + let metadata = TrackMetadata { title: Some(entry.title.clone()), artist: entry.artist.clone(), @@ -566,6 +568,7 @@ pub fn playback_item_from_entry( track_number: entry.track_number.clone(), creator: entry.creator.clone(), duration: resource.duration.clone(), + is_continuous_stream, }; debug!( diff --git a/pmocontrol/src/model.rs b/pmocontrol/src/model.rs index a9aca196..1bd6dd7c 100644 --- a/pmocontrol/src/model.rs +++ b/pmocontrol/src/model.rs @@ -94,6 +94,9 @@ pub struct TrackMetadata { pub track_number: Option, pub creator: Option, pub duration: Option, + /// Indique si cette piste correspond à un flux continu (radio, stream) + /// plutôt qu'à un fichier avec une durée fixe + pub is_continuous_stream: bool, } #[derive(Clone, Debug, Copy)] diff --git a/pmocontrol/src/music_renderer/watcher.rs b/pmocontrol/src/music_renderer/watcher.rs index 30b2a523..3db2f178 100644 --- a/pmocontrol/src/music_renderer/watcher.rs +++ b/pmocontrol/src/music_renderer/watcher.rs @@ -156,6 +156,10 @@ pub fn extract_track_metadata(position: &PlaybackPositionInfo) -> Option Option Option { "Parsed DIDL metadata for track" ); + // Déterminer si c'est un stream continu à partir de l'URI + let uri = item.resources.first().map(|r| r.url.as_str()).unwrap_or(""); + let is_continuous_stream = crate::music_renderer::is_continuous_stream_url(uri); + Some(TrackMetadata { title: Some(item.title.clone()), artist: item.artist.clone(), @@ -964,6 +968,7 @@ pub fn parse_track_metadata_from_didl(xml: &str) -> Option { track_number: item.original_track_number.clone(), creator: item.creator.clone(), duration: item.resources.first().and_then(|r| r.duration.clone()), + is_continuous_stream, }) }