stream: interleave a random jingle every two songs
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
1f6937f22c
commit
3469b2680c
3 changed files with 36 additions and 1 deletions
|
|
@ -49,4 +49,5 @@ services:
|
||||||
- "8000:8000" # flux HTTP : http://localhost:8000/radio.mp3
|
- "8000:8000" # flux HTTP : http://localhost:8000/radio.mp3
|
||||||
volumes:
|
volumes:
|
||||||
- ./cache:/cache:ro # lecture seule : secours + résolution des chemins
|
- ./cache:/cache:ro # lecture seule : secours + résolution des chemins
|
||||||
|
- ./jingles:/jingles:ro # jingles intercalés toutes les 2 chansons
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
|
||||||
0
jingles/.gitkeep
Normal file
0
jingles/.gitkeep
Normal file
|
|
@ -71,7 +71,41 @@ backup = playlist(
|
||||||
|
|
||||||
# fallback préfère la source principale et bascule sur le cache si elle n'a
|
# 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.
|
# 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
|
# Transition douce entre les morceaux : fondu enchaîné de 3 s. La fin du
|
||||||
# morceau courant se fond dans le début du suivant.
|
# morceau courant se fond dans le début du suivant.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue