#!/usr/bin/env bash set -euo pipefail 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" fail() { echo "[upload_all.sh] ERROR: $*" >&2 exit 1 } 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 DB_PATH LOG_DIR PYTHON_BIN VENV_DIR OBJECT_BACKEND_NAME OBJECT_BUCKET OBJECT_ENDPOINT OBJECT_CREDENTIAL_ENV_PREFIX; 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 ACCESS_KEY_VAR="${OBJECT_CREDENTIAL_ENV_PREFIX}_ACCESS_KEY_ID" SECRET_KEY_VAR="${OBJECT_CREDENTIAL_ENV_PREFIX}_SECRET_ACCESS_KEY" require_var "${ACCESS_KEY_VAR}" require_var "${SECRET_KEY_VAR}" mkdir -p "${APP_HOME}/data" "${LOG_DIR}" "$(dirname "${DB_PATH}")" export PYTHONPATH="${APP_HOME}/app${PYTHONPATH:+:${PYTHONPATH}}" LOG_FILE="${LOG_DIR}/upload_all_$(date +%Y%m%d_%H%M%S).log" exec > >(tee -a "${LOG_FILE}") 2>&1 echo "[upload_all.sh] logging to ${LOG_FILE}" REGISTER_ARGS=( -m musicdl.catalogsync.cli register-object-backend --db "${DB_PATH}" --backend "${OBJECT_BACKEND_NAME}" --bucket "${OBJECT_BUCKET}" --endpoint "${OBJECT_ENDPOINT}" --credential-env-prefix "${OBJECT_CREDENTIAL_ENV_PREFIX}" ) if [[ -n "${OBJECT_REGION:-}" ]]; then REGISTER_ARGS+=(--region "${OBJECT_REGION}") fi if [[ -n "${OBJECT_BASE_PREFIX:-}" ]]; then REGISTER_ARGS+=(--base-prefix "${OBJECT_BASE_PREFIX}") fi if [[ -n "${OBJECT_ADDRESSING_STYLE:-}" ]]; then REGISTER_ARGS+=(--addressing-style "${OBJECT_ADDRESSING_STYLE}") fi if [[ -n "${OBJECT_PUBLIC_BASE_URL:-}" ]]; then REGISTER_ARGS+=(--public-base-url "${OBJECT_PUBLIC_BASE_URL}") fi "${PYTHON_BIN}" "${REGISTER_ARGS[@]}" UPLOAD_ARGS=( -m musicdl.catalogsync.cli upload --db "${DB_PATH}" --backend "${OBJECT_BACKEND_NAME}" --workers "${UPLOAD_WORKERS:-4}" ) if [[ -n "${UPLOAD_SOURCES:-}" ]]; then UPLOAD_ARGS+=(--sources "${UPLOAD_SOURCES}") fi if [[ -n "${UPLOAD_PLAYLIST_IDS:-}" ]]; then UPLOAD_ARGS+=(--playlist-ids "${UPLOAD_PLAYLIST_IDS}") fi if [[ -n "${UPLOAD_LIMIT:-}" ]]; then UPLOAD_ARGS+=(--limit "${UPLOAD_LIMIT}") fi "${PYTHON_BIN}" "${UPLOAD_ARGS[@]}" "$@"