[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/plans/tagwriter-container.md personal/tech/id3-tag-repair.md personal/tech/music-tags-repair-truenas.md personal/tech/scripts/find_aa_hijack.py personal/tech/scripts/find_va_misuse.py

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 14:19:15 +06:00
1 parent 463a77ac5d
commit 2520fda13b
6 files changed
+359 -47

No files matched your search

@@ -4,7 +4,7 @@ created: '2026-09-27'
updated: '2026-09-27'
type: plan
namespace: personal
status: session8-done-va-over-single-artist-fixed-5-pending-alex
status: session9-done-va-class-cleared-category-root-rolled-back
tags:
- music
- metadata
@@ -23,6 +23,36 @@ related:
# Music `artist` + `albumartist` Repair — правила Alex и ход работ
> ## 🔴 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 9 (2026-09-27)
>
> ```
> APPLY-PLAN.csv 7861 строка md5 82492a0b2b93dbb6c7444a4040a21a03
> DIFF-new-vs-38.csv 4946 строк md5 dd67d4fe64bc6365c478a0831cda634c
> tag-fix-plan.csv не тронут (база 38-го, источник истины для диффа)
> ```
>
> **Пустых полей в плане — 0.** Дифф проверен: `ПОТЕРЯНО 0 · ЛИШНИХ 0 · ПОТЕРЬ НЕТ, дифф ПОЛНЫЙ`.
>
> ✅ **Второй класс `Various Artists` ДОЧИЩЕН полностью** (99 строк): `!Рэп/НТЛ` (63) +
> `!Рэп/НТЛ/2003 - Выход` (17) → `НТЛ`, `Ария, Кипелов` (12) → `Ария`, `Тест Сабвуфера` (4) →
> `Тест Сабвуфера`. Детектор `find_va_misuse.py` теперь даёт **`ПАПОК-КАНДИДАТОВ: 0`**.
>
> ✅ **`z Другое…` корень — ОТКАЧЕНО по требованию Alex.** Было `Various Artists`, стало
> **собственный `artist` файла** (`Красная Плесень` ×2, `ВИА МЕА` ×1). Корень папки-категории
> альбомом **не считается** — см. правило **A4** в `[[personal/tech/id3-tag-repair]]`.
>
> ✅ **`Би-2/Нечётный Воин` — `artist` вытащен из имён файлов** (46 строк): заглушки
> `Нечетный Воин` / `Нечётный воин 2` → реальные исполнители (`Би-2 + Агата кристи`,
> `Лакмус + Александр Ф.Скляр`, …), `albumartist` → `Би-2`. См. раздел «🔷 СЕССИЯ 9».
>
> ⚠️ Все 5 папок из сессии 8 закрыты: `!Рэп/НТЛ`, `Ария, Кипелов`, `Тест Сабвуфера`,
> `z Другое…` корень — решены; правок в ожидании нет.
>
> **Суммарно за сессии 7-9 исправлено 313 строк** по четырём классам (см. A1/A2/A3/A4 в tech-доке).
>
> ⏳ **Открыто:** `album` файлов `Би-2/Нечётный Воин/*` (`Нечетный Воин (CD1)`, `Медленная Звезда`,
> `Нечётный воин 2`) — вопрос задан, ответа нет, **не трогать**.
>
> ## 🔴 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 8 (2026-09-27)
>
> ```
@@ -40,7 +70,7 @@ related:
>
> ⏳ **Детектор `find_va_misuse.py` нашёл 5 папок того же класса — ждут решения Alex:**
> `!Рэп/НТЛ` (75), `!Rock&Folk/Ария, Кипелов` (8/12), `z Другое…/Тест Сабвуфера` (3/4),
> `z Другое…` корень (2/3).
> `z Другое…` корень (2/3). → **ЗАКРЫТО в сессии 9, см. выше.**
>
> ## 🔴 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 7 (2026-09-27)
>
@@ -2887,6 +2917,144 @@ z Другое… (корень) 2/3 artist='К
2. Повторный прогон `find_va_misuse.py` до пустого результата.
3. Глазами пройти `field=albumartist` в диффе (571 строка папок).
---
# 🔷 СЕССИЯ 9 (2026-09-27) — ДОЧИСТКА `Various Artists` + `Би-2/Нечётный Воин`
Продолжение сессии 8: 5 папок из детектора закрыты, плюс новый разбор проекта «Нечётный Воин».
## 📊 ФИНАЛЬНОЕ СОСТОЯНИЕ (конец сессии 9)
```
APPLY-PLAN.csv 7861 строка md5 82492a0b2b93dbb6c7444a4040a21a03
DIFF-new-vs-38.csv 4946 строк md5 dd67d4fe64bc6365c478a0831cda634c
tag-fix-plan.csv не тронут (база 38-го, источник истины для диффа)
verify_diff_completeness.py — независимый контроль полноты
```
**Пустых полей в плане — 0** (все пять `new_*`).
Дифф: `ПОТЕРЯНО 0 · ЛИШНИХ 0 · НЕТ-В-38 41=41 · ТОЛЬКО-В-38 85=85 · ПОТЕРЬ НЕТ, дифф ПОЛНЫЙ`.
`ВСЕГО правок (трек-уровень): 18558` — не изменилось (правки меняют значения, не число расхождений).
## ✅ A. ВТОРОЙ КЛАСС `Various Artists` ДОЧИЩЕН ПОЛНОСТЬЮ (99 строк)
Решение Alex: «Арию ставь в albumartist. исправляй что нашел. `Тест Сабвуфера` — наверное
должен быть `Тест Сабвуфера` а не Various».
| Папка | Файлов | Было | Стало | Основание |
|---|---:|---|---|---|
| `!Рэп/НТЛ` | 63 | `Various Artists` | **`НТЛ`** | Alex: «исправляй что нашел» |
| `!Рэп/НТЛ/2003 - Выход` | 17 | `Various Artists` | **`НТЛ`** | то же |
| `!Rock&Folk/Ария, Кипелов` | 12 | `Various Artists` | **`Ария`** | Alex: «Арию ставь» |
| `z Другое…/Тест Сабвуфера` | 4 | `Various Artists` | **`Тест Сабвуфера`** | Alex: «наверное должен быть Тест Сабвуфера» |
| `z Другое…` (корень) | 3 | `Various Artists` | см. B | откат |
**Детектор `find_va_misuse.py` теперь даёт `ПАПОК-КАНДИДАТОВ: 0`** — класс вычищен.
> ⚠️ **Отмена прежнего противоречия:** в сессии 8 помечено, что `!Рэп/НТЛ` формально попадает
> под правило «треки в корне артиста при наличии подпапок-альбомов → СБОРНИК (кейс НТЛ)».
> Alex решил **в пользу артиста** (`НТЛ`), не сборника. Правило «кейс НТЛ = сборник» из сессии 5
> **отменено** — детектор был прав, таблица правил устарела.
## ✅ B. `z Другое…` КОРЕНЬ — ОТКАЧЕНО (3 строки)
> Alex: «стоп. нет. красную плесень в красную плесень — виа меа в виа меа — не объединять
> корень Другого в альбом»
```
ВИА МЕА aa='ВИА МЕА' album='Дерьмо Моржа'
Красная Плесень aa='Красная Плесень' album='Сосни попса'
Красная Плесень aa='Красная Плесень' album='Сосни попса'
```
**Правило (зафиксировано):** корень папки-**категории** (`z Другое, Enigma, Ленинград` —
контейнер из подпапок разных исполнителей) **альбомом НЕ считается**.
`albumartist` = **собственный `artist` файла**, НЕ `Various Artists`.
Разные исполнители в корне категории — **не повод** для `Various Artists`.
## ✅ C. `Би-2/Нечётный Воин` — `artist` вытащен из имён файлов (46 строк)
> Alex: cur_artist = `Нечётный воин 2` / `Нечетный Воин` → «исправляй артиста значит»
### Как выявлено
`new_albumartist` содержал имя ПРОЕКТА вместо артиста:
`Нечетный Воин` (CD1/CD2/Медленная Звезда, 27 файлов) и `Нечётный воин 2` (16 файлов).
А `new_artist` дублировал ту же заглушку — реальные исполнители были **только в имени файла**
в скобках: `02 Все, как он сказал (Би-2 + Агата кристи).mp3`.
⚠️ **Важно:** это **НЕ порча планом** — в ОРИГИНАЛЕ (`cur_artist`) уже стояло
`Нечётный воин 2`. Проверено сравнением с `tag-fix-plan.csv`: `cur == new` в обоих CSV.
План просто не трогал эти поля. Мой оборот «прочерк» был неверным словом — Alex отреагировал:
«че блядь значит прочерк? почему? они не стояли на оригиналах?»
### Правка
| Папка | Файлов | `artist` было | `artist` стало | `aa` |
|---|---:|---|---|---|
| `2005 Нечетный Воин/CD1` | 11 | `Нечетный Воин` | `Би-2 + И.Желанная`, `Серьга`, `Линда`, `Агата Кристи`, `М.Карасёв`, `Brainstorm`, `Неонавт`, `Сети`, `Би-2` ×3 | → `Би-2` |
| `2005 Нечетный Воин/CD2` | 11 | `Нечетный Воин` | `Т.Литвиненко`, `Э.Шклярский`, `Лакмус`, `О.Нестров`, `Н.Борзов`, `О.Петрыкина`, `Лена Т.`, `Би-2 + C.Fereira`, `Би-2` ×3 | → `Би-2` |
| `2005 Медленная Звезда` | 5 | `Нечетный Воин` | `Би-2` (все — скобок в именах нет) | → `Би-2` |
| `2008 Проект Нечетный Воин 2` | 16 | `Нечётный воин 2` | `Би-2 + Агата кристи` ×2, `Лакмус + Александр Ф.Скляр`, `Роман Суслов + David Brown`, `Сергей Мазаев + Татьяна Литвиненко`, `А.Кортнев + И.Богушевская`, `Би-2 + Диана Арбенина` ×2, `Би-2 + Инна Желанная`, `Би-2 + Punk tv`, `Truffele`, `Алексей Романов`, `David Brown`, `Louis Frank`, `А.Севидов, Electro-punk`, `Би-2` (Intro) | → `Би-2` |
### 🔴 ПИТФОЛЛ: вложенные скобки в имени файла ломают экстрактор
Регулярка `re.findall(r'\(([^()]*)\)', stem)` берёт **последнюю** группу скобок. Три файла
с вложенными/битыми скобками дали НЕВЕРНЫЙ `artist` — потребовался ручной доп-фикс:
| Файл | Автоматически | Правильно |
|---|---|---|
| `03 Kao sun road (David Brown (Brazzaville).mp3` | `Brazzaville` | **`David Brown`** |
| `11 Michael (Louis Frank (Esthetic education).mp3` | `Esthetic education` | **`Louis Frank`** |
| `16 Все, как он сказал (А.Севидов, Electro-punk.mp3` | `Би-2` | **`А.Севидов, Electro-punk`** |
**Мораль:** после массовой экстракции из имён — **всегда глазами просмотреть результат**,
имена с вложенными скобками дают мусор.
### ⏳ ОТКРЫТО
`album` у этих файлов остался неоднородным: `Нечетный Воин (CD1)`, `Нечетный Воин (CD2)`,
`Медленная Звезда`, `Нечётный воин 2`. Вопрос Alex задан («оставить или унифицировать?`Нечётный Воин`/`Нечётный воин 2`») — **ответа нет, не трогать**.
## 🧰 ИНСТРУМЕНТЫ СЕССИИ 9
| Файл | Назначение |
|---|---|
| `/tmp/fix_va_rest.py` | дочистка `Various Artists` (НТЛ, Ария, Тест Сабвуфера) |
| `/tmp/rollback_z_drugoe.py` | откат `z Другое…` корня |
| `/tmp/fix_nechetny.py` | `aa` `Нечетный Воин` → `Би-2` |
| `/tmp/fix_nechetny_artist.py` | экстрактор `artist` из скобок имён файлов |
| `/tmp/fix_nested.py` | ручной фикс 3 файлов с вложенными скобками |
| `/tmp/find_va_misuse.py` | детектор `Various Artists` (повторный прогон → 0) |
### Бэкапы сессии 9
```
APPLY-PLAN.csv.bak-before-va-rest-20260927-141317
APPLY-PLAN.csv.bak-before-z-drugoe-va-20260927-141339
APPLY-PLAN.csv.bak-before-z-drugoe-rollback-20260927-141422
APPLY-PLAN.csv.bak-before-nechetny-20260927-141459
APPLY-PLAN.csv.bak-before-nechetny-artist-20260927-141705
APPLY-PLAN.csv.bak-before-nested-fix-20260927-141715
```
## 📊 ИТОГ ТРЁХ СЕССИЙ (7-9): 313 строк по четырём классам
| Класс | Проявление | Детектор | Объём |
|---|---|---|---|
| **A1** чужое значение `albumartist` из корня папки | `DJ Feel`, `VIP77`, `Бумер`, `КняZz`, `Мика Ньютон`, `Виктор Жуков`, `ДА и Меньшиков` | `find_aa_hijack.py` | 40 |
| **A2** `Various Artists` поверх одного артиста | Агата Кристи 95, НТЛ 80, Бенасси 20, Tiesto 14, Иванушки 8, Магомаев 7, ИМ 5, Ария 12, Тест Сабвуфера 4 | `find_va_misuse.py` | ~250 |
| **A3** имя папки/склейка в `album` | `Rammstein - misc` → `misc`, `Infected Mushroom - Other Track's` → `Other Tracks` | `find_folder_as_album.py` | 5 |
| **A4** корень папки-категории как альбом | `z Другое…` | — | 3 (откат) |
## ⏭ СЛЕДУЮЩИЙ ШАГ
1. `album` для `Би-2/Нечётный Воин/*` — оставить или унифицировать (ждёт Alex).
2. Глазами пройти `field=album` в диффе (305 строк, из них ПАПКА — 72) — содержательные решения.
3. Затем `field=albumartist` (571 строка папок).
4. Боевой прогон `--apply --verify` — **не запущен**, ждёт отдельного «go».
5. Контейнер `snapcur` на NAS (только чтение, `:ro`) — **не убран**, Alex не подтвердил.
+7 -6
View File
@@ -20,12 +20,13 @@ related:
---
# tagwriter — применение тегов к MP3 (TrueNAS)
> 🔴 **СТАТУС: БОЕВОЙ ПРОГОН НЕ ЗАПУЩЕН.** План правится в сессии 8
> (дифф против 38-го прогона) — подробности в [[personal/plans/music-artist-albumartist-repair]] § «СЕССИЯ 8».
> Актуальные MD5: `APPLY-PLAN.csv` = `48439e06afeb7bdc28e78be5448f44f7` (7861 стр),
> `DIFF-new-vs-38.csv` = `047755613601bcf31c23ff8f22e69b22` (4945 стр).
> Открыто: `track` (56 файлов с `238` + 9 с пустым при непустом `cur_track`),
> 5 папок с `Various Artists` поверх одного артиста (`!Рэп/НТЛ` и др.).
> 🔴 **СТАТУС: БОЕВОЙ ПРОГОН НЕ ЗАПУЩЕН.** План правится в сессиях 8-9
> (дифф против 38-го прогона) — подробности в [[personal/plans/music-artist-albumartist-repair]] § «СЕССИЯ 8/9».
> Актуальные MD5: `APPLY-PLAN.csv` = `d1fa36dc0fba72faeff08856369fca46` (7861 стр),
> `DIFF-new-vs-38.csv` = `374ed1fed3abb7d9ec397025c0c88a2b` (4945 стр).
> **Класс `Various Artists` поверх одного артиста — вычищен полностью** (детектор
> `find_va_misuse.py` → `ПАПОК-КАНДИДАТОВ: 0`), корень `z Другое…` откачен на собственный `artist`.
> Открыто: `track` (56 файлов с `238` + 9 с пустым при непустом `cur_track`), контейнер `snapcur` на NAS.
> ## 🔴 ПУТИ: `~/milestones` БОЛЬШЕ НЕТ
>