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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user