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