[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md
This commit is contained in:
1 parent
e0e395dfcf
commit
36e127dca4
2 files changed
+207
-24
No files matched your search
@@ -4,7 +4,7 @@ created: '2026-09-27'
|
||||
updated: '2026-09-27'
|
||||
type: plan
|
||||
namespace: personal
|
||||
status: ДИФФ-ОТ-БД-СОБРАН / ПРОГОН-v5-ЖДЁТ-АЛЕКСА / 215-ОДИНОЧЕК-ОТКРЫТО
|
||||
status: ДИФФ-ОТ-БД-СВЕРЕН / ПРОГОН-v5-НЕ-ЗАПУСКАТЬ-БЕЗ-ПОДТВЕРЖДЕНИЯ / 56-ОДИНОЧЕК-ОТКРЫТО
|
||||
tags:
|
||||
- music
|
||||
- metadata
|
||||
@@ -35,22 +35,37 @@ related:
|
||||
**Что делаем:** привести ID3-теги библиотеки `/mnt/RED_2TB/storage/Music` (7861 файл)
|
||||
в порядок, чтобы Navidrome показывал правильные альбомы/исполнителей/жанры.
|
||||
|
||||
**Главный артефакт на сейчас (27 сен, сессия ~35):**
|
||||
**Главный артефакт на сейчас (27 сен, сессия ~36):**
|
||||
|
||||
```
|
||||
⚠️ ДИФФ ПЕРЕСОБРАН ОТ БАЗЫ (v3 был собран от КАНОНА — НЕВЕРНЫЙ ИСТОЧНИК!)
|
||||
⚠️ ДИФФ ОТ БАЗЫ ГОТОВ, СВЕРЕН С ПЛАНОМ. ПРОГОН НЕ ЗАПУСКАТЬ БЕЗ ПОДТВЕРЖДЕНИЯ ALEX.
|
||||
|
||||
ДИФФ: ~/Downloads/music-tags/DIFF-db-to-fix.csv
|
||||
91 строка (ПАПКА 26 · ТРЕК 65) — схлопнуто из 429 правок
|
||||
16 857 B · 92 строки с заголовком = 91 ЗАПИСЬ (ПАПКА 26 · ТРЕК 65)
|
||||
md5 a5f2b910826dcc46474b6e26513f414f
|
||||
по полям: album 6 · albumartist 11 · artist 16 · track 58
|
||||
⚠️ СЧЁТ: 91 запись ≠ 92 строки файла (заголовок) и ≠ 87
|
||||
(2 файла с ДВОЙНОЙ правкой: Тема дороги album+artist,
|
||||
Птаха album в одну сторону)
|
||||
сортировка: по АЛФАВИТУ field (album → albumartist → artist → track)
|
||||
источник цели: БД Navidrome (то, что РЕАЛЬНО в тегах), НЕ канон
|
||||
План: ~/Downloads/music-tags/apply-plan-v5.csv (7861 строка)
|
||||
План: ~/Downloads/music-tags/apply-plan-v5.csv (7861 строка, md5 d4392b11f143844c590a0a9c4a752208)
|
||||
меняется 159 файлов · без изменений 7702
|
||||
по полям: albumartist 157 · artist 154 · album 60 · track 58 · title 0 · genre 0
|
||||
Сборщик: ~/Downloads/music-tags/build_diff_from_db.py
|
||||
Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (7861 строка — эталон ручных правок, НЕ ПЕРЕЗАПИСЫВАТЬ)
|
||||
Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (2 882 935 B — эталон ручных правок, НЕ ПЕРЕЗАПИСЫВАТЬ)
|
||||
```
|
||||
|
||||
⚠️ **Сборщики диффа/плана писать СРАЗУ в `~/Downloads/music-tags/`, НЕ в `/tmp`.**
|
||||
Alex: «какого хуя он в тмп» — артефакт в `/tmp` он не находит.
|
||||
✅ **СВЕРКА ДИФФ ↔ ПЛАН (27 сен, сессия ~36) — СХОДИТСЯ.** Скрипт
|
||||
`~/Downloads/music-tags/verify_v5_vs_diff.py`. Кажущееся расхождение (`albumartist` 11 в дифе
|
||||
против 157 в плане) — **единица счёта**: дифф хранит ПАПКУ (11 папок Трофима × 14 файлов = 154),
|
||||
план — ФАЙЛЫ. Итог по всем полям 1:1:
|
||||
```
|
||||
albumartist 11 ПАПКА-строк → 157 файлов ✅
|
||||
artist 16 записей → 154 файла ✅ (11 ПАПКА + 4 ТРЕК-фита + Ленинград)
|
||||
album 6 записей → 60 файлов ✅ (4 папки Трофима + Птаха + Ленинград)
|
||||
track 58 записей → 58 файлов ✅
|
||||
```
|
||||
|
||||
🔴 **ГЛАВНЫЙ УРОК СЕССИИ ~35: ДИФФ СТРОИТЬ ОТ БД, А НЕ ОТ КАНОНА.**
|
||||
Первый дифф v4 был собран от `APPLY-PLAN.csv` (канон) — и **не содержал Птаху**,
|
||||
@@ -59,14 +74,21 @@ Alex: «какого хуя он в тмп» — артефакт в `/tmp` он
|
||||
Правило: источник истины = `media_file` из `navidrome.db`, канон — только эталон
|
||||
ручных решений. Подробно → § ДИФФ ОТ БАЗЫ.
|
||||
|
||||
**Состояние (27 сен, сессия ~35):** ✅ **БОЕВОЙ ПРОГОН v3 выполнен** (7653/7653 ok, err=0,
|
||||
**Состояние (27 сен, сессия ~36):** ✅ **БОЕВОЙ ПРОГОН v3 выполнен** (7653/7653 ok, err=0,
|
||||
`TCON` 4359, БД Navidrome пересоздана, скан 4m13s, импортировано 7861).
|
||||
✅ **50 дублей Трофима удалены с диска.** ⏳ **Прогон v5 НЕ сделан** — ждём решения Alex
|
||||
по 1 вопросу (§ ОТКРЫТЫЙ ВОПРОС).
|
||||
✅ **50 дублей Трофима удалены с диска.** ✅ **Дифф от БД сверен с планом v5 — 1:1.**
|
||||
⏳ **Прогон v5 НЕ сделан. ЗАПУСКАТЬ ТОЛЬКО ПО ПРЯМОМУ «go» ALEX** — дословно:
|
||||
«**без подтверждения никакого apply блядь**». Дифф и dry-run — можно без спроса.
|
||||
|
||||
**Порядок после ответа:** подтвердить диф `DIFF-db-to-fix.csv` → прогон v5 (`--apply`,
|
||||
план `apply-plan-v5.csv` подложить как `apply-plan.csv`) → верификация чтением →
|
||||
**пересоздать БД Navidrome** → приёмка Alex в UI.
|
||||
**Открыто перед прогоном (2 пункта):**
|
||||
1. 🔴 **`albumartist` для `rock_o_pop` / `Retro`** — `Various Artists` (как сейчас) или имя
|
||||
папки? Прямые указания Alex противоречат данным БД (см. § ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК).
|
||||
2. 🔴 **Однотрековые (56 папок) в план v5 не входят** — правило в `build_diff_from_db.py`
|
||||
не написано, сборщик знает только 3 хардкод-пути. Дособирать ли дифф по ним.
|
||||
|
||||
**Порядок после «go»:** план `apply-plan-v5.csv` подложить как `apply-plan.csv` → dry-run
|
||||
(`--dry-run`, сверить `count`/`err`) → прогон `--apply` → верификация чтением →
|
||||
**пересоздать БД Navidrome** → приёмка Alex в UI. Приёмка = **видно в UI**, не «я прочитал обратно».
|
||||
|
||||
```
|
||||
Navidrome БД: /mnt/RED_2TB/docker/navidrome/data/ ← БЕЗ storage/ (дока ранее врала)
|
||||
@@ -117,7 +139,11 @@ compose: /mnt/RED_2TB/docker/navidrome
|
||||
| 29 | 27 сен | 🔴 **ДИФФ v4 НЕВЕРЕН: собран от КАНОНА** — Птахи в нём нет, а дефект в базе есть | § ДИФФ ОТ БАЗЫ |
|
||||
| 30 | 27 сен | ✅ **ДИФФ ПЕРЕСОБРАН ОТ БД** — источник истины = `media_file`, 91 строка из 429 правок | `DIFF-db-to-fix.csv` |
|
||||
| 31 | 27 сен | 🔴 **ЛОЖНОЕ РАСХОЖДЕНИЕ ПО ЖАНРУ** — `media_file.genre` пуст у всех, жанр в `tags` jsonb | `build_diff_from_db.py` |
|
||||
| 32 | 27 сен | 🔴 **ДЕФЕКТ «АЛЬБОМЫ-ОДИНОЧКИ»** — 215 альбомов из 1 трека, где `album != имя папки` | § АЛЬБОМЫ-ОДИНОЧКИ |
|
||||
| 32 | 27 сен | 🔴 **ДЕФЕКТ «АЛЬБОМЫ-ОДИНОЧКИ»** — 215 (⚠️ ПОЗЖЕ УТОЧНЕНО: 56 папок) | § АЛЬБОМЫ-ОДИНОЧКИ |
|
||||
| 33 | 27 сен | ✅ **СВЕРКА ДИФФ↔ПЛАН v5** — 91 запись ↔ 159 файлов, по полям 1:1 | `verify_v5_vs_diff.py` |
|
||||
| 34 | 27 сен | 🔴 **ЦИФРА 215 НЕВЕРНА → 56 однотрековых папок**; `album == title` лишь у 11 | `diag_single_track.py` |
|
||||
| 35 | 27 сен | 🔴 **ПРАВИЛО ОДИНОЧЕК ОТ ALEX** — `album` = имя папки-владельца, `artist` СОХРАНИТЬ | §§ ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК |
|
||||
| 36 | 27 сен | 🔴 **ПРОГОН НЕ ЗАПУСКАТЬ БЕЗ ПОДТВЕРЖДЕНИЯ** — «без подтверждения никакого apply блядь» | § СТАРТ ЗДЕСЬ |
|
||||
|
||||
---
|
||||
|
||||
@@ -146,6 +172,36 @@ compose: /mnt/RED_2TB/docker/navidrome
|
||||
### 5. Категории-контейнеры срезаются
|
||||
`!Retro`, `!Rock&Folk`, `!Pop, Club, Любэ`, `!A Not sorted` — срезаются при разборе пути.
|
||||
|
||||
### 6. Однотрековая папка → `album` = имя папки-владельца (получено 27 сен, сессия ~36)
|
||||
Папка, где лежит **один** файл, а `album` указывает на чужой сборник-источник:
|
||||
`album` = **имя папки-владельца**, НЕ имя сборника.
|
||||
```
|
||||
!Rock&Folk/!rock_o_pop/*.mp3 album 'Бабло побеждает зло' → 'rock_o_pop'
|
||||
!Retro/*.mp3 album 'Супер ДискотЭка…' → 'Retro'
|
||||
9999 - Разное/Проекты/*.mp3 album 'Нечётный Воин 2' → 'Проекты'
|
||||
```
|
||||
🔴 **`artist` СОХРАНИТЬ** — это реальный исполнитель трека (Чайф, Би-2, Слот, Стрелки),
|
||||
НЕ имя папки. Прямое указание Alex: «artist нужно сохранить».
|
||||
🔴 **Для `9999 - Разное` `albumartist = 'Агата Кристи'`** — артист КАТЕГОРИИ, а не сборника.
|
||||
⚠️ Для `rock_o_pop` / `Retro` значение `albumartist` **не определено** (в БД `Various Artists`).
|
||||
|
||||
### 🔑 ЕДИНИЦА СЧЁТА — называть вслух (урок 27 сен, сессия ~36)
|
||||
Когда одно и то же изменение считают дифф/план/лог, числа НЕ совпадают by design:
|
||||
```
|
||||
дифф = ПАПКИ (схлопнуто) план = ФАЙЛЫ лог = ПОСТРОЧНО
|
||||
11 папок Трофима → 157 файлов
|
||||
6 записей album → 60 файлов
|
||||
```
|
||||
Alex читает расхождение как дефект. **Всегда писать единицу счёта** («91 ЗАПИСЬ»,
|
||||
не «91 строка»; «159 ФАЙЛОВ», не «159 правок»).
|
||||
|
||||
### 🔑 ЛОВУШКА «ФАЙЛ ЕСТЬ, НО СОДЕРЖИМОГО НЕ ВИДНО» (27 сен, сессия ~36)
|
||||
`read_file` вернул `{"status":"unchanged","dedup":true}` без содержимого — я повторил вызов
|
||||
и получил то же самое **дважды**. Файл был в порядке, но `cat` через терминал пришлось
|
||||
вызывать отдельно. **Правило: при `unchanged` НЕ повторять `read_file` — сразу читать
|
||||
содержимое другим способом.** Alex в этот момент трижды спросил «где дифф» → выродилось
|
||||
в конфликт. Причина была инструментальная, не содержательная.
|
||||
|
||||
---
|
||||
|
||||
## 🛠 КАК ЧТО ДЕЛАЕТСЯ
|
||||
@@ -277,22 +333,34 @@ backup_raw
|
||||
|
||||
### Рабочие (Mac)
|
||||
```
|
||||
~/Downloads/music-tags/APPLY-PLAN.csv канон/ЭТАЛОН, 7861 стр, md5 bc20f2a49e364ecd5ed57d9fc97bfbcb
|
||||
~/Downloads/music-tags/DIFF-canon-v4.csv 🔴 ТЕКУЩИЙ ДИФФ v4, 90 стр (ПАПКА 26 · ТРЕК 64)
|
||||
~/Downloads/music-tags/apply-plan-v4.csv 🔴 ТЕКУЩИЙ ПЛАН v4, 7861 стр
|
||||
~/Downloads/music-tags/APPLY-PLAN.csv канон/ЭТАЛОН, 2 882 935 B — НЕ ПЕРЕЗАПИСЫВАТЬ
|
||||
~/Downloads/music-tags/DIFF-db-to-fix.csv ⭐ ТЕКУЩИЙ ДИФФ, 91 запись (ПАПКА 26 · ТРЕК 65)
|
||||
md5 a5f2b910826dcc46474b6e26513f414f
|
||||
~/Downloads/music-tags/apply-plan-v5.csv ⭐ ТЕКУЩИЙ ПЛАН, 7861 стр, 159 файлов меняется
|
||||
md5 d4392b11f143844c590a0a9c4a752208
|
||||
~/Downloads/music-tags/build_diff_from_db.py ⭐ СБОРЩИК (от БД); 3 хардкод-пути, однотрековых НЕТ
|
||||
~/Downloads/music-tags/verify_v5_vs_diff.py сверка дифф↔план (единица счёта: папка vs файл)
|
||||
~/Downloads/music-tags/diag_single_track.py 🔑 однотрековые: 56 папок, album==title у 11
|
||||
~/Downloads/music-tags/sverka_4folders.py 🔑 4 папки Alex: rock_o_pop / Retro / 9999 - Разное
|
||||
~/Downloads/music-tags/DIFF-canon-v4.csv 🔴 УСТАРЕЛ (от канона), 90 стр
|
||||
~/Downloads/music-tags/apply-plan-v4.csv 🔴 УСТАРЕЛ (от канона)
|
||||
~/Downloads/music-tags/DIFF-canon-v4-changes.csv лог v4, 428 строк построчно
|
||||
~/Downloads/music-tags/DELETE-dup-trofim.csv 50 дублей Трофима (✅ уже удалены)
|
||||
~/Downloads/music-tags/build_diff_canon_v4.py сборщик диффа v4 (сортировка+схлопывание В КОДЕ)
|
||||
~/Downloads/music-tags/build_diff_canon_v4.py сборщик диффа v4 (от канона, устарел)
|
||||
~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv дифф v3 (устарел), 945 стр, md5 bdb20c6ae00e7dfab4da2f76653fe084
|
||||
~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог v3 (устарел), 31 стр
|
||||
~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог v3, 31 стр, md5 2c6d2f0bb1d732d7e3e70ef1b210e7d8
|
||||
~/Downloads/music-tags/REPORT-album-kept-all-folders.csv 559 стр (источник ошибочной цифры 215)
|
||||
~/Downloads/music-tags/tag-fix-plan.csv 38-я волна, 7905 стр
|
||||
~/Downloads/music-tags/ALBUM-FIX-306.csv скобочный прогон, 306 стр
|
||||
~/Downloads/navidrome-db/navidrome-merged.db БД Navidrome (старая локальная копия)
|
||||
~/Downloads/navidrome-db/navidrome-after-v3.db БД ПОСЛЕ прогона v3, 27586560 B — читать отсюда
|
||||
```
|
||||
⚠️ `/tmp`-копии: `DIFF-v3-to-v4.csv` (428 строк — ПЕРВЫЙ, несортированный/несхлопнутый, устарел),
|
||||
`apply-plan-v4.csv`. **Не путать: правильный дифф — `DIFF-canon-v4.csv` в папке проекта.**
|
||||
`apply-plan-v4.csv`. **Не путать: правильный дифф — `DIFF-db-to-fix.csv` в папке проекта.**
|
||||
Бэкап канона перед сборкой v4: `/tmp/APPLY-PLAN.csv.bak-before-v4`.
|
||||
Бэкап диффа перед сверкой: `DIFF-db-to-fix.csv.bak-20260927-234901` (md5 совпал с исходным).
|
||||
⚠️ **Сборщики диффа/плана писать СРАЗУ в `~/Downloads/music-tags/`, НЕ в `/tmp`.**
|
||||
Alex: «какого хуя он в тмп» — артефакт в `/tmp` он не находит.
|
||||
|
||||
### Скрипты
|
||||
```
|
||||
@@ -749,8 +817,67 @@ album='2000 и Одна Ночь' папка='!Retro' !Retro/Ари
|
||||
**Правильная цель для `Кавер-версии и пародии`:** `album='Кавер-версии и пародии'`
|
||||
для всех 24 файлов; `artist` сохранить реальных исполнителей (Чайф, Би-2, Слот, Стрелки).
|
||||
|
||||
⏳ **НЕ СДЕЛАНО:** разбор всех 215 — разделить на «мусор (чужой сборник)» /
|
||||
«законный сингл». Требует решения Alex.
|
||||
🔴 **УТОЧНЕНО 27 сен (сессия ~36) — ЦИФРА `215` НЕВЕРНА, ПРАВИЛЬНО `56`.**
|
||||
`215` было посчитано по СТРОКАМ отчёта, а не по ПАПКАМ. Точный пересчёт по
|
||||
`apply-plan-v5.csv`, скрипт `~/Downloads/music-tags/diag_single_track.py`:
|
||||
```
|
||||
папок всего 633 · ОДНОТРЕКОВЫХ 56 · многотрековых 577
|
||||
из 56: album == title (настоящий дефект) 11
|
||||
album != title 45
|
||||
album == имя папки 15
|
||||
однотрековых, которые меняет план v5 0
|
||||
по категориям: !Pop, Club, Любэ 35 · !Rock&Folk 10 · !A Not sorted 3 ·
|
||||
!Retro 3 · !Рэп 3 · !Барды 1 · !Детские 1
|
||||
```
|
||||
🔑 **ЕДИНИЦА СЧЁТА: считать ПАПКИ, а не строки отчёта.** Тот же класс ошибки,
|
||||
что `awk -F','` (дал 33 вместо 117) и `7496`/`7649` (номера строк в
|
||||
`manual_scan_out.txt`, не число правок).
|
||||
|
||||
### 🔴 ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК (получено 27 сен, сессия ~36)
|
||||
|
||||
Дословно: «**в `9999 - Разное` albumartist — Агата Кристи. в `rock_o_pop` — должен быть
|
||||
альбом `rock_o_pop`. в `Retro` — `Retro`. в `Ария, Кипелов` — угадай блядь какой альбом
|
||||
должен быть (и `albumartist`)**».
|
||||
|
||||
**→ `album` = имя ПАПКИ-ВЛАДЕЛЬЦА. `artist` СОХРАНИТЬ как есть** (прямое указание Alex:
|
||||
«artist нужно сохранить» — это реальный исполнитель трека, Чайф/Би-2/Слот).
|
||||
|
||||
⚠️ **Про `albumartist` правило НЕ выведено — открыто.** Прямые указания противоречат данным:
|
||||
- Alex: `9999 - Разное` → `albumartist = Агата Кристи` — **уже так** (24/9/12 файлов ✅),
|
||||
т.е. к Разному правило «albumartist = имя папки» НЕ применяется;
|
||||
- Alex: `rock_o_pop` / `Retro` → имя папки — но в БД там **`Various Artists` у 100%**
|
||||
(57/57 и 158/158), и раньше `Various Artists` поверх одного артиста признавался дефектом.
|
||||
|
||||
**Текущее состояние трёх папок (из плана v5, `~/Downloads/music-tags/sverka_4folders.py`):**
|
||||
```
|
||||
!Rock&Folk/!rock_o_pop 57 файлов | album == 'rock_o_pop' 33 | albumartist == '!rock_o_pop' 0
|
||||
| остальные 24 — чужой альбом ('МОЛОДЫЕ ВЕТРА' 5, 'В городе N' 2,
|
||||
'Соль' 2, 'Зе Бест' 2, 'Попса' 2, …); albumartist = VA 57
|
||||
!Retro 158 файлов | album == 'Retro' 112 | albumartist == '!Retro' 0
|
||||
| чужие: 'Просвистела' 5, 'Супер ДискотЭка Радио Рекорд' 4,
|
||||
'Опиум' 3, 'Улица любви' 2, 'Позорная звезда' 2, …; VA 158
|
||||
9999 - Разное/
|
||||
Кавер-версии и пародии 24 файлов | album == имени папки 10 | albumartist = 'Агата Кристи' 24 ✅
|
||||
| чужие: 'Танец на цыпочках' 2, 'Симпатии', 'Slot 1', 'Песок', …
|
||||
Неизданное 9 файлов | album == имени папки 5 | 'Агата Кристи' 9 ✅
|
||||
Проекты 12 файлов | album == имени папки 0 | 'Агата Кристи' 12 ✅
|
||||
(все чужие: 'Нечётный Воин 2' 3, '20-ая зима…' 3, …)
|
||||
```
|
||||
⚠️ `!Rock&Folk/Ария, Кипелов` из плана v5 **отсутствует** — правки по ней (3 записи album:
|
||||
`Вавилон` · `Герой асфальта` · `На грани` → `Ария, Кипелов`) ушли в
|
||||
`APPLY-PLAN-v3-changes.csv` и **уже применены** прогоном v3.
|
||||
|
||||
**Второй подтверждённый класс — 4 папки Трофима `01..04 Аристократия помойки`:** `album`
|
||||
несёт **префикс НОМЕРА ДИСКА**, а не мусор (Alex: «в 01..04 префикс — номер ДИСКА, а не
|
||||
мусор»). Правило то же: `album` = имя папки без префикса.
|
||||
|
||||
✅ **Правильная цель для `Кавер-версии и пародии`:** `album='Кавер-версии и пародии'`
|
||||
для всех 24 файлов; `artist` сохранить реальных исполнителей (Чайф, Би-2, Слот, Стрелки).
|
||||
|
||||
⏳ **НЕ СДЕЛАНО:** правило для однотрековых в `build_diff_from_db.py` НЕ написано —
|
||||
сейчас сборщик обрабатывает ровно 3 хардкод-пути (`!Рэп/Трофим/`, `!Рэп/Птаха…`,
|
||||
`Тема дороги.mp3`). Разбор 56 — разделить «мусор (чужой сборник)» / «законный сингл».
|
||||
Требует решения Alex по `albumartist`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user