[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 20:08:49 +06:00
1 parent 9393d68bde
commit 203e0da1a1
2 files changed
+152 -1

No files matched your search

@@ -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 строк) выяснилось, что
@@ -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** —