[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:
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 читал.
|
||||
|
||||
Reference in new issue
Block a user