From 3469b2680c7d0827a4da6f5efbf7fc70a1441a65 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Fri, 3 Jul 2026 00:17:34 +0800 Subject: [PATCH] stream: interleave a random jingle every two songs Co-Authored-By: Claude Opus 4.8 --- docker-compose.yml | 1 + jingles/.gitkeep | 0 stream/radio.liq | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 jingles/.gitkeep diff --git a/docker-compose.yml b/docker-compose.yml index 286d4f3..76c1f99 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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 diff --git a/jingles/.gitkeep b/jingles/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/stream/radio.liq b/stream/radio.liq index 3e58526..5e1be77 100644 --- a/stream/radio.liq +++ b/stream/radio.liq @@ -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.