stream: interleave a random jingle every two songs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nemunaire 2026-07-03 00:17:34 +08:00
commit 3469b2680c
3 changed files with 36 additions and 1 deletions

View file

@ -49,4 +49,5 @@ services:
- "8000:8000" # flux HTTP : http://localhost:8000/radio.mp3
volumes:
- ./cache:/cache:ro # lecture seule : secours + résolution des chemins
- ./jingles:/jingles:ro # jingles intercalés toutes les 2 chansons
restart: unless-stopped

0
jingles/.gitkeep Normal file
View file

View file

@ -71,7 +71,41 @@ backup = playlist(
# fallback préfère la source principale et bascule sur le cache si elle n'a
# rien de prêt. track_sensitive=true : on ne coupe pas un morceau en cours.
radio = fallback(track_sensitive=true, [main, backup])
music = fallback(track_sensitive=true, [main, backup])
# --- Jingles : intercalés toutes les 2 chansons -----------------------------
# Le dossier /jingles (monté depuis ./jingles) est parcouru et lu au hasard.
# reload_mode="watch" : un jingle ajouté/retiré est pris en compte à chaud.
# Dossier vide → source jamais prête → le switch retombe simplement sur la
# musique, sans jingle et sans plantage.
jingles = playlist(
mode="randomize", reload_mode="watch", check_next=audio_only, "/jingles"
)
# On compte les morceaux de musique réellement diffusés : on_track ne se
# déclenche que sur la source effectivement tirée par le switch (les sources
# non sélectionnées ne sont pas consommées), donc les jingles ne comptent pas.
song_count = ref(0)
music = source.on_track(music, fun(_) -> song_count := song_count() + 1)
# Prédicat du switch : vrai quand 2 chansons ont été diffusées depuis le dernier
# jingle. Il remet le compteur à zéro au passage pour repartir sur un cycle neuf.
def time_for_jingle() =
if song_count() >= 2 then
song_count := 0
true
else
false
end
end
# switch track_sensitive : la décision est prise aux frontières de morceaux, on
# ne coupe donc jamais un titre. Si les jingles ne sont pas prêts (dossier vide),
# le switch enchaîne directement sur la musique.
radio = switch(
track_sensitive=true,
[(time_for_jingle, jingles), ({true}, music)]
)
# Transition douce entre les morceaux : fondu enchaîné de 3 s. La fin du
# morceau courant se fond dans le début du suivant.