#!/bin/bash # ${PIPELINE_DIR:-/app/pipeline}/lib/prep-audio.sh # # Shared helper sourced by run-playlist.sh and import-track.sh. # Pre-tags newly-arrived audio with ReplayGain (loudgain, track-mode) and # Liquidsoap autocue tags (cue_file from Moonbase59/autocue) before beets # ingests them, so AzuraCast sees fully-prepped files the moment they land # in /music. # # Usage: prep_audio # Returns: number of files processed (via stdout) prep_audio() { local scan_dir="$1" local log="$2" local files=() while IFS= read -r -d '' f; do files+=("$f") done < <(find "$scan_dir" -type f \ \( -iname "*.flac" -o -iname "*.mp3" -o -iname "*.m4a" \ -o -iname "*.ogg" -o -iname "*.opus" \) -print0) if [[ ${#files[@]} -eq 0 ]]; then echo 0 return 0 fi echo "[prep-audio] loudgain (track-mode RG, clip-safe) on ${#files[@]} file(s)" >>"$log" # -q quiet, -k lower track gain to avoid clipping >-1 dBFS, # -s e write extended ReplayGain2 + R128 tags, -I 4 ID3v2.4 for MP3. # No -a, so each file gets its own track gain (track-mode). if ! loudgain -q -k -s e -I 4 "${files[@]}" >>"$log" 2>&1; then echo "[prep-audio] loudgain returned non-zero (see log)" >>"$log" fi echo "[prep-audio] cue_file (autocue liq_* tags) on ${#files[@]} file(s)" >>"$log" # -w write tags into file, -k true-peak clipping prevention. # Skips files that already have liq_cue_file=true (use -f to force). local failed=0 for f in "${files[@]}"; do if ! cue_file -w -k "$f" >>"$log" 2>&1; then echo "[prep-audio] cue_file failed on $f" >>"$log" failed=$((failed + 1)) fi done [[ $failed -gt 0 ]] && echo "[prep-audio] cue_file errors: $failed" >>"$log" echo "${#files[@]}" }