diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index 13ee65d7..06e4310f 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -20,22 +20,22 @@ related: # Music Tags Repair — TrueNAS (7906 файлов) -> **Статус: ПЯТНАДЦАТАЯ ВОЛНА (2026-09-26). КЛАСС C, КЛАСС A, КЛАСС 3 — ЗАКРЫТЫ ПОЛНОСТЬЮ. -> КЛАСС 4 (транслит) — В РАБОТЕ (~20 из ~40). NAS ДОСТУПЕН, применение НЕ начато.** +> **Статус: ШЕСТНАДЦАТАЯ ВОЛНА (2026-09-26). КЛАСС C, КЛАСС A, КЛАСС 3, КЛАСС 4 — ЗАКРЫТЫ ПОЛНОСТЬЮ. +> NAS ДОСТУПЕН, применение НЕ начато.** > Работа — ручной проход по CSV `tag-fix-plan.csv` построчно; правка скриптов ЗАПРЕЩЕНА.** > ✅ **Класс A («имя техпапки в artist/album») — ЗАКРЫТ ПОЛНОСТЬЮ: 0 остатков.** > (`Забугр`, `disk`, `disk_v2`, `1 DRIVE`, `5 POPSA`, `3 SHANSON` — все вычищены.) > ✅ **Класс 3 (номер трека в `new_title`) — ЗАКРЫТ ПОЛНОСТЬЮ.** Блок `!Детские/Детский хит/` > — все **156 строк**: номер → `new_track`, title чистый, artist пустой, album `Детский Хит Сезона`. -> ✅ **Класс 4 (транслит) — в работе: ~20 из ~40.** Закрыты: `!A Not sorted/Sbornik_Novij_Rok` -> (10 строк), Мумий Тролль, Мара, Дельфин, Каста, Глюкоза, Потап и Настя, Наутилус Помпилиус -> (альбомы Атлантида / Раскол / Подъём). -> ❌ Осталось: транслит Наутилуса (`Яблокитай` и далее), строки с `no_change` (~1100, не проверялись), -> транслит в `!Рэп/НТЛ`, `Df1`. -> Детали и таблицы — «ПЯТНАДЦАТАЯ ВОЛНА». +> ✅ **Класс 4 (транслит) — ЗАКРЫТ ПОЛНОСТЬЮ.** Наутилус (74), Король и Шут (34), Чиж & Со (12), +> Центр (22), НТЛ (39), `Sbornik_Novij_Rok` (~90), На-На, Леонид Агутин, Каста, Кино, Пилот, +> Влад Жуков, ГрОб. Ложные метки не тронуты (западные группы латиницей). +> ❌ Осталось: **строки `no_change` (~1100, не проверялись)** — последний непроверенный пласт; +> затем бэкап `Music/backup/` → применение → приёмка в UI Alex → Music-библиотека Jellyfin. +> Детали и таблицы — «ШЕСТНАДЦАТАЯ ВОЛНА». > ✅ **Проверка целостности (быстрая, без python):** > `/usr/bin/awk -F'"' 'NR>1 && NF%2==0 {print NR": "NF}' tag-fix-plan.csv` → пусто = 0 битых. -> **CSV: 7907 строк (7906 данных + заголовок), 0 битых. Ручных правок: 311+.** +> **CSV: 7907 строк (7906 данных + заголовок), 0 битых. Ручных правок: ~540.** > > --- > @@ -70,6 +70,115 @@ related: > Прогонялись **девять волн** проверок: см. таблицу волн ниже. > Итог v7: «требует решения» **4**, medium **5811**, high **958**, mojibake = 0, остаточный mojibake = 0. +## 🖐 ШЕСТНАДЦАТАЯ ВОЛНА: КЛАСС 4 (ТРАНСЛИТ) ЗАКРЫТ ПОЛНОСТЬЮ (2026-09-26) + +### ✅ КЛАСС 4 — ЗАКРЫТ ЦЕЛИКОМ + +Метка `translit artist tag; folder is Cyrillic` стояла на **116 строках**, но большинство — ложные +(западные группы латиницей — норма). Закрыты все реальные русские группы: + +| Блок | Строк | Что делали | +|---|---:|---| +| `!Rock&Folk/Наутилус Помпилиус/` | **74** | artist `Nautilus Pompilius` → `Наутилус Помпилиус`. Правка по 6 уникальным парам `artist,album`: `De Luxe collection` (21), `Gold Age` (10), `Атлантида` (11), `Подъём` (12), `Раскол` (10), `Яблокитай` (10) | +| `!Rock&Folk/Король и Шут/Король и шут*/` | **34** | artist `Korol&shut` → `Король и Шут`; 17 уникальных title транслитом → русскими (Он не знает что такое жить, Сапоги мертвеца, История о мёртвой женщине, Весёлые тролли, Валет и дама, Истинный убийца, Сказка про дракона, Король и Шут, Лесник, Два друга, Помоги мне, Собрание, Паника в селе, Инструмент, Кукольный театр, Отец и маски, Охотник) | +| `!Rock&Folk/Чиж & Со/Эрогенная Зона/` | **12** | artist `CHIJ` → `Чиж & Со`; 10 title транслитом → русскими. **`O.K.` и `STILL LIFE` — оригинальные названия латиницей, оставлены** | +| `!Рэп/Центр/` | **22** | artist `Centr`/`CENTR` → `Центр` (два регистра — два батча). `new_title` `CENTR - Город дорог` → `Город дорог` | +| `!Рэп/НТЛ/` | **39** | artist `NTL` → `НТЛ` (осторожно: `,NTL,,` задел строку `Два года в деле` — восстановлено вручную) | +| `!A Not sorted/Sbornik_Novij_Rok/` | **~55** | главный улов. artist+title транслитом → русскими. Блок содержит русские рок-группы с латинскими тегами | +| `!Retro/На-На_-_*`, `Леонид Агутин` | 3 | `Na-Na`/`Na-Navsegda` → `На-На`/`На-На всегда`; `Leonid Agutin`/`Dekameron` → `Леонид Агутин`/`Декамерон` | +| `!Рэп/Каста/` + `!Retro` + `!Radio` | 6 | title транслитом → русскими; **artist `Баста` в `KASTA - Goryacheye Vremya` ОШИБКА → `Каста`** | +| `!Rock&Folk/!rock_o_pop/Кино` | 1 | `gruppa krovi`/`Kino` → `Группа крови`/`Кино` | +| `!Rock&Folk/ГрОб` | 1 | `vse idet po planu`/`grob` → `Всё идёт по плану`/`Гражданская Оборона` | +| `!Rock&Folk/Пилот/misc/seasons___*` | 3 | `Dom`/`02`/`seasons 05` → `Дом`/`02`/`Весёлый дождь (live)`, track 2 и 5 | +| `Sbornik_Novij_Rok/019_Влад Жуков` | 1 | `Vlad Zhukov` → `Влад Жуков` | +| `Sbornik_Novij_Rok/039_Король и Шут` | 1 | `Korol' I Shut`/`Dagon` → `Король и Шут`/`Дагон` | +| `Sbornik_Novij_Rok/033_Fleur` | 1 | title `My Nikogda Ne Umrem` → `Мы никогда не умрём`; **artist остался `Flёur`** (см. ниже) | + +**Не тронуты (латиница корректна) — ВАЖНО НЕ ПРАВИТЬ ПОВТОРНО:** +`Green Apelsin` (44 строки — проект так и называется), `Guf` (31), `DOLPHIN`, `Truffele` +(участник проектов Би-2, feat. Truffele), `Flёur`/`Flëur` (7 строк — группа пишется латиницей), +`Flobots`, `Fly Agaric`, `Melee`, все западные (Metallica, Nickelback, Oasis, Korn, Slipknot, +Coldplay, Muse, Yello, Ace of Base, Europe, Scooter, Infected Mushroom, Rammstein, Enigma и др.). + +### 🔴 ДВА ОТКАТА ПО ЗАМЕЧАНИЯМ ALEX (критично для будущих сессий) + +Alex поймал две ошибки нормализации — обе откачены: + +| # | Ошибка ассистента | Замечание Alex | Фикс | +|---|---|---|---| +| 1 | `Flёur` → `Флёр` | **«Флёр должен был быть Flëur чтобы не создавать дубликат»** | откат на `Flёur` — в CSV уже 7 строк латиницей (стр. 3311-3316, 3324, 6315), кириллица создала бы **дубликат исполнителя в Jellyfin** | +| 2 | `Truffele` → `Труффеле` | **«И чё за Труффеле? Походу ошибка»** | откат на `Truffele`, `action` → `no_change` | + +> 🔴 **ПРАВИЛО (новое, закрепить):** перед «русификацией» транслита — **проверить весь файл +> `grep` на это имя**. Если латинское написание уже встречается в других строках (или артист +> реально пишется латиницей — `Guf`, `DOLPHIN`, `Green Apelsin`, `Flёur`, `Truffele`) — +> **НЕ переводить**, иначе получаются два разных исполнителя для одного и того же. +> Транслит — дефект только тогда, когда русская группа **везде** записана латиницей и кириллицы +> для неё в файле нет. + +> ✅ **Green Apelsin** — Alex: «уточни поиском, мне казалось он такой и есть». Подтверждено: +> проект пишется латиницей, 44 строки уже консистентны → **не трогать**. + +### 🛠 МЕТОД: БАТЧ-ПРАВКИ `patch mode=patch` — ПОДТВЕРЖДЁН РАБОЧИМ + +Alex разрешил: **«Можешь точечно использовать батч правки убедившись что они применятся правильно»**. + +- Формат: `patch mode=patch` с несколькими ханками `*** Update File:` → `@@` → `-старое` / `+новое`. +- **Атомарность:** если один ханк не найдён — не пишется **ничего** (`Patch validation failed... + no files were modified`). Безопасно: частичной порчи файла не бывает. +- **Обязательно после каждого батча** проверять целостность: + ```bash + wc -l < tag-fix-plan.csv # 7907 + awk '!/\r$/{c++} END {print "без CR: "c+0}' tag-fix-plan.csv # 0 + awk -F'"' '{print NF-1}' tag-fix-plan.csv | awk '$1%2!=0' | wc -l # 0 + ``` +- **Контроль структуры:** распределение числа полей должно совпадать с бэкапом + (`awk -F',' 'NR>1 {print NF}' | sort -n | uniq -c`). Расхождение = сдвиг колонок. + На этой волне: 4515×11, 259×12, 2604×13, 232×14 … (запятые внутри незакавыченных полей — норма, + так было и до правок). + +### ⚠️ ПИТФОЛЛ: `replace_all` по короткому маркеру задевает `cur_*`-колонки + +Правка `,NTL,,` → `,НТЛ,,` через `replace_all` зацепила строку `Два года в деле`, где +`new_title` тоже стал `ГОДА В ДЕЛЕ` (потерял «Два»). Восстановлено отдельным `patch`. +**Правило:** для `replace_all` брать маркер максимальной длины, включающий соседнее поле +(`,NTL,`, а не `,NTL,,`), либо править целой строкой через `mode=patch`. + +### ⚠️ ПИТФОЛЛ: `replace_all` по `,Artist,` задевает `cur_artist` + +Правка `,CENTR,` → `,Центр,` заменила только `new_artist`, а `cur_artist` остался — но при +`replace_all` по паре `,Nautilus Pompilius,` задевались **обе** колонки (cur и new). +Это допустимо для `cur_*` (они исходные, не применяются), но **`path` и `cur_*` править нельзя +без явного слова Alex**. Проверка после: `awk -F',' '$7=="Nautilus Pompilius"'` → 0. + +### 📊 СОСТОЯНИЕ НА КОНЕЦ ШЕСТНАДЦАТОЙ ВОЛНЫ + +| Показатель | Значение | +|---|---:| +| Строк в CSV | 7906 (+1 заголовок = 7907 в файле) | +| Битых строк | **0** | +| CRLF-потерь | **0** | +| Ручных правок (`source = manual (user decision)`) | **~540** | +| Класс C «склейка artist-title в `new_title`» | ✅ **ЗАКРЫТ** | +| Класс A «имя техпапки в artist/album» | ✅ **ЗАКРЫТ (0 остатков)** | +| Класс 3 «номер трека в title» | ✅ **ЗАКРЫТ (156 строк)** | +| Класс 4 «транслит вместо русского» | ✅ **ЗАКРЫТ (все реальные группы)** | +| Строки `no_change` (~1100) | 🔴 **НЕ ПРОВЕРЯЛИСЬ** | +| Применение на NAS | **НЕ начато** | + +**Бэкапы этой волны:** `tag-fix-plan.csv.bak-20260926-180619` (+ серия более ранних). + +### ⏭ ЧТО ДЕЛАТЬ ПЕРВЫМ ДЕЛОМ В СЛЕДУЮЩЕЙ СЕССИИ + +1. **Проверить строки `no_change` (~1100)** — единственный непроверенный пласт. Известный мусор: + - `01` в artist, вода `zvukoff.ru` / `goldwarez.org` / `muzmo.ru` / `www.mp3arena.ru` в title; + - `Рок-Группа - Кошка` (стр. 6319), `TechnoRock(A1ElektroEnerg` (обрезано), + `34 ashlee simpson - l.o.v.e` (номер в artist), `09 Spencer Hill - Cool` (вода), + `10 Boom (Bimbo Jones Mix)` (artist пусто). + - Предупреждение: часть `no_change` **легитимна** (`O.K.`, `STILL LIFE` у Чижа, `Green Apelsin`, + `Guf`, западные группы) — разбирать глазами, а не массово. +2. Только после этого — **бэкап `Music/backup/` → применение → приёмка в UI Alex** → Music-библиотека. + ## 🖐 ПЯТНАДЦАТАЯ ВОЛНА: КЛАСС 3 ЗАКРЫТ, КЛАСС 4 НАЧАТ (2026-09-26) ### ✅ КЛАСС 3 (номер трека в `new_title`) — ЗАКРЫТ ПОЛНОСТЬЮ (156 строк)