[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 23:36:29 +06:00
1 parent 36014c7e59
commit 891942e1d6
1 file changed
+207 -41
+207 -41
View File
@@ -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 = '<N разных>' при разных старых значениях, конкретное при одном, пусто при всех пустых.
ТРЕК-строка = файл, чья цель УНИКАЛЬНА в папке.
СОРТИРОВКА = по АЛФАВИТУ 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.
---