Débugage de la WebUI non complètement convaincants.

This commit is contained in:
2025-12-05 22:31:35 +01:00
parent 27aa70d81f
commit 4d79c6d883
13 changed files with 269 additions and 35 deletions

View File

@@ -697,6 +697,14 @@ impl ControlPoint {
.ok_or_else(|| Self::runtime_entry_missing(renderer_id))
}
/// Retourne les métadonnées courantes depuis le snapshot en mémoire
pub fn get_current_track_metadata(
&self,
renderer_id: &RendererId,
) -> Option<TrackMetadata> {
self.runtime.current_track_metadata(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
@@ -713,6 +721,11 @@ impl ControlPoint {
renderer.openhome_playlist_snapshot()
}
pub fn get_openhome_playlist_len(&self, renderer_id: &RendererId) -> anyhow::Result<usize> {
let renderer = self.openhome_renderer(renderer_id)?;
renderer.openhome_playlist_len()
}
pub fn clear_openhome_playlist(&self, renderer_id: &RendererId) -> anyhow::Result<()> {
let renderer = self.openhome_renderer(renderer_id)?;
renderer.openhome_playlist_clear()?;
@@ -1211,10 +1224,13 @@ impl ControlPoint {
}
let renderer = self.openhome_renderer(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));
// Get the last track ID from the OpenHome native playlist
// This ensures we append to the end of the actual playlist, not just our local queue
let mut after_id = renderer
.openhome_playlist_ids()
.ok()
.and_then(|ids| ids.last().copied());
for item in items.iter() {
let metadata = item.to_didl_metadata();
@@ -1227,10 +1243,33 @@ impl ControlPoint {
}
fn play_current_openhome(&self, renderer_id: &RendererId) -> anyhow::Result<()> {
let renderer = self.openhome_renderer(renderer_id)?;
// Pour les renderers OpenHome, vérifier d'abord si la playlist native a des pistes
// Cela couvre le cas où l'utilisateur a ajouté des morceaux directement via l'interface OpenHome
let native_playlist_len = renderer.openhome_playlist_len().unwrap_or(0);
if native_playlist_len > 0 {
// La playlist native a des pistes, on peut simplement appeler play()
// Cela reprendra la lecture à partir du morceau actuel (ou du premier si rien n'est en cours)
renderer.play()?;
self.runtime
.set_playback_source(renderer_id, PlaybackSource::FromQueue);
self.sync_openhome_playlist_for(renderer_id)?;
info!(
renderer = renderer_id.0.as_str(),
playlist_len = native_playlist_len,
"Started OpenHome native playlist playback"
);
return Ok(());
}
// Fallback: utiliser la PlaybackQueue locale si la playlist native est vide
// (ce cas se produit quand on a enqueue des items via le control point)
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"
"OpenHome playlist is empty or no current item (both native and queue)"
);
self.runtime
.set_playback_source(renderer_id, PlaybackSource::None);
@@ -1239,14 +1278,13 @@ impl ControlPoint {
let track_id = openhome_track_id_from_item(&item)
.ok_or_else(|| anyhow!("Current OpenHome item has no track id"))?;
let renderer = self.openhome_renderer(renderer_id)?;
renderer.openhome_playlist_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)"
track_id, "Started OpenHome playlist playback (current item from queue)"
);
Ok(())
}
@@ -1387,6 +1425,13 @@ impl RuntimeState {
entries.get(id).map(|entry| entry.queue.full_snapshot())
}
fn current_track_metadata(&self, id: &RendererId) -> Option<TrackMetadata> {
let entries = self.entries.lock().unwrap();
entries
.get(id)
.and_then(|entry| entry.snapshot.last_metadata.clone())
}
fn dequeue_next(&self, id: &RendererId) -> Option<(PlaybackItem, usize)> {
let mut entries = self.entries.lock().unwrap();
let entry = entries.get_mut(id)?;
@@ -1747,6 +1792,7 @@ fn playback_item_from_entry(server: &MusicServer, entry: &MediaEntry) -> Option<
item.date = entry.date.clone();
item.track_number = entry.track_number.clone();
item.creator = entry.creator.clone();
item.protocol_info = Some(resource.protocol_info.clone());
Some(item)
}
@@ -2788,6 +2834,13 @@ fn extract_track_metadata(position: &PlaybackPositionInfo) -> Option<TrackMetada
}
};
debug!(
title = item.title.as_str(),
has_album_art = item.album_art.is_some(),
album_art_uri = item.album_art.as_deref(),
"Extracted metadata from position info"
);
Some(TrackMetadata {
title: Some(item.title.clone()),
artist: item.artist.clone(),