[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/id3-tag-repair.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 14:44:35 +06:00
1 parent 981a59781e
commit 6576b53834
2 files changed
+217 -23

No files matched your search

+83 -1
View File
@@ -34,6 +34,11 @@ related:
> и `file_lines` в один список, `field` первым + `scope` вторым; правка `key=` в двух
> раздельных циклах бесполезна); **D11** (`new_track` теряется при пустом `cur_track`);
> **D12** (`new_track` «ни к чему не привязан» → сдвинутый ряд пересчитать, иначе убрать).
>
> ⚠️ **Обновлён до v1.7.0 (сессия 13):** **D12 ОТКАЧЕН** — см. **D12-R** ниже (сквозная
> нумерация многодисковых изданий НЕ трогать). Добавлены **D13** (жанр унаследован от
> `cur_genre` без проверки), **D14** (статус «привязан/сирота» для `track`), **D15** (поиск
> по бэкапам: фильтр `.csv` отсекает `APPLY-PLAN.csv.bak-*`).
## 📁 Артефакты проекта
@@ -429,7 +434,8 @@ lost = [r for r in rows if r["field"] == "track"
Если `old_38` было числом, а `new_apply_plan` пусто — это **потеря**, а не правка.
Восстановление: перенести значение из `old_38` (`/tmp/restore_lost_track.py`).
### 🔴 D12 — `new_track` «ни к чему не привязан» → пересчитать или убрать
### 🔴 D12 — ~~`new_track` «ни к чему не привязан» → пересчитать или убрать~~
> ## ⛔ ОТКАЧЕНО в сессии 13 — НЕ ПРИМЕНЯТЬ. См. **D12-R** ниже.
Правило Alex (сессия 12):
> «если там есть порядковый номер в альбоме — то ты его оставляешь»
@@ -464,6 +470,82 @@ lost = [r for r in rows if r["field"] == "track"
`/tmp/restore_lost_track.py`, `/tmp/audit_track_seq.py`, `/tmp/classify_track.py`.
См. `personal/plans/music-artist-albumartist-repair.md` § «🟢 СЕССИЯ 12».
### 🔴 D12-R — СКВОЗНАЯ нумерация многодисковых изданий НЕ ТРОГАТЬ (сессия 13)
**Класс A из D12 был дефектом и откачен.** Сброс `14..26 → 1..13` в
`!Детские/Сказки/Алиса в Стране Чудес (Диск2)` **уничтожал верный сквозной номер трека**
многодискового издания. Alex: «ты нахуя сквозную нумерацию двухдисковую — ВЕРНУЮ БЛЯДЬ
В 38 csv — сбросил блядь??»
**Правило:** папка с суффиксом `(Диск2)` / `CD2` / `Disc 2` / `_2` и рядом последовательных
номеров, продолжающих предыдущий диск → **нумерация сквозная, оставлять как есть**.
Издания, найденные в библиотеке (эталон для проверки):
`Алиса в Стране Чудес (Диск2)` 14..26 · `Трое из Простоквашино (Диск 2)` 10..20 ·
`Принц и нищий (Диск 2)` 8..14 · `Малыш и Карлсон (Диск 2)` 4..6 ·
`Остров сокровищ (Диск 2)` 5..6 · `Али-Баба и сорок разбойников_2` 8..14 ·
`Final Fantasy VI - Balance and Ruin/MP3/Disc 2..5` (18..34 / 35..50 / 51..60 / 61..74) ·
`Rammstein/1999 Live Aus Berlin CD2` 13..18 · `Би-2/Нечетный Воин/2005 .../CD1,CD2` ·
`Неголубой огонёк НГ 2004/CD1,CD2`.
**Осталось в силе из D12 (не откачено):** критерий «номер ни к чему не привязан» относится
к **подборкам** (`!Radio/*`, `!Retro`), а не к дискам альбомов. Класс B (1107 строк) —
**не применялся**, применять только после явного правила Alex.
Откат: `/tmp/rollback_track_fix.py`, источник `APPLY-PLAN.csv.bak-trackfix-20260927-143611`
(этот бэкап — **состояние ДО дефекта**, не удалять).
### 🔴 D13 — жанр унаследован от `cur_genre` без проверки принадлежности (сессия 13)
План копирует `cur_genre` через свой словарь и **не проверяет, относится ли жанр к этому
артисту/альбому**. Из-за этого всплывают абсурды. Все 26 найденных строк имели `cur_genre`,
совпадающий с мусорным `new_genre` — значение **не выдумано планом**, оно было в теге.
| Было (`cur_genre`) | Стало | Строк | Где |
|---|---|---|---|
| `Детская Музыка` | `Детские` → **`Rock`** | 20+1 | `!Rock&Folk/Несчастный Случай/День радио` (весь альбом), `!Retro/Несчастный случай - Радио (как бы).mp3` |
| `Psychedelic Rock` / `Psychedelic` | → **`Rock`** | 1+1 | `!Retro/Колибри - Желтый лист осенний.mp3`, `!Rock&Folk/Агата Кристи/Триллер(Радио).mp3` |
| `Folk` | → **`Electronic`** | 3 | `IM/Unreleased/Other/IM - Other Track's` |
| `Blues` | → **`Electronic`** | 1 | `IM Vs. The Prodigy - Supervized Firestarter` |
**Не трогать:** 51 строка `Psychedelic` у Infected Mushroom — верный жанр (IM = психоделик-транс).
Там же план **исправляет** опечатку `Psychadelic` → `Psychedelic` — это плюс.
**Метод детекции:** `collections.Counter(new_genre)` по артисту/папке + вывод `cur_genre` рядом.
Подозрительно: жанр, встречающийся у одного файла из сотни (`Детские` 1 из 231 в `!Retro`),
или жанр, несовместимый с артистом.
Скрипты: `/tmp/check_neschast.py`, `check_denradio.py`, `check_kolibri.py`, `check_folk.py`,
`check_imfolio_all.py`, `check_im_blues.py` + фиксеры `fix_nesg.py`, `fix_denradio.py`,
`fix_psy.py`, `fix_imfolk.py`, `fix_imblues.py`.
### 🔴 D14 — статус `track`: «привязан» vs «сирота» (сессия 13)
Для оценки объёма правок `track` папки делятся по критерию: **полный ли ряд `1..N`**.
- **привязан** — `sorted(nums) == range(1, len(nums)+1)` → 371 папка, номер рабочий, не трогать;
- **сирота** — иначе → 1907 строк в 184 папках.
⚠️ «Сирота» **не равно** «надо чистить»: сироты = подборки `!Radio/*`, `!Retro`, `Sbornik_Novij_Rok`
(там номер = порядковый номер в сборнике, напр. `023_Бумбокс`). Судьба сирот — **вопрос к Alex**,
автоочистка запрещена.
Скрипт: `/tmp/classify_track.py`.
### 🔴 D15 — поиск по бэкапам: фильтр `.csv` отсекает `APPLY-PLAN.csv.bak-*` (сессия 13)
`glob(f"{B}/APPLY-PLAN.csv*")` + условие `p.endswith(".csv")` **выбрасывает все бэкапы**,
потому что имя `APPLY-PLAN.csv.bak-before-radiofix-20260927-140315` заканчивается на дату,
а не на `.csv`. Первый прогон дал «файлов: 1» вместо 45, и я построил вывод на неполных данных.
**Правильно:** фильтровать по началу имени или не фильтровать расширение, а проверять
наличие колонки (`"new_album" in rows[0]`). Скрипт `/tmp/find_benassi2.py` (рабочая версия)
и `/tmp/compare_backups_album.py`.
**Питфолл восприятия:** в диффе `old_38 = ''` означает «в 38-м прогоне поле было пустым»,
а **не** «значение потеряно». Alex увидел `'' -> 'КняZz'`, прочитал как «альбом слетел» и
потребовал откат. Отчёт нужно подавать так, чтобы `''` не читалось как потеря — например
`<пусто в 38-м> -> 'КняZz'`.
### 🔴 D10 — секции полноты в хвосте диффа читаются как мусор
`НЕТ-В-38` (41) + `ТОЛЬКО-В-38` (85) идут после правок и выглядят как сломанный хвост файла.