From 157877d82f221751ffc2dcb2bac3b689cf7fbda3 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sat, 26 Sep 2026 18:40:03 +0600 Subject: [PATCH] [2026-09-26] eagle: personal/tech/music-tags-repair-truenas.md --- personal/tech/music-tags-repair-truenas.md | 104 ++++++++++++++++++++- 1 file changed, 99 insertions(+), 5 deletions(-) diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index 06e4310f..1e305fdd 100755 --- a/personal/tech/music-tags-repair-truenas.md +++ b/personal/tech/music-tags-repair-truenas.md @@ -4,7 +4,7 @@ created: '2026-09-26' updated: '2026-09-26' type: tech namespace: personal -wave: 15 +wave: 17 tags: - music - jellyfin @@ -20,7 +20,7 @@ related: # Music Tags Repair — TrueNAS (7906 файлов) -> **Статус: ШЕСТНАДЦАТАЯ ВОЛНА (2026-09-26). КЛАСС C, КЛАСС A, КЛАСС 3, КЛАСС 4 — ЗАКРЫТЫ ПОЛНОСТЬЮ. +> **Статус: СЕМНАДЦАТАЯ ВОЛНА (2026-09-26). КЛАСС C, A, 3, 4 ЗАКРЫТЫ + ЧИСТКА `no_change` ПРОДВИНУТА. > NAS ДОСТУПЕН, применение НЕ начато.** > Работа — ручной проход по CSV `tag-fix-plan.csv` построчно; правка скриптов ЗАПРЕЩЕНА.** > ✅ **Класс A («имя техпапки в artist/album») — ЗАКРЫТ ПОЛНОСТЬЮ: 0 остатков.** @@ -30,12 +30,15 @@ related: > ✅ **Класс 4 (транслит) — ЗАКРЫТ ПОЛНОСТЬЮ.** Наутилус (74), Король и Шут (34), Чиж & Со (12), > Центр (22), НТЛ (39), `Sbornik_Novij_Rok` (~90), На-На, Леонид Агутин, Каста, Кино, Пилот, > Влад Жуков, ГрОб. Ложные метки не тронуты (западные группы латиницей). -> ❌ Осталось: **строки `no_change` (~1100, не проверялись)** — последний непроверенный пласт; +> ✅ **СЕМНАДЦАТАЯ ВОЛНА: чистка `no_change` — вычищены сайты-источники, иероглифы, +> числа-в-title, вода в album.** `Pushnoy.ru` (81 строка) → `Александр Пушной`. +> ❌ Осталось: **добить `no_change` (1001 строка, часть легитимна)**; > затем бэкап `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 битых. Ручных правок: ~540.** +> **CSV: 7907 строк (7906 данных + заголовок), 0 битых. Ручных правок: ~635.** +> **`fix` 6905 / `no_change` 1001.** > > --- > @@ -70,6 +73,97 @@ related: > Прогонялись **девять волн** проверок: см. таблицу волн ниже. > Итог v7: «требует решения» **4**, medium **5811**, high **958**, mojibake = 0, остаточный mojibake = 0. +## 🖐 СЕМНАДЦАТАЯ ВОЛНА: ЧИСТКА `no_change` — САЙТЫ, ИЕРОГЛИФЫ, ВОДА (2026-09-26) + +> Триггер: Alex — **«Продолжай до конца»**, затем **«Можешь точечно использовать батч правки +> убедившись что они применятся правильно»** (разрешение на батч-метод). +> Прерывание: **«Остановись и забэкапь файл»** → бэкап `bak-20260926-180619` → продолжение. +> +> 🔴 ГЛАВНЫЙ КЛАСС ЭТОЙ ВОЛНЫ — **сайты-источники и вода, попавшие в `new_artist`/`new_album`/`new_title`**. +> Строки `no_change` (~1000) не проверялись ни разу — там лежал мусор сотнями строк. + +### 🛠 ЧТО ВЫЧИЩЕНО (по типам дефектов) + +| Дефект | Строк | Фикс | +|---|---:|---| +| **`Pushnoy.ru` в `new_artist`** (папка пародий Александра Пушного) | **81** | → `Александр Пушной`. 5 батчей по album: `2005-2006` (7), `старые` (26), `Pushnoy.ru NEW` (17), `демки` (7), `2007` (11), плюс одиночные (`+/`, `Bachilo-aha-ru`) | +| `P@X@Tu*HCK*u` в artist (пиратский водяной знак) | 2 | `Kid Cudi & Collie Buddz` / `Freemasons & Sophie Ellis-Bextor` | +| `PiratMusic.ru - Рэпер Сява` в artist | 1 | → `Рэпер Сява` | +| **Иероглифы UTF-16** (`ᬄ㔄䈄…`) — `Олег Митяев/Лето это маленькая жизнь.mp3` | 1 | → `Лето - это маленькая жизнь` / `Олег Митяев` | +| Вода `[muzmo.ru]` / `[mp3ex.net]` в `new_title` | 3 | вырезана | +| Вода `Mp3-Az.com`, `www.mp3arena.ru`, `Renat.promodj.ru`, `utmostdjs@inbox.ru`, `www.mp3ex.net`, `www.Ostrov-Ok.net`, `www.musicdjsmp3.com`, `www.katyafirst.ru`, `mp3ex.net`, `4ump4.com` в `new_album` | ~12 | вырезана из `new_*` (`cur_*` не трогаются) | +| `(Sefon.Pro)` / `(Sefon.me)` в `new_title` | 5 | вырезано (Пионерлагерь Пыльная Радуга, Канцлер Ги, КняZz ×2) | +| `melody.az - КняZz - Корсар` в title+artist | 1 | → `Корсар` / `КняZz` | +| `Князь` (старое имя) → `КняZz` (по папке) | 1 | `Стальные кандалы` / `КняZz` | +| Число в `new_title` (номер трека попал в название) | 6 | `1100`→track 4 (Ария); `11`→`Истерика`/`Агата Кристи`; `120`→`Гурод`/`Звери`, album `Голод`, track 3; `48`→track 5; `11 - 11`→track 11; `06 Unknown`→track 6 (Пилот) | +| `Рок-Группа` в `new_artist` (мусорный artist) | 3 | title начисто: `Попса`, `Кошка`; `Бесы` + artist `Пилот` | +| `Prodigy - Smack My Bitch Up (Sub Focus Remix)` в title | 1 | → title `Smack My Bitch Up (Sub Focus Remix)`, artist `The Prodigy` | +| `Нечётный Воин-2` в artist | 1 | → `Капли о стекло` / `Нечётный Воин-2` | + +### 🔴 ПИТФОЛЛ ВОЛНЫ: `new_*`-КОЛОНКИ НЕ ТАМ, ГДЕ ЖДЁШЬ (сдвиг из-за запятых) + +`awk -F','` даёт сдвиг колонок на строках с запятыми/кавычками в `path`. **Позиция полей +зависит от числа полей в строке** (11 / 12 / 13 / 14). Диагностика одной строки: + +```bash +sed -n 'p' tag-fix-plan.csv | awk -F',' '{for(i=1;i<=NF;i++) print i": "$i}' +``` + +Пример: в строке `"!Pop, Club, Любэ/..."` (запятые в пути) `new_artist` оказывается в **9-й** +колонке, а не в 7-й. Для 11-полевых строк — 7-я. Универсальный детектор с учётом сдвига: + +```bash +awk -F',' 'NR>1 {n=NF; na=(n==11)?7:((n==13)?9:((n==12)?8:0)); + if(na && $na ~ /МАРКЕР/) print NR"|"n"|"$na}' tag-fix-plan.csv +``` + +> ⚠️ `cur_album`, `cur_title`, `cur_artist` — **НЕ ПРАВИТЬ** без явного слова Alex. +> Вода в `cur_*` — норма (исходные испорченные теги, остаются как история). Чистится только `new_*`. + +### 🛠 МЕТОД БАТЧ-ПРАВОК — ПОДТВЕРЖДЁН (второй раз) + +`patch mode=patch` с несколькими ханками применяется **атомарно**: если хоть один ханк не +найден — не пишется ничего (`Patch validation failed... no files were modified`). +Сбой записи (`Failed to write file: [Command interrupted]`) **файл не портит** — проверено +сравнением с бэкапом (размер идентичен). + +**Обязательная проверка после каждого батча:** +```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 +``` + +### 📊 СОСТОЯНИЕ НА КОНЕЦ СЕМНАДЦАТОЙ ВОЛНЫ + +| Показатель | Значение | +|---|---:| +| Строк в CSV | 7906 (+1 заголовок = 7907 в файле) | +| Битых строк | **0** | +| CRLF-потерь | **0** | +| Ручных правок (`source = manual (user decision)`) | **~635** | +| `fix` / `no_change` | **6905 / 1001** | +| Сайтов-источников в `new_artist` | **0** | +| Иероглифов (UTF-16) в CSV | **0** | +| Пустых пар `new_title`+`new_artist` | **0** | +| Класс C / A / 3 / 4 | ✅ **ЗАКРЫТЫ** | +| Строки `no_change` (1001) | 🔄 **ЧАСТИЧНО ВЫЧИЩЕНЫ** (сайты, вода, иероглифы, числа) | +| Применение на NAS | **НЕ начато** | + +**Бэкапы этой волны:** `bak-20260926-180619`, `bak-20260926-183432`, `bak-20260926-183541`. + +### ⏭ ЧТО ДЕЛАТЬ ПЕРВЫМ ДЕЛОМ В СЛЕДУЮЩЕЙ СЕССИИ + +1. **Добить `no_change` (1001 строка)** — часть легитимна (`Green Apelsin`, `Guf`, западные группы, + `O.K.`/`STILL LIFE` у Чижа). Искать: вода в `new_title`/`new_album`, числа в title, + обрезанные значения, мусорные artist (`01`, `Unknown Artist`). Детекторы (с учётом сдвига!): + ```bash + awk -F',' 'NR>1 && $6 ~ /www\.|\.ru|\.com|\.net|muzmo|zvukoff|Sefon/ {print NR"|"$6}' tag-fix-plan.csv + awk -F',' 'NR>1 {n=NF; na=(n==11)?7:((n==13)?9:((n==12)?8:0)); if(na && $na ~ /www\.|\.ru$|\.net$/) print NR"|"$na}' tag-fix-plan.csv + ``` +2. Только после этого — **бэкап `Music/backup/` → применение → приёмка в UI Alex** → + Music-библиотека Jellyfin. + ## 🖐 ШЕСТНАДЦАТАЯ ВОЛНА: КЛАСС 4 (ТРАНСЛИТ) ЗАКРЫТ ПОЛНОСТЬЮ (2026-09-26) ### ✅ КЛАСС 4 — ЗАКРЫТ ЦЕЛИКОМ