diff --git a/deploy.sh b/deploy.sh index c6c6f3d..8a534ad 100755 --- a/deploy.sh +++ b/deploy.sh @@ -38,6 +38,7 @@ CFG_PUBLIC_API_BASE_URL="/api/v1" CFG_ADMIN_CREATE="no"; CFG_ADMIN_USER=""; CFG_ADMIN_PASS="" CFG_ML_URL="" CFG_ACOUSTID_KEY="" +CFG_MUSICBRAINZ_OWNER_EMAIL="" CFG_JWT_SECRET="" # ========================================================================== @@ -190,6 +191,8 @@ step_enrichment() { ui_title "$(t step_enrichment)" ui_dim "$(t enrichment_note)" ui_input "$(t acoustid_prompt)" "" ""; CFG_ACOUSTID_KEY="$UI_VALUE" + ui_dim "$(t musicbrainz_note)" + ui_input "$(t musicbrainz_email_prompt)" "" v_email_opt; CFG_MUSICBRAINZ_OWNER_EMAIL="$UI_VALUE" } access_url() { diff --git a/i18n/en.sh b/i18n/en.sh index 5e5568c..b21b34e 100644 --- a/i18n/en.sh +++ b/i18n/en.sh @@ -103,6 +103,8 @@ MSG[ml_prompt]="ML service URL (leave blank — backend degrades gracefully)" MSG[step_enrichment]="Metadata enrichment (optional)" MSG[enrichment_note]="Imported files are auto-tagged from their embedded tags. Add an AcoustID key to also identify untagged files by audio fingerprint (free: https://acoustid.org/new-application)." MSG[acoustid_prompt]="AcoustID API key (leave blank to use embedded tags only)" +MSG[musicbrainz_note]="MusicBrainz/AcoustID require a contact email in their User-Agent or they may throttle requests." +MSG[musicbrainz_email_prompt]="Contact email for MusicBrainz/AcoustID (leave blank to use the project's default)" # -- summary / run --------------------------------------------------------- MSG[summary_title]="Summary (secrets hidden)" diff --git a/i18n/ru.sh b/i18n/ru.sh index 348be57..3a1fb0e 100644 --- a/i18n/ru.sh +++ b/i18n/ru.sh @@ -103,6 +103,8 @@ MSG[ml_prompt]="URL ML-сервиса (оставьте пустым — backend MSG[step_enrichment]="Обогащение метаданных (опционально)" MSG[enrichment_note]="Импортируемые файлы тегируются из встроенных тегов. Добавьте ключ AcoustID, чтобы опознавать файлы без тегов по аудио-отпечатку (бесплатно: https://acoustid.org/new-application)." MSG[acoustid_prompt]="API-ключ AcoustID (пусто — только встроенные теги)" +MSG[musicbrainz_note]="MusicBrainz/AcoustID требуют контактный email в User-Agent, иначе запросы могут ограничиваться (throttling)." +MSG[musicbrainz_email_prompt]="Контактный email для MusicBrainz/AcoustID (пусто — использовать значение по умолчанию)" # -- summary / run --------------------------------------------------------- MSG[summary_title]="Сводка (секреты скрыты)" diff --git a/lib/env_gen.sh b/lib/env_gen.sh index 08ea16f..a620ed1 100644 --- a/lib/env_gen.sh +++ b/lib/env_gen.sh @@ -84,5 +84,14 @@ generate_env() { } >>"$ENV_FILE" fi + # -- MusicBrainz/AcoustID contact (required by their usage policy) ---- + if [[ -n "${CFG_MUSICBRAINZ_OWNER_EMAIL:-}" ]]; then + { + echo "" + echo "# -- MusicBrainz/AcoustID contact ----------------------------------------" + echo "MUSICBRAINZ_OWNER_EMAIL=${CFG_MUSICBRAINZ_OWNER_EMAIL}" + } >>"$ENV_FILE" + fi + chmod 600 "$ENV_FILE" } diff --git a/lib/ui.sh b/lib/ui.sh index ff760aa..62a390f 100644 --- a/lib/ui.sh +++ b/lib/ui.sh @@ -132,3 +132,4 @@ v_port() { [[ "$1" =~ ^[0-9]+$ ]] && (($1 >= 1 && $1 <= 65535)) || { ui_warn v_url() { [[ "$1" =~ ^https?:// ]] || { ui_warn "$(t invalid_input)"; return 1; }; } v_redis() { [[ "$1" =~ ^rediss?:// ]] || { ui_warn "$(t invalid_input)"; return 1; }; } v_domain() { [[ "$1" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]] || { ui_warn "$(t invalid_input)"; return 1; }; } +v_email_opt() { [[ -z "$1" || "$1" =~ ^[^[:space:]@]+@[^[:space:]@]+\.[a-zA-Z]{2,}$ ]] || { ui_warn "$(t invalid_input)"; return 1; }; } diff --git a/templates/env/env.template b/templates/env/env.template index e5df296..74f3959 100644 --- a/templates/env/env.template +++ b/templates/env/env.template @@ -33,7 +33,6 @@ STORAGE_BACKEND=@STORAGE_BACKEND@ # Browser-facing API base URL. Injected into the webui at container start # (window.__APP_CONFIG__). '/api/v1' = same-origin behind the reverse proxy. PUBLIC_API_BASE_URL=@PUBLIC_API_BASE_URL@ -MUSICBRAINZ_USER_AGENT=mcma-backend/0.1.0 ( https://github.com/your/repo ) # -- published ports ------------------------------------------------------ HTTP_PORT=@HTTP_PORT@