#!/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 # loudgain (ReplayGain) and cue_file (Liquidsoap autocue) are optional. They # are not in the base image, so only run them if present -- otherwise skip # cleanly with a note instead of failing on a missing binary. Install them in # the image if you want ReplayGain/autocue tags written at prep time. if command -v loudgain >/dev/null 2>&1; then 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 else echo "[prep-audio] loudgain not installed, skipping ReplayGain" >>"$log" fi if command -v cue_file >/dev/null 2>&1; then 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" else echo "[prep-audio] cue_file not installed, skipping autocue tags" >>"$log" fi echo "${#files[@]}" }