[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 18:07:04 +06:00
1 parent 23b4acc8cc
commit 23a5da004b
2 files changed
+245 -3

No files matched your search

@@ -4,7 +4,7 @@ created: '2026-09-27'
updated: '2026-09-27'
type: plan
namespace: personal
status: session18-dop-diff-inventoried-folders-counted-awaiting-apply-go
status: session18-dop-diff-inventoried-folders-counted-genre-origin-found-awaiting-apply-go
tags:
- music
- metadata
@@ -24,8 +24,16 @@ related:
## 🟣 СЕССИЯ 18-ДОП (2026-09-27, вечер) — ИНВЕНТАРЬ ДИФФА ПО ФАКТУ, ПОСЛЕ ВОПРОСА ALEX «ГДЕ ДИФ?»
> **Триггер:** Alex — «**Где диф последний с 371 правкой альбомов/albumartist который ты готовил?**»
> → затем «**Какие там записи?**». Отвечено из **Zulip DB** (по скиллу `zulip-db-forensics`),
> затем проверено по самим файлам на диске.
> → «**Какие там записи?**» → «**Все папки**» → «**С количеством файлов**» →
> «**Откуда там 7963 правки?**» → «**Откуда там правка жанра то??**» →
> «**Ты только что блядь сказал что в диффе 306 сука файлов! Какие нахуй 4359?!**».
> Отвечено из **Zulip DB** (по скиллу `zulip-db-forensics`), затем проверено по самим файлам на диске.
>
> **Два новых факта сессии (см. разделы ниже):**
> 1. **GENRE в плане — колонки в волне 38 НЕ БЫЛО вообще** → все 4359 = первая запись тега (ср. D3).
> Генератора `new_genre` на диске нет — только `fix_apply_plan.py` (1 правка мусора).
> 2. **306 в диффе НЕТ — 0 ячеек** (literal search). Дифф держит те же скобки как **15 записей**
> (схлопывание D16). Моё изложение склеило 306 (счётный файл) и дифф в одну фразу — дефект изложения.
### 📍 Местонахождение (факт с диска, mtime 2026-09-27 17:41)
@@ -158,6 +166,104 @@ ANY field differing 7651
> план — «что реально отличается от целевого». **Две разные базы счёта** (ср. §Число 371 ≠ строки диффа).
> Проверочный скрипт: `/tmp/explain_genre.py`.
### 🔴 ОТКУДА ВЗЯЛСЯ GENRE В ПЛАНЕ — КОЛОНКИ В ВОЛНЕ 38 НЕ БЫЛО ВООБЩЕ
Alex: «**Откуда там правка жанра то??**» → затем «**Откуда там 7963 правки?**»
**Факт — заголовки двух планов (`csv.DictReader`):**
```
tag-fix-plan.csv (волна 38):
path, current_verdict, cur_title, cur_artist, cur_album,
new_title, new_artist, new_album, new_track, action, source
↑ genre ОТСУТСТВУЕТ
APPLY-PLAN.csv (текущий, 16 колонок):
path, folder, class, cur_title, cur_artist, cur_albumartist, cur_album,
cur_genre, cur_track, new_title, new_artist, new_albumartist, new_album,
new_genre, new_track, changed ← genre ПОЯВИЛСЯ
```
**Следствие (ср. D3):** жанр не писался ни разу за всю историю волн. Любое непустое
`new_genre` в текущем плане = **первая запись тега**. Это и есть все `4359`.
**Состав — 137 пар `cur_genre → new_genre`, три класса:**
| файлов | было | стало | класс |
|---:|---|---|---|
| 1136 | *пусто* | `Rock` | заполнение (правило «жанр по артисту/папке», ср. G4) |
| 439 | *пусто* | `Pop` | заполнение |
| 322 | *пусто* | `Детские` | заполнение |
| 252 | *пусто* | `Бардовская песня` | заполнение |
| 237 | *пусто* | `Сказки` | заполнение |
| 182 | `Рок` | `Rock` | нормализация |
| 177 | *пусто* | `Chanson` | заполнение |
| 101 | *пусто* | `Dark Cabaret` | заполнение |
| 94 | `Other` | `Pop` | разрешение по артисту (G3) |
| 82 | `Punk Rock` | `Punk` | нормализация |
| 52 | `Metal` | `Heavy Metal` | нормализация |
| 41 | `Psy Årance` | `Psy-Trance` | омоглиф (G2) |
| 32 | `(17)` | `Rock` | 🔴 **поле прочитано неверно** — `(17)` стоял на 32 файлах ДДТ |
| 30 | `Psy Еrance` | `Psy-Trance` | омоглиф (G2) |
| 23 | `Dance/Club` | `Dance` | нормализация |
| 22 | `Разное` | `Бардовская песня` | 🔴 поле прочитано неверно (Высоцкий) |
| 22 | `Детская Музыка` | `Rock` | нормализация |
| 16 | `Поп` | `Pop` | нормализация |
**Кто правил `new_genre` в самом плане:** `~/Downloads/music-tags/fix_apply_plan.py` (mtime 13:13)
содержит ровно **одну** genre-правку — мусор `яюElectronic` → `Electronic` (JUNK_FIX), плюс
пересчёт `changed`. 🔴 **Генератора, который построил `new_genre`, на месте НЕТ** — `fix_apply_plan.py`
правит уже готовый план, а не строит его. Скрипт-строитель отсутствует в
`~/Downloads/music-tags/*.py`.
> 🔑 **МЕТОД-УРОК:** прежде чем объяснять «откуда правка», **сравнивать ЗАГОЛОВКИ обеих версий
> плана**. Отсутствие колонки в предыдущей версии объясняет весь объём поля одним фактом —
> и это надёжнее любых рассуждений о логике заполнения. Проверочный скрипт: `/tmp/where_genre.py`,
> `/tmp/genre_origin.py`.
### 🔴 306 В ДИФФЕ НЕТ — ПРОВЕРЕНО ПО ЯЧЕЙКАМ (ответ на «Какие нахуй 4359?»)
Alex: «**Ты только что блядь сказал что в диффе 306 сука файлов! Какие нахуй 4359?!**»
**Он прав: 306 в диффе не существует.** Проверено скриптом `/tmp/find_306.py` по всем ячейкам:
```
DIFF-new-vs-38-v2.csv
строк всего 2854
album-строк 164
из них old_38 в скобках 15 (12 ПАПКА + 3 ТРЕК)
ячеек, содержащих "306" 0 ← literal search по всем колонкам
```
**Где стоят эти 15 строк (схлопывание D16: одна запись папки = N файлов):**
| scope | old_38 | new_apply_plan |
|---|---|---|
| ПАПКА | `(2001) Infected Mushroom - S Is Here (Yahel Mix)` | `S Is Here (Yahel Mix)` |
| ПАПКА | `(Авария)` | `Москва пьёт пиво` |
| ПАПКА | `(Авария)` | `Старые хиты` |
| ПАПКА | `(zvezda)` | `zvezda` |
| ПАПКА | `(Несчастный Случай)` | `Несчастный Случай` |
| ПАПКА | `(Блатные)` | `Блатные` |
| ПАПКА | `(Из Сказок)` | `Из Сказок` |
| ПАПКА | `(Морские)` | `Морские` |
| ПАПКА | `(Высоцкий - Разное)` | `Разное` |
| ПАПКА | `(Спортивные)` | `Спортивные` |
| ПАПКА | `(Философские)` | `Философские` |
| ПАПКА | `(Вилли Токарев)` | `Вилли Токарев` |
| ТРЕК | `(2001) Infected Mushroom - Wider (Domestic RMX)` | `Wider (Domestic RMX)` |
| ТРЕК | `(2004) Infected Mushroom - Shakawkaw (Vibe Tribe Rmx)` | `Shakawkaw (Vibe Tribe Rmx)` |
| ТРЕК | `(2009) Infected Mushroom - Bust a Move (Infected Remix)` | `Bust a Move (Infected Remix)` |
`distinct paths` в этих строках — **4** (три IM-файла + пустой path у ПАПКА-строк).
> 🔴 **ПРАВИЛО ИЗЛОЖЕНИЯ (мой дефект, не дефект данных):** я произнёс «306» и «дифф»
> **в одном ответе**, хотя 306 — счётный файл `ALBUM-FIX-306.csv` (построчный список путей),
> а дифф схлопнул те же 306 в **15 записей**. Alex прочитал это как подмену числа.
> **Отвечая про дифф — называть ТОЛЬКО числа диффа (2854 / 2768 / 164).**
> Числа из `ALBUM-FIX-*.csv` давать отдельным абзацем с явной пометкой «это счётный файл,
> не дифф». Никогда не склеивать два артефакта в одну фразу.
### 🧾 Список удаления скобок — ГДЕ ЛЕЖИТ (ответ на «Где список с удалением скобок»)
Alex: «**Где список который ты готовил с удалением скобок**»