[2026-09-27] eagle: personal/plans/tagwriter-container.md personal/tech/music-tags-repair-truenas.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 00:29:45 +06:00
1 parent ae931acd15
commit 627d06c07f
2 files changed
+263 -46

No files matched your search

+84 -21
View File
@@ -84,10 +84,79 @@ related:
> **MISSING 83 = 10 не-MP3 (9 wma + 1 ogg, mutagen их не пишет) + 73 не разобрано. MP3 из плана потеряно — 0.**
> Полный разбор перезапущен (лог был обрезан `первые 10`/`первые 30`).
> ✅ **Бэкап не-MP3: 70 файлов, 386 МБ → `/music/backup_raw/`** (40 ogg · 16 wma · 13 m4a · 1 flac);
> `/music/backup/` не тронут (42 ГБ, 7041). ⏳ Далее — конвертация не-MP3 → MP3 (ffmpeg в образ, VBR V0, удаление оригиналов после проверки бэкапа), **ждёт `go` Alex**.
> ✅ **APPLY ВЫПОЛНЕН: `APPLY: обновлено 7041, ошибок 0`** (~17 мин, запуск в фоне).
> ✅ **READ-BACK: не найдено на диске 0.**
> Блокер прав на `/mnt/RED_2TB/docker/` решён: каталог создан **из контейнера** (`docker run -u 0 -v /mnt/RED_2TB/docker:/docker alpine mkdir` + `chown 950:950`).
> `/music/backup/` не тронут (42 ГБ, 7041).
>
> ### 🔴🔴 ПОЛНЫЙ РАЗБОР СВЕРКИ (полный лог, 2026-09-26) — И ИСПРАВЛЕНИЕ ПРЕЖНЕГО ВЫВОДА
>
> | Метрика | Значение |
> |---|---:|
> | Строк в плане | 7905 (7041 `fix` + 864 `no_change`/`skip`) |
> | Совпало | **7610 (96.3%)** |
> | MISSING | 83 = **40 ogg + 26 m4a + 16 wma + 1 flac — все не-MP3** |
> | MISMATCH | 212 = **все `no_change`/`skip`, `apply` их не трогал** |
>
> **MISSING 83 — не потери.** Ни одного MP3 (проверено). mutagen пишет только ID3 → не-MP3 ожидаемо.
> Ни один MP3 из плана не потерян; не-MP3 в план попали ошибочно и на теги MP3 не влияли.
>
> **MISMATCH 212 — не «всё ок».** Разбивка по характеру: REAL_DIFF 135 · TRCK_LEADING_ZERO 49 ·
> EMPTY_ON_DISK (`None`) 35 · EXTRA_IN_DISK 14 · MOJIBAKE 6 · прочее ~13.
> Поля: TRCK 102 · TPE1 98 · TALB 29 · TIT2 25.
>
> ### ✅ ФАКТ-ЧЕК 212 MISMATCH ПО ДИСКУ → 165 РЕАЛЬНЫХ ПРАВОК
>
> Alex: **«У тебя блядь есть список несовпавших mp3! Ты не можешь просто по нему update tags
> запустить что-ли??»** → «У тебя же уже есть этот список зачем пересчет» → **«Чини»**.
>
> **Короткий путь (вместо пересчёта всего плана):** 212 путей из MISMATCH → фильтр MP3
> (все 212 MP3) → `new_*` из плана → `update-plan.csv` → факт-чек реальных ID3 →
> `final-update.csv`.
>
> | Метрика | Значение |
> |---|---:|
> | Вход (212 MISMATCH) | 212 |
> | **Требуют правки** | **165** |
> | Уже совпадают (ложные: ведущий ноль TRCK) | 45 |
> | Ошибки | 2 (`._*` AppleDouble-мусор, не ID3) |
>
> Поля к правке: `TRCK` 128 · `TPE1` 98 · `TALB` 29 · `TIT2` 25.
> Примеры: `Сектор Газа` mojibake `Ãðÿçíàÿ êðîâü` → `Грязная кровь`; `50 cent-Candy Shop`
> `Shop`/`Candy` → `Candy Shop`/`50 Cent`; Наутилус `Nautilus Pompilius` → `Наутилус Помпилиус`;
> НТЛ `NTL` → `НТЛ`; `Wolfgang Gartner - Fire Power` пустые теги → заполнить.
>
> 🔴 **ОТКРЫТЫЙ ВОПРОС: 75 правок вида `TRCK: 'N'->''`** (удалить номер трека; почти все —
> Наутилус Помпилиус). Похоже на дефект плана (`new_track` пустой = «не задано»).
> Варианты: **A** удалить как в плане · **B** не трогать пустой `new_track` (рекомендация) ·
> **C** показать полный список 75. **Ждёт ответа Alex. До ответа `apply` дельта-правок не запускать.**
> Отдельно: 2 файла `._Infected Mushroom - Tiwanacu.MP3`, `._МИМИКРИЯ.MP3` — удалять?
>
> **Скрипты этой сессии:** `build_update_plan.py` (локально) + `fact_check_212.py` (NAS).
>
> ### 🔴 ГЛАВНЫЙ ДЕФЕКТ ПЛАНА: ЛОЖНЫЙ `action=no_change` — 353 СТРОКИ
>
> Alex: **«Что блядь значит no action??»** `no_change` — колонка `action` в CSV («менять не надо»).
> `apply_tags.py` выполняет план буквально → файл пропущен. **Скрипт не виноват, виноват ПЛАН.**
>
> **353 строки** `action=no_change`/`skip`, где `cur_*` ≠ `new_*` (TRCK 262 · TIT2 49 · TALB 21 · TPE1 21).
> `source` пустой у 320/353. **Две причины:**
> 1. **Ложная логика генератора** — `50 cent-Candy Shop.mp3`: `cur_title=Shop` vs `new_title=Candy Shop`, а `no_change`.
> 2. **Устаревший `cur_*`** — `!Retro/Крылья.mp3`: план `cur_artist=Наутилус Помпилиус` (= new),
> **на диске реально `Nautilus Pompilius`** → генератор решил «совпадает», поставил `no_change`.
>
> **Следствие:** 262 файла `Sbornik_Novij_Rok` (`169_Steven Curtis Chapman` в имени, `TRCK=None` в теге) —
> номер так и **не записан**. 6 mojibake (`Ãðÿçíàÿ êðîâü`) — **не перезаписаны**. И т.д.
>
> **Правило:** `action` валидировать против **фактического диска**, а не `cur_*` из плана.
> Детектор: `/tmp/find_false_nochange.py` (353 строки, разбивка по полю/`source`/`verdict`).
>
> ⏭ **Дальше:** (1) пересчитать `action` по факту диска → дельта-план → dry-run → apply;
> (2) конвертация не-MP3 → MP3 (ffmpeg в образ, VBR V0, удаление после проверки бэкапа);
> (3) приёмка в Jellyfin; (4) после приёмки — удалить бэкап.
>
> **Прогресс apply/бэкапа (выполнено ранее):**
> ✅ **APPLY: 7041 файл, ошибок 0** (~17 мин, в фоне). ✅ **READ-BACK: не найдено 0.**
> ✅ Бэкап 7041 файл / 42 ГБ → `/music/backup/`. ✅ Бэкап не-MP3 70 файлов / 386 МБ → `/music/backup_raw/`.
> Блокер прав на `/mnt/RED_2TB/docker/` решён: каталог создан **из контейнера**
> (`docker run -u 0 -v /mnt/RED_2TB/docker:/docker alpine mkdir` + `chown 950:950`).
>
> ### 📊 НЕЗАВИСИМАЯ СВЕРКА `verify_tags.py` (2026-09-26) — 96.3%
>
@@ -99,22 +168,13 @@ related:
> | MISMATCH (тег ≠ план) | 212 |
> | Файлов на диске (индекс NFC) | 7822 |
>
> **MISSING 83:** из видимых 10 — **9 `.wma` + 1 `.ogg`** (mutagen пишет только ID3/MP3 →
> ожидаемо не обрабатываются). Остальные 73 **не разобраны** — скрипт печатал только первые 10.
> **MISSING 83:** ✅ РАЗОБРАНО ПОЛНОСТЬЮ — **40 ogg + 26 m4a + 16 wma + 1 flac, все не-MP3**
> (mutagen пишет только ID3/MP3 → ожидаемо). **Ни одного MP3 не потеряно.** См. § ПОЛНЫЙ РАЗБОР выше.
>
> **MISMATCH 212:** из видимых 30 — `TPE1` 16, `TRCK` 11, `TIT2` 9, `TALB` 6. Классы:
> - **mojibake (3)** — CP1251 прочитан как UTF-8: `Ãðÿçíàÿ êðîâü` → `Грязная кровь`
> (`Сектор Газа/05 - Грязная кровь.mp3`, `07 - Черный вурдалак.mp3`, `НТЛ/САВЛО&LIL'DEN vs. NTL.mp3`).
> Это **битые исходные ID3**, не результат apply. ⚠️ mutagen их не перезаписал.
> - **регистр/транслит** — `Ace of Base` / `Nautilus Pompilius` / `Fleur` / `Vanessa-Mae` / `Иванушки Int`.
> - **TRCK пустой или чужой** — `None`, `14`→`1`, `2`→`None`, `0`→`24`.
> - **TALB с мусором** — `Лучшие песни. Часть 2` (план: `Лучшие песни`).
> - **TIT2 усечён/с артистом внутри** — `Shop` vs `Candy Shop`; `Sander Kleinenberg - The Fruit…`.
>
> ⚠️ **Статус разбора: НЕПОЛНЫЙ.** Лог обрезан (скрипт печатал `первые 10`/`первые 30`).
> Фикс (печать всех) готов локально в `/tmp/verify_tags.py`, **но НЕ залит** — апрув истёк дважды.
> Причины 212 MISMATCH **не установлены**: возможны правки после apply, дубли имён файлов,
> битые исходные теги.
> **MISMATCH 212:** ✅ РАЗОБРАНО ПОЛНОСТЬЮ — **все 212 строк с `action=no_change`/`skip`**,
> `apply` их не трогал, расхождение было ДО apply. **Корень: ложный `no_change` в плане (353 строки).**
> См. § ГЛАВНЫЙ ДЕФЕКТ ПЛАНА выше. Поля: TRCK 102 · TPE1 98 · TALB 29 · TIT2 25.
> Классы: REAL_DIFF 135 · TRCK_LEADING_ZERO 49 · EMPTY_ON_DISK 35 · EXTRA_IN_DISK 14 · MOJIBAKE 6.
>
> ### 🔴 ПИТФОЛЛ: скрипт в каталоге проекта НЕ попадает в образ
>
@@ -137,8 +197,11 @@ related:
> ⚠️ **Пул:** после бэкапа `df` показал `RED_2TB` = 935G (было 976G) — ZFS-снапшоты. Свободно 919 ГБ.
> Бэкап (`/music/backup/`, 7041 файл) удалять **только после приёмки в Jellyfin**.
>
> ⏭ **Осталось:** (1) получить полный список 83 MISSING + 212 MISMATCH → разобрать причины;
> (2) приёмка в UI Jellyfin (глазами Alex); (3) после приёмки — удалить бэкап.
> ⏭ **Осталось:** (1) ✅ полный разбор 83 MISSING + 212 MISMATCH — **сделан, вскрыл ДЕФЕКТ ПЛАНА
> (353 строки ложного `no_change`) + факт-чек (165 реальных правок)**;
> (2) 🔴 **ответ Alex по TRCK (A/B/C) — 75 правок «удалить»** → затем **apply дельта-правок (165)**
> (бэкап уже есть); (3) конвертация не-MP3 → MP3 (**ждёт `go`**);
> (4) приёмка в UI Jellyfin (глазами Alex); (5) после приёмки — удалить бэкап.
>
> ### 🔴 ПИТФОЛЛ: sentinel-группа собирается по КОРНЮ сборника, НЕ по ближайшей папке
>