From b290eec03bfbab3076bcb3e25bdbbd9741d9ecfa Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sat, 26 Sep 2026 19:51:03 +0600 Subject: [PATCH] [2026-09-26] eagle: personal/plans/music-tags-review/music-tags-review.md personal/tech/music-tags-repair-truenas.md --- .../music-tags-review/music-tags-review.md | 15 +++++ personal/tech/music-tags-repair-truenas.md | 66 ++++++++++++++++++- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/personal/plans/music-tags-review/music-tags-review.md b/personal/plans/music-tags-review/music-tags-review.md index c126ad8b..e44c24c3 100755 --- a/personal/plans/music-tags-review/music-tags-review.md +++ b/personal/plans/music-tags-review/music-tags-review.md @@ -11,6 +11,21 @@ updated: '2026-09-26' **К правке:** 6773 файлов · **без изменений:** 1133 +> **⚠️ 23-я волна (2026-09-26): CSV обработан глубже, но всё ещё НЕ ГОТОВ к применению.** +> Добито то, что предыдущая волна оставила как «осталось»: +> - **`album` = `ГГГГ - Название`** (`2002 - Живой`, `1989 - Сектор Газа`) — **504 строки**, год снят +> скриптом `strip_year_album.py`. +> - **Плейсхолдеры в `album`**: `2007` (10), `NEW (Remix Album)` (15, Eminem/50cent), +> `Unreleased_Tracks`/`Unreleased`/`old - unreleased` (4) → пусто либо `Unreleased Tracks`. +> - **Потерянный умляут** `Nö`→`Nц` в Knorkator (3 строки), **обрезанные title** +> (`Dust Brothers Who is Tyler Du`), **имя файла в title** (`cat_hous.mp3`→`Кошкин дом`, +> `RacinG_Portal`, `DJ Times Shortlist-SAT-18-11-2009`). +> +> **⏭ Осталось до «go»:** title у **~7000 строк прочих исполнителей глазами НЕ проходился** +> (детекторы ловят обрезки/дубли, смысловые ошибки — нет); `ty_49` (`!Radio/y OOF/пакет.mp3`, +> artist `1club`) — не определить без прослушивания; 46 альбомов после снятия года с треклистами +> не сверялись. Детали и детекторы — [[personal/tech/music-tags-repair-truenas|tech/music-tags-repair-truenas]], 23-я волна. + > **⚠️ 22-я волна (2026-09-26): CSV НЕ ГОТОВ.** Alex спросил: «Ты прошёл вручную через весь список > и АБСОЛЮТНО всё корректно? Нет дублей с разным написанием?» — честный ответ был **НЕТ**. Проверка > нашла ещё ~900 дефектных строк сверх «зелёных» чекеров. diff --git a/personal/tech/music-tags-repair-truenas.md b/personal/tech/music-tags-repair-truenas.md index c14b7c48..3349c03b 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: 22 +wave: 23 tags: - music - jellyfin @@ -20,8 +20,31 @@ related: # Music Tags Repair — TrueNAS (7906 файлов) -> **Статус: ДВАДЦАТЬ ВТОРАЯ ВОЛНА (2026-09-26). CSV: 7906 строк, 0 БИТЫХ, 0 ДУБЛЕЙ АРТИСТОВ. -> НЕ ГОТОВ к применению — остались неразобранные классы (см. «ОСТАЛОСЬ»).** +> **Статус: ДВАДЦАТЬ ТРЕТЬЯ ВОЛНА (2026-09-26). CSV: 7906 строк, 0 БИТЫХ, 0 ДУБЛЕЙ АРТИСТОВ, +> 0 год-префиксов в album, 0 плейсхолдеров в album, 0 сайтов-воды.** +> НЕ ГОТОВ к применению: **title у ~7000 строк НЕ проходился глазами** (детекторы смысловые +> ошибки не ловят), `ty_49`/`пакет.mp3` не определены без прослушивания, 46 альбомов не сверены +> с официальными треклистами. См. «ОСТАЛОСЬ» ниже. +> ✅ **НОВОЕ (23-я волна) — год-префикс в album + плейсхолдеры + обрезки + умляуты:** +> | Класс | Строк | Скрипт/метод | Результат | +> |---|---|---|---| +> | `album` = `ГГГГ - Название` (`2002 - Живой`) | **504** (46 уник.) | `strip_year_album.py` | год снят → `Живой` | +> | `album` = `ГГГГ` (год) — Pushnoy `2007/` | 10 | `fix_placeholders.py` | → пусто | +> | `album` = `NEW (Remix Album)` (Eminem/50cent) | 15 | тот же | → пусто | +> | `album` = `Unreleased_Tracks`/`Unreleased`/`old - unreleased`/`...CD R` | 4 | `fix_unreleased.py` | → `Unreleased Tracks` | +> | Потерянный умляут `Nö`→`Nц` (Knorkator `03. Nö`, `04. From Nö Till`, `02. From Du Nich Till Nö`) | 3 | вручную `patch` | → `Nö` | +> | Обрезанный title (`Dust Brothers Who is Tyler Du`, `SLIMHOUSE vol.5 - mixed by`, `Come Along Noew (feat. Phoebus`) | 4 | вручную | исправлено | +> | Имя файла в title (`cat_hous.mp3`(→`Кошкин дом`), `ty_49`, `RacinG_Portal`(→`RacinG Portal`), `DJ Times Shortlist-SAT-18-11-2009`(→`DJ Times Shortlist`)) | 5 | вручную | исправлено | +> | `trapped (hi_tack remix)` → `Trapped (Hi_Tack Remix)` | 1 | вручную | исправлено | +> | `Infected Mushroom Vs. The Prodigy` → `Infected Mushroom vs. The Prodigy` | 1 | вручную | исправлено | +> +> ⏭ **ОСТАЛОСЬ на конец 23-й волны (НЕ трогать без проверки):** +> - **title ~7000 строк прочих исполнителей глазами НЕ проходился.** Детекторами ловятся только +> обрезки/дубли/расширения/транслит; смысловые ошибки («трек назван не тем треком») — НЕТ. +> - `ty_49` в `!Radio/y OOF/пакет.mp3` (artist `1club`) — **не определить без прослушивания.** +> - 46 уникальных альбомов после снятия года — **с официальными треклистами НЕ сверялись.** +> - 138 строк `album == artist` — БОЛЬШИНСТВО ЛЕГИТИМНЫ (одноимённые альбомы) — не трогать. +> > ✅ **НОВОЕ (22-я волна) — ДЕДУП АРТИСТОВ + АРТИСТ В TITLE + case в album. Поймано триггером > Alex: «Ты прошел вручную через весь список и абсолютно все выглядит корректно??? Нет дублей > с разным написанием?» — ответ был НЕТ, и проверка нашла ещё ~900 дефектных строк.** @@ -91,6 +114,43 @@ related: > > --- > +> 🛠 **НОВЫЕ СКРИПТЫ 23-й волны (все по безопасной схеме tmp + валидация + `os.replace`):** +> - `strip_year_album.py` — снимает `ГГГГ - ` с начала `new_album` + вырезает дублирующийся +> артист-префикс внутри album. 504 строки. +> - `fix_placeholders.py` — карта `DROP`: `2007`/`2005`/`NEW (Remix Album)`/`DJ Times Shortlist-SAT-18-11` +> → пусто; `Unreleased_Tracks` → `Unreleased Tracks`. +> - `fix_unreleased.py` — карта `MAP`: `Unreleased Tracks CD R`/`old - unreleased`/`Unreleased` +> → `Unreleased Tracks`. +> - `rebuild_summaries.py` — пересборка `artists-single-track.csv` (3222) + +> `artists-multi-track.csv` (4669) = 7891 (делит по признаку непустого `new_track`, фильтрует +> `action=skip` + `source=dropped`). +> +> 📎 **Детекторы 23-й волны (read-only, гонять ПЕРЕД заявлением «готово»)** — то, что нашли +> год-префиксы, плейсхолдеры, обрезки и умляуты: +> ```bash +> cd ~/Downloads/music-tags && python3 - <<'EOF' +> import csv, re +> rows=list(csv.DictReader(open('tag-fix-plan.csv',encoding='utf-8-sig',newline=''))) +> # A. album = чистый год +> print("year-only:", [i for i,r in enumerate(rows,2) if re.fullmatch(r'(19|20)\d\d',(r['new_album'] or '').strip())]) +> # B. album = "ГГГГ - Название" +> print("year-prefix:", sum(1 for r in rows if re.match(r'^(19|20)\d\d\s*[-–—]',(r['new_album'] or '').strip()))) +> # C. плейсхолдеры в album +> PL={'NEW (Remix Album)','Unreleased_Tracks','DJ Times Shortlist-SAT-18-11','misc','new'} +> print("placeholders:", sum(1 for r in rows if (r['new_album'] or '').strip() in PL)) +> # D. title = имя файла / расширение +> print("file-title:", [i for i,r in enumerate(rows,2) if re.search(r'\.(mp3|m4a|flac)$',(r['new_title'] or '').strip(),re.I)]) +> # E. потерянный умляут: латиница+ц+латиница / одинокое "Nц" +> print("umlaut:", [i for i,r in enumerate(rows,2) if re.search(r'[A-Za-z][ц][A-Za-z]|\bNц\b',(r['new_title'] or ''))]) +> # F. обрезанный title: незакрытая "(" или висящий "&"/"-" +> print("truncated:", [i for i,r in enumerate(rows,2) if (r['new_title'] or '').count('(')!=(r['new_title'] or '').count(')')]) +> EOF +> ``` +> **Бэкапы 23-й волны:** `bak--year`, `bak--ph`, `bak--unrel`, +> `bak--albumfix`, `bak--prefix2` в `~/Downloads/music-tags/`. +> +> --- +> > ✅ **НОВОЕ (21-я волна) — блок `Pushnoy.ru`/`Александр Пушной` + `Infected Mushroom`:** > - `Pushnoy-ru_` в title — это НЕ сайт-вода, а **префикс-пространство имён файлов** (транслит > имени файла); артист везде `Александр Пушной`. `Pushnoy.ru`/`Pushnoy-ru` в `cur_artist`