[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
@@ -25,10 +25,16 @@ related:
|
||||
> восстановление БД из `/home/truenas_admin/jellyfin-config-bak-20260926-203007.tar.gz`.
|
||||
> Детали — [[family/plans/music-jellyfin-lidarr-taiga]] §ВОССТАНОВЛЕНИЕ.
|
||||
>
|
||||
> 🔴 **ПРИЧИНА провала приёмки — в файлах ОТСУТСТВУЕТ фрейм `TPE2` (albumartist).**
|
||||
> Теги **уже в UTF-16 с BOM** (encoding-байт `01`), **CP1251 там нет** — прежний диагноз опровергнут.
|
||||
> Jellyfin в music-библиотеке строит иерархию по `TPE2`; при его отсутствии уходит в fallback
|
||||
> на папки и перестаёт читать `TPE1`. Детали — [[personal/tech/jellyfin-tags-cp1251-unreadable]].
|
||||
> 🔴 **ПРИЧИНА провала приёмки — БАГ JELLYFIN [`#18162`](https://github.com/jellyfin/jellyfin/issues/18162):
|
||||
> имя MusicArtist берётся из ИМЕНИ ПАПКИ, перекрывая теги `ARTIST`/`ALBUMARTIST`** (статус
|
||||
> `confirmed`, `In Progress`; у нас 10.11.11). Теги **уже в UTF-16 с BOM**, **CP1251 там нет**.
|
||||
> Дополнительно: в файлах **отсутствует `TPE2` (albumartist)** — 154/154, его не было в плане
|
||||
> правок (`tag-fix-plan.csv` без колонки `album_artist`). Баг перекрывает теги папкой
|
||||
> **даже при валидном `ALBUMARTIST`**.
|
||||
> Детали и сравнение с Navidrome — [[personal/tech/jellyfin-tags-cp1251-unreadable]].
|
||||
>
|
||||
> ✅ **ВЫВОД: для музыки нужен Navidrome** (читает теги, папки игнорирует) —
|
||||
> [[family/how-to/navidrome-truenas-android]].
|
||||
>
|
||||
> ⚠️ Прежний вывод «108/108 теги чистые» был **методологически неверен**: валидация шла через
|
||||
> `ffprobe` (он угадывает кодировку) и **не проверяла `albumartist`** вообще.
|
||||
|
||||
@@ -1,50 +1,85 @@
|
||||
# Музыкальный плеер с TrueNAS на Android
|
||||
|
||||
**Статус:** 📋 Планируется
|
||||
**Статус:** 📋 Планируется — 🟢 **блокер СНЯТ, вариант 1 (Navidrome) стал основным кандидатом**
|
||||
**Дата:** 2026-05-10
|
||||
**Обновлено:** 2026-09-26
|
||||
**Обновлено:** 2026-09-27 (v3 — исправлено ошибочное утверждение о движке)
|
||||
|
||||
## 🔴 ИСПРАВЛЕНО 2026-09-27: Navidrome ≠ Jellyfin по поведению движка
|
||||
|
||||
> **Прежнее утверждение этой заметки: «Navidrome раскладывает библиотеку по тегам ТАК ЖЕ,
|
||||
> как Jellyfin» — НЕВЕРНО.** Проверено по официальной доке и GitHub Navidrome.
|
||||
> Разница принципиальная, и она как раз в нашу пользу.
|
||||
|
||||
| | Jellyfin (баг [#18162](https://github.com/jellyfin/jellyfin/issues/18162)) | Navidrome |
|
||||
|---|---|---|
|
||||
| Источник имени артиста | **имя папки** перекрывает тег | **только тег** |
|
||||
| Структура папок | требуется `Artist/Album/Track` | **игнорируется полностью** |
|
||||
| Наша структура `категория/подпапка/файл` | ломает навигацию | **работает как есть** |
|
||||
| Интернет-метаданные артистов | тянет из MusicBrainz → левые артисты (`Maria Makarova (organ)`) | **не тянет** |
|
||||
| Пишет в файлы | может | **никогда** (by design) |
|
||||
|
||||
**Официальная дока 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**... 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 сорвал приёмку Music-библиотеки 2026-09-27
|
||||
(навигация по папкам: `Letuchuj korabl`, `Vinni pooh`). **Navidrome этого бага не имеет.**
|
||||
Разбор — [[personal/tech/jellyfin-tags-cp1251-unreadable]].
|
||||
|
||||
## Задача
|
||||
Поднять стриминг музыки с TrueNAS (`/mnt/RED_2TB/storage/Music/`) на Android-устройства.
|
||||
|
||||
## Варианты
|
||||
|
||||
### ✅ Вариант 1 — Navidrome + Symfonium (рекомендован)
|
||||
### ✅ Вариант 1 — Navidrome + Symfonium (рекомендован, ОСНОВНОЙ)
|
||||
- **Сервер:** [Navidrome](https://www.navidrome.org/) — лёгкий музыкальный сервер, Docker-образ
|
||||
- **Плеер Android:** [Symfonium](https://symfonium.app/) — Subsonic API, офлайн-кэш, теги, обложки
|
||||
- Работает через интернет по порту, можно за nginx reverse proxy
|
||||
- Docker уже есть: `/mnt/RED_2TB/docker/`
|
||||
- **Ключевое преимущество:** читает теги, **игнорирует папки** — наша структура категорий не мешает
|
||||
|
||||
### Вариант 2 — Jellyfin + Finamp
|
||||
- **Сервер:** Jellyfin (Docker) — универсален (видео, фото, музыка)
|
||||
- **Плеер Android:** [Finamp](https://github.com/jmshrv/finamp) — опенсорс
|
||||
- Чуть тяжелее Navidrome
|
||||
- ⚠️ 🔴 **ПРОВАЛЕНО 2026-09-27:** музыкальная библиотека построена по папкам, не по тегам
|
||||
(баг #18162). Приёмка Alex не пройдена, библиотека удалена, БД восстановлена.
|
||||
**Пока не исправлено в upstream — для музыки не годится.**
|
||||
|
||||
### Вариант 3 — SMB напрямую
|
||||
- Без сервера, VLC или Solid Explorer играют по SMB
|
||||
- Только для домашней сети — по интернету медленно и небезопасно
|
||||
- ✅ Запасной вариант: не зависит ни от тегов, ни от движка
|
||||
|
||||
## 🔴 Общий блокер для ВСЕХ вариантов (найдено 2026-09-26)
|
||||
## ✅ Блокер снят (был: «теги массово битые»)
|
||||
|
||||
**Теги в `Music/` массово битые** — полная инвентаризация 7906 файлов:
|
||||
`mojibake` 2759, `lost` 662 (данные уничтожены, `\ufffd`), `empty` 1026, `partial` 2920,
|
||||
`clean` только 537. Ремонт на этапе «ждём апрув Alex по CSV v2», правки файлов не начаты.
|
||||
> ~~🔴 **Общий блокер для ВСЕХ вариантов (найдено 2026-09-26):** Теги в `Music/` массово битые —
|
||||
> `mojibake` 2759, `lost` 662, `empty` 1026, `partial` 2920, `clean` только 537.~~
|
||||
|
||||
> **Navidrome раскладывает библиотеку по тегам так же, как Jellyfin** — то есть битые теги
|
||||
> портят **и этот** вариант, не только Jellyfin. Порядок «сначала теги, потом сервер»
|
||||
> распространяется на все варианты 1–2.
|
||||
> Детали: [[personal/tech/music-tags-repair-truenas]].
|
||||
**АКТУАЛЬНО 2026-09-27:** ремонт тегов (волна 38) выполнен — `artist`/`title`/`album`
|
||||
заполнены, мойибаке нет, теги в **UTF-16 с BOM**. Цифры выше относятся к состоянию
|
||||
**ДО** волны 38 и устарели.
|
||||
|
||||
> ⚠️ **Вариант 3 (SMB) от битых тегов не зависит** — навигация по файлам. Единственный,
|
||||
> работающий прямо сейчас.
|
||||
⚠️ **Но выявлен новый пробел:** в файлах **отсутствует `TPE2` (albumartist)** — проверено
|
||||
`154/154`. Его **не было в плане правок** (`tag-fix-plan.csv` не содержит колонки `album_artist`).
|
||||
Navidrome строит **альбомы** по `AlbumArtist`; артисты будут правильные и без него,
|
||||
но альбомы могут склеиваться. **Желательно добавить `TPE2` перед запуском.**
|
||||
|
||||
Детали — [[personal/tech/jellyfin-tags-cp1251-unreadable]] §ИНВЕНТАРИЗАЦИЯ.
|
||||
|
||||
## Следующие шаги
|
||||
- [ ] **Сначала:** ремонт тегов 7906 файлов ([[personal/tech/music-tags-repair-truenas]])
|
||||
- [x] ~~Сначала: ремонт тегов 7906 файлов~~ → ✅ выполнен (волна 38)
|
||||
- [ ] **Опционально:** добавить `TPE2` = `TPE1` (нужен НОВЫЙ план правок с колонкой `album_artist`)
|
||||
- [ ] Поднять Navidrome в Docker на TrueNAS
|
||||
- [ ] Пробросить порт / настроить Caddy subdomain (Caddyfile root-owned → через alpine-контейнер)
|
||||
- [ ] Установить Symfonium на Android, подключить
|
||||
|
||||
## Связанные заметки
|
||||
- [[personal/tech/music-tags-repair-truenas]] — 🔴 ремонт тегов, блокирует всё
|
||||
- [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ⏳ Lidarr на Тайге (2026-09-26), наполнение `Music/` новым контентом
|
||||
- [[personal/tech/jellyfin-tags-cp1251-unreadable]] — 🔴 почему Jellyfin провалился (баг #18162), сравнение с Navidrome
|
||||
- [[personal/tech/music-tags-repair-truenas]] — ремонт тегов (волна 38)
|
||||
- [[family/plans/music-jellyfin-lidarr-taiga]] — план Music → Jellyfin + Lidarr (Jellyfin-ветка откачена)
|
||||
- [[family/how-to/jellyfin-config]] — Jellyfin как альтернативный музыкальный сервер (Вариант 2)
|
||||
@@ -1,4 +1,115 @@
|
||||
# Music → Jellyfin + Lidarr на Тайге — план (v5, 2026-09-27)
|
||||
# Music → Jellyfin + Lidarr на Тайге — план (v6, 2026-09-27)
|
||||
|
||||
> ✅ **СТАТУС v6: ОТКАТ ЗАВЕРШЁН И ПОДТВЕРЖДЁН.** БД Jellyfin восстановлена на версию до импорта
|
||||
> музыки. Итог: 6 библиотек, Audio=0, MusicArtist=0, Music отсутствует. Jellyfin работает.
|
||||
> **MD5 внутри контейнера = `b71b5d659a1262fa98b85a6ab0003f24`** — совпал с бэкапом.
|
||||
> Задача Lidarr — **не начата, отложена** (Alex не возвращался к ней после отката).
|
||||
>
|
||||
> 🔴 **ГЛАВНОЕ ОТКРЫТИЕ v6: поведение Jellyfin — это ОФИЦИАЛЬНО ПОДТВЕРЖДЁННЫЙ БАГ
|
||||
> [`jellyfin/jellyfin#18162`](https://github.com/jellyfin/jellyfin/issues/18162), а НЕ проблема
|
||||
> наших тегов.** Jellyfin берёт имя артиста **из имени папки**, перекрывая теги. Гипотеза
|
||||
> «в файлах нет `TPE2`» **смягчена**: `TPE2` отсутствует у 154/154 (факт), но баг перекрывает
|
||||
> теги именем папки **даже при валидном `ALBUMARTIST`**.
|
||||
>
|
||||
> ✅ **Найденное решение: Navidrome** — читает теги, **папки игнорирует полностью**, бага не имеет.
|
||||
> Детали и сравнение движков — [[personal/tech/jellyfin-tags-cp1251-unreadable]].
|
||||
> Деплой-план — [[family/how-to/navidrome-truenas-android]].
|
||||
|
||||
## 🔴 v6: БАГ JELLYFIN #18162 — имя папки перекрывает теги
|
||||
|
||||
**Проверено в официальном репозитории Jellyfin (2026-09-27).** Статус 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**.»
|
||||
|
||||
**Места в исходниках (разобрано в issue):**
|
||||
|
||||
| Файл | Поведение |
|
||||
|---|---|
|
||||
| `ResolverHelper.cs` → `EnsureName` | `item.Name = fileInfo.IsDirectory ? fileInfo.Name : Path.GetFileNameWithoutExtension(...)` |
|
||||
| `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.**»
|
||||
|
||||
### 🎯 Откуда взялся `Maria Makarova (organ)`
|
||||
|
||||
Alex указал на несоответствие: в UI Jellyfin `Maria Makarova` — это **органистка
|
||||
(Maria Makarova, organ)**, а не «Маша Макарова» из Ногу Свело.
|
||||
|
||||
- В файлах есть только фит: `!Rock&Folk/Ногу Свело!/2004 - Откровенные фотографии/10.Ногу свело - Реки (feat. Маша Макарова).mp3`
|
||||
- Файлов с тегом `Makarova`/`Макарова` поиском по тегам **не найдено**
|
||||
- **Вывод: имя пришло из MusicBrainz/TheAudioDB** — Jellyfin пошёл во внешнюю базу по имени
|
||||
папки/файла и получил первое совпадение (западную органистку)
|
||||
|
||||
> 🔴 Версия «прошла потому что латиница» — **ОКОНЧАТЕЛЬНО ОПРОВЕРГНУТА**. Не тиражировать.
|
||||
|
||||
### Официальное требование Jellyfin к структуре
|
||||
|
||||
> «Jellyfin works best if the folder structure is: **Artist/Album/Track.ext**»
|
||||
> «Music Albums are organized in folders, with one folder containing one and only one album...
|
||||
> **If no other metadata was found, Jellyfin uses the file names as track titles.**»
|
||||
|
||||
**Наша структура** `!Rock&Folk/Ария/1997 - Смутное время/файл.mp3` — **4 уровня с категорией
|
||||
сверху**. Jellyfin берёт ур.1 (`!Rock&Folk`) как артиста, ур.2 как альбом.
|
||||
|
||||
### Варианты решения (решение Alex НЕ принято)
|
||||
|
||||
| # | Вариант | Оценка |
|
||||
|---|---|---|
|
||||
| A | Отключить интернет-метаданные для музыки | убирает `Maria Makarova (organ)`, папки остаются артистами |
|
||||
| B | Перестроить в `Artist/Album/Track` | радикально, перемещение 7826 файлов |
|
||||
| C | Проставить `TPE2` | **может не помочь** — баг перекрывает теги папкой |
|
||||
| D | Обновить Jellyfin | баг `In Progress`, у нас 10.11.11 |
|
||||
| **E** | **Navidrome** | ✅ **решает полностью** — тег-ориентирован, папки игнорирует |
|
||||
|
||||
## 📦 ИНВЕНТАРИЗАЦИЯ БЭКАПОВ И CSV (ответ на вопрос Alex, 2026-09-27)
|
||||
|
||||
### Бэкап — 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 = 91%**. Остальные ~671 файл
|
||||
не бэкапились (не правились, были `clean`).
|
||||
|
||||
> 🔴 **Полного бэкапа всей библиотеки НЕ существует.**
|
||||
|
||||
### CSV — полный список, 7906 записей
|
||||
|
||||
| Файл | Строк | mtime |
|
||||
|---|---:|---|
|
||||
| `/mnt/RED_2TB/storage/tmp/tag-inventory.csv` | 7907 | 2026-09-26 00:39 |
|
||||
| `/mnt/RED_2TB/storage/tmp/tag-inventory2.csv` | 7907 | 2026-09-26 01:18 |
|
||||
| `/tmp/tag-fix-plan.csv` | 7907 | 2026-09-26 04:07 |
|
||||
|
||||
**Расхождение:** CSV 7906 записей vs **7861 mp3 на диске** = 45 файлов. Инвентарь снят до
|
||||
конвертаций (wma→mp3) и до удаления DRM.
|
||||
|
||||
### 🔴 КОРЕНЬ ПРОПУСКА `TPE2`: его не было в плане правок
|
||||
|
||||
```
|
||||
tag-inventory2.csv: колонка album_artist ЕСТЬ (пустых 4399, заполнено 3507)
|
||||
tag-fix-plan.csv: колонки album_artist НЕТ ← вот причина
|
||||
```
|
||||
|
||||
**Почему у 154/154 файлов нет `albumartist`:** его **никогда не планировали записывать**.
|
||||
Инвентарь про `album_artist` знал, но план правок этой колонки не содержит → скрипт писал
|
||||
только `title`/`artist`/`album`. **Не баг скрипта — пропуск в плане.**
|
||||
Для ремонта `TPE2` нужен **новый** план с колонкой `album_artist`.
|
||||
|
||||
> ✅ **СТАТУС v5: ОТКАТ ЗАВЕРШЁН И ПОДТВЕРЖДЁН.** БД Jellyfin восстановлена на версию до импорта
|
||||
> музыки. Итог: 6 библиотек, Audio=0, MusicArtist=0, Music отсутствует. Jellyfin работает.
|
||||
|
||||
@@ -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