[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 19:58:42 +06:00
1 parent e9c2135642
commit 4803fc9881
2 files changed
+151 -3

No files matched your search

@@ -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`
> **ТРИГГЕР (цепочка):** «**он и так уже в файлах "Красивые, богатые"! как он блядь оказался в диффе?!**»
+14 -2
View File
@@ -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 пустых полей** и проверенного диффа