[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/id3-tag-repair.md
This commit is contained in:
1 parent
981a59781e
commit
6576b53834
2 files changed
+217
-23
No files matched your search
@@ -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) идут после правок и выглядят как сломанный хвост файла.
|
||||
|
||||
Reference in new issue
Block a user