[2026-09-28] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-28 00:01:48 +06:00
1 parent 36e127dca4
commit 3466ad094d
2 files changed
+180 -12

No files matched your search

@@ -4,7 +4,7 @@ created: '2026-09-27'
updated: '2026-09-27'
type: plan
namespace: personal
status: ДИФФ-ОТ-БД-СВЕРЕН / ПРОГОН-v5-НЕ-ЗАПУСКАТЬ-БЕЗ-ПОДТВЕРЖДЕНИЯ / 56-ОДИНОЧЕК-ОТКРЫТО
status: ДИФФ-ОТ-БД-СВЕРЕН / СБОРЩИК-v2-НЕ-НАПИСАН (сборники вне дифа) / ПРОГОН-НЕ-ЗАПУСКАТЬ-БЕЗ-ПОДТВЕРЖДЕНИЯ
tags:
- music
- metadata
@@ -80,11 +80,15 @@ track 58 записей → 58 файлов ✅
⏳ **Прогон v5 НЕ сделан. ЗАПУСКАТЬ ТОЛЬКО ПО ПРЯМОМУ «go» ALEX** — дословно:
«**без подтверждения никакого apply блядь**». Дифф и dry-run — можно без спроса.
**Открыто перед прогоном (2 пункта):**
1. 🔴 **`albumartist` для `rock_o_pop` / `Retro`** — `Various Artists` (как сейчас) или имя
папки? Прямые указания Alex противоречат данным БД (см. § ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК).
2. 🔴 **Однотрековые (56 папок) в план v5 не входят** — правило в `build_diff_from_db.py`
не написано, сборщик знает только 3 хардкод-пути. Дособирать ли дифф по ним.
**Открыто перед прогоном (1 пункт):**
1. 🔴 **Сборщик v2 не написан** — правило сборников (п.7) в `build_diff_from_db.py` НЕ внесено.
Дифф `DIFF-db-to-fix.csv` пока НЕ содержит сборников: ни `!rock_o_pop` (24), ни `!Retro` (46),
ни `!ZabuGor` (15), ни `!Классика` (5), ни `9999 - Разное` (30), ни 3 корневых файла.
**Добавить правило → пересобрать дифф → сверить → показать Alex.**
См. § ПОЧЕМУ ПАПКИ-СБОРНИКИ НЕ В ДИФЕ.
✅ ЗАКРЫТО: вопрос `albumartist` для `rock_o_pop`/`Retro` — **`Various Artists`, уже так,
не трогать.** Разрешён Alex в сессии 37 (я перепутал `album`/`albumartist`).
**Порядок после «go»:** план `apply-plan-v5.csv` подложить как `apply-plan.csv` → dry-run
(`--dry-run`, сверить `count`/`err`) → прогон `--apply` → верификация чтением →
@@ -144,6 +148,11 @@ compose: /mnt/RED_2TB/docker/navidrome
| 34 | 27 сен | 🔴 **ЦИФРА 215 НЕВЕРНА → 56 однотрековых папок**; `album == title` лишь у 11 | `diag_single_track.py` |
| 35 | 27 сен | 🔴 **ПРАВИЛО ОДИНОЧЕК ОТ ALEX** — `album` = имя папки-владельца, `artist` СОХРАНИТЬ | §§ ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК |
| 36 | 27 сен | 🔴 **ПРОГОН НЕ ЗАПУСКАТЬ БЕЗ ПОДТВЕРЖДЕНИЯ** — «без подтверждения никакого apply блядь» | § СТАРТ ЗДЕСЬ |
| 37 | 27 сен | 🔴 **КОРЕНЬ «ПОЧЕМУ ПАПКИ ОПЯТЬ ВСПЛЫВАЮТ»** — по `!Retro`/`!ZabuGor`/`!Классика` НИКОГДА не было ПОЛНОГО прохода, правились отдельные файлы | § ПОЛНЫЙ ПРОХОД vs ТОЧЕЧНЫЙ |
| 38 | 27 сен | 🔴 **`build_diff_from_db.py`: правила сборников НЕТ** — только 3 хардкод-префикса (Трофим/Птаха/Ленинград), поэтому 5 папок-сборников не в дифе | § СБОРЩИК v2 |
| 39 | 27 сен | ❌ **МОИ 3 ОШИБКИ, исправлено Alex** — перепутал `album`/`albumartist`; звал `!` в тег; спрашивал про `2009-03 mIr.vEsNЫ` | § ОШИБКИ СЕССИИ 37 |
| 40 | 27 сен | ✅ **ПРАВИЛО СБОРНИКОВ ФИНАЛИЗОВАНО** — `album` = имя папки без `!`, `albumartist` = `Various Artists`, `artist` = трек (не трогать) | § ПРАВИЛО СБОРНИКОВ |
| 41 | 27 сен | 📊 **ПОСЧИТАН ОБЪЁМ**: сборники 70 файлов · `9999-Разное` 30 · корни категорий 3 | `rule_sborniki_v2.py` |
---
@@ -183,7 +192,39 @@ compose: /mnt/RED_2TB/docker/navidrome
🔴 **`artist` СОХРАНИТЬ** — это реальный исполнитель трека (Чайф, Би-2, Слот, Стрелки),
НЕ имя папки. Прямое указание Alex: «artist нужно сохранить».
🔴 **Для `9999 - Разное` `albumartist = 'Агата Кристи'`** — артист КАТЕГОРИИ, а не сборника.
⚠️ Для `rock_o_pop` / `Retro` значение `albumartist` **не определено** (в БД `Various Artists`).
### 7. 🔑 ПРАВИЛО СБОРНИКОВ — ФИНАЛИЗОВАНО (сессия 37, прямая формулировка Alex)
```
album = имя папки-владельца БЕЗ ведущего '!' ← ТОЛЬКО ЭТО МЕНЯЕМ
albumartist = 'Various Artists' для сборников ← УЖЕ ТАК, НЕ ТРОГАЕМ
= владелец категории для '9999 - Разное' ← УЖЕ ТАК (Агата Кристи)
artist = реальный исполнитель трека ← НЕ ТРОГАЕМ НИКОГДА
```
Alex дословно: «АЛЬБОМ БЛЯДЬ rock_o_pop **не albumartist** блядь! для сборников типа
rock_o_pop **artist = 'Various Artists'**!!!»
🔴 **`!` — служебный префикс сортировки папки, в тег НЕ ПОПАДАЕТ.**
`album` для `!rock_o_pop` = `rock_o_pop`, НЕ `!rock_o_pop`. Для `!Retro` = `Retro`.
То же правило уже применялось в `APPLY-PLAN-v3-changes` (31 запись).
**Область применения (посчитано `rule_sborniki_v2.py`, сессия 37):**
```
!Rock&Folk/!rock_o_pop 57 файлов | album != 'rock_o_pop': 24
!Retro 158 файлов | album != 'Retro': 46
!Pop, Club, Любэ/!ZabuGor 15 файлов | album != 'ZabuGor': 15
!Классика 20 файлов | album != 'Классика': 5
9999 - Разное/Кавер-версии… 24 файлов | album != имени папки: 14
9999 - Разное/Неизданное 9 файлов | album != имени папки: 4
9999 - Разное/Проекты 12 файлов | album != имени папки: 12
корни категорий (3 файла, адресно → 'Radio') 3
ИТОГО к правке `album`: ~123
```
⚠️ Из 158 файлов `!Retro` **112 уже имеют `album='Retro'`** — верные, не трогаются.
Это не «158 правок», а 46. Всегда вычитать уже-верное.
### 8. Сборники — исключение из правила корня
Если тег `artist` ≠ имя папки → сборник, правило корня не применяется (см. п.2).
Для сборников действует п.7.
### 🔑 ЕДИНИЦА СЧЁТА — называть вслух (урок 27 сен, сессия ~36)
Когда одно и то же изменение считают дифф/план/лог, числа НЕ совпадают by design:
@@ -201,6 +242,93 @@ Alex читает расхождение как дефект. **Всегда п
вызывать отдельно. **Правило: при `unchanged` НЕ повторять `read_file` — сразу читать
содержимое другим способом.** Alex в этот момент трижды спросил «где дифф» → выродилось
в конфликт. Причина была инструментальная, не содержательная.
🔴 **НЕ СТАВИТЬ `execute_code` — Alex его блокирует** («script denied by user»).
Только `write_file` скрипта в файл + `python3 /tmp/x.py` или терминал.
---
## 🔴 ПОЛНЫЙ ПРОХОД vs ТОЧЕЧНЫЙ — ПОЧЕМУ ПАПКИ «ОПЯТЬ ВСПЛЫВАЮТ» (сессия 37)
**Вопрос Alex:** «`Retro`, `ZabuGor` (15), `!Классика` — мы АБСОЛЮТНО ТОЧНО ПРАВИЛИ ДЛЯ
полных проходов. почему они опять всплывают?»
**Ответ: полного прохода по этим папкам НИКОГДА НЕ БЫЛО.** Правились отдельные файлы,
поименно. Правило «`album` = имя папки» к папке целиком не применялось ни разу.
**Доказательство — `!ZabuGor`, 15 файлов:**
```
APPLY-PLAN-v3-changes.csv правил РОВНО 2 файла:
Marlyn Manson-The Golden Age of Grotesque.mp3 → 'ZabuGor'
2 Unlimited - No Limit.mp3 → 'ZabuGor'
Остальные 13 не трогались, и вот что в них сейчас:
Marlyn Manson-The Golden Age of Grotesque.mp3 album='!ZabuGor' ← '!' В ТЕГЕ (дефект)
Crazy Frog - Axel F.mp3 album='Pop - ZabuGor'
No Doubt - Don't Speak.mp3 album='Tragic Kingdom'
No Doubt - In My Head.mp3 album='Rock Steady'
Gorillaz - Clint Eastwood.mp3 album='Gorillaz'
Городок - Clint Eastwood.mp3 album='Hey Baby (Single)'
```
**Доказательство — `!Классика`:** 15 файлов `album='Классика'` (верно) +
5 файлов с чужими (`Classical Sampler`, `Paganini: 24 Caprices`, `Musopen: …`).
Правились не все.
**Доказательство — `!Retro`:** **62 уникальных значения `album` на 236 файлов.**
112 = `Retro`, 124 — мусор от чужих альбомов.
🔑 **ВЫВОД / ПРАВИЛО:** прежде чем чинить папку — проверить, был ли по ней **полный**
проход. Если правились 2 файла из 15 — это точечная правка, и остальные 13 всплывут
законно. **Не искать багу в скрипте, пока не доказано, что проход был полным.**
Диагностика: `collections.Counter(cur_album)` по папке — много уникальных значений =
прохода не было.
⚠️ **Отдельный поддефект, найденный здесь:** в `!ZabuGor` у файла Marlyn Manson
`album='!ZabuGor'` — **`!` попал в тег**. Префикс сортировки не должен писаться в тег;
это следствие старой правки по хардкод-списку, где имя папки взяли целиком.
---
## 🔴 ПОЧЕМУ ПАПКИ-СБОРНИКИ НЕ В ДИФЕ — ДЕФЕКТ СБОРЩИКА (сессия 37)
`~/Downloads/music-tags/build_diff_from_db.py` содержит **только 3 хардкод-префикса**:
```python
if rel.startswith("!Рэп/Трофим/"): ...
if rel.startswith("!Рэп/Птаха - Красивые, богатые (2009)/"): ...
if rel == "z Другое, Enigma, Ленинград/Ленинград/Тема дороги.mp3": ...
```
Правила «`album` = имя папки-владельца» **в скрипте НЕТ ВООБЩЕ.**
Поэтому `!Retro` (46), `!ZabuGor` (15), `!Классика` (5), `9999 - Разное` (30) в дифф
не попали — не «выборочно проскочили», а под правило не было кода.
🔴 **ЧТО НАДО ДОБАВИТЬ В СБОРЩИК (сборщик v2):**
```
1. правило сборников: для любой папки, чьё имя начинается с '!'
→ album = basename без ведущих '!'
→ albumartist оставить как есть (Various Artists / владелец категории)
→ artist НЕ трогать
2. папки '9999 - Разное/*' → album = basename вложенной папки (без '!')
3. адресно (2 файла):
!Pop, Club, Любэ/detskiy_hor_benassi_satisfaction.mp3 → album = 'Radio'
!Pop, Club, Любэ/!Radio/…/10-10. Stylemasters … My Sadness.mp3 → album = 'Radio'
4. + уже работающие блоки Трофим / Птаха / Ленинград / track
```
---
## ❌ ОШИБКИ СЕССИИ 37 — ЧТО Я СДЕЛАЛ НЕ ТАК
Три ошибки, все исправлены Alex. Записаны, чтобы не повторять:
| # | Ошибка | Как надо |
|---|---|---|
| 1 | Перепутал `album` и `albumartist`: написал «`albumartist` должен быть `rock_o_pop`» | `album` = `rock_o_pop`. `albumartist` = `Various Artists` — **уже верный**, не трогать |
| 2 | Предложил `album = '!rock_o_pop'` — с восклицательным знаком | `!` — префикс сортировки, **в тег не пишется**. `album = 'rock_o_pop'` |
| 3 | Спросил про путь `2009-03 mIr.vEsNЫ` — он не дефект | Не спрашивать про то, что не в списке дефектов. Скрипт вытащил его по подстроке в имени файла |
| 4 | Спросил «править ли файлы в корне категорий`?`» повторно | По правилу корня — **очевидно да**. Вопрос читается как саботаж |
🔑 **ОБЩЕЕ ПРАВИЛО: если файл/папка всплыли повторно — искать ПРИЧИНУ в данных, а не
спрашивать Alex, что с ними делать.** Alex: «почему именно 2 и 3 не подпали? значит есть
бага в твоем скрипте. ищи ее».
---
@@ -342,7 +470,12 @@ backup_raw
~/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/diag_named_folders.py 🔑 разбор папок, названных Alex (9999-Разное/rock_o_pop/Retro/Ария)
~/Downloads/music-tags/rule_sborniki_count.py первый счёт правила сборников (⚠️ БАГА: брал '!' в имя)
~/Downloads/music-tags/rule_sborniki_v2.py ⭐ ПРАВИЛЬНЫЙ счёт: basename БЕЗ '!' — 70 файлов сборников + 30 Разное
~/Downloads/music-tags/why_resurface.py 🔑 диагностика «почему папки всплывают»: Counter(cur_album) по папке
~/Downloads/music-tags/show_root_files.py 🔑 файлы в КОРНЕ категорий (3 шт, → 'Radio')
~/Downloads/music-tags/verify_v5_vs_diff.py сверка дифф↔план (единица счёта: папка vs файл)
~/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 дублей Трофима (✅ уже удалены)
+39 -4
View File
@@ -139,10 +139,45 @@ related:
>
> 🔴 **ПРАВИЛО ОДИНОЧЕК ОТ 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 ДЛЯ ОДИНОЧЕК.
> сохранить»).
> ✅ **ЗАКРЫТО 27 сен (сессия 37):** `albumartist` для `rock_o_pop`/`Retro` — **`Various
> Artists`, УЖЕ ТАК, НЕ ТРОГАТЬ.** Alex дословно: «АЛЬБОМ БЛЯДЬ rock_o_pop **не
> albumartist** блядь! для сборников типа rock_o_pop **artist = 'Various Artists'**!!!»
> `!Rock&Folk/Ария, Кипелов` в v5 отсутствует — правки по ней уже в v3.
>
> 🔑 **ПРАВИЛО СБОРНИКОВ (финализировано, сессия 37):**
> ```
> album = имя папки-владельца БЕЗ ведущего '!' ← ЕДИНСТВЕННОЕ, ЧТО МЕНЯЕМ
> albumartist = 'Various Artists' (сборники) / владелец категории ('9999 - Разное' = Агата Кристи)
> artist = реальный исполнитель трека ← НЕ ТРОГАЕМ НИКОГДА
> ```
> 🔴 **`!` — служебный префикс сортировки, В ТЕГ НЕ ПИШЕТСЯ.** `!rock_o_pop` → `album='rock_o_pop'`.
> 🔴 **Антидефект найден:** в `!Pop, Club, Любэ/!ZabuGor/` у файла Marlyn Manson
> `album='!ZabuGor'` — восклицательный знак **попал в тег** (следствие старой правки по
> хардкод-списку). Кандидат в правку.
>
> 🔴🔴 **ПОЧЕМУ ПАПКИ «ОПЯТЬ ВСПЛЫВАЮТ» — ПОЛНОГО ПРОХОДА НЕ БЫЛО (сессия 37).**
> Alex спросил: «`Retro`, `ZabuGor` (15), `!Классика` — мы АБСОЛЮТНО ТОЧНО ПРАВИЛИ ДЛЯ
> полных проходов. почему они опять всплывают?». Ответ: правки были **ТОЧЕЧНЫЕ, по
> отдельным файлам**, правило «`album` = имя папки» к папке целиком не применялось ни разу.
> ```
> !ZabuGor, 15 файлов: APPLY-PLAN-v3-changes правил РОВНО 2 (Marlyn Manson, 2 Unlimited)
> остальные 13 → чужие album ('Tragic Kingdom', 'Rock Steady', …)
> !Классика, 20 файлов: 15 верных ('Классика') + 5 чужих (Paganini, Musopen, …)
> !Retro, 236 файлов: 62 УНИКАЛЬНЫХ значения album; 112 'Retro' + 124 мусор
> ```
> 🔑 **ПРАВИЛО: прежде чем искать багу — доказать, что проход был ПОЛНЫМ.**
> Диагностика: `collections.Counter(cur_album)` по папке. Много уникальных = прохода не было.
> Alex: «почему именно 2 и 3 не подпали? значит есть бага в твоем скрипте. ищи ее».
>
> 🔴 **СБОРЩИК `build_diff_from_db.py` НЕ ЗНАЕТ ПРАВИЛА СБОРНИКОВ.** Внутри только 3
> хардкод-префикса (`!Рэп/Трофим/`, `!Рэп/Птаха…`, `Тема дороги.mp3`). Поэтому `!Retro` (46),
> `!ZabuGor` (15), `!Классика` (5), `9999 - Разное` (30) и 3 корневых файла **в дифф не попали**.
> ⚠️ **Сборщик v2 (правило сборников) НЕ НАПИСАН** — открытый пункт перед прогоном.
> Требуемые правки → [[personal/plans/music-artist-albumartist-repair]] § ПОЧЕМУ ПАПКИ-СБОРНИКИ НЕ В ДИФЕ.
>
> ⚠️ **`execute_code` ЗАБЛОКИРОВАН Alex** («script denied by user»). Только `write_file`
> скрипта + `python3 /tmp/x.py`, либо терминал.
>
> ✅ **АРТЕФАКТ «КАК СТРОИЛСЯ APPLY-PLAN И ДИФФ» — ЗАПИСАН.** Zulip DB показала:
> `APPLY-PLAN.csv` собран в `/Users/admin/milestones/music-csv-2026-09-26/`