Fix critical bug: send TrackBoundary before first audio chunk

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 ..."
This commit is contained in:
Claude
2025-11-09 09:54:42 +00:00
parent 56abb68c0d
commit 96ee568840

View File

@@ -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