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

This commit is contained in:
Alexey Martemyanov committed 2026-09-26 20:11:22 +06:00
1 parent b00eb549bf
commit 55fb735977
2 files changed
+100 -17

No files matched your search

+23 -15
View File
@@ -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, где регрессия найдена и исправлена).
+77 -2
View File
@@ -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 строк).
>