[2026-09-27] eagle: personal/plans/tagwriter-container.md personal/tech/id3-tag-repair.md
This commit is contained in:
1 parent
6912c41874
commit
c75721bebb
2 files changed
+153
-16
No files matched your search
@@ -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 оказались шумом.
|
||||
|
||||
## Связано
|
||||
|
||||
|
||||
Reference in new issue
Block a user