From 203e0da1a15b4f13d3b555f918012ddae89ea7c1 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 27 Sep 2026 20:08:49 +0600 Subject: [PATCH] [2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md --- .../plans/music-artist-albumartist-repair.md | 140 +++++++++++++++++- personal/tech/music-tags-repair-truenas.md | 13 ++ 2 files changed, 152 insertions(+), 1 deletion(-) diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index e1dd3ba4..709517cb 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: session29-DIFF-new-vs-38-v6-1674-stroki-shlopnuto-15069-AWAITING-ALEX-ANDervud +status: session29bis-DIFF-rule-album-v1-170-DIFF-rule-vs-BASE-13-rashozhdeniy-AWAITING-ALEX tags: - music - metadata @@ -150,6 +150,144 @@ grep -c 'Андервуд' DIFF-new-vs-38-v6.csv → 3 --- +## 🔴 СЕССИЯ 29-БИС (2026-09-27, ночь) — ГЛАВНЫЙ АРТЕФАКТ СЕССИИ НАЙДЕН: `/tmp/make_diff_rule.py` + +> **ТРИГГЕР (продолжение):** «**«Sbornik_Novij_Rok» — да ты охуел блядь!!!**» → +> «**какого лешего ты эту хуйню туда блядь вписал?!**» → «**стоп блядь**» → +> «**где тот скрипт которым ты генерил сука 7496 правку?! он блядь и схлопывал и там +> все дефинишены блядь были прописаны уже включая «Сборник нового рока»! где он блядь?!**» → +> «**так бери блядь этот скрипт и генери сука им полный csv. а потом дифай его против базы скачанной!**» + +### 🔴🔴 ГЛАВНЫЙ ПРОЦЕССНЫЙ ПРОВАЛ СЕССИИ: НАПИСАЛ ЗАНОВО ВМЕСТО ПЕРЕИСПОЛЬЗОВАНИЯ + +Готовые скрипты **уже существовали и делали ровно то, что просил Alex**: + +| Скрипт | Что делает | Статус | +|---|---|---| +| ⭐ `/tmp/rule_check_v2.py` | правило корня по БД Navidrome; сборники (`!Retro/!Radio`) **исключены на входе**; вхождение в обе стороны; `norm()` | рабочий → `RULE-CHECK-v2.csv` (1133) | +| ⭐ `/tmp/make_diff_rule.py` | **схлопывание по папке** + диф по правилу; формат канонного дифа; `assert` контроль | рабочий → `DIFF-rule-album-v1.csv` (170) | + +Я же написал с нуля `diff_new_vs_38_v5.py` / `_v6.py`, **потеряв схлопывание и вписав правило +корня туда, где его быть не должно** — получил `Sbornik_Novij_Rok` вместо `Сборник нового рока` +на 200 файлов. + +**🔑 ПРАВИЛО СЕССИИ: перед написанием скрипта — `grep -l "<ключевое слово>" /tmp/*.py +~/Downloads/music-tags/*.py`. Готовый скрипт с дефинишенами почти всегда уже есть. +Переписывание с нуля = потеря наработанных правил + новые дефекты.** + +**🔑 ПРАВИЛО 2: `7496` / `7649` — это НЕ число правок, а НОМЕР СТРОКИ** в +`~/Downloads/music-tags/manual_scan_out.txt` (класс `имя-папки-в-album`). При поиске +«скрипта на 7496» `grep -l "7496" *.py` даёт пусто — искать надо в отчётах скана, а скрипт +по назначению, а не по числу. + +### 🔴 ДЕФЕКТ №3 v5/v6: ПРАВИЛО КОРНЯ ПЕРЕБИВАЛО ALBUM, КОТОРЫЙ ПЛАН УЖЕ ДАЛ ВЕРНО + +`!A Not sorted/Sbornik_Novij_Rok` — в плане `new_album = Сборник нового рока` (**правильно**), +`new_albumartist = Various Artists`. v6 вписал **имя папки** `Sbornik_Novij_Rok` на **200 файлов**. + +**Фикс (в v6):** правило корня вмешивается **только если план НЕ дал целевого album**: +```python +plan_gives_album = bool(new_alb) and new_alb != cur_alb +if not plan_gives_album: # иначе значение из плана — верное, правило не трогаем + ... +``` +Плюс `root_rule_target()` возвращает `None` для папок-сборников (`"sbornik" in low or "сборник" in low`). + +### ✅ ГЛАВНЫЙ РЕЗУЛЬТАТ: ОБА CSV СГЕНЕРИРОВАНЫ ГОТОВЫМИ СКРИПТАМИ + +**1. `/tmp/make_diff_rule.py` → `DIFF-rule-album-v1.csv`** (полный CSV правилом корня): + +| Метрика | Значение | +|---|---| +| Строк на входе (`RULE-CHECK-v2.csv`) | 1133 | +| Схлопнуто по папке | **113** | +| На отдельные треки | **57** | +| Покрыто файлов схлопыванием | **1076** | +| Всего | **1133** — `assert` прошёл | + +Контроль из отчёта (примеры схлопывания): +``` +[ПАПКА] !Pop, Club, Любэ/Руки вверх 'Песни' -> 'Руки вверх' (файлов 2) +[ПАПКА] !Retro/Руки '<5 разных>' -> 'Руки Вверх' (файлов 8) +[ПАПКА] !Retro/Юрий Никулин 'Песни' -> 'Юрий Никулин' (файлов 3) +[ТРЕК] !Retro/Тамара Миансарова 'Храбрый Зайчик. Песни для детей' -> 'Тамара Миансарова' +``` + +**2. `/tmp/diff_rule_vs_base.py` → `DIFF-rule-vs-BASE.csv`** (диф правила против скачанной БД): + +| Вердикт | Файлов | +|---|---| +| `БАЗА-КАК-В-ДИФЕ` | **1272** | +| `УЖЕ-ПРИМЕНЕНО` | **64** | +| `БАЗА-РАСХОДИТСЯ` | **13** | +| **Всего проверено** | **1349** (БД: 8167 файлов) | + +Колонки: `scope, folder, path, album_in_db, old_now, new_rule, verdict`. БД читается +`file:…?mode=ro` (только чтение, БД не трогается). + +### 🔴 РАЗБОР 13 × `БАЗА-РАСХОДИТСЯ` — ДВА КЛАССА, ОБА ДЕФЕКТЫ **МОЕГО** ДИФА, НЕ ПРАВИЛА + +**Класс 1 — `!Классика` и `z Другое, Enigma, Ленинград/Классика` (10 файлов).** +Диф говорит `'Классика' → 'Various Artists'`, а в БД лежат **настоящие названия альбомов** +(`Paganini: 24 Caprices`, `Classical Sampler`, `Masters Remastered (FMA)`, +`Musopen: The Complete Works of Frédéric Chopin`, `Creepy Classical Music …`). +Правка **затрёт реальные альбомы на `Various Artists`** — в базе ЛУЧШЕ, чем предлагает диф. + +**Причина (доказано `/tmp/why_13.py`):** правило корня на этих файлах **НЕ срабатывало вообще** — +все четыре проверки `False` (`nleaf in nartist`, `nartist in nleaf`, `nleaf in naa`, `naa in nleaf`). +Файлы попали в отчёт через **развёртывание ПАПКА-записи на все файлы папки из БД**, а не только +на те, что были во входе `RULE-CHECK-v2.csv`. + +**🔑 ДЕФЕКТ №4 (мой, в `diff_rule_vs_base.py`): схлопнутую ПАПКА-запись нельзя разворачивать +на всю папку из БД** — только на пути, которые были во входе правила. Иначе ложные +`БАЗА-РАСХОДИТСЯ`. **Не исправлено — ждёт решения.** + +**Класс 2 — `!Рэп/Eminem,50cent` (3 файла).** +Диф: `'Encore' → 'Eminem'` и `"Get Rich Or Die Tryin'" → 'Eminem'`. В БД — настоящие альбомы. + +**Причина (доказано):** `nartist in nleaf` = **`True`** — артист **`50 Cent` содержится +в имени папки-сборника `Eminem,50cent`** → правило решило, что папка = папка артиста 50 Cent. + +**🔑 ДЕФЕКТ №5 (в правиле `rule_check_v2.py`, НЕ мой): обратное вхождение `nartist in nleaf` +пропускает артиста как ЧАСТЬ имени папки-сборника.** Папка `Eminem,50cent` — сборник, не папка +50 Cent. **Не исправлено — ждёт решения Alex.** + +Доказательство (`/tmp/why_13.py`, выборка): +``` +leaf='Eminem,50cent' artist='50 Cent' aa='50 Cent' album='Eminem,50cent' + nleaf='eminem50cent' nartist='50cent' nartist in nleaf: True ⛔ +leaf='Eminem,50cent' artist='50 Cent' aa='50 Cent' album="Get Rich Or Die Tryin'" + nartist in nleaf: True ⛔ +leaf='!Классика' artist='Фредерик Шопен' aa='Various Artists' + ВСЕ 4 ПРОВЕРКИ False → правило корня НЕ срабатывало +``` + +### ⏳ ОТКРЫТЫЕ ВОПРОСЫ К ALEX (2, оба требуют его решения) + +1. **`!Рэп/Eminem,50cent`** — что верно: `album` остаётся `Get Rich Or Die Tryin'` (как в БД), + или правило корня всё же ставит `Eminem`? (нужно решить до правки дефекта №5) +2. **`Андервуд`** (из предыдущего блока) — папка через «н», `albumartist` через «д». + +### 🛠 СКРИПТЫ И АРТЕФАКТЫ ЭТОГО БЛОКА + +``` +/tmp/rule_check_v2.py ⭐ правило корня по БД → RULE-CHECK-v2.csv (1133) +/tmp/make_diff_rule.py ⭐ схлопывание + диф → DIFF-rule-album-v1.csv (170) +/tmp/diff_rule_vs_base.py ⭐ НОВЫЙ: диф правила против БД → DIFF-rule-vs-BASE.csv +/tmp/why_13.py 🔍 диагностика 13 расхождений (leaf/artist/aa/album + 4 проверки) + +~/Downloads/music-tags/DIFF-rule-album-v1.csv ⭐ 170 записей (113 ПАПКА + 57 ТРЕК) +~/Downloads/music-tags/DIFF-rule-vs-BASE.csv ⭐ 1349 проверено (13 расхождений) +~/Downloads/music-tags/manual_scan_out.txt 🔍 скана-отчёт: '7496'/'7649' = НОМЕРА СТРОК, не правки +``` + +### 🔴 СТАТУС БЛОКА + +**Правки НЕ применялись.** Файлы на NAS не тронуты, БД читалась `mode=ro`. +**13 расхождений требуют фикса дефекта №4** (`diff_rule_vs_base.py`) и решения по дефекту №5. + +--- + ## 🔴 СЕССИЯ 28 (2026-09-27, ночь) — ДЫРА В ДЕТЕКТОРЕ ПРАВИЛА ЗАКРЫТА: 225 → 1133 ФАЙЛА > **ТРИГГЕР:** «**диф гре**» → после показа `RULE-CHECK.csv` (225 строк) выяснилось, что diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index 0e3be000..c37505fc 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -50,6 +50,19 @@ related: > (`DIFF-new-vs-38-v6.csv`, **1674 строки**, схлопнуто 15069 треков). Старые > `DIFF-new-vs-38-v2/v3/v4/v5.csv` — **сломаны/черновики, не использовать.** > **Боевой прогон НЕ запущен — ждёт «go» от Alex.** +> +> 🔴 **ОБНОВЛЕНИЕ (сессия 29-бис):** актуальный путь сместился на **правило корня**, а не +> диф волны 38. Готовые скрипты **уже существовали** и были найдены только после того, как +> я написал замену с нуля и получил `Sbornik_Novij_Rok` вместо `Сборник нового рока` (200 файлов): +> **`/tmp/rule_check_v2.py`** (правило, сборники исключены) → **`/tmp/make_diff_rule.py`** +> (схлопывание) → `DIFF-rule-album-v1.csv` (**170**: 113 ПАПКА + 57 ТРЕК; `assert` 1076+57=1133 ✅); +> затем **`/tmp/diff_rule_vs_base.py`** диффует правило против БД → `DIFF-rule-vs-BASE.csv` +> (**1349 проверено**: 1272 как-в-дифе · 64 уже-применено · **13 БАЗА-РАСХОДИТСЯ**). +> **🔑 ПРАВИЛО: перед написанием скрипта — `grep -l` по `/tmp/*.py` и `~/Downloads/music-tags/*.py`.** +> **🔑 `7496`/`7649` — НОМЕРА СТРОК в `manual_scan_out.txt`, не число правок.** +> 13 расхождений → дефект №4 (мой: ПАПКА-запись разворачивалась на всю папку из БД) + +> дефект №5 (правило: `nartist in nleaf` ловит `50 Cent` внутри папки `Eminem,50cent`). +> Полный разбор — [[personal/plans/music-artist-albumartist-repair]] § СЕССИЯ 29-БИС. > ✅ Класс **«`albumartist` размножен от чужого файла в корне папки»** — ИСПРАВЛЕН (7 папок, 40 строк). > ✅ Класс **«`Various Artists` поверх одного артиста»** — ВЫЧИЩЕН ПОЛНОСТЬЮ > (`find_va_misuse.py` → `ПАПОК-КАНДИДАТОВ: 0`). Разбор классов **A1-A4** —