diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index 81e4ec3d..86cb3a69 100755 --- a/personal/plans/music-artist-albumartist-repair.md +++ b/personal/plans/music-artist-albumartist-repair.md @@ -5508,6 +5508,118 @@ track 118 **неподряд**, сортировка битая; если один `folder`+`field` повторяется с разными `new` — это сборник, не дефект. +## ✅ ЧИСТКА ДИФФА ОТ ШУМА `track N → N/M` (2026-09-27, финал сессии 29-окти) + +> **ТРИГГЕР:** Alex: «**я думаю трек 6 не надо править на "6/14" ты как считаешь?**» + +### 🔑 ПОДТВЕРЖДЕНО ФАКТОМ ИЗ БД: `track_number` ХРАНИТСЯ ЦЕЛЫМ + +```sql +SELECT track_number, COUNT(*) FROM media_file +WHERE path NOT LIKE 'backup%' GROUP BY track_number +``` +Дал: `0` (1581) · `1` (510) · `2` (466) · … · `24` (22) — **только целые**, без `/M` +и без ведущих нулей. + +**Следствие:** `6 → 6/14` и `8 → 08` — **значение трека НЕ меняется**. База всё равно +приведёт его к целому. Это форматная косметика, не правка. + +### ✅ УБРАНО 118 строк шума + +| Скрипты | Убрано | Осталось | +|---|---:|---:| +| `/tmp/drop_track_noise.py` (`N → N/M`) | 117 | 945 | +| добор последней `8 → 08` | 1 | **945** | + +⚠️ **ПИТФОЛЛ СЧЁТА:** первый подсчёт через `awk ... | grep -c "/"` дал **33** строки — +потому что `awk -F','` разваливает пути с запятыми в кавычках и часть строк теряется. +Реальный объём — **117**. Считать надо CSV-парсером, не `awk` по кавычкам. + +**Бэкапы:** `/tmp/DIFF-v3.bak-20260927-205211.csv`, `/tmp/DIFF-v3.bak2-*.csv` + +### 🔴 РЕШЕНИЕ ALEX (зафиксировано): `N/M` в треках НЕ ПРАВИМ + +Причина, названная Alex и подтверждённая фактом: значение не меняется, правится впустую. +Дополнительно: `TRCK` с `/` ломает часть парсеров и сортировку в Navidrome. + +## 🔴 РЕШЕНИЕ ALEX: ПАПКУ `Разное` НЕ РАЗГРЕБАЕМ + +> Alex: «**нет. план такой и был что папку Разное мы кидаем как альбом "Разное" а не разгребаем.**» + +Класс из 76 файлов (папки-мусорки внутри артиста) — **ЗАКРЫТ БЕЗ ДЕЙСТВИЙ**: + +``` +44 !Барды/Владимир Высоцкий/Разное album='Разное' +14 !Rock&Folk/Пилот/Избранное album='Избранное' +10 !Rock&Folk/ДДТ/2003 - песни album='Песни' + 3 !Rock&Folk/Наутилус Помпилиус/2000 - песни album='песни' + 3 !Rock&Folk/Rammstein/misc album='misc' + 1 !A Not sorted/SD-card-2026-05/Агата Кристи album='Избранное' + 1 !Детские/Из чего же.mp3 album='' → починен, см. ниже +``` + +🔑 **Это ПЛАН, а не дефект.** Папка-мусорка намеренно становится альбомом-мусоркой. +**НЕ «улучшать»** — Николай/следующая сессия: не предлагать разгребать `Разное`, +`Избранное`, `Песни`, `misc`. Детектор `/tmp/diag_root_junk.py` ловит их как «мусор» — +это **ложное срабатывание по определению плана**. + +## ✅ ФИКС ОПЕЧАТКИ `Андервуд` + ДЫРКИ `!Детские` (2026-09-27, финал) + +> **ТРИГГЕР:** Alex: «**Андервуд надо исправить еще**» → «**`!Детские/Из чего же.mp3` - где альбом**» + +### 1. `Андервуд` (опечатка протекла из имени папки в `album`) + +``` +folder !A Not sorted/SD-card-2026-05/Андервуд +cur_artist Ундервуд ← уже правильное написание +new_album Андервуд → Ундервуд ← ❌ было имя папки с опечаткой +``` +Папка на диске названа с опечаткой (`А` вместо `У`); правило корня взяло её как есть. +Доказательство правильного значения — `cur_artist` у того же файла. + +### 2. `!Детские/Из чего же.mp3` (потеря значения) + +``` +cur_album Íåèçâåñòíîå íàçâàíèå ← битьё CP1251 = «Неизвестное название» +new_album (пусто) → Детские +``` +Генератор распознал битый `cur_album` как мусор и **обнулил**, но подставил значение +в `new_albumartist = Детские песни` — не в то поле. `album` остался пустым, диф показывал +`[Unknown Album] → (пусто)`, т.е. план **сотрал бы тег**. Файл лежит в корне `!Детские`. + +### Скрипт и верификация + +`/tmp/fix_v3_typos.py` — правит **только `/tmp/apply-plan-v3.csv`**, +`APPLY-PLAN.csv` (канон/RC) **НЕ ТРОНУТ**. Бэкап: `/tmp/apply-plan-v3.csv.bak-20260927-204950`. +Проверено `grep` по диффу: +``` +строка 2: Андервуд — album: Андервуд -> Ундервуд ✅ +строка 28: !Детские — album: [Unknown Album] -> Детские ✅ +``` + +## 📊 ФИНАЛЬНОЕ СОСТОЯНИЕ ДИФФА (2026-09-27, сессия 29-окти — ЗАКРЫТА) + +| Артефакт | Значение | +|---|---| +| `~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv` | **945 записей** | +| `md5` | `a89d7b56ce65835c361395c5b7d1064d` | +| Сортировка | `field` **по алфавиту**: `album → albumartist → genre` | + +``` +album 28 склейки, правило корня, опечатки папок +albumartist 6 The Prodigy, Дискотека Авария, Потап, Король и Шут, + Eminem (<2 разных>), Ленинград (<2 разных>) +genre 911 снятие «!» префиксов +``` +`track` в диффе **0** — весь блок убран как шум (см. выше). +БД 7861 ↔ план 7861, сопоставлено 7861, **не найдено 0**. + +### 🔴 ОСТАЁТСЯ НА РЕШЕНИЕ ALEX + +`Sbornik_Novij_Rok` — сборник, `genre` не одно значение (`Folk/Pop/Rock/Punk/Rap`) → +N ПАПКА-строк по одному полю. Alex решения не давал; для сборника это ожидаемо, +но требует подтверждения формы вывода. + ## 🔴 ОСТАВШИЙСЯ ДЕФЕКТ: `!Rock&Folk/Rammstein/misc` — 3 файла Обнаружен Alex в конце сессии: «**`!Rock&Folk/Rammstein/misc` - album - rammstein - неправильно**». diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index b2872ec2..ee758789 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -25,11 +25,12 @@ related: > ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, сессия 29-ОКТИ) — ЧИТАЙ ЭТО ПЕРВЫМ > -> ✅ **КАНОННЫЙ ДИФФ v3 СОБРАН:** `~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv` -> — **1062 записи** (710 ПАПКА + 352 ТРЕК), из них `genre` 911 · `track` 118 · `album` 27 · -> `albumartist` 6. База 7861 ↔ план 7861, сопоставлено 7861, **не найдено 0**. -> Источник: `/tmp/apply-plan-v3.csv` (7861, собран из `new_*` `APPLY-PLAN.csv` + правило -> корня; **31 правка**, лог с колонкой `reason` — `~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv`). +> ✅ **КАНОННЫЙ ДИФФ v3 СОБРАН И ЗАКРЫТ:** `~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv` +> — **945 записей**, `md5 a89d7b56ce65835c361395c5b7d1064d`. Поля: `album` 28 · +> `albumartist` 6 · `genre` 911. `track` — **0** (весь блок убран как шум, см. ниже). +> База 7861 ↔ план 7861, сопоставлено 7861, **не найдено 0** (фильтр `path NOT LIKE 'backup%'`). +> Источник: `/tmp/apply-plan-v3.csv` (7861, из `new_*` `APPLY-PLAN.csv` + правило корня; +> **31 правка**, лог с колонкой `reason` — `~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv`). > Сборщик: `/tmp/build_canon_diff_v3.py`. > > 🔴 **ДЕФЕКТ СОРТИРОВКИ (найден Alex: «почему сортировки по филду нету в диффе») — ИСПРАВЛЕН.** @@ -40,22 +41,36 @@ related: > `sorted({...})`, НЕ список в порядке объявления.** Разбор — > [[personal/plans/music-artist-albumartist-repair]] § СОРТИРОВКА ПО `field` — АЛФАВИТНАЯ. > -> ⚠️ **ОТКРЫТО (2 дефекта верификации v3-диффа):** -> 1. `!Детские/Из чего же.mp3` — `album` в БД `[Unknown Album]` → `new` в диффе **пусто** -> (потеря значения, не правило корня). -> 2. `Sbornik_Novij_Rok` — сборник, `genre` не одно значение (`Folk/Pop/Rock/Punk/Rap`) → -> N ПАПКА-строк по одному полю. Схлопывание `(folder, field, new)` на сборниках -> разваливается; нужно решение Alex. +> 🔴 **ШУМ `track N → N/M` ВЫЧИЩЕН — 118 строк.** Подтверждено из БД: `track_number` +> хранится **ЦЕЛЫМ** (`0` 1581 · `1` 510 · … · `24` 22), без `/M` и без ведущих нулей → +> `6 → 6/14` и `8 → 08` **значение НЕ меняют**. Скрипты `/tmp/drop_track_noise.py` (+ добор). +> ⚠️ **ПИТФОЛЛ СЧЁТА:** `awk -F',' | grep -c "/"` дал **33** вместо **117** — `awk` разваливает +> пути с запятыми в кавычках. Считать CSV-парсером. **РЕШЕНИЕ ALEX: `N/M` в треках НЕ ПРАВИМ.** > -> ✅ **ВЕРИФИЦИРОВАН «короткий список опечаток» — все 6 правок УЖЕ в `APPLY-PLAN.csv`** -> (Простоквашено 0 · Агата кристи 0 · 11 Track 11 0 · IM-склейка 0 · `Radio - ` 0 · -> Бард - Авангард 0 в `new_*`). v3-генератор их наследует автоматически, как и задумано -> архитектурой «от `new_*`, не с нуля». Скрипт проверки: `/tmp/check_shortlist_full.py`. +> ✅ **ОБА ДЕФЕКТА ВЕРИФИКАЦИИ ЗАКРЫТЫ** (`/tmp/fix_v3_typos.py`, бэкап +> `/tmp/apply-plan-v3.csv.bak-20260927-204950`; `APPLY-PLAN.csv` — канон/RC — **НЕ ТРОНУТ**): +> 1. `!Детские/Из чего же.mp3` — битый `cur_album` (`Íåèçâåñòíîå íàçâàíèå`, CP1251) обнулён +> генератором; подстановка ушла в `new_albumartist`, а `album` остался пуст → +> **`[Unknown Album] → Детские`**. +> 2. `!A Not sorted/…/Андервуд` (опечатка в имени папки) протекла в `album` → +> **`Андервуд → Ундервуд`** (доказательство — `cur_artist` того же файла). +> +> ✅ **«КОРОТКИЙ СПИСОК ОПЕЧАТОК» — все 6 правок УЖЕ в `APPLY-PLAN.csv`** (Простоквашено 0 · +> Агата кристи 0 · 11 Track 11 0 · IM-склейка 0 · `Radio - ` 0 · Бард - Авангард 0 в `new_*`). +> v3-генератор их наследует автоматически. Скрипт: `/tmp/check_shortlist_full.py`. > 🔑 **ПИТФОЛЛ: `grep` по ВСЕМУ CSV даёт ложную тревогу «правки откатились»** — опечатки > живут в колонке `title` (название песни). Проверять ТОЛЬКО по колонке через CSV-парсер. > `Муммий` в `new_*` = 0 (в тегах `Мумий Тролль`), в `path` = 88 (имя папки на диске; > **продукт не трогается — переименование папок не входило в задачу**). > +> 🔴 **РЕШЕНИЕ ALEX: ПАПКУ `Разное` НЕ РАЗГРЕБАЕМ.** Класс 76 файлов (папки-мусорки внутри +> артиста: `Высоцкий/Разное` 44 · `Пилот/Избранное` 14 · `ДДТ/2003 - песни` 10 · +> `Rammstein/misc` 3 и др.) — **ПЛАН, а не дефект**: папка-мусорка намеренно становится +> альбомом-мусоркой. **НЕ «улучшать»**, детектор `/tmp/diag_root_junk.py` ловит их ложно. +> +> ⏳ **ОСТАЁТСЯ:** `Sbornik_Novij_Rok` — сборник, `genre` не одно значение +> (`Folk/Pop/Rock/Punk/Rap`) → N ПАПКА-строк по одному полю. Решения Alex нет. +> > Подробно — [[personal/plans/music-artist-albumartist-repair]] § СЕССИЯ 29-ОКТИ / 29-СЕПТИ. > ## 🗄️ ПРЕДЫДУЩЕЕ СОСТОЯНИЕ (сессия 29-секси) — АРХИВ