diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index 04953d43..6a9f87a1 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: БОЕВОЙ-ПРОГОН-ВЫПОЛНЕН / TCON-4359-ЗАПИСАН / BD-ПЕРЕСОЗДАНА / 2-баги-вскрыты / ПЛАН-v4-ТРЕБУЕТСЯ +status: ПЛАН-v4-СОБРАН / ДИФФ-v4-СОБРАН / ДУБЛИ-УДАЛЕНЫ-50 / 2-ВОПРОСА-ОТКРЫТЫ tags: - music - metadata @@ -35,40 +35,44 @@ related: **Что делаем:** привести ID3-теги библиотеки `/mnt/RED_2TB/storage/Music` (7861 файл) в порядок, чтобы Navidrome показывал правильные альбомы/исполнителей/жанры. -**Главный артефакт на сейчас:** +**Главный артефакт на сейчас (27 сен, сессия ~34):** ``` -Дифф: ~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv - md5 bdb20c6ae00e7dfab4da2f76653fe084 - 945 строк (ПАПКА 711 · ТРЕК 234) · genre 911 · album 28 · albumartist 6 -План: /tmp/apply-plan-v3.csv (7861 строка, md5 6b9e49b2baa3f1d1708e4566972266a9) -Лог: ~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv (31 строка — УСТАРЕЛ, см. § ВЕРИФИКАЦИЯ) -Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (7861 строка — НЕ ПЕРЕЗАПИСЫВАТЬ) +ДИФФ: ~/Downloads/music-tags/DIFF-canon-v4.csv + 90 строк (ПАПКА 26 · ТРЕК 64) — схлопнуто из 428 правок + сортировка: по АЛФАВИТУ field (album → albumartist → artist → track) +План: ~/Downloads/music-tags/apply-plan-v4.csv (7861 строка) +Лог: ~/Downloads/music-tags/DIFF-canon-v4-changes.csv (428 строк, построчно, с причиной) +Сборщик: ~/Downloads/music-tags/build_diff_canon_v4.py +Удалено: ~/Downloads/music-tags/DELETE-dup-trofim.csv (50 дублей Трофима — ✅ снесены) +Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (7861 строка — НЕ ПЕРЕЗАПИСЫВАТЬ, эталон) +Бэкап канона: /tmp/APPLY-PLAN.csv.bak-before-v4 ``` -**Состояние (27 сен, сессия ~31):** ✅ **БОЕВОЙ ПРОГОН ВЫПОЛНЕН УСПЕШНО.** -`7653/7653 ok, err=0`; **`TCON` записан в 4359 файлов** — открытый дефект с 27 сен ЗАКРЫТ. -Проверка чтением файлов (не по логу): `7861/7861 имеют TCON`, `mismatches 0`, `read errors 0`. +⚠️ **Сборщики диффа/плана писать СРАЗУ в `~/Downloads/music-tags/`, НЕ в `/tmp`.** +Alex: «какого хуя он в тмп» — артефакт в `/tmp` он не находит. -Скрипт пишет **все 6 полей сразу** (`TIT2 TPE1 TPE2 TALB TCON TRCK`) — режима «только genre» нет. -Решение Alex: **полный набор**, дифф не пересобираем; требование «совпасть по цифрам с -APPLY-PLAN-v3-changes» снято самим Alex (дифф = ГРУППЫ, прогон = ФАЙЛЫ). +**Состояние (27 сен, сессия ~34):** ✅ **БОЕВОЙ ПРОГОН v3 выполнен** (7653/7653 ok, err=0, +`TCON` 4359, БД Navidrome пересоздана, скан 4m13s, импортировано 7861). -⏳ **Осталось (27 сен, сессия ~33) — ЧЕТЫРЕ ЗАДАЧИ ОТ ALEX, план v4 НЕ СОБРАН:** -1. 🔴 **БАГА №1 генератора** — `/tmp/make_applyplan_v3.py` строки 148-154: правила - `album==title` / `album==имя-файла` проверяются на **`new_*`**, а должны на **`cur_*`**. - Задето **20 файлов** (Птаха — симптом №1). Разбор → § КОРЕНЬ ДЕФЕКТА ПТАХИ. -2. 🔴 **БАГА №2 генератора — КАТЕГОРИЯ `z Другое, Enigma, Ленинград` НЕ СРЕЗАЕТСЯ.** - В `CATEGORY_DIRS` строка набрана в СМЕШАННОЙ раскладке → `norm()` не совпадает → - `stripped=False` → правило корня выключено для **~900 файлов** (Ленинград, Сектор Газа, - Красная Плесень, Enigma, Pushnoy.ru). Именно поэтому «Тема дороги» не попала в альбом. - Разбор → § БАГА №2 — КАТЕГОРИЯ Z ДРУГОЕ. -3. **Трофим** — исполнитель `Трофим` → **`Сергей Трофимов`** (199 `new_artist` + 207 `album_artist`); - альбомы `01..04 Аристократия помойки` → без цифрового префикса (58 файлов); - **дубли альбома снести** (копии в `disk/` + `disk_v2/` Alex велел НЕ трогать — живут в сборниках). -4. **Птаха** — 1 файл `new_album` → `Красивые, богатые`. +✅ **ПЛАН v4 СОБРАН И ДИФФ ПОКАЗАН.** База сборки — **КАНОН** `APPLY-PLAN.csv` (НЕ план v3: +v3 испорчен багой `album==title`; сборка от канона лечит 20 файлов автоматически). +Правок 428: `albumartist 157 · artist 154 · album 59 · track 58`. +Верификация v4 — 4 проверки, **0 ошибок** (`/tmp/verify_v4.py`): пути 1:1, каждая строка +дифа подтверждается, изменений вне дифа 0, ложных срабатываний класса Птахи 0. -⚠️ **Три вопроса к Alex ОТКРЫТЫ** (без них план v4 не собрать) → § ВОПРОСЫ К ALEX. +✅ **ДУБЛИ ТРОФИМА УДАЛЕНЫ** — 50 файлов из `disk/` + `disk_v2/` снесены по команде Alex +(`/tmp/del_dups.py`, удалено 50/50, ошибок 0). `!Рэп/Трофим` цел (157 файлов). + +⏳ **ОСТАЛОСЬ — 2 ВОПРОСА К ALEX (блокируют прогон v4):** +1. **`10 Ностальгия` / `Боже, какой пустяк`** — дубль ВНУТРИ `!Рэп/Трофим`, `album='Ветер + в голове'`. Удалять файл или сменить `album` на `Ностальгия`? В дифе его НЕТ (не трогал). +2. **«Тема дороги» `artist`** — в дифе `Бумер → Ленинград` (по имени папки). Оставляем? + Альтернативы: `Сергей Шнуров`, `Various Artists`. + +**Порядок после ответов:** подтвердить диф → прогон v4 (`--apply`, план подложить как +`apply-plan.csv`) → верификация чтением → **пересоздать БД Navidrome** (после удаления +50 файлов рескан обязателен) → приёмка Alex в UI. ``` Navidrome БД: /mnt/RED_2TB/docker/navidrome/data/ ← БЕЗ storage/ (дока ранее врала) @@ -109,6 +113,13 @@ compose: /mnt/RED_2TB/docker/navidrome | 19 | 27 сен | 🔴 **БАГА №2 НАЙДЕНА** — категория `z Другое…` не срезается (смешанная раскладка в `CATEGORY_DIRS`) | `/tmp/diag_category.py` | | 20 | 27 сен | 🔴 **ДЕФЕКТ ТРОФИМ** — 3 физические копии на диске → 8 альбомов, 38 имён задвоено | § ДЕФЕКТ ТРОФИМ | | 21 | 27 сен | 📋 **Решения Alex получены, план v4 НЕ собран** — 3 вопроса открыты | § ВОПРОСЫ К ALEX | +| 22 | 27 сен | ✅ **РЕШЕНИЯ ALEX ПОЛУЧЕНЫ** — Трофим: исполнитель `Сергей Трофимов`, альбомы `01..04` без префикса, дубли снести; Тема дороги → `Ленинград` | § РЕШЕНИЯ ALEX | +| 23 | 27 сен | ✅ **ДУБЛИ ТРОФИМА ПРОВЕРЕНЫ** — `disk/` и `disk_v2/` = одни 25 файлов, уникальных 0 | `/tmp/trofim_dups.py` | +| 24 | 27 сен | ✅ **ПЛАН v4 СОБРАН от КАНОНА** — 428 правок (albumartist 157 · artist 154 · album 59 · track 58) | `apply-plan-v4.csv` | +| 25 | 27 сен | ✅ **50 ДУБЛЕЙ УДАЛЕНЫ С ДИСКА** — 50/50, ошибок 0, `!Рэп/Трофим` цел (157) | `/tmp/del_dups.py` | +| 26 | 27 сен | ✅ **ВЕРИФИКАЦИЯ v4** — 4 проверки, 0 ошибок | `/tmp/verify_v4.py` | +| 27 | 27 сен | ✅ **ДИФФ v4 СОБРАН ПРАВИЛЬНО** — 90 строк (ПАПКА 26 · ТРЕК 64), сортировка по алфавиту field, схлопывание | `DIFF-canon-v4.csv` | +| 28 | 27 сен | 🔴 **ПЕРЕДЕЛКА ДИФФА** — первый дифф был НЕ сортирован и НЕ схлопнут (428 построчных строк) | § ПЕРЕДЕЛКА ДИФФА | --- @@ -268,14 +279,22 @@ backup_raw ### Рабочие (Mac) ``` -~/Downloads/music-tags/APPLY-PLAN.csv канон, 7861 стр, md5 bc20f2a49e364ecd5ed57d9fc97bfbcb -~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv дифф v3, 945 стр, md5 bdb20c6ae00e7dfab4da2f76653fe084 -~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог 31 правки v3, md5 2c6d2f0bb1d732d7e3e70ef1b210e7d8 +~/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/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/DIFF-base-vs-applyplan-v3.csv дифф v3 (устарел), 945 стр, md5 bdb20c6ae00e7dfab4da2f76653fe084 +~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог v3 (устарел), 31 стр ~/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 — читать отсюда +~/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` в папке проекта.** +Бэкап канона перед сборкой v4: `/tmp/APPLY-PLAN.csv.bak-before-v4`. ### Скрипты ``` @@ -305,6 +324,13 @@ backup_raw /tmp/diag_category.py 🔴 БАГА №2: побайтовое сравнение CATEGORY_DIRS с norm(папки) /tmp/diag_trofim.py дубли имён Трофима (53 имени), папки Трофима /tmp/diag_prefix_dups.py альбомы с цифровым префиксом (15, реальных префиксов 3) +/tmp/trofim_map.py карта Трофима: папки/альбомы/треки по канону (157 файлов, 11 альбомов) +/tmp/trofim_dups.py 🔑 дубли Трофима: disk/ и disk_v2/ = одни 25 файлов, уникальных 0 +/tmp/build_v4.py 🔴 СБОРЩИК ПЛАНА v4 (от канона; 428 правок) +~/Downloads/music-tags/build_diff_canon_v4.py 🔴 СБОРЩИК ДИФФА v4 (ПАПКА/ТРЕК + алфавит field) +/tmp/verify_v4.py верификация v4: пути 1:1, каждая строка дифа, пропуски, класс Птахи +/tmp/del_dups.py удаление 50 дублей Трофима (на NAS как /app/data/del_dups.py) +/tmp/move_dups.py карантинный вариант (НЕ РАБОТАЕТ: контейнер не видит /mnt/RED_2TB) /tmp/find_bug.py черновик детектора (ловил album==имя-папки — НЕ та бага) /tmp/find_bug2.py папки с НЕОДНОРОДНЫМ new_album внутри одной папки ~/Developer/personal-os/tools/music-tags/build_fix_plan2.py генератор плана (пофикшен) @@ -474,17 +500,157 @@ new_artist: 'Трофим' 199 · В.Маркин · С.Трофимов,г --- -## 📋 ВОПРОСЫ К ALEX (открыты, блокируют сборку плана v4) +## 📋 РЕШЕНИЯ ALEX (получены 27 сен, сессия ~34) — НЕ ПЕРЕСПРАШИВАТЬ -1. **Исполнитель «Тема дороги»**: `Ленинград`, `Сергей Шнуров` или `Various Artists` (это ОСТ)? -2. **Трофим, `album_artist`**: тоже менять на `Сергей Трофимов`, или только `artist`? - И входит ли `Женя Трофимов & Комната культуры` (другой артист) в «все его треки»? -3. **Дубли Трофима**: «снести дубли альбомов» = удалить 58 файлов `!Рэп/Трофим/01..04` - с диска, или только переименовать тег `album` (сняв цифровой префикс) и оставить файлы? +Alex: «Абсолютно верно, видишь, ты сам можешь правильно рассуждать» — предложенные +варианты приняты. Три вопроса из прошлой сессии **ЗАКРЫТЫ**: -**Порядок после ответов:** фикс баги №1 (`cur_*`) + фикс баги №2 (категория) → пересборка -плана в **НОВЫЙ файл** относительно **текущей БД Navidrome** (не `cur_*` канона — они устарели) -→ список CSV + дифф → показ Alex → прогон. +1. ✅ **Исполнитель «Тема дороги»** → **`Ленинград`** (по имени папки, как положено правилом + корня). Alex: «поместить в альбом Ленинград по корню папки как положено». +2. ✅ **Трофим, исполнитель** → **`Сергей Трофимов`**: и `artist`, и `album_artist`. + **Дуэты НЕ схлопывать** — только нормализовать формат: + ``` + 'С.Трофимов,группа "Тутси"' -> 'Сергей Трофимов и группа «Тутси»' + 'С.Трофимов,группа "Отпетые мошенники"' -> 'Сергей Трофимов и группа «Отпетые мошенники»' + 'С.Трофимов,группа "Любовные истории"' -> 'Сергей Трофимов и группа «Любовные истории»' + 'С.Трофимов,Азиза' -> 'Сергей Трофимов и Азиза' + ``` + Остальные (Александр Маршал, Алексей Иванов, Т. Овсиенко, В.Маркин) — оставить. +3. ✅ **Дубли Трофима** → **удалить 50 файлов** из `disk/` + `disk_v2/`. Оставляем + `!Рэп/Трофим` как эталон. `disk/` и `disk_v2/` **проверены: одни и те же 25 файлов, + уникальных 0** — терять нечего (`/tmp/trofim_dups.py`). + +**Номер трека** в `01..04 Аристократия помойки` — **из имени файла** (`#1_06_Alkash.mp3` → 6). +Причина: в `05..11` номера уже стоят и совпадают с номером из имени → нумерация авторская, +не сплошная. Перенумерация 1..N сломала бы верное. + +**Цифровой префикс** — **адресно, списком**, НЕ общим правилом (только 3 из 15 реальные). + +### ⏳ 2 ОТКРЫТЫХ ВОПРОСА (блокируют прогон v4) + +1. **`!Рэп/Трофим/10 Ностальгия` / `Боже, какой пустяк`** — 16-й файл в папке с + `album='Ветер в голове'` (он же есть в `09 Ветер в голове` trk=14) → альбом «Ностальгия» + раздвоен. **Удалять файл** (он дубль) или сменить `album` на `Ностальгия`? + В дифе v4 его НЕТ — не трогал. +2. **«Тема дороги» `artist`** — в дифе `Бумер → Ленинград`. Alex сказал «поместить в альбом + Ленинград», но **про исполнителя прямо не сказал**. Подтвердить `Ленинград`? + +--- + +## 🚀 ПЛАН v4 — СОБРАН (27 сен, сессия ~34) + +**Сборщик:** `/tmp/build_v4.py` (сборка плана), `/Users/admin/Downloads/music-tags/build_diff_canon_v4.py` (сборка диффа). + +🔑 **БАЗА СБОРКИ = КАНОН `APPLY-PLAN.csv`, НЕ план v3.** Причина: v3 испорчен багой +`album==title` (20 файлов). Канон — эталон, в нём `new_*` правильные. Сборка от канона +**автоматически лечит все 20 файлов**, включая Птаху. Отдельный фикс Птахи НЕ ПОТРЕБОВАЛСЯ +(скрипт дал 0 правок по нему — он уже был верен в каноне). + +```bash +python3 /tmp/build_v4.py +# → ~/Downloads/music-tags/apply-plan-v4.csv (7861 строка) +# → /tmp/diag... (диагностика) +``` +⚠️ Изначально скрипт писал в `/tmp` — Alex: «какого хуя он в тмп». **Писать в папку проекта.** + +**428 правок, 4 класса:** + +| класс | правок | что делает | +|---|---|---| +| `albumartist` | 157 | Трофим → `Сергей Трофимов` (все 11 альбомов) | +| `artist` | 154 | 149× Трофим → `Сергей Трофимов` · 4× дуэты нормализованы · 1× Бумер → `Ленинград` | +| `album` | 59 | 58× цифровой префикс Трофима (`01..04 Аристократия`) · 1× Тема дороги | +| `track` | 58 | номера из имени файла (`#1_06_Alkash.mp3` → 6) | + +**Результат по Трофиму** (`!Рэп/Трофим`, 157 файлов): +``` +albumartist: 'Сергей Трофимов' 157/157 +artist: 'Сергей Трофимов' 149 + 4 дуэта + 4 гостя другого артиста +пустых track: 0 +альбомы: 11 папок -> 11 альбомов без цифровых префиксов + (кроме '10 Ностальгия' — там 2 значения, см. открытый вопрос) +``` + +**Тема дороги** (`z Другое, Enigma, Ленинград/Ленинград/Тема дороги.mp3`): +``` +canon: album='саунд треки к фильму' artist='Бумер' +v4 : album='Ленинград' artist='Ленинград' +``` + +--- + +## 🔴 ПЕРЕДЕЛКА ДИФФА — первый дифф был НЕ сортирован и НЕ схлопнут + +**Alex: «почему диф опять не сортирован и не схлопнут?! ты опять для него заново скрипт +писал?!»** — да, написал заново и не выполнил два обязательных требования. + +Первый дифф `/tmp/DIFF-v3-to-v4.csv` — **428 построчных строк** (по строке на файл+поле): +``` +ТРЕК,...,#1_01_Prolog.mp3,artist,Трофим,Сергей Трофимов +ТРЕК,...,#1_01_Prolog.mp3,albumartist,Трофим,Сергей Трофимов +ТРЕК,...,#1_01_Prolog.mp3,album,01 Аристократия помойки,Аристократия помойки +ТРЕК,...,#1_01_Prolog.mp3,track,,1 +... × 157 файлов +``` +Сортировки по алфавиту `field` не было, схлопывания не было. + +**Правильный формат** (`DIFF-canon-v4.csv`, 90 строк): + +``` +Правила (из канонного DIFF-base-vs-applyplan-v3.csv): + ПАПКА-строка = (folder, field, new) — когда цель одинакова у 2+ файлов папки. + old = '' при разных старых значениях, конкретное при одном, пусто при всех пустых. + ТРЕК-строка = файл, чья цель УНИКАЛЬНА в папке. + СОРТИРОВКА = по АЛФАВИТУ field: album -> albumartist -> artist -> genre -> track, + внутри — folder, затем path. + 🔑 sorted({...}) / ключ сортировки ДОЛЖНЫ БЫТЬ В КОДЕ, не в порядке объявления списка. +``` + +**Результат:** +``` +ПАПКА-строк: 26 ТРЕК-строк: 64 всего 90 (из 428 правок) + +album 59 правок -> 5 строк (4 ПАПКА Трофим + 1 ТРЕК Тема дороги) +albumartist 157 правок -> 11 строк (11 ПАПКА = 11 папок) +artist 154 правки -> 16 строк (11 ПАПКА + 5 ТРЕК: 4 дуэта + Бумер) +track 58 правок -> 58 строк (по ТРЕК: номера у всех разные, схлопывать нечего) +genre/title 0 правок -> 0 +``` +🔑 **`track` схлопнуть нельзя by design** — у каждого файла свой номер, ПАПКА-строка невозможна. + +--- + +## ✅ УДАЛЕНИЕ ДУБЛЕЙ ТРОФИМА (27 сен, сессия ~34) + +Alex: «файлы удали из музыки которые мы хотели». + +**Проверка перед удалением** (`/tmp/trofim_dups.py`): +``` +!Рэп/Трофим 157 файлов ← эталон +disk/ 25 файлов ← все 25 есть в эталоне по названию, уникальных 0 +disk_v2/ 25 файлов ← имена совпадают с disk/ 1:1, уникальных 0 +``` +`disk/` и `disk_v2/` — **одни и те же 25 файлов**. Терять нечего. + +**Удаление** (`/tmp/del_dups.py`, после неудачи с карантином): +```bash +scp /tmp/del_dups.py truenas_admin@mallexxx.duckdns.org:/tmp/tw306/ +docker run --rm --entrypoint python3 \ + -v /tmp/tw306:/app/data:ro -v /mnt/RED_2TB/storage/Music:/music:rw \ + tagwriter:latest /app/data/del_dups.py +``` +``` +в списке: 50 ; удалено: 50 ; не найдено: 0 ; ошибок: 0 +``` +**Проверка после:** `disk/3 SHANSON/Трофим/` — пусто, `disk_v2/…` — пусто, `!Рэп/Трофим` — 157 файлов. + +⚠️ **ПИТФОЛЛ: карантин не сработал** — контейнер видит только `/mnt/RED_2TB/storage/Music` +(смонтирован как `/music`), а `/mnt/RED_2TB` целиком НЕ виден → +`PermissionError: [Errno 13] Permission denied: '/mnt/RED_2TB'`. +Либо монтировать `/mnt/RED_2TB`, либо удалять напрямую (выбрано по команде Alex). + +⚠️ **Navidrome:** 50 файлов с диска ушли, в БД они ещё есть → **обязателен рескан** +(или полный пересбор БД) после прогона v4. ---