From 36e127dca4c5138a9249c3c19d11790eca30c3b2 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 27 Sep 2026 23:56:45 +0600 Subject: [PATCH] [2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md --- .../plans/music-artist-albumartist-repair.md | 173 +++++++++++++++--- personal/tech/music-tags-repair-truenas.md | 58 +++++- 2 files changed, 207 insertions(+), 24 deletions(-) diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index fb7214db..55933eee 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: ДИФФ-ОТ-БД-СОБРАН / ПРОГОН-v5-ЖДЁТ-АЛЕКСА / 215-ОДИНОЧЕК-ОТКРЫТО +status: ДИФФ-ОТ-БД-СВЕРЕН / ПРОГОН-v5-НЕ-ЗАПУСКАТЬ-БЕЗ-ПОДТВЕРЖДЕНИЯ / 56-ОДИНОЧЕК-ОТКРЫТО tags: - music - metadata @@ -35,22 +35,37 @@ related: **Что делаем:** привести ID3-теги библиотеки `/mnt/RED_2TB/storage/Music` (7861 файл) в порядок, чтобы Navidrome показывал правильные альбомы/исполнителей/жанры. -**Главный артефакт на сейчас (27 сен, сессия ~35):** +**Главный артефакт на сейчас (27 сен, сессия ~36):** ``` -⚠️ ДИФФ ПЕРЕСОБРАН ОТ БАЗЫ (v3 был собран от КАНОНА — НЕВЕРНЫЙ ИСТОЧНИК!) +⚠️ ДИФФ ОТ БАЗЫ ГОТОВ, СВЕРЕН С ПЛАНОМ. ПРОГОН НЕ ЗАПУСКАТЬ БЕЗ ПОДТВЕРЖДЕНИЯ ALEX. ДИФФ: ~/Downloads/music-tags/DIFF-db-to-fix.csv - 91 строка (ПАПКА 26 · ТРЕК 65) — схлопнуто из 429 правок + 16 857 B · 92 строки с заголовком = 91 ЗАПИСЬ (ПАПКА 26 · ТРЕК 65) + md5 a5f2b910826dcc46474b6e26513f414f + по полям: album 6 · albumartist 11 · artist 16 · track 58 + ⚠️ СЧЁТ: 91 запись ≠ 92 строки файла (заголовок) и ≠ 87 + (2 файла с ДВОЙНОЙ правкой: Тема дороги album+artist, + Птаха album в одну сторону) сортировка: по АЛФАВИТУ field (album → albumartist → artist → track) источник цели: БД Navidrome (то, что РЕАЛЬНО в тегах), НЕ канон -План: ~/Downloads/music-tags/apply-plan-v5.csv (7861 строка) +План: ~/Downloads/music-tags/apply-plan-v5.csv (7861 строка, md5 d4392b11f143844c590a0a9c4a752208) + меняется 159 файлов · без изменений 7702 + по полям: albumartist 157 · artist 154 · album 60 · track 58 · title 0 · genre 0 Сборщик: ~/Downloads/music-tags/build_diff_from_db.py -Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (7861 строка — эталон ручных правок, НЕ ПЕРЕЗАПИСЫВАТЬ) +Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (2 882 935 B — эталон ручных правок, НЕ ПЕРЕЗАПИСЫВАТЬ) ``` -⚠️ **Сборщики диффа/плана писать СРАЗУ в `~/Downloads/music-tags/`, НЕ в `/tmp`.** -Alex: «какого хуя он в тмп» — артефакт в `/tmp` он не находит. +✅ **СВЕРКА ДИФФ ↔ ПЛАН (27 сен, сессия ~36) — СХОДИТСЯ.** Скрипт +`~/Downloads/music-tags/verify_v5_vs_diff.py`. Кажущееся расхождение (`albumartist` 11 в дифе +против 157 в плане) — **единица счёта**: дифф хранит ПАПКУ (11 папок Трофима × 14 файлов = 154), +план — ФАЙЛЫ. Итог по всем полям 1:1: +``` +albumartist 11 ПАПКА-строк → 157 файлов ✅ +artist 16 записей → 154 файла ✅ (11 ПАПКА + 4 ТРЕК-фита + Ленинград) +album 6 записей → 60 файлов ✅ (4 папки Трофима + Птаха + Ленинград) +track 58 записей → 58 файлов ✅ +``` 🔴 **ГЛАВНЫЙ УРОК СЕССИИ ~35: ДИФФ СТРОИТЬ ОТ БД, А НЕ ОТ КАНОНА.** Первый дифф v4 был собран от `APPLY-PLAN.csv` (канон) — и **не содержал Птаху**, @@ -59,14 +74,21 @@ Alex: «какого хуя он в тмп» — артефакт в `/tmp` он Правило: источник истины = `media_file` из `navidrome.db`, канон — только эталон ручных решений. Подробно → § ДИФФ ОТ БАЗЫ. -**Состояние (27 сен, сессия ~35):** ✅ **БОЕВОЙ ПРОГОН v3 выполнен** (7653/7653 ok, err=0, +**Состояние (27 сен, сессия ~36):** ✅ **БОЕВОЙ ПРОГОН v3 выполнен** (7653/7653 ok, err=0, `TCON` 4359, БД Navidrome пересоздана, скан 4m13s, импортировано 7861). -✅ **50 дублей Трофима удалены с диска.** ⏳ **Прогон v5 НЕ сделан** — ждём решения Alex -по 1 вопросу (§ ОТКРЫТЫЙ ВОПРОС). +✅ **50 дублей Трофима удалены с диска.** ✅ **Дифф от БД сверен с планом v5 — 1:1.** +⏳ **Прогон v5 НЕ сделан. ЗАПУСКАТЬ ТОЛЬКО ПО ПРЯМОМУ «go» ALEX** — дословно: +«**без подтверждения никакого apply блядь**». Дифф и dry-run — можно без спроса. -**Порядок после ответа:** подтвердить диф `DIFF-db-to-fix.csv` → прогон v5 (`--apply`, -план `apply-plan-v5.csv` подложить как `apply-plan.csv`) → верификация чтением → -**пересоздать БД Navidrome** → приёмка Alex в UI. +**Открыто перед прогоном (2 пункта):** +1. 🔴 **`albumartist` для `rock_o_pop` / `Retro`** — `Various Artists` (как сейчас) или имя + папки? Прямые указания Alex противоречат данным БД (см. § ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК). +2. 🔴 **Однотрековые (56 папок) в план v5 не входят** — правило в `build_diff_from_db.py` + не написано, сборщик знает только 3 хардкод-пути. Дособирать ли дифф по ним. + +**Порядок после «go»:** план `apply-plan-v5.csv` подложить как `apply-plan.csv` → dry-run +(`--dry-run`, сверить `count`/`err`) → прогон `--apply` → верификация чтением → +**пересоздать БД Navidrome** → приёмка Alex в UI. Приёмка = **видно в UI**, не «я прочитал обратно». ``` Navidrome БД: /mnt/RED_2TB/docker/navidrome/data/ ← БЕЗ storage/ (дока ранее врала) @@ -117,7 +139,11 @@ compose: /mnt/RED_2TB/docker/navidrome | 29 | 27 сен | 🔴 **ДИФФ v4 НЕВЕРЕН: собран от КАНОНА** — Птахи в нём нет, а дефект в базе есть | § ДИФФ ОТ БАЗЫ | | 30 | 27 сен | ✅ **ДИФФ ПЕРЕСОБРАН ОТ БД** — источник истины = `media_file`, 91 строка из 429 правок | `DIFF-db-to-fix.csv` | | 31 | 27 сен | 🔴 **ЛОЖНОЕ РАСХОЖДЕНИЕ ПО ЖАНРУ** — `media_file.genre` пуст у всех, жанр в `tags` jsonb | `build_diff_from_db.py` | -| 32 | 27 сен | 🔴 **ДЕФЕКТ «АЛЬБОМЫ-ОДИНОЧКИ»** — 215 альбомов из 1 трека, где `album != имя папки` | § АЛЬБОМЫ-ОДИНОЧКИ | +| 32 | 27 сен | 🔴 **ДЕФЕКТ «АЛЬБОМЫ-ОДИНОЧКИ»** — 215 (⚠️ ПОЗЖЕ УТОЧНЕНО: 56 папок) | § АЛЬБОМЫ-ОДИНОЧКИ | +| 33 | 27 сен | ✅ **СВЕРКА ДИФФ↔ПЛАН v5** — 91 запись ↔ 159 файлов, по полям 1:1 | `verify_v5_vs_diff.py` | +| 34 | 27 сен | 🔴 **ЦИФРА 215 НЕВЕРНА → 56 однотрековых папок**; `album == title` лишь у 11 | `diag_single_track.py` | +| 35 | 27 сен | 🔴 **ПРАВИЛО ОДИНОЧЕК ОТ ALEX** — `album` = имя папки-владельца, `artist` СОХРАНИТЬ | §§ ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК | +| 36 | 27 сен | 🔴 **ПРОГОН НЕ ЗАПУСКАТЬ БЕЗ ПОДТВЕРЖДЕНИЯ** — «без подтверждения никакого apply блядь» | § СТАРТ ЗДЕСЬ | --- @@ -146,6 +172,36 @@ compose: /mnt/RED_2TB/docker/navidrome ### 5. Категории-контейнеры срезаются `!Retro`, `!Rock&Folk`, `!Pop, Club, Любэ`, `!A Not sorted` — срезаются при разборе пути. +### 6. Однотрековая папка → `album` = имя папки-владельца (получено 27 сен, сессия ~36) +Папка, где лежит **один** файл, а `album` указывает на чужой сборник-источник: +`album` = **имя папки-владельца**, НЕ имя сборника. +``` +!Rock&Folk/!rock_o_pop/*.mp3 album 'Бабло побеждает зло' → 'rock_o_pop' +!Retro/*.mp3 album 'Супер ДискотЭка…' → 'Retro' +9999 - Разное/Проекты/*.mp3 album 'Нечётный Воин 2' → 'Проекты' +``` +🔴 **`artist` СОХРАНИТЬ** — это реальный исполнитель трека (Чайф, Би-2, Слот, Стрелки), +НЕ имя папки. Прямое указание Alex: «artist нужно сохранить». +🔴 **Для `9999 - Разное` `albumartist = 'Агата Кристи'`** — артист КАТЕГОРИИ, а не сборника. +⚠️ Для `rock_o_pop` / `Retro` значение `albumartist` **не определено** (в БД `Various Artists`). + +### 🔑 ЕДИНИЦА СЧЁТА — называть вслух (урок 27 сен, сессия ~36) +Когда одно и то же изменение считают дифф/план/лог, числа НЕ совпадают by design: +``` +дифф = ПАПКИ (схлопнуто) план = ФАЙЛЫ лог = ПОСТРОЧНО +11 папок Трофима → 157 файлов + 6 записей album → 60 файлов +``` +Alex читает расхождение как дефект. **Всегда писать единицу счёта** («91 ЗАПИСЬ», +не «91 строка»; «159 ФАЙЛОВ», не «159 правок»). + +### 🔑 ЛОВУШКА «ФАЙЛ ЕСТЬ, НО СОДЕРЖИМОГО НЕ ВИДНО» (27 сен, сессия ~36) +`read_file` вернул `{"status":"unchanged","dedup":true}` без содержимого — я повторил вызов +и получил то же самое **дважды**. Файл был в порядке, но `cat` через терминал пришлось +вызывать отдельно. **Правило: при `unchanged` НЕ повторять `read_file` — сразу читать +содержимое другим способом.** Alex в этот момент трижды спросил «где дифф» → выродилось +в конфликт. Причина была инструментальная, не содержательная. + --- ## 🛠 КАК ЧТО ДЕЛАЕТСЯ @@ -277,22 +333,34 @@ backup_raw ### Рабочие (Mac) ``` -~/Downloads/music-tags/APPLY-PLAN.csv канон/ЭТАЛОН, 7861 стр, md5 bc20f2a49e364ecd5ed57d9fc97bfbcb -~/Downloads/music-tags/DIFF-canon-v4.csv 🔴 ТЕКУЩИЙ ДИФФ v4, 90 стр (ПАПКА 26 · ТРЕК 64) -~/Downloads/music-tags/apply-plan-v4.csv 🔴 ТЕКУЩИЙ ПЛАН v4, 7861 стр +~/Downloads/music-tags/APPLY-PLAN.csv канон/ЭТАЛОН, 2 882 935 B — НЕ ПЕРЕЗАПИСЫВАТЬ +~/Downloads/music-tags/DIFF-db-to-fix.csv ⭐ ТЕКУЩИЙ ДИФФ, 91 запись (ПАПКА 26 · ТРЕК 65) + md5 a5f2b910826dcc46474b6e26513f414f +~/Downloads/music-tags/apply-plan-v5.csv ⭐ ТЕКУЩИЙ ПЛАН, 7861 стр, 159 файлов меняется + md5 d4392b11f143844c590a0a9c4a752208 +~/Downloads/music-tags/build_diff_from_db.py ⭐ СБОРЩИК (от БД); 3 хардкод-пути, однотрековых НЕТ +~/Downloads/music-tags/verify_v5_vs_diff.py сверка дифф↔план (единица счёта: папка vs файл) +~/Downloads/music-tags/diag_single_track.py 🔑 однотрековые: 56 папок, album==title у 11 +~/Downloads/music-tags/sverka_4folders.py 🔑 4 папки Alex: rock_o_pop / Retro / 9999 - Разное +~/Downloads/music-tags/DIFF-canon-v4.csv 🔴 УСТАРЕЛ (от канона), 90 стр +~/Downloads/music-tags/apply-plan-v4.csv 🔴 УСТАРЕЛ (от канона) ~/Downloads/music-tags/DIFF-canon-v4-changes.csv лог v4, 428 строк построчно ~/Downloads/music-tags/DELETE-dup-trofim.csv 50 дублей Трофима (✅ уже удалены) -~/Downloads/music-tags/build_diff_canon_v4.py сборщик диффа v4 (сортировка+схлопывание В КОДЕ) +~/Downloads/music-tags/build_diff_canon_v4.py сборщик диффа v4 (от канона, устарел) ~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv дифф v3 (устарел), 945 стр, md5 bdb20c6ae00e7dfab4da2f76653fe084 -~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог v3 (устарел), 31 стр +~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог v3, 31 стр, md5 2c6d2f0bb1d732d7e3e70ef1b210e7d8 +~/Downloads/music-tags/REPORT-album-kept-all-folders.csv 559 стр (источник ошибочной цифры 215) ~/Downloads/music-tags/tag-fix-plan.csv 38-я волна, 7905 стр ~/Downloads/music-tags/ALBUM-FIX-306.csv скобочный прогон, 306 стр ~/Downloads/navidrome-db/navidrome-merged.db БД Navidrome (старая локальная копия) ~/Downloads/navidrome-db/navidrome-after-v3.db БД ПОСЛЕ прогона v3, 27586560 B — читать отсюда ``` ⚠️ `/tmp`-копии: `DIFF-v3-to-v4.csv` (428 строк — ПЕРВЫЙ, несортированный/несхлопнутый, устарел), -`apply-plan-v4.csv`. **Не путать: правильный дифф — `DIFF-canon-v4.csv` в папке проекта.** +`apply-plan-v4.csv`. **Не путать: правильный дифф — `DIFF-db-to-fix.csv` в папке проекта.** Бэкап канона перед сборкой v4: `/tmp/APPLY-PLAN.csv.bak-before-v4`. +Бэкап диффа перед сверкой: `DIFF-db-to-fix.csv.bak-20260927-234901` (md5 совпал с исходным). +⚠️ **Сборщики диффа/плана писать СРАЗУ в `~/Downloads/music-tags/`, НЕ в `/tmp`.** +Alex: «какого хуя он в тмп» — артефакт в `/tmp` он не находит. ### Скрипты ``` @@ -749,8 +817,67 @@ album='2000 и Одна Ночь' папка='!Retro' !Retro/Ари **Правильная цель для `Кавер-версии и пародии`:** `album='Кавер-версии и пародии'` для всех 24 файлов; `artist` сохранить реальных исполнителей (Чайф, Би-2, Слот, Стрелки). -⏳ **НЕ СДЕЛАНО:** разбор всех 215 — разделить на «мусор (чужой сборник)» / -«законный сингл». Требует решения Alex. +🔴 **УТОЧНЕНО 27 сен (сессия ~36) — ЦИФРА `215` НЕВЕРНА, ПРАВИЛЬНО `56`.** +`215` было посчитано по СТРОКАМ отчёта, а не по ПАПКАМ. Точный пересчёт по +`apply-plan-v5.csv`, скрипт `~/Downloads/music-tags/diag_single_track.py`: +``` +папок всего 633 · ОДНОТРЕКОВЫХ 56 · многотрековых 577 + из 56: album == title (настоящий дефект) 11 + album != title 45 + album == имя папки 15 + однотрековых, которые меняет план v5 0 +по категориям: !Pop, Club, Любэ 35 · !Rock&Folk 10 · !A Not sorted 3 · + !Retro 3 · !Рэп 3 · !Барды 1 · !Детские 1 +``` +🔑 **ЕДИНИЦА СЧЁТА: считать ПАПКИ, а не строки отчёта.** Тот же класс ошибки, +что `awk -F','` (дал 33 вместо 117) и `7496`/`7649` (номера строк в +`manual_scan_out.txt`, не число правок). + +### 🔴 ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК (получено 27 сен, сессия ~36) + +Дословно: «**в `9999 - Разное` albumartist — Агата Кристи. в `rock_o_pop` — должен быть +альбом `rock_o_pop`. в `Retro` — `Retro`. в `Ария, Кипелов` — угадай блядь какой альбом +должен быть (и `albumartist`)**». + +**→ `album` = имя ПАПКИ-ВЛАДЕЛЬЦА. `artist` СОХРАНИТЬ как есть** (прямое указание Alex: +«artist нужно сохранить» — это реальный исполнитель трека, Чайф/Би-2/Слот). + +⚠️ **Про `albumartist` правило НЕ выведено — открыто.** Прямые указания противоречат данным: +- Alex: `9999 - Разное` → `albumartist = Агата Кристи` — **уже так** (24/9/12 файлов ✅), + т.е. к Разному правило «albumartist = имя папки» НЕ применяется; +- Alex: `rock_o_pop` / `Retro` → имя папки — но в БД там **`Various Artists` у 100%** + (57/57 и 158/158), и раньше `Various Artists` поверх одного артиста признавался дефектом. + +**Текущее состояние трёх папок (из плана v5, `~/Downloads/music-tags/sverka_4folders.py`):** +``` +!Rock&Folk/!rock_o_pop 57 файлов | album == 'rock_o_pop' 33 | albumartist == '!rock_o_pop' 0 + | остальные 24 — чужой альбом ('МОЛОДЫЕ ВЕТРА' 5, 'В городе N' 2, + 'Соль' 2, 'Зе Бест' 2, 'Попса' 2, …); albumartist = VA 57 +!Retro 158 файлов | album == 'Retro' 112 | albumartist == '!Retro' 0 + | чужие: 'Просвистела' 5, 'Супер ДискотЭка Радио Рекорд' 4, + 'Опиум' 3, 'Улица любви' 2, 'Позорная звезда' 2, …; VA 158 +9999 - Разное/ + Кавер-версии и пародии 24 файлов | album == имени папки 10 | albumartist = 'Агата Кристи' 24 ✅ + | чужие: 'Танец на цыпочках' 2, 'Симпатии', 'Slot 1', 'Песок', … + Неизданное 9 файлов | album == имени папки 5 | 'Агата Кристи' 9 ✅ + Проекты 12 файлов | album == имени папки 0 | 'Агата Кристи' 12 ✅ + (все чужие: 'Нечётный Воин 2' 3, '20-ая зима…' 3, …) +``` +⚠️ `!Rock&Folk/Ария, Кипелов` из плана v5 **отсутствует** — правки по ней (3 записи album: +`Вавилон` · `Герой асфальта` · `На грани` → `Ария, Кипелов`) ушли в +`APPLY-PLAN-v3-changes.csv` и **уже применены** прогоном v3. + +**Второй подтверждённый класс — 4 папки Трофима `01..04 Аристократия помойки`:** `album` +несёт **префикс НОМЕРА ДИСКА**, а не мусор (Alex: «в 01..04 префикс — номер ДИСКА, а не +мусор»). Правило то же: `album` = имя папки без префикса. + +✅ **Правильная цель для `Кавер-версии и пародии`:** `album='Кавер-версии и пародии'` +для всех 24 файлов; `artist` сохранить реальных исполнителей (Чайф, Би-2, Слот, Стрелки). + +⏳ **НЕ СДЕЛАНО:** правило для однотрековых в `build_diff_from_db.py` НЕ написано — +сейчас сборщик обрабатывает ровно 3 хардкод-пути (`!Рэп/Трофим/`, `!Рэп/Птаха…`, +`Тема дороги.mp3`). Разбор 56 — разделить «мусор (чужой сборник)» / «законный сингл». +Требует решения Alex по `albumartist`. --- diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index 2c6ef9c2..e20c8716 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -100,7 +100,63 @@ related: > Файлы в сборниках (`disk/`, `disk_v2/`) **удалять нельзя** — указание Alex: > «они корректно живут в сборниках». Удаляем ТОЛЬКО дубли альбомов. -> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, сессия ~30) — ЧИТАЙ ЭТО ПЕРВЫМ +> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, сессия ~36) — ЧИТАЙ ЭТО ПЕРВЫМ +> +> 🔴🔴 **`apply` НЕ ЗАПУСКАТЬ БЕЗ ПРЯМОГО ПОДТВЕРЖДЕНИЯ ALEX.** Дословно 27 сен: +> «**без подтверждения никакого apply блядь**». Дифф и dry-run — можно, запись — только «go». +> +> ✅ **ДИФФ ОТ БД ГОТОВ И СВЕРЕН С ПЛАНОМ.** `DIFF-db-to-fix.csv` — 16 857 B, **91 запись** +> (ПАПКА 26 · ТРЕК 65), md5 `a5f2b910826dcc46474b6e26513f414f`. Поля: `album` 6 · +> `albumartist` 11 · `artist` 16 · `track` 58. План `apply-plan-v5.csv` — 7861 стр, +> md5 `d4392b11f143844c590a0a9c4a752208`, **меняется 159 файлов**, 7702 без изменений. +> `title 0 · genre 0` — эти поля не трогаются. +> +> ⚠️ **ЕДИНИЦА СЧЁТА — главная ловушка этой сверки.** Одни и те же правки считаются так: +> ``` +> DIFF-db-to-fix.csv 92 строки файла = 91 ЗАПИСЬ (91 + заголовок) +> 87 уникальных (файл,поле) (2 файла с двойной правкой: +> Тема дороги album+artist, Птаха album) +> план v5 159 ФАЙЛОВ, разбивка по ПОЛЯМ (albumartist 157 · artist 154 · +> album 60 · track 58) +> дифф ПАПКИ, не файлы: 11 папок Трофима × 14 файлов = 154 +> ``` +> Сверка 1:1 по всем полям — скрипт `verify_v5_vs_diff.py`. Дифф↔план РАСХОЖДЕНИЙ НЕТ. +> **Называть единицу счёта вслух** (папки ≠ строки ≠ файлы) — иначе Alex видит +> противоречие там, где его нет. +> +> ✅ **ДИФФ v3 (`APPLY-PLAN-v3-changes.csv`) — СПРАВОЧНИК, НЕ источник правды В ЭТОМ ДИФФЕ.** +> 31 запись (album: Забугр, Руки вверх, Ария/Кипелов, Юрий Никулин, Дискотека Авария…), +> md5 `2c6d2f0bb1d732d7e3e70ef1b210e7d8`, **уже применена прогоном v3**. В v5 её нет: +> v5 — отдельная волна, 87 из 87 правок это Трофим + Ленинград + Птаха. +> ⚠️ **Не смешивать: v3-changes = journal ДО прогона (album), v5 = дифф ПОСЛЕ прогона +> от БД (4 поля).** Общего пересечения — 0. +> +> 🔴 **ЦИФРА «215 АЛЬБОМОВ-ОДИНОЧЕК» — НЕВЕРНА. ПРАВИЛЬНО `56`.** `215` посчитано по +> СТРОКАМ отчёта `REPORT-album-kept-all-folders.csv`, а не по папкам. Пересчёт по плану v5: +> **633 папки · однотрековых 56 · многотрековых 577**; `album == title` (настоящий дефект) +> лишь у **11**; `album != title` у 45; `album == имя папки` у 15. +> **В плане v5 однотрековых, которые меняются — 0** (сборщик их не знает). +> +> 🔴 **ПРАВИЛО ОДИНОЧЕК ОТ ALEX (27 сен):** `album` = **имя ПАПКИ-ВЛАДЕЛЬЦА** +> (`rock_o_pop` → `rock_o_pop`, `Retro` → `Retro`), **`artist` СОХРАНИТЬ** («artist нужно +> сохранить»). Про `albumartist` — **ОТКРЫТО**: по `9999 - Разное` он должен быть +> `Агата Кристи` (уже так), но по `rock_o_pop`/`Retro` в БД стоит `Various Artists` +> у 100% файлов. `!Rock&Folk/Ария, Кипелов` в v5 отсутствует — правки по ней уже в v3. +> Разбор — [[personal/plans/music-artist-albumartist-repair]] § ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК. +> +> ✅ **АРТЕФАКТ «КАК СТРОИЛСЯ APPLY-PLAN И ДИФФ» — ЗАПИСАН.** Zulip DB показала: +> `APPLY-PLAN.csv` собран в `/Users/admin/milestones/music-csv-2026-09-26/` +> (`tag-inventory3.csv` → `APPLY-PLAN-FINAL.csv` → `APPLY-PLAN-FINAL2.csv` → канон), +> **скрипта-сборщика как единого файла НЕТ** — сведение шло несколькими скриптами +> (`add_track.py`, `fix_track_and_selfcheck.py`) + ручные решения по 51 файлу. +> 🔴 **Папка `milestones/music-csv-2026-09-26/` БОЛЬШЕ НЕ СУЩЕСТВУЕТ** (`ls` → No such file). +> `build_fix_plan2.py` — **другой скрипт** (волна 38), канон НЕ писал, `albumartist` не умеет. +> +> 🔴 ПИТФОЛЛ ЗАПУСКА (без изменений): у образа `tagwriter:latest` в `CMD` прописан +> `--dry-run` → явно передавать `--apply`, иначе прогон молча уходит в dry-run. +> Два шага: `docker create` затем `docker start` (составная команда прерывается по таймауту). + +> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (сессия ~29-35) — АРХИВ > > ✅ **БОЕВОЙ ПРОГОН ВЫПОЛНЕН:** 7653/7653 ok, err=0. > `TCON 4359 · TPE2 7213 · TALB 2031 · TPE1 381 · TRCK 437 · TIT2 8`.