From 55fb73597752a7a1cc7e1175ccd7684f4be493c2 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sat, 26 Sep 2026 20:11:22 +0600 Subject: [PATCH] [2026-09-26] eagle: personal/tech/music-tags-final-review.md personal/tech/music-tags-repair-truenas.md --- personal/tech/music-tags-final-review.md | 38 +++++++---- personal/tech/music-tags-repair-truenas.md | 79 +++++++++++++++++++++- 2 files changed, 100 insertions(+), 17 deletions(-) diff --git a/personal/tech/music-tags-final-review.md b/personal/tech/music-tags-final-review.md index a10234d0..b2c188cb 100644 --- a/personal/tech/music-tags-final-review.md +++ b/personal/tech/music-tags-final-review.md @@ -18,9 +18,10 @@ related: _Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-fix-plan.csv`._ -> ⚠️ **Статус: НЕ ФИНАЛЬНЫЙ аппрув.** Блок строк 6402–7906 (1505 строк, ~19%) прочитан -> скриптами, но НЕ глазами. См. «Что НЕ покрыто». Полный контекст волн — -> `personal/tech/music-tags-repair-truenas.md`. +> ## ✅ ГОТОВО К АППРУВУ +> **Построчное чтение завершено: 1–7906 (100%).** 27-я волна закрыла блок 6402–7906. +> Все проверки пройдены. Жду слово Alex («go») для бэкапа и применения тегов. +> Полный контекст волн — `personal/tech/music-tags-repair-truenas.md`. ## Состав файлов @@ -29,7 +30,7 @@ _Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-f | `tag-fix-plan.csv` | 7906 | Главный план правок, 11 колонок | | `artists-single-track.csv` | 3223 | Разбивка: треки БЕЗ номера (artist/title/album/path) | | `artists-multi-track.csv` | 4667 | Разбивка: треки С номером (artist/album/track/title/path) | -| | **7890** | = сумма сводок (16 строк отфильтрованы: AppleDouble + skip) | +| | **7890** | = сумма сводок (16 строк отфильтрованы: 15 skip + 1 намеренно пустая) | ## Действия @@ -49,13 +50,13 @@ _Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-f | 756 | только кодировка/очистка | | 882 | (пусто — правка не требуется) | -## Проверки перед аппрувом +## Проверки перед аппрувом (все пройдены, `final_audit.py`) -- 0 битых строк (все 11 колонок на месте), 0 разъехавшихся запятыми -- 0 пустых `new_title` среди `fix` -- 0 сайтов-водяных знаков в `new_title`/`new_artist`/`new_album` +- 0 битых строк — все 11 колонок на месте +- 0 пустых `new_title` +- 0 сайтов-водяных знаков в `new_*` (`god@pisem.net` / `И тебя уже.net` — это названия песен, не вода) - 0 нечисловых номеров треков -- 0 дублей-артистов (регистр/ё/латиница-кириллица), кроме сведённых +- **0 дублей-артистов** (регистр / ё / латиница-кириллица) - 577 строк без artist — из них **562 это `!Детские/Сказки`** (artist пуст намеренно) ## Приёмка (глазами) @@ -65,11 +66,18 @@ _Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-f 3. Найди свой артист, проверь названия 4. Скажи «go» → бэкап в `Music/backup/` → применение → приёмка в UI Jellyfin -## Что НЕ покрыто +## Что найдено в последнем проходе (6402–7906, 27-я волна) -Блок **строк 6402-7906** главного файла разобран скриптами (кодировка, номера, album из папки), -но **не прочитан построчно глазами**. Крупные артисты блока: Агата Кристи (244), ДДТ (205), -Rammstein (134), Би-2 (128), Ночные Снайперы (96), Muse (91), Пикник (69), Захар Май (67), -Ундервуд (66), Чиж & Со (63). +Самое массовое — **полное имя файла в `title`** (ДДТ `Город без окон` 26 строк, +Чиж & Со 22 строки) и **артист в `title`** (Muse `/` в hullabaloo, 17 строк). +Плюс 25 строк обрезанного `Live Aus Berlin [Limited Edition]`, 17 строк `album == artist` +у Краденого Солнца, ведущий пробел в album «Нечетный Воин» (20), транслит Кукрыниксов (13), +латинские fallback-title Агаты Кристи (10), track=9 у всех The Used (9), +`Психея` ошибочно приписана Агате Кристи (1), `Город Makoнdo` (1), `Hyermusic` (1), +`new_track=48` (1), `title=1/2` (1). Подробная таблица — в дока волн. -Отдельные «не определить без прослушивания»: `ty_49` (`!Radio/y OOF/пакет.mp3`). +## Известные «не определить без прослушивания» + +- `ty_49` / `пакет.mp3` (`!Radio/y OOF/`) — оставлен. +- 46 уникальных альбомов после снятия года — с официальными треклистами не сверялись + (кроме Pushnoy, где регрессия найдена и исправлена). diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index 680fd906..55b991f7 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: 26 +wave: 27 tags: - music - jellyfin @@ -20,7 +20,82 @@ related: # Music Tags Repair — TrueNAS (7906 файлов) -> **Статус: ДВАДЦАТЬ ШЕСТАЯ ВОЛНА (2026-09-26). ПРОЧИТАНО ПОСТРОЧНО 2402–6401 ИЗ 7906 (~81%).** +> ## ✅ ДВАДЦАТЬ СЕДЬМАЯ ВОЛНА (2026-09-26) — ПОСТРОЧНОЕ ЧТЕНИЕ ЗАВЕРШЕНО: 1–7906 (100%) +> +> **Весь файл прочитан глазами построчно. Готов к аппруву Alex.** Триггер: Alex — +> «Ты строки с 6200 до конца проверил в итоге или нет?» (ответ был НЕТ, 6402–7906 не читались). +> +> ### Что найдено и починено в этой волне (6202–7907, 11 блоков) +> +> | Класс | Строк | Скрипт | Результат | +> |---|---|---|---| +> | The Used `2007 - Berth`: `new_track` = `9` у ВСЕХ (из имени файла `3-9 - Title`) | 9 | `fix_block6200.py` | реальные номера 1–8 | +> | Агата Кристи: латинские fallback-title из имён файлов (`luna`, `rep`, `negovori`, `polkovnik`, `piknik graf`) | 10 | `fix_block6400.py` | кириллица (`Луна`, `Рэп`, `Не говори мне`, `Полковник`, `Пикник и Граф`) | +> | Агата Кристи: `Психея - Истерика.mp3` лежала в папке Агаты, artist был `Агата Кристи` | 1 | тот же | artist → **`Психея`** | +> | Агата Кристи: `a-studio opium` / `bi2-opium` (латиница в title) | 2 | тот же | `Опиум (кавер А-Студио)` / `Опиум (кавер Би-2)` | +> | Агата Кристи: album `Земфира ()` — пустые скобки | 12 | `fix_block5200.py` | `Земфира (2000)` | +> | `Извращние` / `Эпилог. на краю` / `Исскуство` / `Французкая` | 4 | `fix_block5800/6400` | опечатки исправлены | +> | Захар Май `изBESTняк/`: **artist = имя диска** (`изBESTняк`) | 2 | `fix_block6600.py` | → `Захар Май` | +> | Кукрыниксы `Kukriniksi - 01 Stolknovenie - Serebrianii sentiabr` (полный транслит из файла) | 13 | `fix_block5400.py` + `fix_block5600.py` | → кириллица, `Dvijenie`→`Движение` | +> | `Muse / Space Dementia` — **артист в title** (альбом hullabaloo) | 17 | `fix_block7800.py` (авто) | префикс `Muse / ` срезан | +> | ДДТ `Город без окон`: **26 title = полное имя файла** (`DDT_09_Gorod_bez_okon_(Vihod)_-_Vals`) | 26 | `fix_block7600.py` | → `Вальс`, `Последний Адам`, … | +> | Чиж & Со: **22 title с префиксом `Чиж & Co - `** | 22 | `fix_block7400.py` | префикс срезан | +> | `Live Aus Berlin [Limited Editi` — обрезанный album Rammstein | 25 | `fix_block7400.py` | `[Limited Edition]` | +> | `Город Makoнdo` (кириллица+латиница в одном слове) | 1 | `fix_block6800.py` | `Город Макондо` | +> | `Аfрики` (латинская `f`) | 1 | `fix_block7200.py` | `Африки` | +> | `Hyermusic` / `Geschchte` / `Блок Rak'In Roллоув` (остаточный mojibake) | 3 | `fix_block6200/7600/7800` | `Hyper Music` / `Geschichte` / `Блок Rak'In Roll'ов` | +> | Обрезанные title: `Настрадался Нострадамус от люд`, `Упыри и вурдалаки сотоварищи е`, `Я не сплю с фотомоделям`, `Was hast Du mit meinem Herz ge`, `(Beatum Jungle`, `Дурочка (remix by Ю.Усачёв, Ти` | 6 | `fix_block6600/6800/7400` | восстановлены | +> | `album == artist` в `Краденое Солнце/1998 - Сказка` | 17 | `fix_block7200.py` | `Сказка «Краденое Солнце»` | +> | `album` с ведущим пробелом (` Нечетный Воин (CD2)`) | 20 | `fix_block7000.py` | обрезан | +> | `Пропавший без Вести` / `Метель Августа` / `Единочество I.` — case-рассинхрон album | 30 | `fix_block7600` + `fix_propavshiy.py` | выровнено | +> | `Mgzavrebi` (латиница) при папке `Мгзавреби` | 1 | `fix_block7200.py` | → `Мгзавреби` | +> | `new_track = 48` (из файла `04-48 часов.mp3`) | 1 | `fix_block7000.py` | → `4` | +> | `title = 1/2` (потеряна ведущая `9` от трека `9 1/2`) | 1 | `fix_block7200.py` | → `9 1/2`, track `13` | +> | `YOJI Biomehanika` → `Yoji Biomehanika` (последний дубль артиста) | 1 | `fix_yoji.py` | **0 групп дублей** | +> +> ### 🔴 ГЛАВНЫЙ УРОК ВОЛНЫ +> **Проверять `title.startswith(artist + ' - ')` и `title.startswith(folder + ' - ')` НЕДОСТАТОЧНО.** +> Два самых массовых дефекта волны (ДДТ 26 + Чиж 22 = 48 строк) были не «артист в title», +> а **полное имя файла в title** (`DDT_09_Gorod_bez_okon_(Vihod)_-_Vals`) — детектор +> «артист в title» их пропускал, потому что папка-артист была DDT, а строка начиналась с `DDT_0`. +> **Детектор:** `title` содержит `_` + `_(Vihod)_`/`_-_`/`.mp3` → имя файла, не название. +> +> ### 🔴 ВТОРОЙ УРОК: ОТКАТ РЕГРЕССИИ СВОЕЙ ЖЕ ПРАВКИ +> `fix_block7000.py` в блоке «День радио» записал `new_track` как **строку из имени файла** +> (`05`, `02`, `09`) вместо нормализованного `5`, `2`, `9` — формат файла по всему остальному +> массиву без ведущих нулей. Поймано сравнением с соседними строками, откачено +> `fix_trackzero.py` (`str(int(t))`), правка `48`→`4` сохранена. +> **Правило: любой скрипт, пишущий `new_track` из имени файла, обязан нормализовать — +> `str(int(re.match(r'^\d+', name).group()))` — иначе ведущие нули разъедутся по массиву.** +> +> ### 📊 ФИНАЛЬНОЕ СОСТОЯНИЕ (27-я волна, `final_audit.py` + `rebuild_summaries.py`) +> +> | Показатель | Значение | +> |---|---:| +> | `tag-fix-plan.csv` | **7906 строк, 0 битых** | +> | `fix` / `no_change` / `skip` | **6934 / 957 / 15** | +> | Пустых `new_title` | **0** | +> | Сайтов-воды в `new_*` | **0** (остались `god@pisem.net`, `И тебя уже.net` — это названия песен) | +> | Нечисловых `new_track` | **0** | +> | Групп дублей артистов | **0** | +> | Строк без artist | **577** (562 = `!Детские`, намеренно) | +> | `artists-single-track.csv` | **3223** | +> | `artists-multi-track.csv` | **4667** | +> | Сумма сводок | **7890** (= 7906 − 15 skip − 1 намеренно пустая) | +> +> ### ⏭ СЛЕДУЮЩИЙ ШАГ (ждёт слова Alex) +> 1. Alex глазами проверяет `artists-single-track.csv` / `artists-multi-track.csv` → **аппрув**. +> 2. После аппрува: бэкап перезаписываемых файлов в `Music/backup/` → применение тегов → приёмка в UI Jellyfin → `rm -rf Music/backup/` → создание Music-библиотеки. +> +> **Бэкапы 27-й волны:** `bak-*-blk6200/6400/6600/6800/7000/7200/7400/7600/7800`, +> `bak-*-trackzero`, `bak-*-propavshiy`. +> **Новые скрипты:** `fix_block6200.py` … `fix_block7800.py`, `fix_trackzero.py`, +> `fix_yoji.py`, `fix_propavshiy.py`, `fix_final.py`, `final_audit.py`. +> **Сводка для аппрува:** `personal/tech/music-tags-final-review.md`. +> +> --- +> +> **Статус предыдущей волны: ДВАДЦАТЬ ШЕСТАЯ (2026-09-26). ПРОЧИТАНО ПОСТРОЧНО 2402–6401 ИЗ 7906 (~81%).** > Продолжение требования Alex: «Проходить весь список руками и валидировать» + «Хули встал» > (без пауз). В этой волне закрыты блоки **2402–6401** (11 блоков по 200 строк). >