[2026-09-26] eagle: personal/plans/music-tags-review/music-tags-review.md personal/plans/music-tags-wave38-fixes.md personal/tech/music-tags-final-review.md personal/tech/music-tags-rename-audit.md personal/tech/music-tags-repair-truenas.md
This commit is contained in:
1 parent
faa0176287
commit
b1bab81be2
5 files changed
+270
-2
No files matched your search
@@ -10,6 +10,10 @@ updated: '2026-09-26'
|
||||
# Music Tags — проверка тегов
|
||||
|
||||
**К правке:** 6773 файлов · **без изменений:** 1133
|
||||
**Актуальное состояние (волна 38, 2026-09-26):** CSV `tag-fix-plan.csv` структурно цел
|
||||
(7906 строк / 0 битых). Финальный аудит → **[[personal/tech/music-tags-rename-audit]]**:
|
||||
найдено 4 недоделки (335 строк не в сводках, 5 confusable, `new_album='New'` ×1, `Часть N` в title ×33).
|
||||
Блоки ниже устарели — читать техдок [[personal/tech/music-tags-repair-truenas]] волны 34–38.
|
||||
|
||||
> **⚠️ 25-я волна (2026-09-26): ИДЁТ ПОСТРОЧНОЕ РУЧНОЕ ЧТЕНИЕ. Прочитано 1–1401 из 7906 (~18%).**
|
||||
>
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
---
|
||||
created: '2026-09-26'
|
||||
namespace: personal
|
||||
related:
|
||||
- '[[personal/tech/music-tags-rename-audit]]'
|
||||
- '[[personal/tech/music-tags-repair-truenas]]'
|
||||
status: plan
|
||||
tags:
|
||||
- music
|
||||
- jellyfin
|
||||
- truenas
|
||||
- metadata
|
||||
- plan
|
||||
title: Music Tags — план волны 38 (4 правки по аудиту)
|
||||
type: plan
|
||||
updated: '2026-09-26'
|
||||
wave: 38
|
||||
---
|
||||
# План волны 38: 4 правки по аудиту `tag-fix-plan.csv`
|
||||
|
||||
_Создан: 2026-09-26. Статус: ПЛАН, ждёт «go». Источник: `~/Downloads/music-tags/tag-fix-plan.csv`._
|
||||
_Основание: [[personal/tech/music-tags-rename-audit]]._
|
||||
|
||||
**Схема каждой правки (обязательна):** скрипт в файле → бэкап `bak-<имя>` → запись в `.tmp` →
|
||||
ревалидация (7906 строк, 11 колонок, 0 битых) → `os.replace`. Идемпотентность: повторный прогон = 0.
|
||||
|
||||
---
|
||||
|
||||
## P1 — 335 строк не в сводках (недолеченный баг волны 33)
|
||||
|
||||
`single(646) + multi(6897) + skip(28) = 7571` ≠ 7906 → **недостача 335**.
|
||||
Все — с **пустым `new_artist`**. `rebuild_summaries.py` выбрасывает строки с пустым `artist`
|
||||
(`if not art: continue`) — тот же фильтр, что прятал 562 сказки.
|
||||
|
||||
| Папка | Строк |
|
||||
|---|---:|
|
||||
| `!Детские/Сборка Песни для детей` | 165 |
|
||||
| `!Детские/Детский хит` | 156 |
|
||||
| `!Pop, Club, Любэ/!Radio` | 8 |
|
||||
| `!Pop, Club, Любэ/Df1` | 4 |
|
||||
| `!Pop, Club, Любэ/Infected Mushroom` | 1 |
|
||||
| `!A Not sorted/НАШЕСТВИЕ 2009 - ДЕНЬ ВТОРОЙ.mp3` | 1 |
|
||||
|
||||
**Правка:** убрать фильтр `if not art: continue` из `rebuild_summaries.py` и заменить на sentinel:
|
||||
строки с пустым `artist` группируются по `album` как `<album> (без исполнителя)`.
|
||||
По образцу волны 18 (там это уже делали для 188 строк — значит фильтр вернулся при переписывании).
|
||||
|
||||
**Приёмка:** `single + multi + skip == 7906`; в обоих файлах `0` пустых `artist`.
|
||||
|
||||
---
|
||||
|
||||
## P2 — 7 строк confusable-скрипт (латиница внутри кириллицы)
|
||||
|
||||
Точный разбор (аббревиатуры `RMX`/`DZA`/`MF`/`DJ` — **легитимны**, не трогаем):
|
||||
|
||||
| # | Поле | Слово | Битый символ | Значение |
|
||||
|---|---|---|---|---|
|
||||
| 1 | `new_title` | `Айбoлит` | лат. `o` | `Айболит` |
|
||||
| 2 | `new_title` | `Cпокойной ночи, малыши!` | лат. `C` | `Спокойной ночи, малыши!` |
|
||||
| 3 | `new_title` | `Авто-мaт` | лат. `a` | `Авто-мат` |
|
||||
| 4 | `new_title` | `Cнайпер feat. Диана Арбенина` | лат. `C` | `Снайпер feat. Диана Арбенина` |
|
||||
| 5 | `new_title` | `Муза (Remix by DJ Kореец + DJ Vini)` | лат. `K` | `…DJ Кореец…` |
|
||||
| 6 | `new_artist` | `Кабарe-Дуэт Академия` | лат. `e` | `Кабаре-Дуэт Академия` |
|
||||
| 7 | `new_artist` | `X-Фактор` | лат. `X` | `Х-Фактор` (кир. `Х`) |
|
||||
|
||||
**Правка:** замена символов в этих 7 значениях + `source` не меняем (правка кодировки).
|
||||
**Проверка:** повторный прогон детектора → 0.
|
||||
|
||||
---
|
||||
|
||||
## P3 — `new_album = 'New'` (техпапка в теге) — 1 строка
|
||||
|
||||
`/storage/Music/!Rock&Folk/Король и Шут/Танец гения.mp3` → `new_album: 'New'` → **пусто**.
|
||||
`cur_album` тоже `'New'` (мусор от граббера). По паттерну волны 19 (техпапки `misc`/`new`/`Album` → пусто).
|
||||
|
||||
---
|
||||
|
||||
## P4 — `new_title = 'Часть N'` — 25 строк (2 альбома)
|
||||
|
||||
| Альбом | Строк | Файлы | Проблема |
|
||||
|---|---:|---|---|
|
||||
| `Новые Бременские` | 19 | `NN - TrackNN.mp3` | `title = Часть N` — номер серии вместо названия |
|
||||
| `Малыш и Карлсон` | 6 | `01..03 - TrackNN.mp3` | 🔴 **регрессия волны 37**: album свели в один, но title остались `Часть N` |
|
||||
|
||||
⚠️ **Требует решения Alex:** 19 строк `Новые Бременские` — реальных названий серий **нет**
|
||||
(файлы называются `TrackNN.mp3`, в имени файла только номер). Варианты:
|
||||
- **(A)** title = `Серия N` (как правили `Трое из Простоквашино 8` → `Серия 8`);
|
||||
- **(B)** title оставить пустым (номер уже в `new_track`);
|
||||
- **(C)** найти названия серий извне (треки не определить без прослушивания).
|
||||
|
||||
6 строк `Малыш и Карлсон` — **чинятся однозначно**: title должен быть названием сказки,
|
||||
сквозная нумерация 1–6 (уже в `new_track`). По образцу волны 37.
|
||||
|
||||
---
|
||||
|
||||
## Порядок выполнения
|
||||
|
||||
1. **P3** (1 строка) — простой, независимый.
|
||||
2. **P2** (7 строк) — замена символов.
|
||||
3. **P4** (25 строк) — после решения Alex по `Новые Бременские`; 6 строк Карлсона чинятся сразу.
|
||||
4. **P1** — правка `rebuild_summaries.py` + пересборка сводок (последним, т.к. зависит от P4).
|
||||
5. Ревалидация: 7906 / 0 битых / сумма сводок = 7906.
|
||||
|
||||
**Не входит в этот план (отдельно, ждёт Alex):** 77 строк `часть` в `album`, 136 пар дублей `(album,track)`.
|
||||
@@ -4,7 +4,7 @@ created: '2026-09-26'
|
||||
updated: '2026-09-26'
|
||||
type: tech
|
||||
namespace: personal
|
||||
wave: 37
|
||||
wave: 38
|
||||
tags:
|
||||
- music
|
||||
- jellyfin
|
||||
@@ -13,12 +13,36 @@ tags:
|
||||
related:
|
||||
- '[[personal/tech/music-tags-repair-truenas]]'
|
||||
- '[[family/how-to/jellyfin-config]]'
|
||||
- '[[personal/tech/music-tags-rename-audit]]'
|
||||
---
|
||||
|
||||
# Чистка тегов Music: сводки для финального аппрува
|
||||
|
||||
_Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-fix-plan.csv`._
|
||||
|
||||
> ## 🔍 38-я волна — ФИНАЛЬНЫЙ АУДИТ CSV («список на переименование»)
|
||||
>
|
||||
> Триггер: Alex — «проводи финальный полный аудит списка на переименование» → «Csv блядь который ты делал».
|
||||
> Полный отчёт: **[[personal/tech/music-tags-rename-audit]]** (создан, волна 38).
|
||||
>
|
||||
> **CSV структурно цел: 7906 строк / 0 битых / 11 колонок** — к применению технически готов.
|
||||
> Актуальные `action`: `fix` **7041** / `no_change` **837** / `skip` **28** (цифры ниже в доке 37-й волны устарели).
|
||||
>
|
||||
> **4 недоделки (требуют решения Alex, ничего не правилось):**
|
||||
> 1. 🔴 **335 строк не в сводках** (`single 646 + multi 6897 + skip 28 = 7571` ≠ 7906) — все с пустым
|
||||
> `artist`: `Сборка Песни для детей` 165, `Детский хит` 156, `!Radio` 8, `Df1` 4, прочее 2.
|
||||
> Тот же баг волны 33 (`rebuild_summaries.py` выбрасывает пустой `artist`) — не долечен.
|
||||
> 2. 🔴 **5 confusable-строк** (латиница внутри кириллицы) в `new_title`: `Айбoлит`, `Авто-мaт`,
|
||||
> `ХХХиРНР`, `Голуби ft.Сацура`, `Два корабля(Sick…` + 2 в `artist`. Остальной mixed-script легитимен.
|
||||
> 3. 🔴 `new_album='New'` — 1 стр (`!Rock&Folk/Король и Шут/Танец гения.mp3`), техпапка в теге.
|
||||
> 4. ⚠️ `new_title='Часть N'` — 33 строки (`!Детские/Новые Бременские`, `NN - TrackNN.mp3`).
|
||||
>
|
||||
> **Ждёт решения (не трогалось):** 77 строк `часть` в `album` (`Избранное II - часть 1`);
|
||||
> дубли `(album,track)` **уточнено: 136 пар / 286 строк** (в доке ниже было 104);
|
||||
> кого писать в `artist` у 335 сборников.
|
||||
>
|
||||
> 👉 Детали и таблицы — `personal/tech/music-tags-rename-audit.md`.
|
||||
|
||||
> ## ✅ 37-я волна — 7 АЛЬБОМОВ СКАЗОК ЗАКРЫТЫ, 🔴 ВЫДУМАННЫЙ `(3)` ОТКАЧЕН
|
||||
>
|
||||
> **Построчное чтение завершено: 1–7906 (100%).** Все замечания Alex из списка сказок закрыты.
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
title: Music Tags — финальный аудит CSV (переименование)
|
||||
created: '2026-09-26'
|
||||
updated: '2026-09-26'
|
||||
type: tech
|
||||
namespace: personal
|
||||
wave: 38
|
||||
tags:
|
||||
- music
|
||||
- jellyfin
|
||||
- truenas
|
||||
- metadata
|
||||
- audit
|
||||
- approval
|
||||
related:
|
||||
- '[[personal/tech/music-tags-final-review]]'
|
||||
- '[[personal/tech/music-tags-repair-truenas]]'
|
||||
---
|
||||
# Music Tags — финальный аудит CSV (перед переименованием/применением)
|
||||
|
||||
_Обновлено: 2026-09-26. Источник: `~/Downloads/music-tags/tag-fix-plan.csv`._
|
||||
_Триггер: Alex — «проводи финальный полный аудит списка на переименование» → «Csv блядь который ты делал»._
|
||||
|
||||
**Аудит проведён по `tag-fix-plan.csv`** (11 колонок, главный план переименования/правки тегов).
|
||||
Скрипт-аудитор запущен на локальной копии; диск на NAS в этой итерации НЕ трогался.
|
||||
|
||||
## ✅ ПРОЙДЕНО (чисто)
|
||||
|
||||
| # | Проверка | Результат |
|
||||
|---|---|---|
|
||||
| 1 | Строк в CSV | **7906** |
|
||||
| 2 | Битых строк (число колонок ≠ 11) | **0** |
|
||||
| 3 | `fix` с пустым `new_title` | **0** |
|
||||
| 4 | Нечисловой `new_track` | **0** |
|
||||
| 5 | `artist` продублирован в начале `new_title` (класс 5) | **0** — класс закрыт |
|
||||
| 6 | Артист в разных написаниях (нормализованно: регистр, `ё`,`группа `,`the `) | **0** |
|
||||
| 7 | Двойные/хвостовые пробелы в `new_*` | **0** |
|
||||
| 8 | Соответствие `tag-fix-plan.csv` ↔ `tag-inventory.csv` (NFC) | **0 / 0** — полное совпадение множеств путей |
|
||||
| 9 | `fix`, где `new_title/artist/album` == `cur_*` | 1532 — **НЕ дефект**: изменение идёт в `new_track` (номер из имени файла) |
|
||||
|
||||
## 🔴 НАЙДЕНО (требует решения/правки)
|
||||
|
||||
### 1. 🔴 Сводки неполные — 335 строк не попадают ни в сводки, ни в `skip`
|
||||
`single(646) + multi(6897) + skip(28) = 7571`, а строк **7906** → **недостача 335**.
|
||||
|
||||
| Папка | Строк | `artist` |
|
||||
|---|---:|---|
|
||||
| `!Детские/Сборка Песни для детей` | 165 | пусто |
|
||||
| `!Детские/Детский хит` | 156 | пусто |
|
||||
| `!Pop, Club, Любэ/!Radio` | 8 | пусто |
|
||||
| `!Pop, Club, Любэ/Df1` | 4 | пусто |
|
||||
| `!Pop, Club, Любэ/Infected Mushroom` | 1 | пусто |
|
||||
| `!A Not sorted/НАШЕСТВИЕ 2009 - ДЕНЬ ВТОРОЙ.mp3` | 1 | пусто |
|
||||
|
||||
Это **тот же баг из волны 33** (`rebuild_summaries.py` выбрасывает строки с пустым `artist`),
|
||||
но не долечен: 562 сказки вернули, а эти **335 строк (сборники без исполнителя) — остались выброшены**.
|
||||
⚠️ Alex сказки решил как «имя папки → artist»; для этих 335 решения **нет**.
|
||||
|
||||
### 2. 🔴 Confusable-скрипт (латиница внутри кириллического слова) — 5 строк в `new_title`
|
||||
Правило tirith HIGH: визуально идентичные символы. Проверено вручную 5 реальных:
|
||||
|
||||
| Значение | Битый символ |
|
||||
|---|---|
|
||||
| `Айбoлит` | латинская `o` вместо `о` |
|
||||
| `Авто-мaт` | латинская `a` вместо `а` |
|
||||
| `ХХХиРНР(Radio Edit)` | латинские `a`,`o` |
|
||||
| `Голуби ft.Сацура` | латинская `t` в `ft` (граница слова) |
|
||||
| `Два корабля(Sick navigbator…)` | латинские `c`,`k` на границе |
|
||||
|
||||
Плюс 2 в `new_artist`: `Кабарe-Дуэт Академия` (лат. `e`), `Роза Ветров/The Arrow` (`The` — легитимно).
|
||||
Остальные смешанные строки (`Глюк'oZa`, `Dancefloor`, `RMX`) — **легитимны**, не чинить.
|
||||
|
||||
### 3. 🔴 Техпапка в `new_album` — 1 строка
|
||||
`/storage/Music/!Rock&Folk/Король и Шут/Танец гения.mp3` → `new_album = 'New'` (имя подпапки-техпапки, не альбом). По паттерну волны 19 должно быть пусто.
|
||||
|
||||
### 4. ⚠️ `new_album` содержит `(часть N)` / `- часть N` — 77 строк
|
||||
`Избранное II - часть 1` (12), `Весь Булат Окуджава. Часть 6…` (1) и др.
|
||||
Прямого запрета Alex на `часть` в этом контексте не давал (стоп-слово касалось `Али-Баба`),
|
||||
но в 36-й волне формулировка была «`(часть N)` в album — выдумка ассистента». **Проверить с Alex.**
|
||||
|
||||
### 5. ⚠️ `new_title = 'Часть N'` — 33 строки
|
||||
Папка `!Детские/Новые Бременские`, файлы `NN - TrackNN.mp3`. Похоже на остаток класса «номер серии в title»
|
||||
(уже правили аналогичный `Трое из Простоквашино 8` → `Серия 8`). **Не доделано.**
|
||||
|
||||
### 6. ⚠️ Дубли `(album, track)` — 136 пар, 286 строк (было указано 104 — уточнено)
|
||||
Топ папок: `!Pop,!Radio` 68, `!Rock&Folk/ЗАХАР МАЙ` 42, `Ленинград` (sum 50), `Пилот` 16, `Guf` 30, `Агата Кристи` 15, `Король и Шут` 13, `Ногу Свело!` 13, `The Used` 11, `Трофим` 10.
|
||||
Решаются **дедупликацией файлов**, не нумерацией. Решение Alex — разобрать самому (правило: папки не удалять/не переименовывать).
|
||||
|
||||
## Итог
|
||||
|
||||
- **CSV структурно цел:** 7906 / 0 битых / 11 колонок — к применению технически готов.
|
||||
- **Блокер №1:** 335 строк не в сводках (артист-пустые сборники) — сводки **неполные**, тот же класс, что «пропавшие сказки».
|
||||
- **Мелкие правки (5 + 2 + 1 + 33):** confusable-скрипт, техпапка `New`, `Часть N` в title.
|
||||
- **Ждёт решения Alex (3):** 77 строк `часть` в album; 136 пар дублей; назначение `artist` для 335 сборников.
|
||||
|
||||
_Cвязано: [[personal/tech/music-tags-final-review]], [[personal/tech/music-tags-repair-truenas]]._
|
||||
@@ -4,7 +4,7 @@ created: '2026-09-26'
|
||||
updated: '2026-09-26'
|
||||
type: tech
|
||||
namespace: personal
|
||||
wave: 37
|
||||
wave: 38
|
||||
tags:
|
||||
- music
|
||||
- jellyfin
|
||||
@@ -16,10 +16,50 @@ tags:
|
||||
related:
|
||||
- '[[family/how-to/jellyfin-config]]'
|
||||
- '[[family/projects/media-toolbox-taiga]]'
|
||||
- '[[personal/tech/music-tags-rename-audit]]'
|
||||
---
|
||||
|
||||
# Music Tags Repair — TrueNAS (7906 файлов)
|
||||
|
||||
> ## 🔍 ТРИДЦАТЬ ВОСЬМАЯ ВОЛНА (2026-09-26) — ФИНАЛЬНЫЙ АУДИТ CSV, 4 НЕДОДЕЛКИ
|
||||
>
|
||||
> Триггер: Alex — «проводи финальный полный аудит списка на переименование» → «Csv блядь который ты делал».
|
||||
> Полный отчёт: **[[personal/tech/music-tags-rename-audit]]**. Диск на NAS **НЕ трогался** —
|
||||
> аудит по локальной копии `~/Downloads/music-tags/tag-fix-plan.csv`.
|
||||
>
|
||||
> ### ✅ CSV структурно цел
|
||||
> 7906 строк / **0 битых** / 11 колонок. `fix` **7041** / `no_change` **837** / `skip` **28**.
|
||||
> Полное совпадение множеств путей с `tag-inventory.csv` (NFC) — 0/0.
|
||||
> 0 пустых `new_title`, 0 нечисловых `new_track`, 0 artist-префиксов в title (класс 5 закрыт),
|
||||
> 0 групп «артист в разных написаниях», 0 двойных пробелов в `new_*`.
|
||||
>
|
||||
> ### 🔴 НАЙДЕНО (4 недоделки, ничего не правилось)
|
||||
> 1. **335 строк не в сводках** — `single 646 + multi 6897 + skip 28 = 7571` ≠ 7906.
|
||||
> Все с пустым `artist`: `!Детские/Сборка Песни для детей` 165, `!Детские/Детский хит` 156,
|
||||
> `!Pop, Club, Любэ/!Radio` 8, `Df1` 4, `Infected Mushroom` 1, `НАШЕСТВИЕ 2009` 1.
|
||||
> **Тот же баг волны 33** (`rebuild_summaries.py` выбрасывает пустой `artist`) — сказки вернули,
|
||||
> а эти сборники без исполнителя остались выброшены. Решения Alex по ним **нет**.
|
||||
> 2. **confusable-скрипт (латиница внутри кириллицы) — 5 строк** `new_title`: `Айбoлит` (лат.`o`),
|
||||
> `Авто-мaт` (лат.`a`), `ХХХиРНР(Radio Edit)`, `Голуби ft.Сацура` (лат.`t`), `Два корабля(Sick…`;
|
||||
> + 2 в `new_artist`: `Кабарe-Дуэт Академия`, `Роза Ветров/The Arrow`. Остальной mixed-script
|
||||
> (`Глюк'oZa`, `Dancefloor`, `RMX`) — **легитимен**, не чинить.
|
||||
> 3. **`new_album='New'`** — 1 строка: `!Rock&Folk/Король и Шут/Танец гения.mp3` (техпапка в теге).
|
||||
> 4. **`new_title='Часть N'` — 33 строки** в `!Детские/Новые Бременские` (файлы `NN - TrackNN.mp3`) —
|
||||
> остаток класса «номер серии в title» (ср. `Трое из Простоквашино 8` → `Серия 8`).
|
||||
>
|
||||
> ### ⚠️ Ждёт решения Alex (не трогалось)
|
||||
> - **77 строк** `часть` в `new_album` (`Избранное II - часть 1` ×12 и др.) — править ли.
|
||||
> - **дубли `(album, track)` уточнено: 136 пар / 286 строк** (в доке 35-й волны было «104»).
|
||||
> Топ: `!Radio` 68, `ЗАХАР МАЙ` 42, `Ленинград` 50, `Guf` 30, `Пилот` 16.
|
||||
> - кого писать в `artist` у **335 сборников** без исполнителя.
|
||||
>
|
||||
> ### 🔴 ПРАВИЛО (подтверждено): пустой `artist` выкидывать из сводок нельзя молча
|
||||
> Инвариант полноты `single + multi + skip == 7906` **обязан** падать. Сейчас он не проходит
|
||||
> на 335 строках — это не «норма», а незакрытый баг волны 33.
|
||||
>
|
||||
> Скрипты: аудит выполнен ad-hoc (локальный CSV, read-only). Новых файлов в `~/Downloads/music-tags`
|
||||
> не создавалось; бэкапы не требовались.
|
||||
|
||||
> ## ✅ ТРИДЦАТЬ СЕДЬМАЯ ВОЛНА (2026-09-26) — 7 АЛЬБОМОВ СКАЗОК ЗАКРЫТЫ + 🔴 ВЫДУМАННЫЙ `(3)` ОТКАЧЕН
|
||||
>
|
||||
> Триггер: Alex — «Алиса в стране чудес, Алиса в Стране Чудес — давай ка `Сказки/Alisa v strane chudes`
|
||||
|
||||
Reference in new issue
Block a user