#!/usr/bin/env bash # Sides are encoded individually — no concatenation. Idempotent: a side is # skipped if its output is newer than its source. set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" MANIFEST="${MANIFEST:-$REPO_ROOT/content/audio.yaml}" RAW_DIR="${RAW_DIR:-$REPO_ROOT/content/audio}" OUT_DIR="${OUT_DIR:-$REPO_ROOT/web/static/audio}" for tool in yq ffmpeg; do if ! command -v "$tool" >/dev/null; then echo "error: $tool not in PATH (try: nix develop)" >&2 exit 1 fi done if [[ ! -f "$MANIFEST" ]]; then echo "error: manifest not found: $MANIFEST" >&2 exit 1 fi mkdir -p "$OUT_DIR" DEFAULT_BITRATE=$(yq -r '.defaults.bitrate // "64k"' "$MANIFEST") DEFAULT_CHANNELS=$(yq -r '.defaults.channels // "2"' "$MANIFEST") DEFAULT_RATE=$(yq -r '.defaults.sample_rate // "48000"' "$MANIFEST") encoded=0 skipped=0 missing=0 failed=0 NUM_ARTISTS=$(yq '.artists | length' "$MANIFEST") for ((a=0; a src_mt )); then printf ' %-50s up to date\n' "$OUT_NAME" skipped=$((skipped + 1)) continue fi fi printf ' %-50s encoding ...\n' "$OUT_NAME" if ffmpeg \ -i "$SRC_PATH" \ -c:a libopus -b:a "$BITRATE" -ac "$CHANNELS" -ar "$RATE" \ -application audio -vbr on -compression_level 10 \ -y "$OUT_PATH" \ -hide_banner -loglevel warning -nostdin &2 failed=$((failed + 1)) fi done done done printf '\n%d encoded · %d up-to-date · %d missing sources · %d failed\n' \ "$encoded" "$skipped" "$missing" "$failed" if (( failed > 0 )); then exit 1 fi