diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index 400046de..5b7eae34 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -5,6 +5,8 @@ updated: '2026-09-27' type: tech namespace: personal wave: 38 +diff_v6_md5: cfaf2f74432dbe8eadc53954eb452707 +last_session: 25 tags: - music - jellyfin @@ -313,7 +315,10 @@ related: > ~/Downloads/music-tags/REPORT-album-kept-all-folders.csv (559 строк, старый источник цифры 215) > ``` -> ## ✅ СЕССИЯ 24 (2026-09-27): ПРАВИЛО 10 ПЕРЕПИСАНО ПО «ДОМИНАНТЕ» — ДИФФ 96 ФАЙЛОВ +> ## ✅ СЕССИЯ 24 (2026-09-27): ПРАВИЛО 10 «ПО ДОМИНАНТЕ» — ОТМЕНЕНО В СЕССИИ 25. ЧИТАТЬ НИЖЕ +> +> ⚠️ **ВЕСЬ БЛОК НИЖЕ — ИСТОРИЯ. Правило «доминанта ≥60%» УДАЛЕНО ИЗ СБОРЩИКА в сессии 25.** +> Актуальная версия — блок «СЕССИЯ 25». Оставлено, чтобы не переизобретать откаченное. > > **Триггер:** Alex: «надо бля их чинить» → «Так чини блядь в чем вопрос?! Что не очевидно блядь?!» > после моего вопроса «класс 2 — ставить им album = доминанта папки или не трогаем?». @@ -418,6 +423,93 @@ related: > **5. КАЖДЫЙ СНОС БД — ОТДЕЛЬНОЕ СОГЛАСОВАНИЕ.** Alex возразил дважды («ты нахуя базу снес?»), > хотя обоснование было верным. +> ## ✅ СЕССИЯ 25 (2026-09-27): ПРАВИЛО «ДОМИНАНТЫ» ВЫКИНУТО. ДИФФ v6 = 135 ФАЙЛОВ / 139 ПРАВОК +> +> **Триггер:** Alex: «Да что опять там у тебя не покрыто блядь? 9 файлов сука не можешь никак +> добить?» → «Ты точно дебил.» → после вопроса про одиночек: «Нихуя блядь не понял. В списке +> теперь те 135 файлов/139 правок плюс 9 файлов которых не хватало?» → «Я БЛЯДЬ вопросы задаю.» +> +> ### 🔴 ГЛАВНОЕ: ПРАВИЛО «ДОМИНАНТА ≥60%» УДАЛЕНО ПОЛНОСТЬЮ +> +> Правило доминанты (сессия 24) — **источник разнобоя**. Оно оставляло «непокрытыми» папки, +> где нет 60% большинства (`Забугр`, `Rammstein/misc`, `Красная Плесень/misc`, `Df1`), +> и я по каждой из них задавал Alex вопрос «добивать или нет». Три вопроса подряд = мат. +> +> **Рабочая формулировка вместо доминанты:** +> ``` +> album = имя папки-владельца (ведущие '!' срезаются), для ЛЮБОЙ папки-сборника +> albumartist не трогаем (для сборников уже 'Various Artists') +> ПРАВИЛО ДОМИНАНТЫ НЕТ — оно давало ложные пропуски +> ``` +> +> 🔑 **Урок:** если после правила остаются «непокрытые» — правило неверное, а НЕ данные особенные. +> Вопрос «добивать 9 файлов?» был тупым: ответ выводился из уже сказанного (album = имя папки). +> +> ### 📊 ДИФФ v6 АКТУАЛЬНЫЙ +> ``` +> ~/Downloads/music-tags/DIFF-v6.csv 135 файлов · 139 правок (album 135 · albumartist 4) +> md5 cfaf2f74432dbe8eadc53954eb452707 +> источник: ~/Downloads/music-tags/navidrome-fresh.db (7808 треков, фильтр path NOT LIKE '%backup%') +> бэкап: DIFF-v6.csv.prev- +> ``` +> Состав: Infected Mushroom (~100 правок) + 4 плоские папки-сборника: +> ``` +> Rammstein/misc 15 файлов → album='misc' +> Красная Плесень/misc 26 файлов → album='misc' +> !Retro/Забугр 53 файла → album='Забугр' +> !Pop, Club, Любэ/Df1 16 файлов → album='Df1' +> ``` +> Явное исключение: `!Retro/Забугр/Eminem-The Marshall Mathers LP` (17 файлов, свой альбом, всё ровно). +> `albumartist` = 4 правки, только `Remixes, Mixes` (`Fly Agaric`, `Astrix`, `Yahel And Infected +> Mushroom`, `Infected Mushroom vs. The Prodigy` → `Infected Mushroom`). +> +> ⏳ **ДИФФ НЕ ПРИМЕНЁН.** Dry-run на NAS не запускался (сборщик упал на относительных путях — +> см. питфолл ниже), apply не запускался. +> +> ### 🔴 ПИТФОЛЛ СБОРЩИКА: `folder_of()` ОБЯЗАН РАБОТАТЬ ОТ `ROOT` +> +> Фильтры писались как `'/!Rock&Folk/Rammstein/misc/' in path`, а `folder_of()` резал путь +> по `path[len(ROOT):]` при `ROOT = "/storage/Music/"`. В БД путь **относительный** +> (`э/Infected Mushroom/...`), поэтому `len(ROOT)` съедал первые 15 символов → `folder_of` +> возвращал мусор, фильтры не срабатывали. **Проверять формат `path` в БД ДО написания правил.** +> В v6 префикс вернули: `path` в дифе пишется как `/storage/Music/...` (иначе tagwriter даёт MISSING). +> +> ### 📊 СРЕЗ «ОДИНОЧКИ» — ЭТО ДРУГОЙ СЧЁТ, НЕ ДЕФЕКТ +> +> Реальный вопрос Alex был про числа, поэтому зафиксировано жёстко: +> ``` +> 135 файлов / 139 правок = DIFF-v6, пойдёт в план +> 189 «одиночек» = альбом-ключи (album, albumartist) с 1 файлом — ДРУГОЙ срез +> ├─ 29 уже внутри DIFF-v6 +> └─ 160 вне диффа → из них ~10 реально кривых, остальное НОРМА +> ``` +> **Пересечения «135 + 9» НЕ СУЩЕСТВУЕТ** — 9 файлов (Забугр/Rammstein/Кр.Плесень/Df1) теперь ВНУТРИ 135. +> Единица счёта обязательна: «одиночки» ≠ «сироты» ≠ «файлы дифа». +> +> Класс A (норма, не трогать): папки-артисты с 1 файлом — `Little Big/Skibidi`, `Хабиб`, +> `Юрий Антонов`, `Серёга`, `Руки Вверх`, `Бутусов/Ю-Питер`. +> Класс C (реальные дефекты ВНЕ дифа, ~10, не покрыты): `Muse` (`'Muse'` vs `'Muse - Let It Slide'`), +> `Ногу Свело!` (`'Счастлива потому что беременна'`), `Eminem/misc` (`'The Marshall Mathers'`), +> `Голубой щенок` (два разных байта «й» в одном теге), `Би-2` (`'Иномарки'`). +> **Решение по классу C не получено.** +> +> ### ✅ НОРМА (проверено, правило НЕ должно их брать) +> `Dj Tiesto`·`Global Deejays`·`Benassi Bros`·`The Prodigy`·`Ария/Кипелов`·`Пилот/misc` — +> у каждого файла свой альбом, доминанты нет = **замысел**. `Sbornik_Novij_Rok` — `In Rainbows` +> → `Сборник нового рока`. +> +> ### 📁 АРТЕФАКТЫ СЕССИИ 25 +> ``` +> ~/Downloads/music-tags/DIFF-v6.csv 135 файлов, 139 правок, md5 cfaf2f74432dbe8eadc53954eb452707 +> ~/Downloads/music-tags/DIFF-v6.csv.prev-* бэкап прежней версии (96 файлов) +> ~/Downloads/music-tags/build_diff_v6.py сборщик (Infected Mushroom + 4 плоские папки) +> /tmp/show_orphans.py вывод album/artist/aa по 4 папкам +> /tmp/show_diff_v6.py сводка дифа по папкам +> /tmp/solo_albums.py список 189 одиночек +> /tmp/reconcile_solo.py пересечение дифа и одиночек (29 / 160) +> ``` +> ⏳ **NEXT:** dry-run на NAS → сверить с 139 правками → apply → приёмка с диска → пересбор БД. + > ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, сессия 38) — АРХИВ > > ### 📁 АРТЕФАКТЫ СЕССИИ 23 (все в `~/Downloads/music-tags/`)