From cc5ffc0133e0e9bc0be56ea435962268cf10350a Mon Sep 17 00:00:00 2001 From: Sli Date: Mon, 19 Jan 2026 23:01:47 +0100 Subject: [PATCH] =?UTF-8?q?L'oncle=20claude=20ce=20nulos=20il=20sait=20pas?= =?UTF-8?q?=20d=C3=A9terminenr=20combien=20de=20temps=20=C3=A7a=20dure=20u?= =?UTF-8?q?ne=20musique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- air-support/.gitignore | 1 + entrypoint.sh | 6 +++--- je_te_met_en_pls.py | 44 +++++++++++++++++++++++++++++++++--------- ultrasync.sh | 8 ++++++-- yt_sync.py | 4 ++-- 5 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 air-support/.gitignore diff --git a/air-support/.gitignore b/air-support/.gitignore new file mode 100644 index 0000000..02be15f --- /dev/null +++ b/air-support/.gitignore @@ -0,0 +1 @@ +*.pls \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh index 381d024..275bb32 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -2,11 +2,11 @@ touch /songs/playlist.pls /jingles/playlist.pls +# fallback +python /opt/je_te_met_en_pls.py /air-support + # Start background sync process /opt/ultrasync.sh & -# fallback -python /opt/je_te_met_en_pls.py /air-support /air-support/playlist.pls - # Run Liquidsoap as zambla user runuser -l zambla -c 'liquidsoap /opt/radio.liq' diff --git a/je_te_met_en_pls.py b/je_te_met_en_pls.py index 0ba0c25..af6c190 100755 --- a/je_te_met_en_pls.py +++ b/je_te_met_en_pls.py @@ -1,8 +1,36 @@ #!/usr/bin/env python3 -import glob, os, sys +import glob +import os +import sys +import subprocess +from pathlib import Path -def generate_pls(directory: str, output_file: str = None) -> None: +def get_song_length(file: Path) -> float: + ret = subprocess.run( + [ + "ffprobe", + "-i", + str(file.absolute()), + "-show_entries", + "format=duration", + "-v", + "quiet", + "-of", + "csv=p=0", + ], + stdout=subprocess.PIPE, + ) + if ret.returncode != 0: + return -1 + + try: + return float(ret.stdout) + except ValueError: + return -1 + + +def generate_pls(directory: str, output_file: str | None = None) -> None: """Generate a .pls playlist file from all audio files in a directory. Args: @@ -38,14 +66,12 @@ def generate_pls(directory: str, output_file: str = None) -> None: pls_content.append(f"NumberOfEntries={len(audio_files)}") pls_content.append("") - for idx, file_path in enumerate(audio_files, start=1): - # Get absolute path - abs_path = os.path.abspath(file_path) - filename = os.path.basename(file_path) + for idx, path in enumerate(audio_files, start=1): + file = Path(path) - pls_content.append(f"File{idx}={abs_path}") - pls_content.append(f"Title{idx}={filename}") - pls_content.append(f"Length{idx}=-1") + pls_content.append(f"File{idx}={file.absolute()}") + pls_content.append(f"Title{idx}={file.stem.replace('_', ' ')}") + pls_content.append(f"Length{idx}={get_song_length(file)}") pls_content.append("") pls_content.append("Version=2") diff --git a/ultrasync.sh b/ultrasync.sh index 58c5e7f..eb774bf 100644 --- a/ultrasync.sh +++ b/ultrasync.sh @@ -2,8 +2,12 @@ while true; do pip3 install -U yt-dlp - /opt/je_te_met_en_pls.py /songs /songs/playlist.pls || true - /opt/je_te_met_en_pls.py /jingles /jingles/playlist.pls || true + /opt/je_te_met_en_pls.py /songs || true + /opt/je_te_met_en_pls.py /jingles || true + /opt/yt_sync.py || true + + /opt/je_te_met_en_pls.py /songs || true + /opt/je_te_met_en_pls.py /jingles || true sleep 6h done diff --git a/yt_sync.py b/yt_sync.py index 4bfd0fb..75fa32a 100644 --- a/yt_sync.py +++ b/yt_sync.py @@ -11,7 +11,7 @@ if __name__ == "__main__": ydl_parameters = { "format": "bestaudio/best", "postprocessors": [{"key": "FFmpegExtractAudio", "preferredcodec": "vorbis"}], - "outtmpl": f"{songs_folder}/%(title)s.godwin", + "outtmpl": f"{songs_folder}/%(title)s", "ignoreerrors": True, "restrictfilenames": True, } @@ -23,7 +23,7 @@ if __name__ == "__main__": # Radio Bullshit Jingles ## change output path for Radio Bullshit jingles - ydl_parameters["outtmpl"] = f"{jingles_folder}/%(title)s.godwin" + ydl_parameters["outtmpl"] = f"{jingles_folder}/%(title)s" ## download ydl = yt_dlp.YoutubeDL(ydl_parameters) ydl.extract_info(