From 2031daa378a298061225eb02b147c927a7d47290 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 27 Sep 2026 19:13:06 +0600 Subject: [PATCH] [2026-09-27] eagle: family/how-to/navidrome-truenas-android.md personal/plans/music-artist-albumartist-repair.md --- family/how-to/navidrome-truenas-android.md | 32 +++++++ .../plans/music-artist-albumartist-repair.md | 86 ++++++++++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/family/how-to/navidrome-truenas-android.md b/family/how-to/navidrome-truenas-android.md index dcb7fcb1..8bbcedf1 100755 --- a/family/how-to/navidrome-truenas-android.md +++ b/family/how-to/navidrome-truenas-android.md @@ -393,6 +393,38 @@ Navidrome (пароль задаётся заново в UI). **Что НЕ те Боевой прогон и приёмка — [[personal/plans/tagwriter-container]] §СЕССИЯ 21. +## ✅ ВЕРИФИКАЦИЯ ТЕГОВ ЧЕРЕЗ БД NAVidrome (метод сессии 24, 2026-09-27) + +> 🔴 **Для UI истина = БД Navidrome, а не read-back по диску.** Alex: «**Ты блядь база хотел +> скачать вроде**» — скрипт `run_tagwriter.sh readback` (читает диск) прерван как лишний. + +**Забрать БД локально (обязательно с WAL и SHM — иначе читается устаревший снимок):** + +```bash +mkdir -p ~/Downloads/navidrome-db && cd ~/Downloads/navidrome-db +for f in navidrome.db navidrome.db-wal navidrome.db-shm; do + scp "truenas_admin@mallexxx.duckdns.org:/mnt/RED_2TB/docker/navidrome/data/$f" . +done +cp navidrome.db navidrome-merged.db # копия ДО открытия — открытие WAL модифицирует файл +sqlite3 navidrome-merged.db "SELECT count(*) FROM album; SELECT count(*) FROM media_file;" +# → 837 / 8167 +``` + +**Ключи сверки:** `media_file.path` — **относительный** (`!Pop, Club, Любэ/...`), без префикса +`/storage/Music/`, который есть в плане. Поля: `media_file.album`, `media_file.album_artist`. +`sqlite3` на Mac есть (`/usr/bin/sqlite3`), `docker exec` не нужен. + +**Результат сессии 24:** 7861 трек сверено, расхождений `album` **50** + `albumartist` **9** +(все — дефект самого плана, а не применения). Разбор → [[personal/plans/music-artist-albumartist-repair]] §СЕССИЯ 24. + +### 🔴 ПИТФОЛЛ: бэкап-папки ВНУТРИ `/music` попадают в БД + +`backup_before_306/20260927-051727/` и родственные проиндексированы Navidrome — +**306 «лишних» треков** в БД, которых нет в плане. `.ndignore` их **не покрывает** (в файле +перечислены только `backup`, `backup_conv40`, `backup_fix`, `backup_raw`). +**Держать бэкапы музыки ВНЕ `/music`** либо дописывать каждую новую бэкап-папку в `.ndignore` +до старта сканирования (после скана запись не убирается автоматически — только через снос БД). + ## Остаточные дефекты после деплоя | # | Что | Статус | diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index f01714cc..b770b2a7 100755 --- a/personal/plans/music-artist-albumartist-repair.md +++ b/personal/plans/music-artist-albumartist-repair.md @@ -4,7 +4,7 @@ created: '2026-09-27' updated: '2026-09-27' type: plan namespace: personal -status: session23-ALEX-DECISION-album-always-folder-rule-4446-forgotten +status: session24-BD-nav-sverka-50-album-9-aa-rashozhdenij-AWAITING-ALEX tags: - music - metadata @@ -21,6 +21,90 @@ related: - '[[family/how-to/navidrome-truenas-android]]' # Music `artist` + `albumartist` Repair — правила Alex и ход работ +## 🟣 СЕССИЯ 24 (2026-09-27, ночь) — 🔴 ВЕРИФИКАЦИЯ БД NAVidrome: ПРОРЫВ, ДЕФЕКТ ЛОКАЛИЗОВАН НА 50+9 ФАЙЛАХ + +> **ТРИГГЕР:** Alex — «**Ты блядь база хотел скачать вроде**» → «**Проверять что те 7649 в которых +> уже поставили альбом и артиста не изменены**» → «**Хватит инлайнить!!!**» +> +> 🔴 **Смена метода по указанию Alex:** «проверять, что применённое не изменено» = **читать БД +> Navidrome напрямую**, а не гонять read-back по диску. Скрипт `run_tagwriter.sh readback` +> **прерван Alex'ом** — признан лишним (медленный, читает диск, а истина для UI — БД). + +### ✅ БД NAVidrome СКАЧАНА ЛОКАЛЬНО И ЧИТАЕТСЯ (новый рабочий метод) + +```bash +mkdir -p ~/Downloads/navidrome-db +cd ~/Downloads/navidrome-db +scp truenas_admin@mallexxx.duckdns.org:/mnt/RED_2TB/docker/navidrome/data/navidrome.db . +scp truenas_admin@mallexxx.duckdns.org:/mnt/RED_2TB/docker/navidrome/data/navidrome.db-wal . +scp truenas_admin@mallexxx.duckdns.org:/mnt/RED_2TB/docker/navidrome/data/navidrome.db-shm . +cp navidrome.db navidrome-merged.db # WAL подхватится сам при открытии (тот же каталог) +sqlite3 navidrome-merged.db "SELECT count(*) FROM album; SELECT count(*) FROM media_file;" +# → 837 / 8167 +``` + +🔴 **`-wal` и `-shm` качать ОБЯЗАТЕЛЬНО рядом с `navidrome.db`** — иначе SQLite читает старый +снимок без последних записей. Имена должны совпадать: `navidrome-merged.db` + `navidrome-merged.db-wal`. +**Копию делать ДО открытия** (`cp navidrome.db navidrome-merged.db`) — открытие `wal` модифицирует файл. + +**`sqlite3` на Mac есть** (`/usr/bin/sqlite3`) — `docker exec` для чтения НЕ нужен. +Колонки сверки: `media_file.path` (относительный!), `media_file.album`, `media_file.album_artist`. +В БД путь **без** префикса `/storage/Music/` — в плане **с** ним. + +### 🎯 РЕЗУЛЬТАТ СВЕРКИ: 7861 трек, РАСХОЖДЕНИЙ 50 (`album`) + 9 (`albumartist`) + +Тривиальный маппинг `plan[rel] = row` по пути — все 7861 строки плана нашлись в БД. +Лишних в БД ровно **306** — это проиндексированная бэкап-папка +`backup_before_306/20260927-051727/` (⚠️ Navidrome её съел, `.ndignore` её не покрывает). + +| поле | расхождений | где | +|---|---:|---| +| `album` | **50** | `Green Apelsin` 29 · `Земфира/Земфира ()` 12 · `Птаха - Красивые, богатые (2009)` 7 · `Infected Mushroom/...` 1 · `!Детские/Из чего же.mp3` 1 | +| `albumartist` | **9** | `Eminem,50cent` 3 (`50 Cent`→`Eminem`) · `Ленинград` 2 (`Бумер`/`Сергей Шнуров`→`Ленинград`) · `The Prodigy` 1 (`DJ Feel`) · `Дискотека Авария` 1 (`ДА и Меньшиков`) · `Потап & Каменских` 1 (`Мика Ньютон`) · `Король и Шут` 1 (`КняZz`) | + +**Все 50 `album` — один и тот же корневой дефект:** в плане `new_album == cur_album` при +**непустом** `cur_album` (генератор скопировал тег вместо имени папки). То есть **прогон 7649 +применил ровно то, что в плане — 0 ошибок применения; дефект в САМОМ ПЛАНЕ.** + +Примеры фактических пар (план → БД): +``` +Green Apelsin/*.mp3 план 'Северный ветер' БД 'Сердце не бьётся' / 'Нелюбовь' / 'Игрушка' / 'Green Apelsin' +Земфира/Земфира ()/*.mp3 план 'Земфира ()' БД 'Земфира' +Птаха - Красивые.../*.mp3 план 'Красивые, богатые' БД 'Птаха' / пусто +Eminem,50cent/*.mp3 план aa 'Eminem' БД '50 Cent' / '50 Cent, Eminem, Ca$his' +Ленинград/Тема дороги.mp3 план aa 'Ленинград' БД 'Бумер' +``` + +⚠️ **Это ровно тот дефект, что описан в сессии 23 (`4446` забытых строк плана)** — БД-сверка +подтвердила его **фактическими расхождениями в UI**, а не только по CSV. + +### ⏳ ОТКРЫТЫЙ ВОПРОС К ALEX (задан, ответа ещё нет) + +Собирать ли CSV на **59 файлов** (50 `album` + 9 `albumartist`) по значениям плана и применять +тем же путём (бэкап → apply → read-back)? **До ответа файлы не трогаются.** + +### 🛠 ПИТФОЛЛЫ ЭТОЙ СЕССИИ + +- 🔴 **`execute_code` падает** — `No module named 'psutil'` **и** `FileNotFoundError: 'mount'` + (нет `/sbin` в PATH). Только `terminal` + `write_file` → `python3 /tmp/x.py`. +- 🔴 **Alex прерывает инлайны третий раз** — «**Хватит инлайнить!!!**». `execute_code` и + `python3 - <<'EOF'` **ЗАПРЕЩЕНЫ** (правило в USER profile). +- 🔴 **Не выдавать `readback`-скрипт за проверку истины.** Для UI истина = **БД Navidrome**. +- ⚠️ **`run_tagwriter.sh readback` работает, но Alex его прервал** — не запускать повторно без запроса. + Путь запуска: `cd ~/Automation/music-tags && bash run_tagwriter.sh readback` + (NAS `truenas_admin@mallexxx.duckdns.org`, образ `tagwriter:latest`, монтирует `${MUSIC}:/music:ro`). + +### 🛠 СКРИПТЫ ДИАГНОСТИКИ (файлы, не инлайн) + +| Скрипт | Что считает | +|---|---| +| `/tmp/nav_probe.py` | схема БД: колонки `media_file`/`album`, счётчики, пример записи | +| `/tmp/nav_cmp1.py` | маппинг план↔БД по пути → `в обоих 7861 / только в плане 0 / только в БД 306` | +| `/tmp/nav_cmp2.py` | 🔴 **главный**: сверка `new_album`/`new_albumartist` vs БД → **50 / 9** | +| `/tmp/nav_cmp3.py` | расхождения по папкам + дамп строк `Green Apelsin` из плана | + +--- + ## 🟣 СЕССИЯ 23 (2026-09-27, вечер) — ФИНАЛЬНОЕ РЕШЕНИЕ ALEX ПО `album`: «ВСЁ ЗАБЫТОЕ ДОВЕСТИ ДО ОБЩЕГО ПРАВИЛА» > **ТРИГГЕР:** Alex — «**Где диф последний с 371 правкой альбомов/albumartist который ты готовил?**»