From b1bab81be220a4d200699fe805438c941478fd06 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sat, 26 Sep 2026 21:17:18 +0600 Subject: [PATCH] [2026-09-26] eagle: personal/plans/music-tags-review/music-tags-review.md personal/plans/music-tags-wave38-fixes.md personal/tech/music-tags-final-review.md personal/tech/music-tags-rename-audit.md personal/tech/music-tags-repair-truenas.md --- .../music-tags-review/music-tags-review.md | 4 + personal/plans/music-tags-wave38-fixes.md | 104 ++++++++++++++++++ personal/tech/music-tags-final-review.md | 26 ++++- personal/tech/music-tags-rename-audit.md | 96 ++++++++++++++++ personal/tech/music-tags-repair-truenas.md | 42 ++++++- 5 files changed, 270 insertions(+), 2 deletions(-) create mode 100644 personal/plans/music-tags-wave38-fixes.md create mode 100644 personal/tech/music-tags-rename-audit.md diff --git a/personal/plans/music-tags-review/music-tags-review.md b/personal/plans/music-tags-review/music-tags-review.md index 59cbc1c1..0995fb49 100755 --- a/personal/plans/music-tags-review/music-tags-review.md +++ b/personal/plans/music-tags-review/music-tags-review.md @@ -10,6 +10,10 @@ updated: '2026-09-26' # Music Tags — проверка тегов **К правке:** 6773 файлов · **без изменений:** 1133 +**Актуальное состояние (волна 38, 2026-09-26):** CSV `tag-fix-plan.csv` структурно цел +(7906 строк / 0 битых). Финальный аудит → **[[personal/tech/music-tags-rename-audit]]**: +найдено 4 недоделки (335 строк не в сводках, 5 confusable, `new_album='New'` ×1, `Часть N` в title ×33). +Блоки ниже устарели — читать техдок [[personal/tech/music-tags-repair-truenas]] волны 34–38. > **⚠️ 25-я волна (2026-09-26): ИДЁТ ПОСТРОЧНОЕ РУЧНОЕ ЧТЕНИЕ. Прочитано 1–1401 из 7906 (~18%).** > diff --git a/personal/plans/music-tags-wave38-fixes.md b/personal/plans/music-tags-wave38-fixes.md new file mode 100644 index 00000000..8b56bc2c --- /dev/null +++ b/personal/plans/music-tags-wave38-fixes.md @@ -0,0 +1,104 @@ +--- +created: '2026-09-26' +namespace: personal +related: + - '[[personal/tech/music-tags-rename-audit]]' + - '[[personal/tech/music-tags-repair-truenas]]' +status: plan +tags: + - music + - jellyfin + - truenas + - metadata + - plan +title: Music Tags — план волны 38 (4 правки по аудиту) +type: plan +updated: '2026-09-26' +wave: 38 +--- +# План волны 38: 4 правки по аудиту `tag-fix-plan.csv` + +_Создан: 2026-09-26. Статус: ПЛАН, ждёт «go». Источник: `~/Downloads/music-tags/tag-fix-plan.csv`._ +_Основание: [[personal/tech/music-tags-rename-audit]]._ + +**Схема каждой правки (обязательна):** скрипт в файле → бэкап `bak-<имя>` → запись в `.tmp` → +ревалидация (7906 строк, 11 колонок, 0 битых) → `os.replace`. Идемпотентность: повторный прогон = 0. + +--- + +## P1 — 335 строк не в сводках (недолеченный баг волны 33) + +`single(646) + multi(6897) + skip(28) = 7571` ≠ 7906 → **недостача 335**. +Все — с **пустым `new_artist`**. `rebuild_summaries.py` выбрасывает строки с пустым `artist` +(`if not art: continue`) — тот же фильтр, что прятал 562 сказки. + +| Папка | Строк | +|---|---:| +| `!Детские/Сборка Песни для детей` | 165 | +| `!Детские/Детский хит` | 156 | +| `!Pop, Club, Любэ/!Radio` | 8 | +| `!Pop, Club, Любэ/Df1` | 4 | +| `!Pop, Club, Любэ/Infected Mushroom` | 1 | +| `!A Not sorted/НАШЕСТВИЕ 2009 - ДЕНЬ ВТОРОЙ.mp3` | 1 | + +**Правка:** убрать фильтр `if not art: continue` из `rebuild_summaries.py` и заменить на sentinel: +строки с пустым `artist` группируются по `album` как ` (без исполнителя)`. +По образцу волны 18 (там это уже делали для 188 строк — значит фильтр вернулся при переписывании). + +**Приёмка:** `single + multi + skip == 7906`; в обоих файлах `0` пустых `artist`. + +--- + +## P2 — 7 строк confusable-скрипт (латиница внутри кириллицы) + +Точный разбор (аббревиатуры `RMX`/`DZA`/`MF`/`DJ` — **легитимны**, не трогаем): + +| # | Поле | Слово | Битый символ | Значение | +|---|---|---|---|---| +| 1 | `new_title` | `Айбoлит` | лат. `o` | `Айболит` | +| 2 | `new_title` | `Cпокойной ночи, малыши!` | лат. `C` | `Спокойной ночи, малыши!` | +| 3 | `new_title` | `Авто-мaт` | лат. `a` | `Авто-мат` | +| 4 | `new_title` | `Cнайпер feat. Диана Арбенина` | лат. `C` | `Снайпер feat. Диана Арбенина` | +| 5 | `new_title` | `Муза (Remix by DJ Kореец + DJ Vini)` | лат. `K` | `…DJ Кореец…` | +| 6 | `new_artist` | `Кабарe-Дуэт Академия` | лат. `e` | `Кабаре-Дуэт Академия` | +| 7 | `new_artist` | `X-Фактор` | лат. `X` | `Х-Фактор` (кир. `Х`) | + +**Правка:** замена символов в этих 7 значениях + `source` не меняем (правка кодировки). +**Проверка:** повторный прогон детектора → 0. + +--- + +## P3 — `new_album = 'New'` (техпапка в теге) — 1 строка + +`/storage/Music/!Rock&Folk/Король и Шут/Танец гения.mp3` → `new_album: 'New'` → **пусто**. +`cur_album` тоже `'New'` (мусор от граббера). По паттерну волны 19 (техпапки `misc`/`new`/`Album` → пусто). + +--- + +## P4 — `new_title = 'Часть N'` — 25 строк (2 альбома) + +| Альбом | Строк | Файлы | Проблема | +|---|---:|---|---| +| `Новые Бременские` | 19 | `NN - TrackNN.mp3` | `title = Часть N` — номер серии вместо названия | +| `Малыш и Карлсон` | 6 | `01..03 - TrackNN.mp3` | 🔴 **регрессия волны 37**: album свели в один, но title остались `Часть N` | + +⚠️ **Требует решения Alex:** 19 строк `Новые Бременские` — реальных названий серий **нет** +(файлы называются `TrackNN.mp3`, в имени файла только номер). Варианты: +- **(A)** title = `Серия N` (как правили `Трое из Простоквашино 8` → `Серия 8`); +- **(B)** title оставить пустым (номер уже в `new_track`); +- **(C)** найти названия серий извне (треки не определить без прослушивания). + +6 строк `Малыш и Карлсон` — **чинятся однозначно**: title должен быть названием сказки, +сквозная нумерация 1–6 (уже в `new_track`). По образцу волны 37. + +--- + +## Порядок выполнения + +1. **P3** (1 строка) — простой, независимый. +2. **P2** (7 строк) — замена символов. +3. **P4** (25 строк) — после решения Alex по `Новые Бременские`; 6 строк Карлсона чинятся сразу. +4. **P1** — правка `rebuild_summaries.py` + пересборка сводок (последним, т.к. зависит от P4). +5. Ревалидация: 7906 / 0 битых / сумма сводок = 7906. + +**Не входит в этот план (отдельно, ждёт Alex):** 77 строк `часть` в `album`, 136 пар дублей `(album,track)`. diff --git a/personal/tech/music-tags-final-review.md b/personal/tech/music-tags-final-review.md index 0f4ff38c..3f530589 100755 --- a/personal/tech/music-tags-final-review.md +++ b/personal/tech/music-tags-final-review.md @@ -4,7 +4,7 @@ created: '2026-09-26' updated: '2026-09-26' type: tech namespace: personal -wave: 37 +wave: 38 tags: - music - jellyfin @@ -13,12 +13,36 @@ tags: related: - '[[personal/tech/music-tags-repair-truenas]]' - '[[family/how-to/jellyfin-config]]' + - '[[personal/tech/music-tags-rename-audit]]' --- # Чистка тегов Music: сводки для финального аппрува _Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-fix-plan.csv`._ +> ## 🔍 38-я волна — ФИНАЛЬНЫЙ АУДИТ CSV («список на переименование») +> +> Триггер: Alex — «проводи финальный полный аудит списка на переименование» → «Csv блядь который ты делал». +> Полный отчёт: **[[personal/tech/music-tags-rename-audit]]** (создан, волна 38). +> +> **CSV структурно цел: 7906 строк / 0 битых / 11 колонок** — к применению технически готов. +> Актуальные `action`: `fix` **7041** / `no_change` **837** / `skip` **28** (цифры ниже в доке 37-й волны устарели). +> +> **4 недоделки (требуют решения Alex, ничего не правилось):** +> 1. 🔴 **335 строк не в сводках** (`single 646 + multi 6897 + skip 28 = 7571` ≠ 7906) — все с пустым +> `artist`: `Сборка Песни для детей` 165, `Детский хит` 156, `!Radio` 8, `Df1` 4, прочее 2. +> Тот же баг волны 33 (`rebuild_summaries.py` выбрасывает пустой `artist`) — не долечен. +> 2. 🔴 **5 confusable-строк** (латиница внутри кириллицы) в `new_title`: `Айбoлит`, `Авто-мaт`, +> `ХХХиРНР`, `Голуби ft.Сацура`, `Два корабля(Sick…` + 2 в `artist`. Остальной mixed-script легитимен. +> 3. 🔴 `new_album='New'` — 1 стр (`!Rock&Folk/Король и Шут/Танец гения.mp3`), техпапка в теге. +> 4. ⚠️ `new_title='Часть N'` — 33 строки (`!Детские/Новые Бременские`, `NN - TrackNN.mp3`). +> +> **Ждёт решения (не трогалось):** 77 строк `часть` в `album` (`Избранное II - часть 1`); +> дубли `(album,track)` **уточнено: 136 пар / 286 строк** (в доке ниже было 104); +> кого писать в `artist` у 335 сборников. +> +> 👉 Детали и таблицы — `personal/tech/music-tags-rename-audit.md`. + > ## ✅ 37-я волна — 7 АЛЬБОМОВ СКАЗОК ЗАКРЫТЫ, 🔴 ВЫДУМАННЫЙ `(3)` ОТКАЧЕН > > **Построчное чтение завершено: 1–7906 (100%).** Все замечания Alex из списка сказок закрыты. diff --git a/personal/tech/music-tags-rename-audit.md b/personal/tech/music-tags-rename-audit.md new file mode 100644 index 00000000..b706af68 --- /dev/null +++ b/personal/tech/music-tags-rename-audit.md @@ -0,0 +1,96 @@ +--- +title: Music Tags — финальный аудит CSV (переименование) +created: '2026-09-26' +updated: '2026-09-26' +type: tech +namespace: personal +wave: 38 +tags: + - music + - jellyfin + - truenas + - metadata + - audit + - approval +related: + - '[[personal/tech/music-tags-final-review]]' + - '[[personal/tech/music-tags-repair-truenas]]' +--- +# Music Tags — финальный аудит CSV (перед переименованием/применением) + +_Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-fix-plan.csv`._ +_Триггер: Alex — «проводи финальный полный аудит списка на переименование» → «Csv блядь который ты делал»._ + +**Аудит проведён по `tag-fix-plan.csv`** (11 колонок, главный план переименования/правки тегов). +Скрипт-аудитор запущен на локальной копии; диск на NAS в этой итерации НЕ трогался. + +## ✅ ПРОЙДЕНО (чисто) + +| # | Проверка | Результат | +|---|---|---| +| 1 | Строк в CSV | **7906** | +| 2 | Битых строк (число колонок ≠ 11) | **0** | +| 3 | `fix` с пустым `new_title` | **0** | +| 4 | Нечисловой `new_track` | **0** | +| 5 | `artist` продублирован в начале `new_title` (класс 5) | **0** — класс закрыт | +| 6 | Артист в разных написаниях (нормализованно: регистр, `ё`,`группа `,`the `) | **0** | +| 7 | Двойные/хвостовые пробелы в `new_*` | **0** | +| 8 | Соответствие `tag-fix-plan.csv` ↔ `tag-inventory.csv` (NFC) | **0 / 0** — полное совпадение множеств путей | +| 9 | `fix`, где `new_title/artist/album` == `cur_*` | 1532 — **НЕ дефект**: изменение идёт в `new_track` (номер из имени файла) | + +## 🔴 НАЙДЕНО (требует решения/правки) + +### 1. 🔴 Сводки неполные — 335 строк не попадают ни в сводки, ни в `skip` +`single(646) + multi(6897) + skip(28) = 7571`, а строк **7906** → **недостача 335**. + +| Папка | Строк | `artist` | +|---|---:|---| +| `!Детские/Сборка Песни для детей` | 165 | пусто | +| `!Детские/Детский хит` | 156 | пусто | +| `!Pop, Club, Любэ/!Radio` | 8 | пусто | +| `!Pop, Club, Любэ/Df1` | 4 | пусто | +| `!Pop, Club, Любэ/Infected Mushroom` | 1 | пусто | +| `!A Not sorted/НАШЕСТВИЕ 2009 - ДЕНЬ ВТОРОЙ.mp3` | 1 | пусто | + +Это **тот же баг из волны 33** (`rebuild_summaries.py` выбрасывает строки с пустым `artist`), +но не долечен: 562 сказки вернули, а эти **335 строк (сборники без исполнителя) — остались выброшены**. +⚠️ Alex сказки решил как «имя папки → artist»; для этих 335 решения **нет**. + +### 2. 🔴 Confusable-скрипт (латиница внутри кириллического слова) — 5 строк в `new_title` +Правило tirith HIGH: визуально идентичные символы. Проверено вручную 5 реальных: + +| Значение | Битый символ | +|---|---| +| `Айбoлит` | латинская `o` вместо `о` | +| `Авто-мaт` | латинская `a` вместо `а` | +| `ХХХиРНР(Radio Edit)` | латинские `a`,`o` | +| `Голуби ft.Сацура` | латинская `t` в `ft` (граница слова) | +| `Два корабля(Sick navigbator…)` | латинские `c`,`k` на границе | + +Плюс 2 в `new_artist`: `Кабарe-Дуэт Академия` (лат. `e`), `Роза Ветров/The Arrow` (`The` — легитимно). +Остальные смешанные строки (`Глюк'oZa`, `Dancefloor`, `RMX`) — **легитимны**, не чинить. + +### 3. 🔴 Техпапка в `new_album` — 1 строка +`/storage/Music/!Rock&Folk/Король и Шут/Танец гения.mp3` → `new_album = 'New'` (имя подпапки-техпапки, не альбом). По паттерну волны 19 должно быть пусто. + +### 4. ⚠️ `new_album` содержит `(часть N)` / `- часть N` — 77 строк +`Избранное II - часть 1` (12), `Весь Булат Окуджава. Часть 6…` (1) и др. +Прямого запрета Alex на `часть` в этом контексте не давал (стоп-слово касалось `Али-Баба`), +но в 36-й волне формулировка была «`(часть N)` в album — выдумка ассистента». **Проверить с Alex.** + +### 5. ⚠️ `new_title = 'Часть N'` — 33 строки +Папка `!Детские/Новые Бременские`, файлы `NN - TrackNN.mp3`. Похоже на остаток класса «номер серии в title» +(уже правили аналогичный `Трое из Простоквашино 8` → `Серия 8`). **Не доделано.** + +### 6. ⚠️ Дубли `(album, track)` — 136 пар, 286 строк (было указано 104 — уточнено) +Топ папок: `!Pop,!Radio` 68, `!Rock&Folk/ЗАХАР МАЙ` 42, `Ленинград` (sum 50), `Пилот` 16, `Guf` 30, `Агата Кристи` 15, `Король и Шут` 13, `Ногу Свело!` 13, `The Used` 11, `Трофим` 10. +Решаются **дедупликацией файлов**, не нумерацией. Решение Alex — разобрать самому (правило: папки не удалять/не переименовывать). + +## Итог + +- **CSV структурно цел:** 7906 / 0 битых / 11 колонок — к применению технически готов. +- **Блокер №1:** 335 строк не в сводках (артист-пустые сборники) — сводки **неполные**, тот же класс, что «пропавшие сказки». +- **Мелкие правки (5 + 2 + 1 + 33):** confusable-скрипт, техпапка `New`, `Часть N` в title. +- **Ждёт решения Alex (3):** 77 строк `часть` в album; 136 пар дублей; назначение `artist` для 335 сборников. + +_Cвязано: [[personal/tech/music-tags-final-review]], [[personal/tech/music-tags-repair-truenas]]._ diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index 8a47c9ac..e951c450 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -4,7 +4,7 @@ created: '2026-09-26' updated: '2026-09-26' type: tech namespace: personal -wave: 37 +wave: 38 tags: - music - jellyfin @@ -16,10 +16,50 @@ tags: related: - '[[family/how-to/jellyfin-config]]' - '[[family/projects/media-toolbox-taiga]]' + - '[[personal/tech/music-tags-rename-audit]]' --- # Music Tags Repair — TrueNAS (7906 файлов) +> ## 🔍 ТРИДЦАТЬ ВОСЬМАЯ ВОЛНА (2026-09-26) — ФИНАЛЬНЫЙ АУДИТ CSV, 4 НЕДОДЕЛКИ +> +> Триггер: Alex — «проводи финальный полный аудит списка на переименование» → «Csv блядь который ты делал». +> Полный отчёт: **[[personal/tech/music-tags-rename-audit]]**. Диск на NAS **НЕ трогался** — +> аудит по локальной копии `~/Downloads/music-tags/tag-fix-plan.csv`. +> +> ### ✅ CSV структурно цел +> 7906 строк / **0 битых** / 11 колонок. `fix` **7041** / `no_change` **837** / `skip` **28**. +> Полное совпадение множеств путей с `tag-inventory.csv` (NFC) — 0/0. +> 0 пустых `new_title`, 0 нечисловых `new_track`, 0 artist-префиксов в title (класс 5 закрыт), +> 0 групп «артист в разных написаниях», 0 двойных пробелов в `new_*`. +> +> ### 🔴 НАЙДЕНО (4 недоделки, ничего не правилось) +> 1. **335 строк не в сводках** — `single 646 + multi 6897 + skip 28 = 7571` ≠ 7906. +> Все с пустым `artist`: `!Детские/Сборка Песни для детей` 165, `!Детские/Детский хит` 156, +> `!Pop, Club, Любэ/!Radio` 8, `Df1` 4, `Infected Mushroom` 1, `НАШЕСТВИЕ 2009` 1. +> **Тот же баг волны 33** (`rebuild_summaries.py` выбрасывает пустой `artist`) — сказки вернули, +> а эти сборники без исполнителя остались выброшены. Решения Alex по ним **нет**. +> 2. **confusable-скрипт (латиница внутри кириллицы) — 5 строк** `new_title`: `Айбoлит` (лат.`o`), +> `Авто-мaт` (лат.`a`), `ХХХиРНР(Radio Edit)`, `Голуби ft.Сацура` (лат.`t`), `Два корабля(Sick…`; +> + 2 в `new_artist`: `Кабарe-Дуэт Академия`, `Роза Ветров/The Arrow`. Остальной mixed-script +> (`Глюк'oZa`, `Dancefloor`, `RMX`) — **легитимен**, не чинить. +> 3. **`new_album='New'`** — 1 строка: `!Rock&Folk/Король и Шут/Танец гения.mp3` (техпапка в теге). +> 4. **`new_title='Часть N'` — 33 строки** в `!Детские/Новые Бременские` (файлы `NN - TrackNN.mp3`) — +> остаток класса «номер серии в title» (ср. `Трое из Простоквашино 8` → `Серия 8`). +> +> ### ⚠️ Ждёт решения Alex (не трогалось) +> - **77 строк** `часть` в `new_album` (`Избранное II - часть 1` ×12 и др.) — править ли. +> - **дубли `(album, track)` уточнено: 136 пар / 286 строк** (в доке 35-й волны было «104»). +> Топ: `!Radio` 68, `ЗАХАР МАЙ` 42, `Ленинград` 50, `Guf` 30, `Пилот` 16. +> - кого писать в `artist` у **335 сборников** без исполнителя. +> +> ### 🔴 ПРАВИЛО (подтверждено): пустой `artist` выкидывать из сводок нельзя молча +> Инвариант полноты `single + multi + skip == 7906` **обязан** падать. Сейчас он не проходит +> на 335 строках — это не «норма», а незакрытый баг волны 33. +> +> Скрипты: аудит выполнен ad-hoc (локальный CSV, read-only). Новых файлов в `~/Downloads/music-tags` +> не создавалось; бэкапы не требовались. + > ## ✅ ТРИДЦАТЬ СЕДЬМАЯ ВОЛНА (2026-09-26) — 7 АЛЬБОМОВ СКАЗОК ЗАКРЫТЫ + 🔴 ВЫДУМАННЫЙ `(3)` ОТКАЧЕН > > Триггер: Alex — «Алиса в стране чудес, Алиса в Стране Чудес — давай ка `Сказки/Alisa v strane chudes`