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

This commit is contained in:
Alexey Martemyanov committed 2026-09-26 18:40:03 +06:00
1 parent baf0274cb0
commit 157877d82f
1 file changed
+99 -5
+99 -5
View File
@@ -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 '<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 — ЗАКРЫТ ЦЕЛИКОМ