diff --git a/family/how-to/navidrome-truenas-android.md b/family/how-to/navidrome-truenas-android.md index d89a3b0c..b679bf0e 100755 --- a/family/how-to/navidrome-truenas-android.md +++ b/family/how-to/navidrome-truenas-android.md @@ -78,9 +78,45 @@ Navidrome поднялся и просканировал **8043 трека**. П | `new_album == cur_album` (оставлено как есть) | **6202 из 7861 (79%)** | | Реальный скобочный мусор | **306 строк / 15 папок** | -**Итог:** 306 строк исправлены, сгенерирован новый дифф `DIFF-new-vs-38-v2.csv`. +**Итог:** 306 строк исправлены (скобочный мусор → 0), затем **ещё 58 строк по 3 дефектам** +(склейка артист+год, чужой `albumartist`, `album`=название песни) → сгенерирован новый дифф +`DIFF-new-vs-38-v2.csv` (⏭ устарел после правки 58 строк, требует перегенерации). Полный разбор — [[personal/plans/music-artist-albumartist-repair]] §СЕССИЯ 18. +## 🔴 УРОК: разброс значений в папке ≠ дефект (метод-урок сессии 18) + +При проверке «один ли `album`/`albumartist` в папке» получено **96 папок с разными `album` +и 7 с разным `albumartist`**. **Реальных дефектов — 2 папки**, остальное легитимно: + +| Что выглядит подозрительно | Почему это НОРМА | +|---|---| +| `!Retro`: `De Luxe collection`, `Опиум`, `Просвистела`, `Retro` | сборник, в нём реальные альбомы | +| `Пилот/2006 Уходящее лето` → `albumartist='Илья Чёрт'` | лидер группы, верно | +| `ГрОб` → `'Гражданская Оборона'` | верно | +| `Benassi Bros` → `'Benny Benassi'` | верно | +| `album == title` (`Малыш и Карлсон`, `Ария/Вавилон`) | одноимённые альбомы | + +**ПРАВИЛО: прежде чем объявлять класс дефектом — проверять, не является ли совпадение/разброс +следствием правила Alex или легитимной структуры данных.** Детекторы «по форме» дали +**7899 ложных срабатываний** против **26 реальных** (ср. сессия 17: `album == title` → 149, реальных 0). + +## 🔴 КАК ИСКАТЬ ПРАВИЛА: база Zulip, НЕ переспрашивать Alex + +Правила `album` (`!Radio` формат, `misc` = подпапка, корень артиста = один альбом) **обсуждались +только в Zulip** — ни в скилле, ни в доке, ни в комментариях скриптов. Alex: «**Читай базу зулип +как мы его делали**». Ключевые сообщения: **127513–127593, 128410** (фильтр `up.full_name='Alex'`). + +```bash +docker exec zulip-database-1 psql -U zulip zulip -c "SELECT m.id, m.date_sent, LEFT(m.content,3000) \ + FROM zerver_message m JOIN zerver_recipient r ON m.recipient_id=r.id \ + JOIN zerver_stream s ON r.type_id=s.id JOIN zerver_userprofile up ON m.sender_id=up.id \ + WHERE r.type=2 AND up.full_name='Alex' AND m.date_sent >= '' AND m.date_sent <= '' \ + ORDER BY m.date_sent;" +``` + +> 🔑 **Правило: правила предметной области ищутся в Zulip DB ПЕРВЫМ шагом.** +> Переспрашивать Alex то, что уже обсуждалось — прямой путь к «Ебаный ты мудак блядь». + > 🔑 **Приёмка в UI — единственный способ поймать дефект такого класса.** Ни валидатор плана > («пустых 0»), ни дифф (`new_album` плана vs базы 38-го прогона — мусор стоял в обоих → «совпало») > его не видят. **Смотреть глазами в UI после деплоя — обязательно.** @@ -280,11 +316,13 @@ folder="!Pop, Club, Любэ/Дискотека Авария/Москва пьё | # | Что | Статус | |---|---|---| -| 1 | `album` в скобках, 306 файлов | 🔴 выявлено, ждёт решения Alex | +| 1 | `album` в скобках, 306 файлов | ✅ **ИСПРАВЛЕНО** (скобок 0) + 58 строк по 3 дефектам | | 2 | Семантика `artist` в `!Классика` | 🔴 не начато (см. ниже) | -| 3 | `TPE2`/`albumartist` — ремонт по 7861 файлу | 🔴 активная задача ([[personal/plans/music-artist-albumartist-repair]]) | +| 3 | `TPE2`/`albumartist` — ремонт по 7861 файлу | 🟡 разброс 7→2 папки; ⏳ 2 папки ждут решения | | 4 | Symfonium на Android | ⏳ не установлен | | 5 | Lidarr | ⏳ не начат (отложен) | +| 6 | ⏭ Перегенерация `DIFF-new-vs-38-v2.csv` | 🔴 план изменился после генерации | +| 7 | Валидатор **смысла** `new_album` | 🔴 в пайплайне отсутствует | ## ⚠️ Расхождение счётчика: 8043 в Navidrome vs 7861 mp3 на диске diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index 3cddccee..56379816 100755 --- a/personal/plans/music-artist-albumartist-repair.md +++ b/personal/plans/music-artist-albumartist-repair.md @@ -27,11 +27,14 @@ status: session18-album-306-fixed-new-diff-generated > **СТАТУС СЕССИИ 18 (финал):** Navidrome ✅ развёрнут и работает (см. ниже + > `[[family/how-to/navidrome-truenas-android]]`). Дефект-класс `new_album == cur_album` > вскрыт (6202 строки, 79%), реального мусора **9 папок / 265 треков→306 строк**. -> Правила `album` восстановлены из базы Zulip. **Все 306 строк исправлены в `APPLY-PLAN.csv` -> (мусора 0 — проверено по файлу). НОВЫЙ дифф `DIFF-new-vs-38-v2.csv` сгенерирован** -> (164 album-строки, +12 к старому). Старый `DIFF-new-vs-38.csv` не тронут. -> ⚠️ Осталось: `albumartist` для 5 файлов `!Retro`, вычитка диффа Alex, валидатор смысла. -> См. §ВОПРОС ПО 3 ПАПКАМ, §СДЕЛАНО: правка 306 строк, §НОВЫЙ ДИФФ. +> Правила `album` восстановлены из базы Zulip. **306 строк исправлены в `APPLY-PLAN.csv`**, +> затем **ещё 58 строк по 3 дефектам** (склейка артист+год 18, чужой `albumartist` 7, +> `album`=название песни 33). Итог по файлу: **скобок 0, `albumartist`-разброс 7→2 папки, +> `Green Apelsin` 13 значений→1**. Дифф `DIFF-new-vs-38-v2.csv` сгенерирован (164 album-строки), +> но ⏭ **устарел после правки 58 строк — требует перегенерации**. +> ⚠️ Открыто: 2 папки с разным `albumartist` (`Ленинград`/`Сергей Шнуров`; `ВИА МЕА`), +> вычитка диффа Alex, валидатор смысла. +> См. §ПРАВКА 3 ДЕФЕКТОВ, §КАЛИБРОВКА ДЕТЕКТОРОВ, §СДЕЛАНО: правка 306 строк, §НОВЫЙ ДИФФ. > **Контекст:** Navidrome поднят и просканировал библиотеку (8043 трека). Alex открыл UI и > спросил: «**Откуда альбомы в скобках взялись?** Типа `Дискотека Авария` — для корня, @@ -403,6 +406,73 @@ APPLY-PLAN.csv.bak-before-2009-04-20260927-134232 {'(Философские)': Построчное наследие `cur_album` — корень дефекта. 6. Приёмка: **видно в UI Navidrome**, не read-back ассистента. +### ✅ ПРАВКА 3 ДЕФЕКТОВ + ЗАКРЫТИЕ `!Retro` (Alex: «Да, походу все так») + +**Проверка Alex по 4 вопросам:** «Проверить. И скрипт проверь, ничего не грохнет, будет 306 +точечных правок? Больше ничего не вызывает подозрений — все остальное по правилам? +В скобках ничего не осталось? В рамках одной папки всегда один альбом/albumartist?» + +**ОТВЕТЫ (факт):** + +| # | Вопрос | Ответ | +|---|---|---| +| 1 | `!Retro` albumartist | ✅ **все 51 файл уже имели `Various Artists`** — доставлять нечего | +| 2 | Скрипт грохнет что-то? | Нет — правит только строки из жёсткого `JUNK`-набора (12 значений), 2 колонки | +| 3 | Скобки остались? | ✅ **0** — по ВСЕМУ плану (7861 строка), не только по правленым | +| 4 | Один album/albumartist в папке? | 🔴 **НЕТ** — 96 папок с разными `album`, 7 с разным `albumartist` | + +> 🔑 **`!Retro` — важное наблюдение:** `album` в папке РАЗНЫЙ (`De Luxe collection`, `Опиум`, +> `Просвистела`, `Танцевать до утра`) — и это **правильно**, там лежат легитимные альбомы. +> Мой фикс заменил только `(Авария)`/`(Вилли Токарев)` → `Retro`. **Не всякий разброс +> `album` в папке = дефект.** + +### 🔴 КАЛИБРОВКА ДЕТЕКТОРОВ — первая версия дала МАССУ ложных (метод-урок) + +**Первые детекторы показали: A=1690, B=6033, C=176.** Alex не утверждал этот объём, я сам +проверил и **откалибровал** — реальных дефектов оказалось **26 строк**, а не 7899. + +| Детектор | Ложных | Почему ложно | +|---|---|---| +| A: `album == имя папки` | 1690 | **корень папки артиста → `album` = имя артиста — это ПРАВИЛО Alex**, а подпапка → имя подпапки тоже правило | +| B: `albumartist != имя папки` | 6033 | `Пилот/2006 Уходящее лето → 'Илья Чёрт'` — **верно** (лидер группы); `ГрОб → 'Гражданская Оборона'` — верно; `Benassi Bros → 'Benny Benassi'` — верно | +| C: `album == title` | 176 | **одноимённые альбомы** (`Малыш и Карлсон`, `Ария/Вавилон`) — легитимно | + +> 🔴 **МЕТОД-УРОК (систематический):** детектор по **форме** значения (совпадение с именем +> папки / отсутствие в справочнике / равенство другому полю) даёт тысячи ложных. Прежде чем +> называть класс дефектом — проверять, **не является ли совпадение следствием правила Alex** +> и **не ложно ли срабатывание на легитимных данных** (фиты, лидеры групп, одноимённые альбомы). +> **Ср. сессия 17:** «`album == title` → 149 попаданий, реальных 0». + +### ✅ ИСПРАВЛЕНО 58 ПРАВОК (скрипт `/tmp/fix_3defects.py`) + +| Класс | Строк | Что | +|---|---:|---| +| **A** `album` = склейка артист+год | **18** | `Птаха - Красивые, богатые (2009)` → `Красивые, богатые`; `Земфира (2000)` → `Земфира`; `Infected Mushroom Vs. The Prodigy - Supervized Firestarter (Gljiva Funmix)` → `Supervized Firestarter (Gljiva Funmix)` | +| **B** `albumartist` = чужой артист | **7** | `DJ Feel`→`The Prodigy`; `КняZz`→`Король и Шут`; `ДА и Меньшиков`→`Дискотека Авария`; `Мика Ньютон`→`Потап и Настя Каменских`; `Бумер`→`Ленинград`; `50 Cent`/`50 Cent, Eminem, Ca$his`→`Eminem` ×2 | +| **C** `album` = название песни (`Green Apelsin`) | **33** | 13 разных значений → **`Северный ветер`** (albumartist папки) | + +**ПРОВЕРКА ФАКТОМ ПОСЛЕ ПРАВКИ:** + +``` +new_album начинается со скобки: 306 → 0 +Папок с разными new_albumartist: 7 → 2 +Green Apelsin: album значений 13 → 1 ('Северный ветер') +``` + +### ⚠️ ОСТАЛОСЬ 2 ПАПКИ С РАЗНЫМ `albumartist` (ждут решения Alex) + +| Папка | Значения | Вопрос | +|---|---|---| +| `z Другое.../Ленинград` | `Ленинград` ×4, **`Сергей Шнуров`** ×1 | ставить `Ленинград`? | +| `z Другое.../Enigma.../Ленинград` (корень) | **`ВИА МЕА`** ×1, `Красная Плесень` ×2 | что с `ВИА МЕА`? | + +**Также осталось:** 11 «склеек» — **ложные** (`NONSONS - zvezda` = имя папки артиста, верно). + +### ⏭ НЕ СДЕЛАНО: перегенерация диффа после правки 3 дефектов + +`DIFF-new-vs-38-v2.csv` сгенерирован **ДО** правки 58 строк. **План изменился — дифф устарел, +требует перегенерации** (`python3 ~/Downloads/music-tags/diff_new_vs_38_v2.py`). + ### ✅ Артефакты сессии 18 | Файл | Что | @@ -417,6 +487,13 @@ APPLY-PLAN.csv.bak-before-2009-04-20260927-134232 {'(Философские)': | `~/Downloads/music-tags/diff_new_vs_38_v2.py` | скрипт нового диффа | | `~/Downloads/music-tags/DIFF-new-vs-38.csv` | **НЕ ТРОНУТ** (прямое указание Alex) | | `/tmp/fix_album_306.py` | применение финальных правил к плану | +| `/tmp/full_check.py` | проверка 4 вопросов Alex (скобки, albumartist в папке) | +| `/tmp/find_3defects.py` | первая версия детекторов 3 дефектов (**дала ложные**) | +| `/tmp/find_3calibrated.py` | ✅ **откалиброванные** детекторы — рабочий вариант | +| `/tmp/detail_multi.py` | папки с разными `album`/`albumartist` | +| `/tmp/fix_3defects.py` | ✅ **правка 58 строк** (3 дефекта) | +| `/tmp/verify_3fix.py` | проверка после правки 3 дефектов | +| `APPLY-PLAN.csv.bak-before-3defects-20260927-173855` | бэкап плана до правки 3 дефектов | | `/tmp/find_filosof_value.py` | проверка по 40+ бэкапам: было ли `Философские` | | `/tmp/report_kept_album.py` | группировка папка → значение → count | | `/tmp/report_all_junk_folders.py` | классификация папок (МУСОР/СМЕШАННАЯ/OK) |