[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md
This commit is contained in:
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** —
|
||||
|
||||
Reference in new issue
Block a user