[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/batch-data-edit-review-loop.md personal/tech/music-tags-repair-truenas.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 20:13:53 +06:00
1 parent 203e0da1a1
commit d77aec3548
3 files changed
+182 -2

No files matched your search

@@ -361,6 +361,59 @@ album = 'misc' (имя подпапки — как есть)
Худший вариант — **«готово» при отсутствии изменений**. Перед словом «готово» обязательна
команда, доказывающая факт изменения (`md5` до/после, счётчик).
### 29. 🔴🔴 ИСКАТЬ ГОТОВЫЙ СКРИПТ ПРЕЖДЕ ЧЕМ ПИСАТЬ НОВЫЙ — `grep -l` обязателен
Скрипты копятся в `/tmp/*.py` и рабочей папке проекта, и **нужный почти всегда уже есть** —
вместе с выстраданными правилами (списки исключений, нормализация, схлопывание).
Кейс сессии 29-бис: написаны `diff_new_vs_38_v5.py` / `_v6.py` **вместо** существующих
`/tmp/make_diff_rule.py` + `/tmp/rule_check_v2.py`, которые делали ровно эту задачу и **уже
содержали исключение сборников** (`Sbornik_*` / `Сборник*`). Переписывание с нуля:
потеряно схлопывание (**16417 строк вместо 1674**) и повторно сломан `Sbornik_Novij_Rok`
(имя папки ушло в `album` на **200 файлов**). Alex: «**какого хуя ты по кругу мне предлагаешь
обратно то это менять?!**».
**Правило: перед написанием любого скрипта —**
```bash
grep -l "<ключевое понятие>" /tmp/*.py ~/Downloads/<проект>/*.py
```
### 30. 🔴 `ё` и `е` — РАЗНЫЕ СИМВОЛЫ: `grep` с `е` НЕ НАХОДИТ значение с `ё`
`grep -ci "черный кот"` вернул **0**, хотя в датасете лежали три файла `Чёрный кот.mp3`.
Из-за поиска сделан вывод «строки нет в плане вообще» — **ответ пользователю был неверным
не по данным, а по поиску**.
**Протокол поиска кириллического значения:** сначала с `ё`, затем с `е`, затем по фрагменту
**без спорной гласной** (`"рный кот"`), затем `grep -i` по всему полю.
Относится к любому поиску имён/текста — артисты, альбомы, заголовки, папки.
### 31. 🔴🔑 СНАЧАЛА УСТАНОВИТЬ, ЧТО ЕСТЬ КАНОН — диффать не тот набор колонок
Диф между неверной парой колонок даёт **уверенный, правдоподобный и полностью неверный** отчёт.
Канонная рамка этого проекта (слова Alex, подтверждать при любом сомнении):
**`APPLY-PLAN.csv` = RC. Канон. Источник истины. Прогон на 7496 файлов.**
| Поле | Смысл |
|---|---|
| `new_*` | **канон** — что ДОЛЖНО быть в файлах |
| `cur_*` | **снимок ДО прогона**; после прогона УСТАРЕЛ |
Отсюда верная проверка — `new_*` плана vs живая БД, ожидание **0 различий**.
Диффать `cur_*` против БД бессмысленно: различия гарантированы и ничего не доказывают.
**В каждом отчёте называть пару полей, которые сравниваешь.** Факт этой сессии:
RC-сверка (`/tmp/rc_verify.py` → `RC-VERIFY.csv`) дала **7861 расхождение из 7861** —
`title`/`artist` сошлись ✅, но `genre` разошёлся на **ВСЕХ 7861** и `track` на 1699.
### 32. 🔴 Колонка `track` в БД Navidrome называется `track_number`
`SELECT track FROM media_file` → `OperationalError: no such column: track`.
Верные имена: `title`, `artist`, `album_artist`, `album`, `genre`, **`track_number`**.
Возвращается **int** → `str(v).strip()`, иначе `AttributeError`.
`track_number = 0` = «номер не проставлен» — сравнивать с пустым значением из плана
с учётом этого, иначе 1699 ложных расхождений.
## Связанное
- [[personal/tech/music-tags-repair-truenas]] — волновой лог канонического инстанса
+17 -1
View File
@@ -1,7 +1,7 @@
---
title: Music Tags Repair — TrueNAS 7906 → 7905 файлов
created: '2026-09-26'
updated: '2026-09-26'
updated: '2026-09-27'
type: tech
namespace: personal
wave: 38
@@ -63,6 +63,22 @@ related:
> 13 расхождений → дефект №4 (мой: ПАПКА-запись разворачивалась на всю папку из БД) +
> дефект №5 (правило: `nartist in nleaf` ловит `50 Cent` внутри папки `Eminem,50cent`).
> Полный разбор — [[personal/plans/music-artist-albumartist-repair]] § СЕССИЯ 29-БИС.
>
> 🔑🔑 **ОПРЕДЕЛЕНИЕ СЕССИИ 29-ТЕР (главное, читать при любом сомнении):**
> **`APPLY-PLAN.csv` = RC. Канон. Источник истины. Прогон на 7496 файлов.**
> `new_*` = канон (что ДОЛЖНО быть). **`cur_*` = снимок ДО прогона, после прогона УСТАРЕЛ.**
> Сверять `cur_*` с базой после прогона НЕЛЬЗЯ — они обязаны расходиться.
> Корректная проверка: `new_*` плана vs БД → должно быть **0 различий**.
> **ФАКТ: RC-сверка (`/tmp/rc_verify.py` → `RC-VERIFY.csv`) дала 7861 расхождение из 7861**
> — `title`/`artist` сошлись ✅, но 🔴 **`genre` разошёлся на ВСЕХ 7861** (БД пусто) и
> `track` на 1699 (БД `0`). Причина не выяснена: прогон не писал `genre`, либо база не
> перечитала теги. Разбор — § СЕССИЯ 29-ТЕР.
> ✅ **Покрытие план↔БД ПОЛНОЕ:** 7861 = 7861, `GAP-db-not-in-plan.csv` и
> `GAP-plan-not-in-db.csv` **оба пусты** (`/tmp/gap_db_plan.py`).
> 🔑 **ПИТФОЛЛ: «Чёрный кот» пишется через Ё** — `grep "черный кот"` даёт 0 и создаёт
> ложное «файла нет». Правило: искать и через `ё`, и через `е`, и без гласной.
> 🔴 **Питфолл БД:** колонка — **`track_number`**, не `track`; возвращается **int**;
> `0` = «номер не проставлен».
> ✅ Класс **«`albumartist` размножен от чужого файла в корне папки»** — ИСПРАВЛЕН (7 папок, 40 строк).
> ✅ Класс **«`Various Artists` поверх одного артиста»** — ВЫЧИЩЕН ПОЛНОСТЬЮ
> (`find_va_misuse.py` → `ПАПОК-КАНДИДАТОВ: 0`). Разбор классов **A1-A4** —