feat(wizard): prompt for MusicBrainz/AcoustID contact email

Replace the hardcoded MUSICBRAINZ_USER_AGENT placeholder in env.template
with an optional MUSICBRAINZ_OWNER_EMAIL prompt in step_enrichment.
The backend now composes a valid User-Agent from app name + version +
this email (falling back to the project URL if left blank).
This commit is contained in:
Senko-san
2026-06-11 00:40:00 +03:00
parent 7da5c4a15e
commit 4108121984
6 changed files with 17 additions and 1 deletions
+3
View File
@@ -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() {
+2
View File
@@ -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)"
+2
View File
@@ -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]="Сводка (секреты скрыты)"
+9
View File
@@ -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"
}
+1
View File
@@ -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; }; }
-1
View File
@@ -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@