[2026-09-27] eagle: personal/plans/tagwriter-container.md personal/tech/id3-tag-repair.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 12:58:14 +06:00
1 parent 6912c41874
commit c75721bebb
2 files changed
+153 -16

No files matched your search

+109 -15
View File
@@ -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-<ts> (перед аудитом)
~/milestones/music-csv-2026-09-26/APPLY-PLAN.csv.bak-before-fix20 (создаст fix_20_files.py)
~/milestones/music-csv-BEFORE-RENAME-<ts>.tar.gz (перед переименованием)
```
## 10. Правила процесса (выведены на этой задаче)
> **1. Договорённость, не записанная в файл, для агента не существует.**
> Контекст диалога сбрасывается — файл не сбрасывается. Решение, зафиксированное
> только в чате, повторит тот же класс ошибки, что `TRCK` и `v1=0`.
> **Фиксировать в файл в том же ходе, когда решение принято.**
> **2. Аудит одного поля не аудит.** Проверка по одному триггеру (`new_artist == 'X'`)
> пропускает записи, где это поле уже верное, а дефект — в соседнем. Класс дефекта
> проверять по ВСЕМ полям группы.
> **3. Не выдавать кандидата за решение.** Когда Alex даёт ответ («Bach», «единообразно»),
> работать с ним сразу. Не переспрашивать то, что уже сказано, и не предлагать меню
> там, где ответ однозначен.
> **4. Regex-детектор — только карта подозрений.** Дефектом объявлять после разбора
> примеров вручную; из 8 классов этой сессии 6 оказались шумом.
## Связано