[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/id3-tag-repair-skill.md personal/tech/music-tags-repair-truenas.md
This commit is contained in:
1 parent
d5fd802113
commit
7d71a558d9
3 files changed
+192
-5
No files matched your search
@@ -324,26 +324,129 @@ NEED_LOOKUP: 0
|
||||
|
||||
`АЛЬБОМ-мульти(?)` (30 папок) разобраны вручную — почти все НЕ сборники, а альбомы с фитами.
|
||||
|
||||
## ✅ ЭТАП ЗАВЕРШЁН: ЖАНРЫ — `genre-plan-FINAL.csv` (7861 строка, 51 пустой)
|
||||
|
||||
Alex: «Ещё проверь» → разбор жанров по всей библиотеке.
|
||||
|
||||
### Исходное состояние (до чистки)
|
||||
|
||||
```
|
||||
genre ЗАПОЛНЕН: 4911 (62%)
|
||||
genre ПУСТ: 2950 (38%)
|
||||
уникальных: 154
|
||||
```
|
||||
|
||||
### 🔴 Дефекты жанров, найденные аудитом
|
||||
|
||||
| # | Дефект | Файлов | Пример |
|
||||
|---|---|---:|---|
|
||||
| 1 | **Мойибаке CP1251 в жанрах** | 29 | `Psy Årance` / `Psy Еrance` (Е — **кириллическая**) → `Psy-Trance` |
|
||||
| 2 | **Разнобой регистра одного жанра** | ~1800 | `Rock` | `ROCK` | `Рок` | `General Rock` — четыре варианта |
|
||||
| 3 | **Синонимы-дубли** | 453 | `Metal`→`Heavy Metal`, `Punk Rock`→`Punk`, `Russia Rap`→`Rap`, `Поп`→`Pop`, `Рэп и хип-хоп`→`Hip-Hop` |
|
||||
| 4 | **Мусорные значения** | 365 | `Other` 261 · `(17)` 32 · `General Rock` 31 · `Разное` 22 · `Unknown` 19 |
|
||||
| 5 | **Детские/сказки без жанра вообще** | 570 | `ДЕТСКИЕ` 0 файлов с жанром, `СКАЗКИ` 11 (10 `Other`, 1 `Blues` у сказки — мусор) |
|
||||
| 6 | **Спам в тегах** | 4 | `www.mp3-ogg.ru`, `.:::artMkiss 2009:::.`, `ÿþElectronic` |
|
||||
|
||||
### ✅ Ручной разбор мусора (по решению Alex — НЕ батчем по папке)
|
||||
|
||||
> Alex: «По other/unknown — не уверен про что речь, **каждую смотри конкретно и ставь правильный
|
||||
> жанр, не батчем по папке**.»
|
||||
|
||||
`(17)` и `General Rock` расшифрованы фактом — это **не жанры вообще, а артисты**:
|
||||
|
||||
| Значение | Факт | Решение |
|
||||
|---|---|---|
|
||||
| `(17)` | **все 32 файла — ДДТ**, попал номер трека/плейлиста | → `Rock` |
|
||||
| `General Rock` | **все 31 файл — Ленинград** (Дачники, Бабаробот) | → `Rock` |
|
||||
| `Other` (261) | DJ-сборники `!Radio`, Пушной, Vanessa Mae, Каста, Трофим | разобраны **по исполнителю** |
|
||||
|
||||
### Ручные правила заполнения 2715 файлов (по Alex: «Вроде все так»)
|
||||
|
||||
| Папка/артист | Ф. | Жанр |
|
||||
|---|---:|---|
|
||||
| `!Барды/Владимир Высоцкий/*` | 223 | `Бардовская песня` |
|
||||
| `!A Not sorted/Sbornik_Novij_Rok` | 200 | `Rock` |
|
||||
| `!Retro` | 94 | `Pop` |
|
||||
| `!Radio/*` (DJ-сборники) | ~200 | `Dance` |
|
||||
| `Захар Май` | ~60 | `Rock` |
|
||||
| `Александр Пушной` | 23 | `Rock` |
|
||||
| `Vanessa Mae` | 26 | `Classical Crossover` |
|
||||
| `The Tiger Lillies` | 24 | `Dark Cabaret` |
|
||||
| `Каста` / `Eminem` | 46 | `Hip-Hop` |
|
||||
| `Трофим` | 50 | `Chanson` |
|
||||
| `Король и Шут` | 21 | `Punk` |
|
||||
| `Rammstein` | — | `Industrial` |
|
||||
|
||||
**Полные правила — 130 key→genre в `fill_genres.py` (RULES), первое совпадение выигрывает.**
|
||||
|
||||
### 📊 Итог
|
||||
|
||||
```
|
||||
было: 154 уникальных жанра, 2950 пустых
|
||||
стало: 82 уникальных жанра, 51 пустой
|
||||
|
||||
мойибаке исправлено: 29
|
||||
синонимов схлопнуто: 453
|
||||
заполнено правилами: 2715 → 0 пустых, затем дочистка 173 + 453
|
||||
```
|
||||
|
||||
**Финальное распределение:**
|
||||
|
||||
```
|
||||
3071 Rock 882 Pop 385 Punk
|
||||
344 Детские 276 Бардовская песня
|
||||
248 Сказки 226 Chanson 218 Hip-Hop
|
||||
211 Heavy Metal 188 Rap 139 House
|
||||
127 Electronic 127 Psy-Trance 121 Industrial
|
||||
107 Blues 101 Dark Cabaret 95 Alternative
|
||||
```
|
||||
|
||||
**51 пустой — осознанно.** Это `unknown`/`неизвестно`/`other`/`другое`/`разное`/`наши`,
|
||||
`(12)`, `www.mp3-ogg.ru` — заполнять нечем. Navidrome покажет файлы без жанра,
|
||||
они просто не попадут в жанровые фильтры.
|
||||
|
||||
### 🔴 ПИТФОЛЛ: `clean_genres.py` чистит по списку, а не итеративно до сходимости
|
||||
|
||||
Первый прогон схлопнул 173 значения, но **на выходе тут же обнаружились новые остатки**
|
||||
(`Russia Rap`, `Рэп и хип-хоп`, `Поп`, `Pop/Rock`) — потому что нормализация дала
|
||||
значения, которых не было в исходном `FIX`-словаре. Понадобился **третий проход**
|
||||
(`final_genres.py`: +мойибаке-декодер + ещё 453 синонима).
|
||||
**Правило: нормализацию гонять до нуля изменений, а не один раз.** Проверка —
|
||||
`Counter(new_genre)` на выходе: если появились неизвестные значения, словарь неполон.
|
||||
|
||||
### 🔴 ПИТФОЛЛ: `Å`/`Е` в `Psy Årance` — латиница vs кириллица
|
||||
|
||||
`Psy Årance` и `Psy Еrance` выглядят идентично, но `Å` (U+00C5) и `Е` (U+0415) — разные символы
|
||||
из разных алфавитов. Словарь синонимов обязан содержать **оба варианта** явно;
|
||||
`str.strip()`/`lower()` их не схлопывает.
|
||||
|
||||
## ⏭ СЛЕДУЮЩИЕ ШАГИ
|
||||
|
||||
1. **Alex проверяет `fix-plan-FINAL.csv`** — три выборки: 57 строк «из скобок»,
|
||||
1518 строк `Various Artists`, 248 строк `Сказки`
|
||||
2. **Скрипт-писатель `apply_tags.py` — написать заново** (старый не годен, см. §Разбор):
|
||||
2. **Свести `fix-plan-FINAL.csv` + `genre-plan-FINAL.csv`** в один CSV для скрипта-писателя
|
||||
(сейчас это два независимых файла, колонка `path` — ключ связи)
|
||||
3. **Скрипт-писатель `apply_tags.py` — написать заново** (старый не годен, см. §Разбор):
|
||||
- `delall` — **вне** `if`, `add` — только при непустом значении
|
||||
- **+`TPE2`** (`albumartist`) в `_frames()`
|
||||
- декодер мойибаке CP1251→UTF-8
|
||||
- фильтр `.mp3` — **обязателен** (иначе `ID3()` поверх не-MP3 → нет `moov atom`, непоправимо)
|
||||
- `save(path, v2_version=3)` **в тот же путь**, не в `.tmp` через `ID3(path)`
|
||||
3. **Сухой прогон на 20 файлах** + пост-сверка (прочитать тег ПОСЛЕ, сравнить с ожиданием)
|
||||
4. **Только после «go»** — массовая правка с бэкапом
|
||||
4. **Сухой прогон на 20 файлах** + пост-сверка (прочитать тег ПОСЛЕ, сравнить с ожиданием)
|
||||
5. **Только после «go»** — массовая правка с бэкапом
|
||||
|
||||
## 📁 ФАЙЛЫ РАБОТЫ (Mac)
|
||||
|
||||
```
|
||||
/Users/admin/milestones/music-csv-2026-09-26/
|
||||
├── fix-plan-FINAL.csv ⭐ 7861 стр, ИТОГОВЫЙ план правок
|
||||
├── fix-plan-FINAL.csv ⭐ 7861 стр, ИТОГОВЫЙ план artist/albumartist/album
|
||||
├── genre-plan-FINAL.csv ⭐ 7861 стр, ИТОГОВЫЙ план жанров (82 уник., 51 пусто)
|
||||
├── fix-plan-final.csv промежуточный (NEED_LOOKUP=121)
|
||||
├── fix-plan-final2/3/4.csv промежуточные после каждой волны lookup
|
||||
├── genre-plan.csv / 2 / 3 промежуточные жанров (нормализация в 3 прохода)
|
||||
├── genre-junk.csv 365 строк с мусорным жанром (Other и т.п.)
|
||||
├── bad-genres.csv 3315 строк (мусор + пустые)
|
||||
├── genre-empty-folders.txt 291 папка без жанра
|
||||
├── raw_tags_full.tsv 7861 стр, сырые теги (md5 0c3647fa...)
|
||||
├── tag-inventory3.csv 7861 стр, 13 колонок, +albumartist
|
||||
├── tag-inventory2.csv.bak-20260927 бэкап
|
||||
@@ -359,7 +462,10 @@ NEED_LOOKUP: 0
|
||||
├── need-lookup.txt / lookup-still.txt списки на поиск в интернете
|
||||
└── *.py analyze / build_inventory3 / build_folders_plan /
|
||||
build_fix_plan / resolve_composers / apply_lookup1-3 /
|
||||
build_final / verify_manual / audit_categories
|
||||
build_final / verify_manual / audit_categories /
|
||||
check_genres / dump_bad_genres / split_genres /
|
||||
normalize_genres / fill_genres / clean_genres /
|
||||
final_genres
|
||||
```
|
||||
|
||||
### Питфолл: субагент пишет в корень vault
|
||||
|
||||
Reference in new issue
Block a user