#!/usr/bin/env bash set -euo pipefail fail() { echo "[download_from_file.sh] ERROR: $*" >&2 exit 1 } if [[ $# -lt 1 ]]; then fail "usage: $0 [extra args...]" fi PLAYLIST_FILE="$1" shift SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" APP_HOME="$(cd "${SCRIPT_DIR}/.." && pwd)" CONFIG_FILE="${APP_HOME}/config/catalogsync.env" # shellcheck source=./load_env.sh source "${SCRIPT_DIR}/load_env.sh" if [[ ! -f "${PLAYLIST_FILE}" ]]; then fail "playlist file not found: ${PLAYLIST_FILE}" fi require_var() { local var_name="$1" if [[ -z "${!var_name:-}" ]]; then fail "Missing required config variable: ${var_name} (from ${CONFIG_FILE})" fi } if [[ -f "${CONFIG_FILE}" ]]; then load_env_file "${CONFIG_FILE}" else fail "Config file not found: ${CONFIG_FILE}. Copy catalogsync.env.example to catalogsync.env first." fi for required_var in LIBRARY_DIR DB_PATH INPUT_DIR LOG_DIR PYTHON_BIN VENV_DIR; do require_var "${required_var}" done if [[ -n "${VENV_DIR:-}" && -x "${VENV_DIR}/bin/python" ]]; then PYTHON_BIN="${VENV_DIR}/bin/python" fi if ! command -v "${PYTHON_BIN}" >/dev/null 2>&1; then fail "PYTHON_BIN is not executable or not found in PATH: ${PYTHON_BIN}" fi mkdir -p "${LIBRARY_DIR}" "${APP_HOME}/data" "${INPUT_DIR}" "${LOG_DIR}" "$(dirname "${DB_PATH}")" export PYTHONPATH="${APP_HOME}/app${PYTHONPATH:+:${PYTHONPATH}}" LOG_FILE="${LOG_DIR}/download_from_file_$(date +%Y%m%d_%H%M%S).log" exec > >(tee -a "${LOG_FILE}") 2>&1 echo "[download_from_file.sh] logging to ${LOG_FILE}" EXTRA_ARGS=() if [[ -n "${DOWNLOAD_SOURCES:-}" ]]; then EXTRA_ARGS+=(--download-sources "${DOWNLOAD_SOURCES}") fi "${PYTHON_BIN}" -m musicdl.catalogsync.cli run \ --db "${DB_PATH}" \ --library-root "${LIBRARY_DIR}" \ --playlist-file "${PLAYLIST_FILE}" \ "${EXTRA_ARGS[@]}" \ "$@"