[2026-09-27] eagle: family/how-to/jellyfin-config.md family/how-to/navidrome-truenas-android.md family/plans/music-jellyfin-lidarr-taiga.md personal/tech/jellyfin-tags-cp1251-unreadable.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 10:21:24 +06:00
1 parent 266b604b30
commit 43ac43aae0
4 files changed
+365 -22

No files matched your search

@@ -165,6 +165,197 @@ TAG:ID3v1 Comment=ñêàçêà ← 🔑 МАРКЕР
Признак дефекта при валидации: **число артистов = числу папок верхнего уровня** (здесь ровно 8).
## 🔴 v6 (2026-09-27, поздняя сессия): ГИПОТЕЗА «НЕТ `TPE2`» СМЯГЧЕНА — ПОДТВЕРЖДЁН БАГ JELLYFIN #18162
**Проверено фактом:** `TPE2` (albumartist) отсутствует у **154 из 154** проверенных файлов
(выборка по 7 категориям). Но при этом найдена **официально подтверждённая причина
поведения Jellyfin**, которая объясняет картину точнее и не сводится к `TPE2`.
### `jellyfin/jellyfin#18162` — MusicArtist Name берётся из ИМЕНИ ПАПКИ, не из тегов
**Статус issue:** `bug`, `confirmed`, `music`, `In Progress` (на 12.1; у нас 10.11.11).
> «The displayed `Name` for a `MusicArtist` entity is taken from the **artist's folder name**
> rather than ID3/Vorbis `ARTIST`/`ALBUMARTIST` tags — **even when the artist entity already
> exists in the database and a rescan is triggered**.»
> «any discrepancy between folder naming and tag content — underscores instead of spaces,
> inconsistent capitalization, etc. — **permanently corrupts the artist's displayed name on
> every scan, regardless of what the audio files themselves say**.»
**Три места в исходниках Jellyfin (разобрано в issue):**
| Файл | Что делает |
|---|---|
| `ResolverHelper.cs` → `EnsureName` | `item.Name = fileInfo.IsDirectory ? fileInfo.Name : Path.GetFileNameWithoutExtension(...)` — имя папки/файла, если Name пуст |
| `LinkedChildrenService.cs` → `FindArtists` | сравнивает имена в «очищенном» виде (игнорируя регистр/подчёркивания) |
| `ArtistsValidator.cs` | **если папка совпала с тегом — создаётся ОТДЕЛЬНАЯ сущность артиста + метаданные из MusicBrainz** |
**Ключевой вывод разработчика (thedreaddpirate), прямая цитата:**
> «**Only when the artist metadata tag and folder for the artist match will the folder's
> capitalization override the metadata tag.**»
Обратная сторона: **когда имя папки произвольное/не совпадает — Jellyfin идёт в MusicBrainz**
и создаёт артиста оттуда. **Доказательство из логов issue:**
```
"GET /ws/2/artist/?fmt=json&query=%22RUSH5000%22 HTTP/1.1" 200 72
^^^^^^^^^^^^ имя папки в запросе
```
### 🎯 ЭТО ОБЪЯСНЯЕТ `Maria Makarova (organ)`
Alex указал на несоответствие: `Maria Makarova` в UI Jellyfin — это **органистка
(Maria Makarova, organ)**, а НЕ «Маша Макарова» из Ногу Свело.
- В наших файлах есть только фит: `!Rock&Folk/Ногу Свело!/2004 - Откровенные фотографии/10.Ногу свело - Реки (feat. Маша Макарова).mp3`
- Файлов с тегом `Makarova`/`Макарова` в библиотеке **не найдено** поиском по тегам.
- **Вывод: имя пришло ИЗ ВНЕШНЕЙ БАЗЫ (MusicBrainz/TheAudioDB)**, куда Jellyfin пошёл по
имени папки/файла и получил первое совпадение — западную органистку.
> 🔴 **Версия «она прошла потому, что имя ASCII/латиница» — ОКОНЧАТЕЛЬНО ОПРОВЕРГНУТА.**
> Не тиражировать ни в какой форме.
### Следствие: `TPE2` — НЕ единственная и, вероятно, не главная причина
**Баг #18162 перекрывает теги именем папки даже при валидном `ALBUMARTIST`.** Поэтому:
| Что | Оценка |
|---|---|
| Наша структура `категория/подпапка/файл` | Jellyfin читает как `Artist/Album` → Artist = `!Детские` |
| Официальное требование Jellyfin | «works best if the folder structure is: **Artist/Album/Track.ext**» |
| Простановка `TPE2` | **не гарантирует** решение — баг перекрывает теги именем папки |
**Официальная дока Jellyfin (music):**
> «Music Albums are organized in folders, with one folder containing one and only one album.
> **Jellyfin does not care how you organize albums together**, as long as each album is
> contained within one folder. Filenames generally do not matter since the info will be
> scraped from the embedded metadata of the tracks. **If no other metadata was found,
> Jellyfin uses the file names as track titles.**»
**Варианты решения (обсуждались, решение Alex не принято):**
| # | Вариант | Оценка |
|---|---|---|
| A | Отключить интернет-метаданные для музыки | убирает `Maria Makarova (organ)`, но папки остаются артистами |
| B | Перестроить структуру в `Artist/Album/Track` | радикально, но массовое перемещение 7826 файлов |
| C | Проставить `TPE2` | **может не помочь** — баг перекрывает теги папкой |
| D | Обновить Jellyfin | баг `In Progress`, у нас 10.11.11 |
| **E** | **Перейти на Navidrome** | ✅ **решает проблему полностью** — см. ниже |
## ✅ РЕШЕНИЕ: Navidrome — тег-ориентированный движок, папки игнорирует
**Проверено по официальной доке и GitHub Navidrome (2026-09-27).**
> **Официальная дока Navidrome (Tagging Guidelines):**
> «Navidrome organizes your music library **entirely** based on the metadata tags in your audio
> files. Unlike some music players, **it does not use folder names or file names to group tracks**.»
> **GitHub-обсуждение Navidrome #3355:**
> «Being tag-based means **it does not care for the folder structure**, as it does not derive
> artist, album and track names from file paths. You can even put your **whole library in just
> one folder**, and as long as the files are tagged properly, Navidrome will organize your
> library correctly.»
**Сравнение движков — принципиальная разница:**
| | Jellyfin (баг #18162) | Navidrome |
|---|---|---|
| Источник имени артиста | **имя папки** перекрывает тег | **только тег** |
| Структура папок | обязательна `Artist/Album/Track` | **игнорируется** |
| Наша структура `категория/подпапка/файл` | ломает навигацию | **работает как есть** |
| Интернет-метаданные артистов | тянет из MusicBrainz → `Maria Makarova (organ)` | **не тянет** (только картинки, если включить) |
| Пишет в файлы | может | **никогда** (by design) |
**Оговорка:** Navidrome тоже строит **альбомы** по `AlbumArtist`. Без `TPE2` артисты будут
правильные (по `TPE1`), но альбомы могут склеиваться/дробиться. `TPE2` желателен, но
**не блокирует запуск** — в отличие от Jellyfin.
**Наша библиотека готова к Navidrome:** 7826 файлов, теги `artist`/`title`/`album` в UTF-16.
**Минусы Navidrome:** нет просмотра по папкам вообще (разработчик отказал принципиально:
«this is not something I'll be adding»); нет видео — видеотека остаётся в Jellyfin.
### ❌ УСТАРЕВШЕЕ утверждение в [[family/how-to/navidrome-truenas-android]]
Заметка (обновлена 26.09) утверждает: «**Navidrome раскладывает библиотеку по тегам
так же, как Jellyfin**». **Это НЕВЕРНО** — движки ведут себя по-разному (см. таблицу выше).
Кроме того, блокер той заметки («теги массово битые: mojibake 2759, lost 662, clean 537»)
относится к состоянию **ДО волны 38** и **устарел**.
## 📦 ИНВЕНТАРИЗАЦИЯ БЭКАПОВ И CSV (факты 2026-09-27)
Ответ на вопрос Alex: «в backup полный бэкап, а в csv полный список треков, или в нём не все?»
### Бэкап — 91%, НЕ полный
| Папка | Всего файлов | mp3 | Объём |
|---|---:|---:|---|
| `backup` | 7042 | 6985 | 42 ГБ |
| `backup_conv40` | 41 | 40 | 251 МБ |
| `backup_fix` | 166 | 165 | 1.4 ГБ |
| `backup_raw` | 71 | **0** | 411 МБ |
| **ИТОГО** | **7320** | **7190** | ~48 ГБ |
**Основная библиотека — 7861 mp3.** Бэкап покрывает **7190 из 7861 = 91%**.
Остальные ~671 файл **никогда не бэкапились** — их не правили (были `clean` изначально).
> 🔴 **Полного бэкапа всей библиотеки НЕ существует.** Бэкапилось только модифицированное.
### CSV — полный список, но с расхождением по числу файлов
| Файл | Строк | Размер | mtime |
|---|---:|---|---|
| `/mnt/RED_2TB/storage/tmp/tag-inventory.csv` | 7907 | 389K | 2026-09-26 00:39 |
| `/mnt/RED_2TB/storage/tmp/tag-inventory2.csv` | 7907 | 401K | 2026-09-26 01:18 |
| `/tmp/tag-fix-plan.csv` | 7907 | 2.2M | 2026-09-26 04:07 |
**Колонки `tag-inventory2.csv`:**
```
path, title, artist, album, album_artist, genre, date, track,
status_title, status_artist, verdict, source
```
**Колонки `tag-fix-plan.csv` (это ПЛАН правок, не инвентарь):**
```
path, current_verdict, cur_title, cur_artist, cur_album,
new_title, new_artist, new_album, action, source
```
**Расхождение:** CSV = 7906 записей, на диске сейчас **7861 mp3**. Разница **45 файлов** —
инвентарь снят 26.09 в 00:39, **до** конвертаций (wma→mp3 добавили) и до удаления DRM.
### 🔴 КОРЕНЬ ПРОПУСКА `TPE2`: его не было в ПЛАНЕ правок
```
tag-inventory2.csv: колонка album_artist ЕСТЬ
пустых: 4399
заполнено: 3507
tag-fix-plan.csv: колонки album_artist НЕТ ← вот причина
```
**Прямое объяснение, почему у 154/154 файлов нет `albumartist`:** его **никогда не планировали
записывать**. Инвентарь про `album_artist` знал (3507 заполненных), но **план правок
(`tag-fix-plan.csv`) не содержит этой колонки** → скрипт применял только `title`/`artist`/`album`
→ `TPE2` не записался никуда.
> 🔑 **Это не баг скрипта, а пропуск в плане.** Для ремонта `TPE2` нужен **новый** план с колонкой
> `album_artist`.
**Распределение `verdict` в `tag-inventory2.csv`** (напоминание: цифры ДО волны 38):
```
mojibake 2615 clean 1687
partial 1558 empty 1008 lost 632
```
**Распределение `action` в `tag-fix-plan.csv`:**
```
fix 2935 no_change 1582
+ артисты-значения: Savant 237, Сектор Газа 191, Infected Mushroom 187, Ленинград 161, Enigma 107, Любэ 103
```
## Ремонт (предложен, НЕ выполнен)
**Цель:** перекодировать ID3v2.3 → **UTF-16 с BOM** (или ID3v2.4 + UTF-8), чтобы Jellyfin читал.