From 43ac43aae0ae3b00b323130b67a281430a0530bb Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 27 Sep 2026 10:21:24 +0600 Subject: [PATCH] [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 --- family/how-to/jellyfin-config.md | 14 +- family/how-to/navidrome-truenas-android.md | 69 +++++-- family/plans/music-jellyfin-lidarr-taiga.md | 113 ++++++++++- .../tech/jellyfin-tags-cp1251-unreadable.md | 191 ++++++++++++++++++ 4 files changed, 365 insertions(+), 22 deletions(-) diff --git a/family/how-to/jellyfin-config.md b/family/how-to/jellyfin-config.md index b199284c..c24c1275 100755 --- a/family/how-to/jellyfin-config.md +++ b/family/how-to/jellyfin-config.md @@ -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`** вообще. diff --git a/family/how-to/navidrome-truenas-android.md b/family/how-to/navidrome-truenas-android.md index 1c525519..41120888 100755 --- a/family/how-to/navidrome-truenas-android.md +++ b/family/how-to/navidrome-truenas-android.md @@ -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) diff --git a/family/plans/music-jellyfin-lidarr-taiga.md b/family/plans/music-jellyfin-lidarr-taiga.md index db3c6575..7ce1d510 100755 --- a/family/plans/music-jellyfin-lidarr-taiga.md +++ b/family/plans/music-jellyfin-lidarr-taiga.md @@ -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 работает. diff --git a/personal/tech/jellyfin-tags-cp1251-unreadable.md b/personal/tech/jellyfin-tags-cp1251-unreadable.md index a1bdc012..2bcc5abd 100755 --- a/personal/tech/jellyfin-tags-cp1251-unreadable.md +++ b/personal/tech/jellyfin-tags-cp1251-unreadable.md @@ -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 читал.