diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index 0f1a2afa..b1c14a3f 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: session14-junk-album-and-track-cleaned-171-rows +status: session15-root-files-one-album-rule-78-rows tags: - music - metadata @@ -23,7 +23,86 @@ related: # Music `artist` + `albumartist` Repair — правила Alex и ход работ -> ## 🔴 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 10 (2026-09-27) — ИСТОРИЧЕСКОЕ, см. сессию 12 выше +## 🟢 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 15 (2026-09-27) — читать это первым + +> ``` +> APPLY-PLAN.csv 7861 строка md5 bd14e6c64a93b422bbdfdaa554dea0c9 +> DIFF-new-vs-38.csv (перегенерировать — см. «Что делать дальше») +> tag-fix-plan.csv 7861 строка md5 203726ebfd2814e2328636df31337238 (НЕ ПРАВИТЬ) +> ``` +> +> ### 🔴 ГЛАВНОЕ ПРАВИЛО СЕССИИ 15 — КОРЕНЬ АРТИСТА = ОДИН АЛЬБОМ +> +> Alex прямым текстом: +> > «Муммий Тролль, Агата, Ария, Rammstein, Жуки, Князь, Benassi, банд эрос — то что в корне +> > лежит мы **считаем одним альбомом**. И `albumartist` соответственно **титульного исполнителя** +> > ставим. **не надо ничего `cur` брать!** редактируешь блядь csv!» +> +> | Поле | Значение для файла ПРЯМО в корне артиста | +> |---|---| +> | `album` | **имя корня** (= имя папки-артиста как есть, включая двойную «мм»: `Муммий Тролль`) | +> | `albumartist` | **имя корня** (титульный исполнитель) | +> | `cur_album` / `cur_artist` | **НЕ ИСПОЛЬЗОВАТЬ ВООБЩЕ** — теги этих файлов мусорные (см. ниже) | +> +> 🔴 **ОБОСНОВАНИЕ (проверено фактами):** у файлов в корнях артистов в теге **нет валидного +> альбома ни у одного**. Всё пусто, либо битьё CP1251→UTF8, либо водяной знак: +> +> | корень | мусорных | есть `cur_album` | из них валидных | +> |---|---:|---:|---:| +> | Агата Кристи | 21 | 4 | **0** — все `(Àãàòà)` = битьё | +> | КняZz | 12 | 6 | **0** — `[muzmo.ru]`, `[~melody.az~]` | +> | Муммий Тролль | 11 | 8 | **0** — `(Ìóììèé Òðîëëü)` = битьё | +> | Жуки | 9 | 0 | — | +> +> Отсюда: `album` = имя корня — это **единственный корректный вариант**, а не fallback. +> +> ### ✅ СДЕЛАНО В СЕССИИ 15 — 78 строк, 7 корней +> +> Скрипт `~/Downloads/music-tags/fix_root_album.py` (dry-run по умолчанию, `--apply` для записи). +> Бэкап: `APPLY-PLAN.csv.bak-rootalbum-20260927-150904`. +> Верификация: `check_root_rule.py` → **0 нарушений** по всем 7 корням. +> +> | корень | файлов в корне | `album` | `albumartist` | +> |---|---:|---|---| +> | `Агата Кристи` | 60 | `(Агата)`×15, `Опиум`×4, `Позорная звезда`×2, `Триллер`×2 … → `Агата Кристи` | `Психея`, `X-PRESs`, `Би-2`, `Пикник & Вадим Самойлов`, `Галанин Сергей`, `Вадим Самойлов`, `В.Шахрин, А.Пантыкин мл.` → `Агата Кристи` | +> | `Rammstein` | 3 | `misc`×2, `Das Modell` → `Rammstein` | — | +> | `Жуки` | 12 | `Батарейка`, `Легендарные песни`, `Прикольный СуперХит 5` → `Жуки` | `Рома Жуков`, `Виктор Жуков` → `Жуки` | +> | `КняZz` | 18 | `Письмо из Трансильвании`×2, `Любовь негодяя`, `Баркас`, `Магия Калиостро`, `Руки к небу` → `КняZz` | — | +> | `Benassi Bros` | 15 | `Hypnotica`×2, `Miami Sampler 2002 CDS`, `Pumphonia`, `Techno 2003` … → `Benassi Bros` | — | +> | `Банд Эрос` | 7 | `Коламбия Пикчерз не Представляет`×2, `Russian R'n'B vol.1` → `Банд Эрос` | `Банд'Эрос`×6, `VIP77` → `Банд Эрос` | +> | `Ария` | 0 | — (в корне нет файлов) | — | +> +> ### ⏳ ОТКРЫТО: `Муммий Тролль` — 23 строки, вопрос задан, ответа НЕТ +> +> Папка называется **`Муммий Тролль`** (две «м»), а в файлах `albumartist='Мумий Тролль'` +> (одна «м» — правильное написание группы). Вопрос Alex: ставить как в папке или правильное +> написание? **НЕ ПРАВИТЬ, пока Alex не ответит.** +> ``` +> album: 7× '(Муммий Тролль)', 1× 'Музыка.ру 5', 1× 'Other' (9 нарушений) +> albumartist: 13× 'Мумий Тролль' (13 нарушений) +> ``` +> +> ### 🔴 МЕТОД-УРОК СЕССИИ 15: НЕ ИЗОБРЕТАТЬ ДЕФЕКТЫ, ЧИТАТЬ ФАКТЫ +> +> Alex трижды за сессию ловил на преждевременных выводах: +> 1. Я объявил «нечего исправлять» по Агате — на деле **72 нарушения `album` + 29 `albumartist`**. +> 2. Я предположил, что `117`/`099` в `Sbornik_Novij_Rok` — «порядковые номера сборников» и +> обнулил их. **Неверно:** у 196/200 файлов папки номер в том же формате → это **реальный +> номер трека**. Откат: `fix_track_restore.py`, 8 строк восстановлено. +> 3. Детектор `check_root_files.py` дал 420 «нарушений», из них **413 — ложные** (обычные +> сборники `Various Artists` с разными артистами). Реальных — 7. +> +> **Следствие:** перед «исправлением» класса — проверить его на **соседних файлах** и убедиться, +> что правило применимо ко всем, а не к выхваченным строкам. +> +> ### 🔴 КЛАСС `Various Artists` — ПРОВЕРЕН, 0 НАРУШЕНИЙ (не трогать) +> +> `check_va.py`: 1229 файлов с `aa='Various Artists'` в 45 папках. Нарушений правила +> «VA только при РАЗНЫХ исполнителях» — **0**. Все 45 папок имеют ≥2 разных `new_artist`. +> +> ── + +> ## 🔴 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 10 (2026-09-27) — ИСТОРИЧЕСКОЕ, см. сессию 14 выше > > ``` > APPLY-PLAN.csv 7861 строка md5 7679ee01a2aa8f28623b6fb8559d7381 @@ -411,27 +490,43 @@ Alex указал на `Алиса в Стране Чудес (Диск2)/04` = по mp3 (7861), поэтому эти форматы в него не попали by design. - `НЕТ-В-38` (41) = есть в новом плане, не было в 38-м. -### 📌 Что делать дальше (порядок приоритета, обновлён в сессии 14) +### 📌 Что делать дальше (порядок приоритета, обновлён в сессии 15) -0. ✅ **ЗАКРЫТО в сессии 14:** мусорный `new_album` (20 строк) и мусорный `new_track` (151 строка). - `disk_v2/2 ALT,PUNK/HARD` → `RADIO 2 ALT,PUNK`. `disk/3 SHANSON/Трофим` — **не трогаем** - (Alex: «альбомы — это правильно»). -1. **Ответить на оставшиеся вопросы по `album`** — особенно #4 (4 разных формата `album` +0. ✅ **ЗАКРЫТО в сессии 15:** корни артистов = один альбом (78 строк, 7 корней); + класс `Various Artists` проверен (0 нарушений); мусорный `new_album`/`new_track` (сессия 14). + Откат моей ошибки: 8 строк `track` в `Sbornik_Novij_Rok` / `Детский хит` восстановлены. +1. ⏳ **ОТВЕТ ALEX НУЖЕН:** `Муммий Тролль` — 23 строки. `album`/`albumartist` = `Муммий Тролль` + (как папка, две «м») или `Мумий Тролль` (правильное написание группы, одна «м»)? + **НЕ ПРАВИТЬ до ответа.** +2. **Ответить на оставшиеся вопросы по `album`** — особенно #4 (4 разных формата `album` внутри `!Radio`) и класс «`album` = название песни» (Алексин/Шалавы, Дискотека Авария). -2. **Дожать класс «жанр унаследован от `cur_genre`»** — `Enigma/Sleep` 13 строк `General Folk` +3. **Дожать класс «жанр унаследован от `cur_genre`»** — `Enigma/Sleep` 13 строк `General Folk` (Enigma = нью-эйдж/эмбиент, не фолк). Тот же корень дефекта, что и 26 исправленных строк. -3. **Остались неразобранными из ручного прохода `album`:** `z Другое, Enigma, Ленинград` → +4. **Остались неразобранными из ручного прохода `album`:** `z Другое, Enigma, Ленинград` → `Сосни попса`; `detskiy_hor_benassi_satisfaction.mp3` → `Горячие Синглы 2004`; - `Бутусов & Ю-Питер/Девушка По Городу`; корни артистов (Жуки, Потап & Каменских, Света, Серёга) - с `album` = имя артиста. -4. **Решить судьбу 51 папки с рваной нумерацией** — но сначала: стоит ли вообще трогать + `Бутусов & Ю-Питер/Девушка По Городу`. +5. **Решить судьбу 51 папки с рваной нумерацией** — но сначала: стоит ли вообще трогать номера в подборках `!Radio`. -5. Перегенерировать `DIFF-new-vs-38.csv` после любых правок плана +6. 🔴 **ОБЯЗАТЕЛЬНО: перегенерировать `DIFF-new-vs-38.csv`** после правок сессии 15 (`python3 diff_new_vs_38.py > /tmp/log 2>&1`) — **и всегда верифицировать свой скрипт - перечитыванием** (см. метод-урок сессии 14). -6. Применение плана к файлам — **отдельное «go»** от Alex, через `tagwriter:v2` + перечитыванием** (см. метод-урок сессии 15: не изобретать дефекты, читать факты). +7. Применение плана к файлам — **отдельное «go»** от Alex, через `tagwriter:v2` (см. `[[personal/plans/tagwriter-container]]`). +### 🛠 Инструменты сессии 15 (`~/Downloads/music-tags/`) + +| Скрипт | Назначение | +|---|---| +| `fix_root_album.py` | правило «корень артиста = один альбом», 78 строк, dry-run по умолчанию | +| `check_root_rule.py` | верификация: `album`/`albumartist` == имя корня → 0 нарушений | +| `check_va.py` | проверка класса `Various Artists` (1229 файлов / 45 папок → 0 нарушений) | +| `check_root_files.py` | детектор файлов в корне; ⚠️ даёт много ложных (сборники) | +| `fix_junk_album.py` + `verify_junk_album.py` | мусорный `new_album` (20 строк, сессия 14) | +| `fix_track_v3.py` + `fix_track_rest7.py` + `verify_track.py` | мусорный `new_track` (151 строка) | +| `fix_track_restore.py` | 🔴 откат моей ошибки: 8 реальных номеров треков восстановлены | +| `scan_junk_album.py` | скан мусорных значений `new_album` | + + ## 🔴 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 11 (2026-09-27) — ИСТОРИЧЕСКОЕ ```