diff --git a/personal/plans/tagwriter-container.md b/personal/plans/tagwriter-container.md index 0cca4e0f..2464e8f5 100755 --- a/personal/plans/tagwriter-container.md +++ b/personal/plans/tagwriter-container.md @@ -4,7 +4,7 @@ created: '2026-09-26' updated: '2026-09-27' type: plan namespace: personal -status: v14-csv-audited-20-defects-awaiting-alex +status: v15-decisions-received-fix20-ready-not-run-translit-open tags: - music - truenas @@ -12,6 +12,7 @@ tags: - id3 - id3v1 - plan + - audit related: - '[[personal/plans/music-artist-albumartist-repair]]' - '[[personal/tech/music-tags-repair-truenas]]' @@ -19,8 +20,10 @@ related: --- # tagwriter — применение тегов к MP3 (TrueNAS) -> 🔴 **СТАТУС: скрипт готов и протестирован. Аудит CSV выявил 20 дефектов в `new_artist` -> (§ 3.5) — правка НЕ начата, ждёт решения Alex. БОЕВОЙ ПРОГОН НЕ ЗАПУЩЕН.** +> 🔴 **СТАТУС: скрипт готов и протестирован. Аудит CSV выявил дефекты в `new_artist` (§ 3.5) — +> Alex дал решения, скрипт правки `fix_20_files.py` НАПИСАН, но НЕ ЗАПУЩЕН. +> Попутно найден новый класс: транслит русских слов в `new_album` (204 файла) — ждёт решения. +> БОЕВОЙ ПРОГОН ТЕГОВ НЕ ЗАПУЩЕН.** ## 1. Что делает скрипт @@ -186,16 +189,67 @@ ID3v2-блок: 87040 = 87040 отрезает ID3v1 (последние 128 байт при `TAG`). Отвечает на вопрос «это дубликат или разные записи», когда размеры совпадают, а MD5 файла различается. -## ⏳ ОТКРЫТЫЙ ВОПРОС: 20 файлов ждут решения Alex +## ⏳ РЕШЕНИЯ ALEX ПОЛУЧЕНЫ — скрипт правки готов, НЕ ЗАПУЩЕН -| # | Что | Предложено | -|---|---|---| -| 1 | `Maria Makarova (organ)` ×2 | `Иоганн Себастьян Бах` (или `Бах`) | -| 2 | `Классика в современной обработке` ×3 | по композитору из title: Моцарт ×2, Вивальди ×1 | -| 3 | `Сказочный сборник` ×15 | `Сказки` / пусто / автор сказки — **нужно решение** | -| 4 | `title='Вивальди А. - Зима (рок-обработка)'` | срезать префикс `Вивальди А. - `? | +| # | Что | РЕШЕНИЕ ALEX | Статус | +|---|---|---|---| +| 1 | `Maria Makarova (organ)` ×2 | ✅ **`Иоганн Себастьян Бах`** | в скрипте | +| 2 | `Классика в современной обработке` ×3 | ✅ по композитору из title (Моцарт ×2, Вивальди ×1) + `genre Rock → Classical` | в скрипте | +| 3 | `Сказочный сборник` ×15 | ✅ **`albumartist='Сказки'` (единообразно), `artist` = РЕАЛЬНЫЙ АВТОР** | в скрипте | +| 4 | `title='Вивальди А. - Зима (рок-обработка)'` | ⚠️ **НЕ решён** (префикс срезать?) | открыт | -Правка боевого CSV **не начата** — ждёт ответа по всем четырём пунктам. +**Правило Alex (дословно):** «единообразно. albumartist - сказки. artist - реальный автор.» + +### Авторы сказок (определены, часть проверена веб-поиском) + +| Файл | Автор | +|---|---| +| Находчивый_солдат · Семь_Симеонов · Волк и семеро козлят | Русская народная | +| Золотая антилопа | Индийская народная | +| Щелкунчик | Эрнст Теодор Амадей Гофман | +| Музыкальный_магазинчик | Люцина Легут ✅ проверено | +| Как_муравей_домой_добирался | Виталий Бианки | +| Кошкин_дом | Самуил Маршак | +| Три_Толстяка | Юрий Олеша | +| Красная_шапочка · Мальчик_с_пальчик | Шарль Перро | +| Огниво | Ганс Христиан Андерсен | +| Котенок_Гав | Григорий Остер | +| Айбoлит · Краденое солнце | Корней Чуковский | + +⚠️ **Питфолл:** в имени файла `Айбoлит.mp3` — **латинская `o`** в середине слова. +Матчинг по basename обязан учитывать это (иначе файл не найдётся). + +### 🔴 В папке 17 файлов, а не 15 — аудит по `new_artist` их пропустил + +Детектор искал `new_artist == 'Сказочный сборник'` — а у двух файлов артист был **уже верный**, +поэтому они в выборку не попали: + +``` +Филипок.mp3 artist='Л.Н. Толстой' ✓ артист верный, но album='Сказочный сборник' +Маленький_Мук.mp3 artist='Вильгельм Гауф' ✓ артист верный, но album='Skazochnyj sbornik' ← ТРАНСЛИТ +``` + +🔴 **Правило: аудит по одному полю пропускает записи, где это поле уже корректно.** +Проверять класс дефекта по ВСЕМ полям папки, а не по одному колонке-триггеру. + +### 🔴 НОВЫЙ КЛАСС ДЕФЕКТА: транслит русских слов в `new_album` + +Найдено при проверке `Маленького Мука`. `new_album` с латинскими словами — **в основном корректны** +(это настоящие названия: `Absolution`, `Sehnsucht`, `The Marshall Mathers LP`). Мусор — только транслит +**русских** слов: + +| `new_album` | файлов | должно быть | +|---|---:|---| +| `Sbornik_Novij_Rok` | 200 | `Сборник нового рока` | +| `Russkie narodnye skazki` | 3 | `Русские народные сказки` | +| `Skazochnyj sbornik` | 1 | `Сказочный сборник` | + +Плюс спорная группа — **разделы диска** (`!rock_o_pop` 57, `1 DRIVE` 89, `3 SHANSON` 50, +`5 POPSA` 33, `2 ALT,PUNK` 22, `4 INSTRUMENTAL` 2) и имена-папки (`!Retro`, `y OOF`, `plux`). + +⚠️ **`Skazochnyj sbornik` / `Russkie narodnye skazki` — это имена ПАПОК на диске, не теги.** +Скрипт тегов папки не переименовывает; правка `new_album` — отдельное решение. +**Ждёт ответа Alex** (204 файла явного транслита + спорные разделы). ## 4. Что скрипт НЕ трогает @@ -289,12 +343,31 @@ docker start -a tw && docker rm -f tw 17. **Права:** uid 950:950, файлы проекта `chmod 644` (иначе `COPY` даёт 600 → Permission denied). 18. **tirith блокирует confusable-строки** (кириллица вплотную к ASCII) — писать скрипт файлом. +### 🔴 Аудит данных + +19. **Аудит по ОДНОМУ полю пропускает записи, где это поле уже корректно.** Детектор искал + `new_artist == 'Сказочный сборник'` → пропустил `Филипок` и `Маленький_Мук` (у них артист + был верный, а дефект — в `album`). Итог: в папке оказалось 17 файлов, а не 15. + **Проверять класс дефекта по ВСЕМ полям папки/группы.** +20. **Regex-детектор даёт массовые ложные срабатывания.** Из 8 классов аудита артиста + **6 оказались шумом** (E 204, F 267, G 96, H 25) — фиты, `Иванушки International`, + `Винни-Пух` + album `Винни-Пух (2)`. **Каждый класс разбирать по примерам вручную, + прежде чем объявлять дефектом и править.** +21. **Латинские буквы-двойники в именах файлов.** `Айбoлит.mp3` — `o` латинская внутри + русского слова. Матчинг по basename ломается. Сверять побайтово при сомнении. +22. **«Транслит в поле» ≠ дефект.** `Absolution`, `Sehnsucht`, `The Marshall Mathers LP` — + настоящие названия. Дефект только транслит **русских** слов (`Sbornik_Novij_Rok`). + Фильтр должен отделять язык-источник, а не «есть латиница». + ## 9. Что осталось | # | Шаг | Статус | |---|---|---| -| 0 | 🔴 **Аудит `new_artist` → 20 дефектов, правка CSV** | ⏳ **ЖДЁТ решения Alex (4 вопроса в § 3.5)** | -| 1 | Боевой `--apply --verify` по 7861 | 🔴 **ЖДЁТ «go»** (после шага 0) | +| 0a | **Правка 20 файлов в CSV** (`fix_20_files.py`) | ⏳ **скрипт написан, НЕ ЗАПУЩЕН** (решения Alex получены) | +| 0b | Вопрос по `title='Вивальди А. - Зима (рок-обработка)'` — срезать префикс? | ⏳ открыт | +| 0c | **Транслит русских слов в `new_album`** (204 файла: `Sbornik_Novij_Rok` 200 и др.) | ⏳ ждёт решения Alex | +| 0d | `Филипок` / `Маленький_Мук` — `album='Сказочный сборник'` / транслит | ⏳ войдёт в 0c | +| 1 | Боевой `--apply --verify` по 7861 | 🔴 **ЖДЁТ «go»** (после 0a–0c) | | 2 | Приёмка Alex в UI (Navidrome/Jellyfin) | ⏳ | | 3 | Откат 40 из `backup_conv40/` | ⏳ | | 4 | Удаление 29 битых/DRM ([[personal/tech/music-broken-toload]]) | ⏳ | @@ -315,12 +388,33 @@ docker start -a tw && docker rm -f tw | `~/Automation/music-tags/find_v1.py` | поиск mp3 с ID3v1 | | `~/Automation/music-tags/Dockerfile.v2` | python:3.11-slim + mutagen 1.47.0 | | `~/Downloads/music-tags/tagwriter/rename_apply_plan.py` | раскладка имён CSV (одноразовый) | +| **`~/Downloads/music-tags/tagwriter/fix_20_files.py`** | **правка 20 файлов в боевом CSV — НЕ ЗАПУЩЕН** | -## 10. Правило процесса (выведено на этой задаче) +### Бэкапы CSV -> **Договорённость, не записанная в файл, для агента не существует.** +``` +~/milestones/music-csv-2026-09-26/APPLY-PLAN.csv.bak-chk- (перед аудитом) +~/milestones/music-csv-2026-09-26/APPLY-PLAN.csv.bak-before-fix20 (создаст fix_20_files.py) +~/milestones/music-csv-BEFORE-RENAME-.tar.gz (перед переименованием) +``` + +## 10. Правила процесса (выведены на этой задаче) + +> **1. Договорённость, не записанная в файл, для агента не существует.** > Контекст диалога сбрасывается — файл не сбрасывается. Решение, зафиксированное > только в чате, повторит тот же класс ошибки, что `TRCK` и `v1=0`. +> **Фиксировать в файл в том же ходе, когда решение принято.** + +> **2. Аудит одного поля не аудит.** Проверка по одному триггеру (`new_artist == 'X'`) +> пропускает записи, где это поле уже верное, а дефект — в соседнем. Класс дефекта +> проверять по ВСЕМ полям группы. + +> **3. Не выдавать кандидата за решение.** Когда Alex даёт ответ («Bach», «единообразно»), +> работать с ним сразу. Не переспрашивать то, что уже сказано, и не предлагать меню +> там, где ответ однозначен. + +> **4. Regex-детектор — только карта подозрений.** Дефектом объявлять после разбора +> примеров вручную; из 8 классов этой сессии 6 оказались шумом. ## Связано diff --git a/personal/tech/id3-tag-repair.md b/personal/tech/id3-tag-repair.md index f3a0273e..fe4c66ac 100755 --- a/personal/tech/id3-tag-repair.md +++ b/personal/tech/id3-tag-repair.md @@ -1,7 +1,7 @@ --- title: ID3 Tag Repair — техника и питфоллы created: '2026-09-26' -updated: '2026-09-26' +updated: '2026-09-27' type: tech namespace: personal tags: @@ -315,6 +315,49 @@ archive/APPLY-PLAN-v0-*.csv — устаревшие версии Суффикс `2` в имени файла-плана — источник ошибок: непонятно, какой применять. Один файл без суффикса, остальные явно помечены. Перед переименованием — `tar czf` снимок каталога. +### 🔴 W17 — аудит по ОДНОМУ полю пропускает записи, где это поле уже верное + +Детектор искал `new_artist == 'Сказочный сборник'` и дал 15 файлов. В папке их **17**: +`Филипок.mp3` (`artist='Л.Н. Толстой'` ✓) и `Маленький_Мук.mp3` (`artist='Вильгельм Гауф'` ✓) — +артист корректен, а дефект в **соседнем поле** (`album='Сказочный сборник'` / `'Skazochnyj sbornik'`). + +**Правило: класс дефекта проверять по ВСЕМ полям группы, а не по одной колонке-триггеру.** +Нашлось только при сверке списка файлов с содержимым папки на диске. + +### 🔴 W18 — «есть латиница в поле» ≠ транслит-мусор + +Класс `new_album` со словами в латинице: **2729 сегментов**, из них настоящий мусор — единицы. +`Absolution` (Muse), `Sehnsucht` (Rammstein), `The Marshall Mathers LP` (Eminem), +`Mein Lieber Tanz` — **законные названия**. Дефект — только транслит **русских** слов: + +``` +Sbornik_Novij_Rok 200 → Сборник нового рока +Russkie narodnye skazki 3 → Русские народные сказки +Skazochnyj sbornik 1 → Сказочный сборник +``` + +🔴 **Фильтр должен определять язык-источник, а не факт наличия латинских букв.** +Отдельно спорна группа «разделы диска» (`!rock_o_pop`, `1 DRIVE`, `3 SHANSON`, `5 POPSA`, +`2 ALT,PUNK`, `4 INSTRUMENTAL`) — это имена папок, протёкшие в `album`, но решение за Alex. + +### 🔴 W19 — латинские буквы-двойники внутри русских слов + +`Айбoлит.mp3` — `o` **латинская** в середине слова. Матчинг по basename ломается молча +(файл просто «не найден»). При точечных правках по списку имён файлов — сверять побайтово. +Родственный случай из §«W15»: `ДжаниRадари`, `Сосунkillaz`, `Света Колiбаба` — рукописная +транслитерация 2000-х, **это НЕ дефект** (см. «Что НЕ является багом»). + +### 🔴 W20 — решения человека фиксировать сразу, не переспрашивать + +Alex дал ответы на все четыре вопроса аудита сразу и дословно: +«**Иоганн Себастьян Бах**» / «**единообразно. albumartist - сказки. artist - реальный автор**». +Дальнейшие уточнения («какую цифру выбрать?») вызвали раздражение: «**какую нахуй цифру! правь**». + +**Правило: когда решение озвучено — работать с ним немедленно.** Предлагать меню допустимо +только там, где данных реально нет ни в файлах, ни в путях (пример: автор сказки +«Как муравей домой добирался» — найден как **Виталий Бианки**, потому что источник +в файле отсутствовал). + ## ⚪ Что НЕ является багом - **Рукописная транслитерация:** `КняZz`, `EMINЭM`, `Flёur`, `изBESTняк`, `Скаzки`, `Глюкоzа`,