[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

+10 -4
View File
@@ -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`** вообще.
+52 -17
View File
@@ -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)
+112 -1
View File
@@ -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 читал.