#!/bin/bash # regen.sh — regenerate per-playlist sldl configs from _template.conf. # # Source of truth is $ALEMBIC_CONFIG_DIR/pipeline/playlists.json, written by # the alembic app's playlist_service whenever a playlist is added/edited/ # removed via the UI. This script never edits that source of truth — it only # renders it. Run automatically by the app before each playlist sync, or # manually: regen.sh # # playlists.json shape: a JSON array of objects, each with at least # {"name": "...", "spotify_url": "...", "active": true, "no_m3u": false}. # Inactive playlists still get a .conf rendered (so a manual run is always # possible) but are skipped by the scheduler. set -euo pipefail ALEMBIC_CONFIG_DIR="${ALEMBIC_CONFIG_DIR:-/config}" MUSIC_DATA_DIR="${MUSIC_DATA_DIR:-/data/music}" PIPELINE_DIR="${PIPELINE_DIR:-/app/pipeline}" CONFIG_OUT_DIR="$ALEMBIC_CONFIG_DIR/pipeline" PLAYLISTS_JSON="$CONFIG_OUT_DIR/playlists.json" TEMPLATE="$PIPELINE_DIR/configs/_template.conf" SLDL_DROPBOX_ROOT="$MUSIC_DATA_DIR/sldl-dropbox" if [[ ! -f "$PLAYLISTS_JSON" ]]; then echo "ERROR: $PLAYLISTS_JSON not found — nothing to regenerate." >&2 echo " This file is written by the alembic app; run its playlist" >&2 echo " import/seed step first if this is a fresh setup." >&2 exit 1 fi mkdir -p "$CONFIG_OUT_DIR" # One "namespotify_url" line per playlist, active or not (see header). python3 -c " import json, sys with open(sys.argv[1]) as f: playlists = json.load(f) for p in playlists: print(p['name'] + '\t' + p['spotify_url']) " "$PLAYLISTS_JSON" | while IFS=$'\t' read -r name url; do [[ -z "$name" ]] && continue sed -e "s|PLAYLIST_NAME|${name}|g" \ -e "s|SPOTIFY_URL|${url}|g" \ -e "s|SLDL_DROPBOX_ROOT|${SLDL_DROPBOX_ROOT}|g" \ "$TEMPLATE" > "$CONFIG_OUT_DIR/${name}.conf" echo "Generated $CONFIG_OUT_DIR/${name}.conf" done