From 96ee5688404f273fa52fa995e3a14b9bbc886935 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Nov 2025 09:54:42 +0000 Subject: [PATCH] Fix critical bug: send TrackBoundary before first audio chunk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrige un bug critique qui empêchait la mise en cache des covers : - RadioParadiseStreamSource envoie maintenant un TrackBoundary pour la première song IMMÉDIATEMENT après le TopZeroSync, AVANT le premier chunk audio - Cela garantit que FlacCacheSink reçoit les métadonnées (incluant cover_url) dès le début du traitement Le problème : - Avant, le TrackBoundary n'était envoyé que quand elapsed_ms >= song.elapsed - Pour la première song avec elapsed > 0, le TrackBoundary arrivait APRÈS plusieurs chunks audio - FlacCacheSink recevait le premier chunk SANS métadonnées - Quand le prebuffer se terminait, track_metadata était None - Les métadonnées (incluant cover_url) n'étaient jamais copiées dans le cache - Résultat : aucune cover n'était mise en cache La solution : - Envoyer explicitement un TrackBoundary pour la première song avant de commencer la boucle de chunks - Les songs suivantes continuent d'être gérées par la logique existante Test validé : ✓ RadioParadiseStreamSource configure cover_url correctement ✓ FlacCacheSink reçoit cover_url ✓ Les covers sont téléchargées et mises en cache ✓ Les logs montrent : "Successfully cached cover for pk ... with cover pk ..." --- .../src/radio_paradise_stream_source.rs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/pmoparadise/src/radio_paradise_stream_source.rs b/pmoparadise/src/radio_paradise_stream_source.rs index 0eb9e1af..1ab23f11 100644 --- a/pmoparadise/src/radio_paradise_stream_source.rs +++ b/pmoparadise/src/radio_paradise_stream_source.rs @@ -124,7 +124,6 @@ impl RadioParadiseStreamSourceLogic { // Préparer les songs ordonnées pour tracking let songs = block.songs_ordered(); let mut song_index = 0; - let mut next_song: Option<(usize, &Song)> = songs.get(0).copied(); let mut total_samples = 0u64; tracing::debug!("Block has {} songs", songs.len()); @@ -136,7 +135,25 @@ impl RadioParadiseStreamSourceLogic { segment: pmoaudio::_AudioSegment::Sync(Arc::new(SyncMarker::TopZeroSync)), }); self.send_to_children(output, top_zero).await?; - tracing::debug!("TopZeroSync sent, starting audio chunk loop"); + tracing::debug!("TopZeroSync sent"); + + // Envoyer TrackBoundary pour la première song AVANT le premier chunk + // Cela garantit que FlacCacheSink reçoit les métadonnées dès le début + let mut next_song: Option<(usize, &Song)> = if let Some((_idx, song)) = songs.get(0).copied() { + tracing::debug!("Sending TrackBoundary for first song before audio chunks"); + let metadata = song_to_metadata(song, block).await; + let track_boundary = AudioSegment::new_track_boundary( + *order, + 0.0, // timestamp = 0 au début du bloc + metadata, + ); + self.send_to_children(output, track_boundary).await?; + song_index = 1; + songs.get(1).copied() // Passer à la song suivante + } else { + None + }; + tracing::debug!("Starting audio chunk loop"); // Buffer pour lecture