diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index 01729301..873685d9 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: session27-kanonnyj-diff-v2-vosstanovlen-2856-strok-peresechenie-218-iz-225-6-defektov-Pushnoy.ru-AWAITING-ALEX +status: session28-RULE-CHECK-v2-1133-stroka-dyra-225-zakryta-DIFF-rule-album-v1-170-strok-AWAITING-ALEX tags: - music - metadata @@ -21,6 +21,142 @@ related: - '[[family/how-to/navidrome-truenas-android]]' # Music `artist` + `albumartist` Repair — правила Alex и ход работ +## 🔴 СЕССИЯ 28 (2026-09-27, ночь) — ДЫРА В ДЕТЕКТОРЕ ПРАВИЛА ЗАКРЫТА: 225 → 1133 ФАЙЛА + +> **ТРИГГЕР:** «**диф гре**» → после показа `RULE-CHECK.csv` (225 строк) выяснилось, что +> **`!Retro/Руки` в файле ОТСУТСТВУЕТ** — `grep -c "Retro/Руки" RULE-CHECK.csv` = **0**. + +### 🔴 ГЛАВНЫЙ ДЕФЕКТ СЕССИИ 26/27: СРАВНЕНИЕ НА РАВЕНСТВО ВМЕСТО ВХОЖДЕНИЯ + +Старый детектор (`/tmp/rule_check_db.py`) определял «файл в корне папки артиста» так: + +```python +if leaf.lower() not in (artist.lower(), aa.lower()): + continue # ❌ СРАВНЕНИЕ НА РАВЕНСТВО +``` + +**Следствие:** `'руки'` не равен `'руки вверх'` → **`!Retro/Руки` (8 файлов) и +`!Pop, Club, Любэ/Руки вверх` (2 файла) выпали из выборки целиком.** Папка-огрызок +(`Руки` при артисте `Руки Вверх`) — ровно тот случай, ради которого правило и писалось. + +Расширенный список потерь (те же грабли, `leaf` ≠ `artist` буквально): `Каста`, +`Savant`, `Infected Mushroom`, `Eminem,50cent`, `Забугр`, `АК-47`, `Ночные Снайперы`, `ДДТ`. + +### ✅ ФИКС: НОРМАЛИЗОВАННОЕ ВХОЖДЕНИЕ В ОБЕ СТОРОНЫ + +```python +def norm(x): # /tmp/rule_check_v2.py + x = (x or "").lower() + for ch in " \t_-.,'’`!()[]&": + x = x.replace(ch, "") + return x + +# файл в папке артиста? +if (nleaf in nartist or nartist in nleaf) or (nleaf in naa or naa in nleaf): + match = True # ✅ ВХОЖДЕНИЕ +``` + +Плюс отсечение пустого `cur_album` (`if not cur_album: continue`) — нечего менять. + +### 📊 РЕЗУЛЬТАТ ФИКСА: `RULE-CHECK-v2.csv` — 1133 ФАЙЛА / 169 ПАПОК + +| Что | Значение | +|---|---| +| Артефакт | `~/Downloads/music-tags/RULE-CHECK-v2.csv` | +| Генератор | `/tmp/rule_check_v2.py` | +| Источник | БД Navidrome (`~/Downloads/navidrome-db/navidrome-merged.db`) | +| Строк | **1133** (было 225 — **+908 файлов** дыры) | +| Папок | **169** (было 60) | +| Колонки | `path, folder, album, albumartist, artist, target` | + +**ТОП-30 папок (новые крупные, которых НЕ БЫЛО в списке на 225):** + +``` +24 !Рэп/Каста/Каста - Быль в Глаза (2009 Переиздание) +23 !Pop, Club, Любэ/Infected Mushroom/(2003) … Converting Vegetarians +23 !Pop, Club, Любэ/Infected Mushroom/Unreleased/Other/… Other Track's +22 !Pop, Club, Любэ/Savant/(2012) Savant - Alchemist [SZLP0008] +21 !Pop, Club, Любэ/Savant/(2013) Savant - Orakel [3766640] +21 !Рэп/Каста/Каста - Быль в Глаза (2008) +19 !Рэп/Eminem,50cent/The Eminem Show +18 !Pop, Club, Любэ/Savant/(2014) Savant - Protos [none] +17 !Retro/Забугр/Eminem-The Marshall Mathers LP +17 !Rock&Folk/Краденое Солнце/1998 - Сказка 'Краденое Солнце' +17 !Детские/Сказки/Маша и Витя против Диких Гитар +17 !Рэп/АК-47/Витя АК - Жирный (2012) +15 !Рэп/Guf - Город дорог (2007) + 15 !Рэп/Guf/Guf - Город дорог (2007) +14 !Pop, Club, Любэ/Dj Tiesto +14 !Rock&Folk/Ария, Кипелов/Кипелов - Главные песни +14 !Rock&Folk/Би-2/2006 БИ-2. Grand Collection +14 !Rock&Folk/Ночные Снайперы/Ночные Снайперы - Армия (2009) +``` + +### ✅ КОНТРОЛЬ (Alex требовал эти файлы) — ТЕПЕРЬ ВСЕ НА МЕСТЕ + +``` +!Pop, Club, Любэ/Руки вверх/Крошка моя.mp3 'Песни' -> 'Руки вверх' +!Pop, Club, Любэ/Руки вверх/Хочешь я тебе (Мороженое).mp3 'Песни' -> 'Руки вверх' + +!Retro/Руки (8 файлов, папка-ОГРЫЗОК) -> target 'Руки Вверх' ✅ ИСПРАВЛЕНО + 'Руки' Puki_vverh-chuzhie_gubi, РУКИ ВВЕРХ - СТУДЕНТ, Руки В Верх - Серёжа + 'Супер ДискотЭка Радио Рекорд' Руки Вверх - Алешка + 'Здравствуй, это я' Руки Вверх Ай Ай Ай + 'Сделай еще громче' Руки Вверх Крошка Моя + 'Конец попсе, танцуют все' Рuki_Vverh-on_Tebya_Celuet + +!Retro/Тамара Миансарова/Чёрный кот.mp3 'Храбрый Зайчик. Песни для детей' -> 'Тамара Миансарова' +!Retro/Юрий Никулин (3 файла) 'Песни' -> 'Юрий Никулин' +``` + +> ✅ **Баг детектора из сессии 26 ЗАКРЫТ:** `target` для `!Retro/Руки` теперь **`'Руки Вверх'`** +> (полное имя артиста), а не `'Руки'` (огрызок папки). Нормализация + ветка «огрызок → полное имя» +> отработали на 8 файлах. + +### 📁 ДИФ ПО ПРАВИЛУ: `DIFF-rule-album-v1.csv` + +``` +Формат: scope, folder, path, field, old_now, new_rule, n_files + (канонное схлопывание ПАПКА/ТРЕК сохранено) + +ПАПКА 113 строк ← покрывают 1076 файлов +ТРЕК 57 строк +ВСЕГО: 1133 файла-правки ← контроль сошёлся (assert в /tmp/make_diff_rule.py) +``` + +Генератор: `/tmp/make_diff_rule.py`. Схлопывание работает: где `target` один на всю папку — +одна строка `ПАПКА` с `n_files`, где разные — построчно `ТРЕК`. + +**Контроль в дифе:** + +``` +[ПАПКА] !Retro/Руки '<5 разных>' -> 'Руки Вверх' 8 ф. +[ПАПКА] !Pop, Club, Любэ/Руки вверх 'Песни' -> 'Руки вверх' 2 ф. +[ПАПКА] !Retro/Юрий Никулин 'Песни' -> 'Юрий Никулин' 3 ф. +[ТРЕК] !Retro/Тамара Миансарова 'Храбрый Зайчик…' -> 'Тамара Миансарова' +``` + +### 🛠 СКРИПТЫ ЭТОЙ СЕССИИ + +| Скрипт | Что делает | +|---|---| +| ⭐ `/tmp/rule_check_v2.py` | **детектор по правилу с ВХОЖДЕНИЕМ** → `RULE-CHECK-v2.csv` (1133) | +| ⭐ `/tmp/make_diff_rule.py` | диф по правилу со схлопыванием → `DIFF-rule-album-v1.csv` (170 строк) | +| ❌ `/tmp/rule_check_db.py` | старый детектор на РАВЕНСТВЕ — дал дыру 225 | + +### 📁 АРТЕФАКТЫ ЭТОЙ СЕССИИ + +``` +~/Downloads/music-tags/RULE-CHECK-v2.csv ⭐ 1133 строк, 169 папок +~/Downloads/music-tags/DIFF-rule-album-v1.csv ⭐ 170 строк (113 ПАПКА + 57 ТРЕК) +~/Downloads/music-tags/RULE-CHECK.csv ⚠️ 225 строк — НЕПОЛНЫЙ, не использовать +``` + +### ⏳ СТАТУС + +**Правки НЕ применялись.** Файлы на NAS не тронуты. Подтверждения на прогон не было. + +--- + ## 🔴 СЕССИЯ 27 (2026-09-27, ночь) — КАНОННЫЙ ФОРМАТ ДИФФА + ПЕРЕСЕЧЕНИЕ С 7649 + 6 ДЕФЕКТОВ `Pushnoy.ru` > **ТРИГГЕР (цепочка):** «**он и так уже в файлах "Красивые, богатые"! как он блядь оказался в диффе?!**» diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index f7ed427c..977ddbb7 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -23,14 +23,26 @@ related: # Music Tags Repair — TrueNAS (7906 → 7905 файлов) -> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, конец сессии 9) — ЧИТАЙ ЭТО ПЕРВЫМ +> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, сессия 28) — ЧИТАЙ ЭТО ПЕРВЫМ +> +> ⚠️ **НОВОЕ (сессия 28): детектор «файл в корне папки артиста» сравнивал на РАВЕНСТВО +> и терял папки-огрызки.** `'Руки'` ≠ `'Руки Вверх'` → `!Retro/Руки` (8 файлов) и +> `!Pop, Club, Любэ/Руки вверх` (2) **выпадали из выборки целиком**. Фикс — нормализованное +> **ВХОЖДЕНИЕ** (`nleaf in nartist or nartist in nleaf`). Результат: **225 → 1133 файла** +> (`RULE-CHECK.csv` → `RULE-CHECK-v2.csv`, 60 → 169 папок). Подробно — +> [[personal/plans/music-artist-albumartist-repair]] § СЕССИЯ 28. +> +> 🔑 **МЕТОД-УРОК (повторяется 3-й раз):** при сопоставлении имени папки с именем артиста +> **НИКОГДА не сравнивать на равенство** — только `norm()` + вхождение в обе стороны. +> Иначе теряются ровно те случаи, ради которых правило писалось (папка-огрызок, +> `Забугр`/`Забугор`, разный регистр, `Руки`/`Руки Вверх`). > > **Этот файл — исторический лог волны 38 (завершена). Актуальная работа идёт здесь:** > > | Документ | О чём | > |---|---| > | **[[personal/plans/tagwriter-container]]** | ⭐ скрипт-писатель `apply_tags_v2.py` (566 стр): логика полей, ID3v1-снос, тесты, 18 питфоллов, запуск | -> | **[[personal/plans/music-artist-albumartist-repair]]** | ⭐ **правила формирования плана, `APPLY-PLAN.csv`, дифф `DIFF-new-vs-38.csv`, сессии 1-9** | +> | **[[personal/plans/music-artist-albumartist-repair]]** | ⭐ **правила формирования плана, `APPLY-PLAN.csv`, диффы, сессии 1-28** | > | **[[personal/tech/music-broken-toload]]** | 29 битых/DRM файлов на перезагрузку | > > **Состояние:** план `APPLY-PLAN.csv` доведён до **0 пустых полей** и проверенного диффа