diff --git a/pmoapp/webapp/src/composables/useRenderers.ts b/pmoapp/webapp/src/composables/useRenderers.ts index b653bee7..703abbd0 100644 --- a/pmoapp/webapp/src/composables/useRenderers.ts +++ b/pmoapp/webapp/src/composables/useRenderers.ts @@ -183,6 +183,8 @@ function ensureSSEConnected() { snapshot.state.current_track.artist = event.artist; snapshot.state.current_track.album = event.album; snapshot.state.current_track.album_art_uri = event.album_art_uri; + // Important: Trigger reactivity en réassignant l'objet complet + snapshotState.snapshots.set(rendererId, { ...snapshot }); break; case "queue_updated": diff --git a/pmocontrol/src/music_renderer/musicrenderer.rs b/pmocontrol/src/music_renderer/musicrenderer.rs index 9baf701b..49389282 100644 --- a/pmocontrol/src/music_renderer/musicrenderer.rs +++ b/pmocontrol/src/music_renderer/musicrenderer.rs @@ -463,7 +463,18 @@ impl MusicRenderer { let changed = watched .position .as_ref() - .map(|prev| !playback_position_equal(prev, &position)) + .map(|prev| { + let equal = playback_position_equal(prev, &position); + if !equal { + tracing::trace!( + "MusicRenderer [{}]: Position changed - prev_rel_time={:?}, new_rel_time={:?}", + self.info.friendly_name(), + prev.rel_time, + position.rel_time + ); + } + !equal + }) .unwrap_or(true); if changed { @@ -943,27 +954,26 @@ impl MusicRenderer { } } - // Calculate rel_time from track_start_time if available (backend values are unreliable) - if let Some(start_time) = self.track_start_time() { - if let Ok(elapsed) = start_time.elapsed() { - let secs = elapsed.as_secs() as u32; - let hours = secs / 3600; - let minutes = (secs % 3600) / 60; - let seconds = secs % 60; - let new_rel_time = format!("{:02}:{:02}:{:02}", hours, minutes, seconds); - tracing::info!( - "MusicRenderer: Patching rel_time: backend={:?} -> calculated={} (elapsed={}s)", - position_info.rel_time, - new_rel_time, - secs - ); - position_info.rel_time = Some(new_rel_time); + // Pour les flux continus uniquement : calculer rel_time depuis track_start_time + // Pour les fichiers normaux : garder les valeurs du backend + let is_stream = self.is_playing_a_stream(); + if is_stream { + if let Some(start_time) = self.track_start_time() { + if let Ok(elapsed) = start_time.elapsed() { + let secs = elapsed.as_secs() as u32; + let hours = secs / 3600; + let minutes = (secs % 3600) / 60; + let seconds = secs % 60; + let new_rel_time = format!("{:02}:{:02}:{:02}", hours, minutes, seconds); + tracing::debug!( + "MusicRenderer [{}]: Stream - calculating rel_time from track_start_time: {} (elapsed={}s)", + self.info.friendly_name(), + new_rel_time, + secs + ); + position_info.rel_time = Some(new_rel_time); + } } - } else { - tracing::info!( - "MusicRenderer: No track_start_time, keeping backend rel_time={:?}", - position_info.rel_time - ); } Ok(position_info) diff --git a/pmocontrol/src/music_renderer/openhome_renderer.rs b/pmocontrol/src/music_renderer/openhome_renderer.rs index 4ddf3eac..ff05f0fb 100644 --- a/pmocontrol/src/music_renderer/openhome_renderer.rs +++ b/pmocontrol/src/music_renderer/openhome_renderer.rs @@ -369,15 +369,19 @@ impl PlaybackPosition for OpenHomeRenderer { Some(format_hhmmss_u32(time_info.duration_secs)) }; + let rel_time = format_hhmmss_u32(time_info.elapsed_secs); + tracing::trace!( - "OpenHome playback_position: duration_secs={}, track_duration={:?}", + "OpenHome playback_position: duration_secs={}, track_duration={:?}, elapsed_secs={}, rel_time={}", time_info.duration_secs, - track_duration + track_duration, + time_info.elapsed_secs, + rel_time ); Ok(PlaybackPositionInfo { track: track_id, - rel_time: Some(format_hhmmss_u32(time_info.elapsed_secs)), + rel_time: Some(rel_time), abs_time: None, track_duration, track_metadata: track_metadata_xml,