From 3a7955cb3681bc88f1c3cfa1f871052e99e98c60 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 27 Sep 2026 17:31:36 +0600 Subject: [PATCH] [2026-09-27] eagle: family/how-to/navidrome-truenas-android.md personal/plans/music-artist-albumartist-repair.md --- family/how-to/navidrome-truenas-android.md | 17 ++- .../plans/music-artist-albumartist-repair.md | 107 +++++++++++++++--- 2 files changed, 108 insertions(+), 16 deletions(-) diff --git a/family/how-to/navidrome-truenas-android.md b/family/how-to/navidrome-truenas-android.md index a6047244..ba89b406 100755 --- a/family/how-to/navidrome-truenas-android.md +++ b/family/how-to/navidrome-truenas-android.md @@ -396,9 +396,20 @@ artist=Maria Makarova (organ) ← исполнитель вмес `~/Downloads/music-tags/REPORT-new-album-equals-cur.csv` (6202 строки) + `REPORT-album-kept-all-folders.csv` (558 папок с классификацией kind). **Уточнено: реальный мусор — 9 папок / 265 треков** (только значения-огрызки в скобках). -- [ ] 🔴 **БЛОКЕР: решение Alex по правке `album` для 9 папок** — какой `album` ставить - (имя папки / реальный альбом из источника). Полный разбор — - [[personal/plans/music-artist-albumartist-repair]] §СЕССИЯ 18. +- [x] ~~Решение Alex по правке `album` для мусорных папок~~ → ✅ **ПРАВИЛА ПОЛУЧЕНЫ 2026-09-27**: + - файл в **корне папки артиста** → `album` = имя папки артиста (`Дискотека Авария`) + - файл в **подпапке-альбоме** → `album` = имя подпапки (`Москва пьёт пиво`) + - **папка-сборник** (`!Retro`, `!Radio`) → `album='Retro'`, `albumartist='Various Artists'` + - правило корня подтверждено из Zulip (сообщение 128410): «то что в корне лежит мы считаем + одним альбомом». **Атрибуты и скобочный мусор разобраны — 306 строк.** + - ⚠️ **Открыто:** расхождение «убрать скобки» vs «имя подпапки» на 3 папках + (`Филосовские`, `Разное`, `Из сказок`) — ждёт ответа Alex. + Разбор — [[personal/plans/music-artist-albumartist-repair]] §СЕССИЯ 18. +- [ ] 🔴 **Сгенерировать НОВЫЙ дифф** со всеми 306 строками `album` внутри. + **Старый `DIFF-new-vs-38.csv` НЕ трогать** (прямое указание Alex). +- [ ] 🔴 **Валидатор смысла `new_album`** — паттерн «значение целиком в скобках» `^\(.+\)$`, + заглушки (`нет альбома`, `NULL`, `no title`, `Non spécifié`), спам-URL. В пайплайне ОТСУТСТВУЕТ: + это и есть причина дефекта (дифф двух планов мусор не ловит — он стоит в обоих). - [ ] ⚠️ **Проверить, не проиндексировались ли бэкап-папки** (8043 трека vs 7861 на диске, т.е. +182) — запрос к БД Navidrome. ⚠️ **Скан завершён, проверка НЕ выполнена.** `.ndignore` создан ПОСЛЕ первого скана → нужен рескан или проверка БД. diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index 1957285a..0c1b170b 100755 --- a/personal/plans/music-artist-albumartist-repair.md +++ b/personal/plans/music-artist-albumartist-repair.md @@ -19,15 +19,18 @@ related: - '[[personal/tech/music-tags-repair-truenas]]' - '[[personal/plans/tagwriter-container]]' - '[[family/how-to/navidrome-truenas-android]]' -status: session18-navidrome-deployed-album-kept-defect-open +status: session18-navidrome-deployed-album-rules-recovered # Music `artist` + `albumartist` Repair — правила Alex и ход работ -## 🟣 СЕССИЯ 18 (2026-09-27) — NAVIDROME РАЗВЁРНУТ, ВСКРЫТ ДЕФЕКТ-КЛАСС «ОСТАВЛЕНО КАК ЕСТЬ» +## 🟣 СЕССИЯ 18 (2026-09-27) — NAVIDROME РАЗВЁРНУТ, ДЕФЕКТ-КЛАСС ВСКРЫТ, ПРАВИЛА ВОССТАНОВЛЕНЫ ИЗ ZULIP > **СТАТУС СЕССИИ 18:** Navidrome ✅ развёрнут и работает (см. ниже + `[[family/how-to/navidrome-truenas-android]]`). -> Вскрыт дефект-класс `new_album == cur_album` (6202 строки, 79%). Уточнён масштаб реального мусора: -> **9 папок / 265 треков** (не 28 папок). **Решение о правке `album` НЕ принято — ждёт Alex.** -> Артефакты: `REPORT-new-album-equals-cur.csv`, `REPORT-album-kept-all-folders.csv`. +> Вскрыт дефект-класс `new_album == cur_album` (6202 строки, 79%). Масштаб реального мусора: +> **9 папок / 265 треков** (не 28 папок). **Правила `album` восстановлены из базы Zulip** +> (см. §ПРАВИЛА ВОССТАНОВЛЕНЫ). **Финальные решения по 306 строкам приняты.** +> ⚠️ Один открытый вопрос — расхождение двух правил на 3 папках Высоцкого (ждёт Alex). +> Артефакты: `REPORT-new-album-equals-cur.csv`, `REPORT-album-kept-all-folders.csv`, `ALBUM-FIX-TABLE.csv`. +> **Дальше: генерация НОВОГО диффа (старый `DIFF-new-vs-38.csv` НЕ трогать).** > **Контекст:** Navidrome поднят и просканировал библиотеку (8043 трека). Alex открыл UI и > спросил: «**Откуда альбомы в скобках взялись?** Типа `Дискотека Авария` — для корня, @@ -246,16 +249,94 @@ Alex: «**Чем тебе не угодили те которые не в ско > **Правило: мусор определяется по паттерну «значение целиком в скобках», а не по «странности» > названия. Отсутствие скобок = значение легитимно.** -### ⏭ Что нужно решить (ждёт Alex) +### 🔴 ПРАВИЛА `album` ВОССТАНОВЛЕНЫ ИЗ БАЗЫ ZULIP (решающий шаг сессии) -1. **Валидатор смысла `new_album`** — паттерны: огрызок в скобках `^\(.+\)$`, заглушки +Alex: «**Читай базу зулип как мы его делали и новый дифф готовь чтобы там эта хуйня была +исправлена. Старый диф не трогай.**» → запрос в `zulip-database-1` восстановил правила. + +> 🔑 **МЕТОД-УРОК:** правила работы с `album` **обсуждались в Zulip и нигде больше** — ни в скилле, +> ни в доке, ни в комментариях скрипта. Первым шагом надо было идти в Zulip DB, а не +> переспрашивать Alex. **Запрос:** `zerver_message` + `zerver_stream`, фильтр +> `up.full_name='Alex'` + диапазон `date_sent`. Ключевые сообщения: **127513–127593, 128410.** + +**Правило КОРНЯ папки артиста (сообщение 128410, дословно):** +> «**Муммий Тролль, Агата, Ария, Rammstein, Жуки, Князь, Benassi, банд эрос — то что в корне +> лежит мы считаем одним альбомом. и albumartist соответственно титульного исполнителя ставим. +> не надо ничего cur брать! редактируешь блядь csv!**» + +**Формат `!Radio` — «Категория - Подпапка» (127513–127507):** +``` +y OOF → Radio - OOF +z Старое → Radio - Старое +1 DRIVE / 2 ALT,PUNK / 5 POPSA → Radio - DRIVE / Radio - ALT,PUNK / Radio - POPSA +2009-04 → 2009-04 Radio (год-месяц вперёд) +2008-07, 2008-04 → + Radio +t 2009-07 c6Or_NICK → 2009-07 c6Or_NICK (без "!Radio") +s 2009-08 Drinkin Summer → 2009-08 Drinkin Summer +``` + +**Категории целиком (127523):** +``` +!ZabuGor → "Pop - ZabuGor" +!Retro → "Retro" +Забугр → "Retro - Забугор" +``` + +**`misc`/`base`/`plux` — имя ПОДпапки, НЕ родителя (127436, 127489):** +``` +Rammstein/misc → album = "Rammstein - misc" (НЕ "Rammstein"! — отдельная правка) +base/plux/pan → не надо, пусть будет родительский альбом +!rock_o_pop → убрать "!" +!Классика → убрать "!" +``` + +### ✅ ФИНАЛЬНЫЕ РЕШЕНИЯ ПО 306 СТРОКАМ (Alex, конец сессии) + +| Случай | Правило | +|---|---| +| Файл в **корне папки артиста** | `album` = **имя папки артиста** (`Дискотека Авария` вместо `(Авария)`) | +| Файл в **подпапке-альбоме** | `album` = **имя подпапки** (`Москва пьёт пиво`, `Старые хиты`) | +| **Папка-сборник** (`!Retro`, `!Radio`) | общее правило сборника: `album='Retro'`, `albumartist='Various Artists'` | +| `Птаха - Красивые, богатые (2009)` | имя папки как альбом — ОК | + +> 🔴 **Скобочный мусор в подпапках (`(Авария)` в `Москва пьёт пиво`/`Старые хиты`) — это мусор +> ПОВЕРХ правильного имени подпапки. Ставить имя подпапки, а не снятые скобки (`Авария`).** + +### ⚠️ ОТКРЫТЫЙ ВОПРОС (единственный, ждёт ответа Alex) + +Расхождение между двумя правилами — «убрать скобки» vs «имя подпапки» — **на 3 папках**: + +| Папка | A: скобки убрать | B: имя подпапки | файлов | +|---|---|---|---:| +| `Владимир Высоцкий/Филосовские` | `Философские` | `Филосовские` (опечатка в имени!) | 97 | +| `Владимир Высоцкий/Разное` | `Высоцкий - Разное` | `Разное` | 44 | +| `Владимир Высоцкий/Из сказок` | `Из Сказок` | `Из сказок` (нижний регистр) | 16 | + +**Совпадают (расхождения нет):** `Блатные`, `Морские`, `Спортивные`. + +### ✅ Артефакты сессии 18 + +| Файл | Что | +|---|---| +| `~/Downloads/music-tags/REPORT-new-album-equals-cur.csv` | **6202 строки**: `folder, album_kept, count, path, title, artist, albumartist, genre` | +| `~/Downloads/music-tags/REPORT-album-kept-all-folders.csv` | 558 папок: `kind, folder, files, unique_albums, values` | +| `~/Downloads/music-tags/ALBUM-FIX-TABLE.csv` | 306 строк: `folder, cur_album, new_album, path, title` (черновик, до финальных правил) | +| `/tmp/report_kept_album.py` | группировка папка → значение → count | +| `/tmp/report_all_junk_folders.py` | классификация папок (МУСОР/СМЕШАННАЯ/OK) | +| `/tmp/check_diff_coverage.py` | проверка покрытия дефекта диффом (7,6%) | +| `/tmp/where_avaria.py` | где физически лежат файлы `(Авария)` | +| `/tmp/album_rules_v2.py` | применение финальных правил (КОРЕНЬ/ПОДПАПКА/СБОРНИК) | + +### ⏭ Что осталось + +1. 🔴 **Ждёт Alex:** ответ по 3 папкам (A или B выше). +2. **Сгенерировать НОВЫЙ дифф** со всеми 306 строками `album` внутри. **Старый + `DIFF-new-vs-38.csv` НЕ трогать** (прямое указание Alex). +3. **Валидатор смысла `new_album`** — паттерны: огрызок в скобках `^\\(.+\\)$`, заглушки (`нет альбома`, `NULL`, `no title`, `Album`, `Non spécifié`), спам-URL. **В пайплайне его нет.** -2. Для «скобочных» папок — какой `album` ставить: реальное название из внешнего источника, - имя подпапки, или имя папки артиста. **Кандидат-правило:** `album` = имя папки - минус год; для `misc`/`disk`/`base`/`plux` — имя ПОДпапки; для корня артиста — имя папки. -3. Регистровые дубли (`Четверо Парней`/`Четверо парней`, `Бунт на Корабле`) — канонизация. -4. 🔴 **Правило «на всю папку», которого не хватало:** `album` решать на уровне ПАПКИ, - не построчно. Построчное наследование `cur_album` — корень дефекта. +4. Регистровые дубли (`Четверо Парней`/`Четверо парней`, `Бунт на Корабле`) — канонизация. +5. 🔴 **Правило «на всю папку»:** `album` решать на уровне ПАПКИ, не построчно. + Построчное наследование `cur_album` — корень дефекта. ---