[2026-09-26] eagle: personal/plans/music-tags-review/music-tags-review.md personal/tech/music-tags-repair-truenas.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-26 17:29:09 +06:00
1 parent 9d5bcf71ba
commit 18386780e3
2 files changed
+87 -19

No files matched your search

+73 -12
View File
@@ -19,16 +19,18 @@ related:
# Music Tags Repair — TrueNAS (7906 файлов)
> **Статус: ДЕСЯТАЯ ВОЛНА (2026-09-26). NAS ДОСТУПЕН, применение НЕ начато.
> **Статус: ДЕСЯТАЯ ВОЛНА ЗАВЕРШЕНА (2026-09-26). NAS ДОСТУПЕН, применение НЕ начато.
> Работа — ручной проход по CSV `tag-fix-plan.csv` построчно; правка скриптов ЗАПРЕЩЕНА.**
> ✅ **ПЕРВЫЕ 33 ПРАВКИ ВНЕСЕНЫ В CSV** (баг 1 полностью + баг 4 + начало бага 3).
> ✅ **Решения Alex по блоку «требует решения» получены** (из файла `1-needs-decision.md` + чата):
> ✅ **108 ПРАВОК ВНЕСЕНЫ В CSV** — баг 1 (26) + баг 3 (50 из 51) + баг 4 (1) + 3 решения Alex.
> Проверка `csv.DictReader`: **7906 строк / 11 колонок / 0 битых**.
> ✅ **Решения Alex по блоку «требует решения» ПРИМЕНЕНЫ** (из файла `1-needs-decision.md` + чата):
> `Kazantip 2008`→artist `Kazantip 2008`; `i am instructor`→artist `Techno Beat`;
> `Из чего же`→artist «Большой детский хор ЦТ и Всесоюзного радио».
> `Из чего же`→artist «Большой детский хор Центрального телевидения и Всесоюзного радио».
> ✅ **Решён вопрос про водяные знаки: ВЫРЕЗАТЬ.** Alex: «БЛЯДЬ как ты думаешь дебил??»
> 🔴 **Построчный ручной проход не закончен** — закрыто 86 строк из 7906. Блок 1 `!Radio`
> (453 строки) вскрыл **новые классы брака**: имя файла целиком в `title`, имя папки-сборника
> в `artist` (`disk`, `disk_v2`, `3 SHANSON`), оборванные скобки, водяные знаки, номер в title.
> 🔴 **Построчный проход по всем 7906 строкам НЕ закончен** — закрыты известные дефекты
> (26+50+1+3 = 80 строк). Блок 1 `!Radio` (453 строки) вскрыл **новые классы брака**:
> имя файла целиком в `title` (**1466 строк**), имя папки-сборника в `artist` (**113**),
> водяные знаки (11), номер в title (папка `Детский хит`), транслит вместо русского.
> Питфоллы прочитать в разделе «ДЕСЯТАЯ ВОЛНА» ниже.
>
> ---
@@ -150,23 +152,82 @@ python3 dump_block.py ALL --limit 500 # вся библиотека по
| Артефакт | Статус |
|---|---|
| `tag-fix-plan.csv` | 7906 строк / 11 колонок, **33 правки внесены** (проверено `csv.DictReader`: 0 битых строк) |
| `tag-fix-plan.csv` | 7906 строк / 11 колонок, **108 правок внесены** (проверено `csv.DictReader`: 0 битых строк) |
| `tag-fix-plan.csv.bak-20260926-171423` | ✅ бэкап **до** начала правок этой волны |
| `tag-fix-plan.csv.bak-20260926-172625` | ✅ бэкап **после** закрытия багов 1/3/4 (до needs-decision) |
| `dump_block.py` | ✅ создан (выгрузка блока для ручного прохода) |
| `find_defects.py` | ✅ создан (счётчик дефектов A–F) — **Alex запретил писать скрипты после него** |
| `check_artist_number.py` | ✅ подтвердил 26 строк с `NNN_`; после правок → **0** |
| Блок «требует решения» в CSV | **0 строк** (в ноте 4 файла — расхождение ноты и CSV) |
### ✅ ЧТО СДЕЛАНО В ЭТОЙ ВОЛНЕ (33 правки, все в `tag-fix-plan.csv`)
### 🔴 ПИТФОЛЛЫ ПРАВКИ CSV, найденные в этой волне (обязательно к прочтению)
**1. Правка идёт по ТЕКСТУ строки, не по номеру из чекера.**
Номера строк из `check_artist_number.py` / `find_defects.py` считают **записи данных**,
а `sed -n 'Np'` — реальные строки файла с учётом кавычек и переносов. Они **не совпадают**.
Правильно: сначала `grep -n '<уникальный фрагмент>'` → взять точный текст строки → `patch` по нему.
**2. `patch` с двойным совпадением — брать длинный контекст.**
Один и тот же файл лежит в двух папках → `old_string` матчится дважды
(`Found 2 matches`). Решение: включать в `old_string` уникальный фрагмент пути
(`.../z Старое/disk/...`) или полный путь до имени файла.
**3. ГЛАВНАЯ ЛОВУШКА: `patch` съедал открывающую кавычку пути.**
Когда `old_string` начинается с `-Сим-Сим, откройся!.mp3"` (значение с запятой,
поле закавычено), замена оставляла строку **без открывающей `"`** → CSV-парсер видел
сдвиг колонок. Проверка после КАЖДОЙ серии правок обязательна:
```python
csv.DictReader(open(f, newline="", encoding="utf-8-sig")) # len(row) == 11 у всех
```
Именно этой проверкой найдена и починена строка **7273**.
**4. `patch` дублировал поля при нечётком `old_string`.**
Если `old_string` короче строки (нет хвоста `,N,fix,track<-filename`), замена вставляла
новые значения, а старый хвост оставался → `manual (user decision)rack<-filename`,
`Откровенные фотографии,2,fix,manual (user decision)track<-filename`.
**Правило: `new_string` собирать строго на 11 полей, обрезая старый хвост целиком.**
**5. Значение с ЗАПЯТОЙ обязано быть в кавычках.**
`Давно не виделись, здравствуй!` без кавычек → парсер видит 12 полей вместо 11.
Правильно: `"Давно не виделись, здравствуй!"`. Проверять после каждой правки title,
где встречается запятая.
**6. `grep -c 'ґ'` даёт 1 даже после фикса** — остаётся в `path` (имя файла) и `cur_title`.
В `new_title`/`new_artist` после фикса — чисто. Проверять поля, а не строку целиком.
### ✅ ИТОГ ВОЛНЫ: 5 задач закрыто
| Задача | Строк | Итог |
|---|---:|---|
| Баг 1 — `NNN_` в `new_artist` | 26 | ✅ 0 остатков |
| Баг 3 — срезанная `!`/`?` | 51 | ✅ 50 исправлено + 2 ложных отсеяны |
| Баг 4 — `ґ` → `'` | 1 | ✅ |
| N — `Kazantip 2008 - Beat` | 1 | ✅ artist `Kazantip 2008`, title `Beat` |
| N — `i am instructor` | 1 | ✅ artist `Techno Beat` |
| N — `Из чего же` | 1 | ✅ artist «Большой детский хор ЦТ и Всесоюзного радио» |
**Не закрыто (следующая волна) — 4 класса, найдены при проходе:**
1. `new_title` дублирует имя файла — **1466 строк**
2. имя папки-сборника в `artist` (`disk`, `disk_v2`, `3 SHANSON`, `04`) — **113 строк**
3. водяные знаки в title (`zvukoff.ru`, `goldwarez.org`, `muzmo.ru`) — **11 строк**
4. номер трека в `new_title` (папка `!Детские/Детский хит`) + транслит вместо русского
(`Sbornik_Novij_Rok`: `Kontrabandy`, `Ya Popala`)
**Применение тегов на NAS НЕ начато** — ждёт «go» Alex + бэкап в `Music/backup/`.
### ✅ ЧТО СДЕЛАНО В ЭТОЙ ВОЛНЕ (108 правок, все в `tag-fix-plan.csv`)
| Баг | Строк | Что сделано |
|---|---:|---|
| **1** — номер плейлиста в `new_artist` (`084_Потап`) | **26** | ✅ **ПОЛНОСТЬЮ ЗАКРЫТ** — срезан `^\d{1,4}_`, проверка даёт 0 |
| **4** — `ґ` вместо апострофа | **1** | ✅ `A Far Lґamore` → `A Far L'amore` (стр. 3278) |
| **3** — срезанная хвостовая `!`/`?` | **51** | ⏳ **6 сделано, 45 осталось** — из списка исключены 2 ложных (см. ниже) |
| **W** — водяные знаки | 11 | ⏳ правило утверждено, правки не начаты |
| **3** — срезанная хвостовая `!`/`?` | **51** | ✅ **ЗАКРЫТ: 50 сделано**, 2 ложных исключены (title — другой трек) |
| **W** — водяные знаки | 11 | ⏳ правило утверждено (ВЫРЕЗАТЬ), правки не начаты |
| **N** — решения Alex (needs-decision) | 3 | ✅ применены: `Kazantip 2008`, `i am instructor`, `Из чего же` |
У всех правленых строк `source` → **`manual (user decision)`** и `new_track` не менялся.
У всех правленых строк `source` → **`manual (user decision)`**, `new_track` не менялся.
Ложные для бага 3 (НЕ править): `Комон эврибади!.mp3` (title = `Рио-рита (Mega-Style-Mix)`)
и `Уходим в море!.mp3` (title = `Дорожка 08`).
**Строки бага 1, закрытые (26):** `084_Потап` ×3 (2977/3126/4414), `035_Denis The Menace`,
`076_Mednezz`, `163_Gusto`, `093_Kerli`, `150_!Boom!`, `197_Electrodomestici`, `003_Inna`,