[2026-09-27] eagle: family/how-to/jellyfin-config.md family/plans/music-jellyfin-lidarr-taiga.md family/projects/media-toolbox-taiga.md personal/tech/jellyfin-tags-cp1251-unreadable.md
This commit is contained in:
1 parent
97c31f3ebb
commit
266b604b30
4 files changed
+238
-37
No files matched your search
@@ -16,19 +16,22 @@ related:
|
||||
---
|
||||
# Jellyfin Config
|
||||
|
||||
> 🔴 **ОБНОВЛЕНО 2026-09-27 (откат): Music-библиотека УДАЛЕНА. Идёт восстановление БД из бэкапа.**
|
||||
> ✅ **ОБНОВЛЕНО 2026-09-27 (v5): ОТКАТ И ВОССТАНОВЛЕНИЕ ЗАВЕРШЕНЫ.**
|
||||
> Music-библиотека удалена, БД восстановлена на версию до импорта.
|
||||
> Итог: **6 библиотек**, **Audio=0**, **MusicArtist=0**, Music отсутствует, Jellyfin работает.
|
||||
> MD5 БД в контейнере = `b71b5d659a1262fa98b85a6ab0003f24` (совпал с бэкапом).
|
||||
> Хронология: библиотека создана (ItemId `7e64e319657a9516ec78490da03edccb`, скан **7826** треков) →
|
||||
> приёмка Alex в UI **провалена** (навигация по папкам, а не по тегам) → Alex потребовал откат →
|
||||
> `DELETE /Library/VirtualFolders?name=Music` → HTTP 204, 6 библиотек на месте.
|
||||
> **Остались осиротевшие записи:** Audio **7826**, MusicAlbum **298**, MusicArtist **9**.
|
||||
> **Найден валидный бэкап БД до импорта:**
|
||||
> `/home/truenas_admin/jellyfin-config-bak-20260926-203007.tar.gz` (98 МБ) →
|
||||
> `jellyfin/data/data/jellyfin.db` (39 МБ, MD5 `b71b5d659a1262fa98b85a6ab0003f24`,
|
||||
> Music-записей **0**, CollectionFolder **6**).
|
||||
> **Восстановление ждёт «да» Alex.** Детали — [[family/plans/music-jellyfin-lidarr-taiga]] §ОТКАТ.
|
||||
> ⚠️ Корневая причина провала — теги в **CP1251**, Jellyfin их отбрасывает
|
||||
> (детали — [[personal/tech/jellyfin-tags-cp1251-unreadable]]). Прежний вывод «108/108 теги чистые»
|
||||
> был **методологически неверен**: валидация шла через `ffprobe`, а он угадывает кодировку.
|
||||
> восстановление БД из `/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]].
|
||||
>
|
||||
> ⚠️ Прежний вывод «108/108 теги чистые» был **методологически неверен**: валидация шла через
|
||||
> `ffprobe` (он угадывает кодировку) и **не проверяла `albumartist`** вообще.
|
||||
|
||||
> ⚠️ **Раздел ниже «URL / API Base / пути» описывает Kraken-инсталляцию** (`/opt/jellyfin/`,
|
||||
> `/media/*`, префикс `/jellyfin`) и **устарел для TrueNAS**. Живой инстанс — на **TrueNAS/Taiga**,
|
||||
@@ -415,7 +418,7 @@ POST /Items/<lib>/Refresh?Recursive=true&RefreshMode=FullRefresh
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
- [[personal/tech/jellyfin-tags-cp1251-unreadable]] — 🔴 **КОРНЕВОЙ ДЕФЕКТ:** теги в CP1251, Jellyfin их не читает
|
||||
- [[personal/tech/jellyfin-tags-cp1251-unreadable]] — 🔴 **КОРНЕВОЙ ДЕФЕКТ:** нет фрейма `TPE2` (albumartist); Jellyfin уходит в fallback на папки (имя файла легаси)
|
||||
- [[personal/tech/music-tags-repair-truenas]] — ремонт тегов (мойибаке/пустые), волна 38
|
||||
- [[family/plans/music-jellyfin-lidarr-taiga]] — план Music → Jellyfin + Lidarr (Фаза 1 частично выполнена)
|
||||
- [[family/projects/media-toolbox-taiga]] — *arr стек на Taiga (Prowlarr/Radarr/Sonarr/Transmission/Jellyfin)
|
||||
|
||||
@@ -1,10 +1,113 @@
|
||||
# Music → Jellyfin + Lidarr на Тайге — план (v4, 2026-09-27)
|
||||
# Music → Jellyfin + Lidarr на Тайге — план (v5, 2026-09-27)
|
||||
|
||||
> ✅ **СТАТУС v5: ОТКАТ ЗАВЕРШЁН И ПОДТВЕРЖДЁН.** БД Jellyfin восстановлена на версию до импорта
|
||||
> музыки. Итог: 6 библиотек, Audio=0, MusicArtist=0, Music отсутствует. Jellyfin работает.
|
||||
> **MD5 внутри контейнера = `b71b5d659a1262fa98b85a6ab0003f24`** — совпал с бэкапом.
|
||||
> Задача Lidarr — **не начата, отложена** (Alex не возвращался к ней после отката).
|
||||
>
|
||||
> 🔴 **ГЛАВНОЕ ОТКРЫТИЕ v5: причина игнора тегов НЕ в CP1251 — она в отсутствии `TPE2`
|
||||
> (albumartist).** Прежний диагноз «теги в CP1251» **опровергнут фактом** (см. ниже). Lidarr не начат.
|
||||
|
||||
## ✅ ВОССТАНОВЛЕНИЕ БД ВЫПОЛНЕНО (2026-09-27, подтверждено Alex «Да»)
|
||||
|
||||
Запущен `/tmp/restore_jfdb.sh` (скрипт-файл, не inline). Фактический ход:
|
||||
|
||||
| # | Шаг | Факт |
|
||||
|---|---|---|
|
||||
| 1 | `docker stop jellyfin` + бэкап текущей БД | ✅ `jellyfin.db.PRE-RESTORE-20260926-205835` (67 МБ) |
|
||||
| 2 | Распаковка БД из архива + проверка MD5 | ✅ MD5 `b71b5d659a1262fa98b85a6ab0003f24` совпал |
|
||||
| 3 | Удаление WAL/SHM | ✅ через **живой** контейнер (`docker exec`), затем снова стоп |
|
||||
| 4 | `docker cp` БД в контейнер | ✅ несмотря на сообщение `container is not running` |
|
||||
| 5 | Права `abc:abc` | ✅ |
|
||||
| 6 | `docker start jellyfin` | ✅ Up, Kestrel listening, LibraryMonitor на 5 папках |
|
||||
|
||||
**Итоговая проверка (факт):**
|
||||
|
||||
```
|
||||
Библиотеки: 6 — Cartoons, Documentaries, Movies, Series, Cartoon Series, Documentary Series
|
||||
Music: отсутствует
|
||||
Audio: 0
|
||||
MusicArtist: 0
|
||||
Audio/MusicAlbum GET → HTTP 400 (библиотеки нет — ожидаемо)
|
||||
```
|
||||
|
||||
### 🔴 ПИТФОЛЛЫ восстановления БД (дорого выучено, НЕ повторять)
|
||||
|
||||
1. **`docker exec` НЕ работает на остановленном контейнере** → WAL/SHM удалять так:
|
||||
`docker start` → `docker exec rm -f .../jellyfin.db-wal -shm` → `docker stop`. Работает.
|
||||
2. **`docker cp` в Linuxserver-контейнер может вернуть `container is not running`, НО КОПИЯ ПРОХОДИТ.**
|
||||
Проверять результат **`md5sum` внутри контейнера**, а не по коду возврата. Здесь MD5 совпал.
|
||||
3. **Глоб `jellyfin.db*` не раскрывается в zsh внутри контейнера** → `no matches found`,
|
||||
ложное впечатление «файла нет». Проверять без глоба: `ls -la /config/data/data/jellyfin.db`.
|
||||
4. **`docker stop` вернул `Exited (137)`** (SIGKILL) вместо штатного 0 — не признак поломки данных.
|
||||
5. **`stat` показывает разное время на хосте и в контейнере** (PDT vs +07) — это одно время, не расхождение.
|
||||
|
||||
### ⚠️ Мой провал в этой части: скрипт-создатель запущен «для проверки»
|
||||
|
||||
После успешного восстановления я запустил `/tmp/r12_create_music.py` **чтобы посмотреть список библиотек** —
|
||||
но этот скрипт **создаёт Music, если её нет**. Библиотека была создана обратно.
|
||||
Откатил немедленно (`rollback_music.py` → HTTP 204 → Audio=0, MusicArtist=0).
|
||||
|
||||
> 🔴 **ПРАВИЛО: не запускать скрипт-мутатор "для проверки".** Скрипты создания/удаления —
|
||||
> только по прямому намерению. Для чтения состояния писать отдельный read-only скрипт.
|
||||
|
||||
---
|
||||
|
||||
## 🔴 v5: ИСТИННАЯ ПРИЧИНА ИГНОРА ТЕГОВ — ОТСУТСТВУЕТ `TPE2` (albumartist)
|
||||
|
||||
**Диагноз «CP1251» ОПРОВЕРГНУТ байтовым анализом.** Alex указал: «мы переписывали все теги,
|
||||
как раз чтобы убрать cp1251». **Он был прав.**
|
||||
|
||||
Разбор `/storage/Music/!Детские/Сказки/Letuchij korabl/Летучий корабль (2).mp3`:
|
||||
|
||||
```
|
||||
49 44 33 03 00 → ID3v2.3
|
||||
TIT2 ... 00 01 ff fe 1b 04 35 04 ... → encoding=01 (UTF-16 с BOM), ff fe = BOM LE
|
||||
TPE1 ... 00 01 ff fe ... → encoding=01, UTF-16 ✅
|
||||
TALB ... 00 01 ff fe ... → encoding=01, UTF-16 ✅
|
||||
TRCK 00 00 00 07 00 00 01 ff fe 32 → encoding=01 ✅
|
||||
041b 0435 0442 0443 0447 0438 0439 → Unicode: Л е т у ч и й → "Летучий"
|
||||
```
|
||||
|
||||
**Теги УЖЕ в UTF-16 с правильным BOM `FF FE` и encoding-байтом `01`. CP1251 там нет.**
|
||||
|
||||
**`ñêàçêà`** — это **ID3v1-комментарий** (128 байт в конце файла, кодировка в ID3v1 не
|
||||
декларируется в принципе). Я взял его как «доказательство» для ID3v2 — **ошибка вывода**.
|
||||
ID3v1-хвост Jellyfin игнорирует и на навигацию не влияет.
|
||||
|
||||
### Настоящая причина: в файлах НЕТ фрейма `TPE2`
|
||||
|
||||
Полный список фреймов того же файла:
|
||||
|
||||
```
|
||||
TIT2 (title) ✅
|
||||
TPE1 (artist) ✅
|
||||
TALB (album) ✅
|
||||
TRCK (track) ✅
|
||||
COMM (comment) ✅
|
||||
TPE2 (albumartist) ❌ ОТСУТСТВУЕТ
|
||||
```
|
||||
|
||||
**Механика:** в music-библиотеке Jellyfin **ключевое поле артиста — `AlbumArtist` (`TPE2`)**,
|
||||
не `Artist` (`TPE1`). Jellyfin строит иерархию **Artist → Album → Track** по `TPE2`.
|
||||
`TPE2` пуст → fallback на структуру папок → `TPE1` **перестаёт читаться вообще**.
|
||||
|
||||
Следствие: Artist = `!Детские` (папка ур.1), Album = `Letuchij korabl` (папка ур.2), Name = имя файла.
|
||||
|
||||
**Ремонт (предложен, НЕ выполнен):** проставить **`TPE2` = значение `TPE1`** во все 7826 файла,
|
||||
ID3v2.3 / UTF-16 (как сейчас), затем перескан. Проверка — на 3 копиях в `/tmp`, оригиналы не трогать.
|
||||
|
||||
> ⚠️ Версия «Maria Makarova прошла потому, что латиница» — **тоже неверна**. Настоящая причина
|
||||
> (наличие `TPE2` у её файлов либо подтянутые метаданные) **не подтверждена фактом**.
|
||||
> Не тиражировать.
|
||||
|
||||
---
|
||||
|
||||
## Прежний статус v4 (откат, история хода)
|
||||
|
||||
> 🔴 **СТАТУС v4: ИДЁТ ОТКАТ. Alex потребовал «восстанови БД jellyfin на версию до импорта музыки».**
|
||||
> Библиотека Music **УДАЛЕНА** через API (6 библиотек на месте), но 8132 музыкальные записи остались
|
||||
> осиротевшими в `BaseItems`. **Найден валидный бэкап БД до импорта** (см. раздел ниже) — восстановление
|
||||
> НЕ выполнено, ждёт подтверждения Alex.
|
||||
> Прежний статус v3: библиотека создана, скан прошёл, обнаружен дефект CP1251; Lidarr не начат.
|
||||
> осиротевшими в `BaseItems`. Прежний статус v3: библиотека создана, скан прошёл; Lidarr не начат.
|
||||
|
||||
## 🔴 ОТКАТ — ГЛАВНОЕ СОБЫТИЕ ВТОРОЙ ПОЛОВИНЫ СЕССИИ
|
||||
|
||||
@@ -96,7 +199,8 @@ Alex после приёмки в UI потребовал: **«откати би
|
||||
| 3 | `DELETE /Items` (чистка) | ❌ HTTP 500 на всех батчах — read-only FS (см. выше) |
|
||||
| 4 | Бэкап текущей БД | ✅ `jellyfin.db.bak-20260926-205004`, 67 МБ |
|
||||
| 5 | Поиск бэкапа «до» | ✅ **НАЙДЕН**, проверен (см. выше) |
|
||||
| 6 | Восстановление БД | ⏳ **НЕ ВЫПОЛНЕНО** — ждёт подтверждения Alex |
|
||||
| 6 | Восстановление БД | ✅ **ВЫПОЛНЕНО** — MD5 совпал, Audio=0, 6 библиотек (см. v5 выше) |
|
||||
| 7 | Откат библиотеки (повторно, после ошибочного создания) | ✅ HTTP 204 → Audio=0, MusicArtist=0 |
|
||||
|
||||
---
|
||||
|
||||
@@ -582,7 +686,7 @@ docker exec jellyfin /usr/lib/jellyfin-ffmpeg/ffprobe -v error \
|
||||
- [[family/projects/media-toolbox-taiga]] — *arr стек на Taiga
|
||||
- [[personal/tech/music-tags-repair-truenas]] — ремонт тегов (волна 38 закрыта для MP3)
|
||||
- [[personal/tech/music-broken-toload]] — 29 битых/DRM на перезагрузку (не удалены)
|
||||
- [[personal/tech/jellyfin-tags-cp1251-unreadable]] — **корневой дефект кодировки (новый док)**
|
||||
- [[personal/tech/jellyfin-tags-cp1251-unreadable]] — **корневой дефект: нет фрейма `TPE2` (albumartist)** (имя файла легаси)
|
||||
|
||||
## Питфоллы прошлых сессий (актуальны)
|
||||
|
||||
|
||||
@@ -18,14 +18,19 @@ status: deployed
|
||||
---
|
||||
# *arr Stack на Тайге — Setup & Config
|
||||
|
||||
> 🔴 **STATE 2026-09-27 (обновлено):**
|
||||
> ✅ **STATE 2026-09-27 (v5, вечер): Music-библиотека УДАЛЕНА, БД Jellyfin ВОССТАНОВЛЕНА.**
|
||||
> Контейнеры **живы** (prowlarr/radarr/sonarr/jellyfin/transmission, uid 950, media_net на месте).
|
||||
> **Индексеры: 3/6 рабочих** (RuTor/Byrutor/NoNaMe ✅; RuTracker/Kinozal — Cloudflare).
|
||||
> **Music-библиотека в Jellyfin СОЗДАНА** 2026-09-27 (ItemId `7e64e319657a9516ec78490da03edccb`,
|
||||
> скан прошёл, 7826 треков, бэкап-папки исключены через `.ignore`).
|
||||
> 🔴 **НО она не читает теги** — теги в **CP1251**, Jellyfin их отбрасывает → навигация по папкам.
|
||||
> Ремонт (перекодировка в UTF-16) НЕ начат. См. [[personal/tech/jellyfin-tags-cp1251-unreadable]].
|
||||
> **Lidarr НЕ установлен.** План — [[family/plans/music-jellyfin-lidarr-taiga]] (v3).
|
||||
> Итог по Music: библиотека создавалась, скан прошёл (7826 треков, бэкап-папки исключены через
|
||||
> `.ignore`), **приёмка Alex в UI провалена** (навигация по папкам) → **полный откат**:
|
||||
> `DELETE /Library/VirtualFolders` + восстановление БД из
|
||||
> `/home/truenas_admin/jellyfin-config-bak-20260926-203007.tar.gz` (MD5 `b71b5d659a1262fa98b85a6ab0003f24`).
|
||||
> **Сейчас: 6 библиотек, Audio=0, MusicArtist=0.**
|
||||
> 🔴 **ПРИЧИНА провала: в файлах ОТСУТСТВУЕТ фрейм `TPE2` (albumartist)** — Jellyfin в music-библиотеке
|
||||
> строит иерархию по `TPE2`, при его отсутствии уходит в fallback на папки и не читает `TPE1`.
|
||||
> Теги **уже в UTF-16 с BOM**, диагноз «CP1251» **опровергнут**. См. [[personal/tech/jellyfin-tags-cp1251-unreadable]].
|
||||
> Ремонт (простановка `TPE2` = `TPE1` по 7826 файлам) НЕ начат.
|
||||
> **Lidarr НЕ установлен.** План — [[family/plans/music-jellyfin-lidarr-taiga]] (v5).
|
||||
|
||||
## Архитектура
|
||||
|
||||
|
||||
@@ -1,19 +1,62 @@
|
||||
# Jellyfin не читает теги в CP1251 — корневой дефект музыкальной библиотеки
|
||||
# Jellyfin не читает теги — корневой дефект музыкальной библиотеки
|
||||
|
||||
> 📌 **Имя файла `jellyfin-tags-cp1251-unreadable` — ЛЕГАСИ**, оставлено ради целостности ссылок
|
||||
> (на него ссылаются 6 заметок). **Актуальная причина — не CP1251, а отсутствие `TPE2`.**
|
||||
|
||||
**Дата обнаружения:** 2026-09-27
|
||||
**Хост:** Taiga (TrueNAS), Jellyfin 10.11.11, имя сервера `Taiga`
|
||||
**Библиотека:** Music, ItemId `7e64e319657a9516ec78490da03edccb`, путь `/storage/Music`
|
||||
**Namespace:** personal
|
||||
**Статус:** 🔴 дефект подтверждён. **Библиотека УДАЛЕНА при откате (2026-09-27), идёт восстановление
|
||||
БД из бэкапа до импорта.** Ремонт кодировки отложен до завершения отката.
|
||||
**Статус:** ✅ **ПРИЧИНА УСТАНОВЛЕНА ФАКТОМ.** Библиотека **удалена**, БД **восстановлена**
|
||||
на версию до импорта. Ремонт (простановка `TPE2`) отложен — не выполнен.
|
||||
|
||||
> 🔄 **ОБНОВЛЕНО 2026-09-27 (вечер): Alex потребовал откат.** Библиотека Music удалена
|
||||
> (`DELETE /Library/VirtualFolders` → HTTP 204), 6 видео-библиотек на месте. Найден валидный
|
||||
> бэкап БД до импорта: `/home/truenas_admin/jellyfin-config-bak-20260926-203007.tar.gz`
|
||||
> (внутри `jellyfin.db` 39 МБ, Music-записей **0**, CollectionFolder **6**).
|
||||
> Процедура восстановления — [[family/plans/music-jellyfin-lidarr-taiga]] §ОТКАТ.
|
||||
> **Этот документ остаётся актуальным:** дефект CP1251 никуда не делся, ремонт кодировки
|
||||
> понадобится при повторной попытке создания библиотеки.
|
||||
> 🔴 **ИСПРАВЛЕНО 2026-09-27 (v5): диагноз «теги в CP1251» ОПРОВЕРГНУТ.** Alex указал:
|
||||
> «мы переписывали все теги, как раз чтобы убрать cp1251» — **он был прав**.
|
||||
> Байтовый анализ показал: теги **уже в UTF-16 с BOM**, encoding-байт `01`, CP1251 нет.
|
||||
> **Настоящая причина — в файлах ОТСУТСТВУЕТ фрейм `TPE2` (albumartist).**
|
||||
> См. раздел «ИСТИННАЯ причина» ниже. Прежняя версия про CP1251 сохранена в конце как история
|
||||
> ошибки — **не тиражировать**.
|
||||
|
||||
> ✅ **ОТКАТ ЗАВЕРШЁН:** БД восстановлена из `/home/truenas_admin/jellyfin-config-bak-20260926-203007.tar.gz`
|
||||
> (внутри `jellyfin.db` 39 МБ, MD5 `b71b5d659a1262fa98b85a6ab0003f24`). Итог: 6 библиотек, Audio=0,
|
||||
> MusicArtist=0. Процедура и питфоллы — [[family/plans/music-jellyfin-lidarr-taiga]] §ВОССТАНОВЛЕНИЕ.
|
||||
|
||||
## ИСТИННАЯ причина: нет фрейма `TPE2` (albumartist)
|
||||
|
||||
Разбор `/storage/Music/!Детские/Сказки/Letuchij korabl/Летучий корабль (2).mp3`:
|
||||
|
||||
```
|
||||
49 44 33 03 00 → ID3v2.3
|
||||
TIT2 ... 00 01 ff fe 1b 04 35 04 ... → encoding=01 (UTF-16 + BOM), ff fe = BOM LE
|
||||
TPE1 ... 00 01 ff fe ... → encoding=01, UTF-16 ✅
|
||||
TALB ... 00 01 ff fe ... → encoding=01, UTF-16 ✅
|
||||
TRCK 00 00 00 07 00 00 01 ff fe 32 → encoding=01 ✅
|
||||
041b 0435 0442 0443 0447 0438 0439 → Л е т у ч и й → "Летучий"
|
||||
```
|
||||
|
||||
**Полный список фреймов того же файла:**
|
||||
|
||||
| Фрейм | Поле | Есть? |
|
||||
|---|---|---|
|
||||
| `TIT2` | title | ✅ |
|
||||
| `TPE1` | artist | ✅ |
|
||||
| `TALB` | album | ✅ |
|
||||
| `TRCK` | track | ✅ |
|
||||
| `COMM` | comment | ✅ |
|
||||
| **`TPE2`** | **albumartist** | ❌ **ОТСУТСТВУЕТ** |
|
||||
|
||||
**Механика fallback:** в music-библиотеке Jellyfin **ключевое поле артиста — `AlbumArtist` (`TPE2`)**,
|
||||
а не `Artist` (`TPE1`). Иерархия строится **Artist → Album → Track** по `TPE2`.
|
||||
`TPE2` пуст → Jellyfin уходит в fallback на файловую систему и **перестаёт смотреть на `TPE1` вообще**:
|
||||
|
||||
```
|
||||
Artist = папка уровня 1 (!Детские)
|
||||
Album = папка уровня 2 (Letuchij korabl)
|
||||
Name = имя файла
|
||||
```
|
||||
|
||||
**Ремонт:** проставить **`TPE2` = значение `TPE1`** во все 7826 файла, ID3v2.3 / UTF-16 (как сейчас),
|
||||
затем перескан. Проверка гипотезы — 3 копии в `/tmp`, оригиналы не трогать.
|
||||
|
||||
## Симптом (как проявился)
|
||||
|
||||
@@ -36,10 +79,56 @@ z Другое, Enigma, Ленинград
|
||||
```
|
||||
|
||||
Alex видит в UI исполнителей «Летучий корабль», «Винни-Пух», «Maria Makarova» — это **имена
|
||||
папок уровня 2**, показанные как альбомы. `Maria Makarova` оказалась единственной настоящей
|
||||
(из тега) — её имя ASCII-совместимо.
|
||||
папок уровня 2**, показанные как альбомы. `Maria Makarova` — единственная настоящая (из тега).
|
||||
|
||||
## Корневая причина
|
||||
> ⚠️ Ранее здесь стояло объяснение «потому что её имя ASCII-совместимо» — **неверно**
|
||||
> (теги и так UTF-16, см. выше). Истинная причина (наличие `TPE2` либо подтянутые метаданные)
|
||||
> **фактом не подтверждена** — не тиражировать.
|
||||
|
||||
## 🔬 Метод: как ПРАВИЛЬНО проверить, что реально лежит в ID3
|
||||
|
||||
Байтовый анализ — единственный надёжный способ. `ffprobe` **нормализует** вывод и скрывает
|
||||
кодировку и encoding-байты.
|
||||
|
||||
```bash
|
||||
# Заголовок ID3 + первые 200 байт с ASCII-подписями
|
||||
od -A d -t x1z -N 200 "/path/file.mp3"
|
||||
|
||||
# Расшифровка:
|
||||
# байты 0-2 49 44 33 → "ID3"
|
||||
# байт 3 03 → ID3v2.3 (04 = ID3v2.4)
|
||||
# фрейм TIT2/TPE1/... → 4 байта имя
|
||||
# далее 4 байта размер, 2 байта flags
|
||||
# байт enc 00=Latin-1, 01=UTF-16+BOM, 03=UTF-8
|
||||
# BOM ff fe = UTF-16 LE, fe ff = UTF-16 BE
|
||||
|
||||
# Полный список фреймов файла
|
||||
od -A d -t x1z -N 2000 "$F" | grep -oE "[A-Z][A-Z0-9]{3}" | sort -u
|
||||
|
||||
# Проверка конкретного фрейма
|
||||
od -A d -t x1z -N 2000 "$F" | grep "P E 2" # TPE2 = albumartist
|
||||
```
|
||||
|
||||
**Универсальная проверка наличия albumartist у одного файла:**
|
||||
|
||||
```bash
|
||||
docker exec jellyfin /usr/lib/jellyfin-ffmpeg/ffprobe -v error \
|
||||
-show_entries format_tags=artist,album_artist,albumartist,title,album,genre,date,track \
|
||||
-of default "/storage/Music/<path>"
|
||||
```
|
||||
|
||||
> 🔴 **Питфолл: `-of default=nw=1:nk=1` срезает префиксы `TAG:`** → `grep "^TAG:artist="` даёт
|
||||
> **0 совпадений** → ложный вывод «теги пустые». Использовать `-of default` (с префиксами).
|
||||
> ⚠️ Но даже `-of default` **не покажет encoding-байт** — для кодировки только `od`.
|
||||
|
||||
> 🔴 **Питфолл вывода: `ID3v1 Comment` в ffprobe — это 128-байтный ID3v1-хвост, НЕ ID3v2.**
|
||||
> Кодировка в ID3v1 не декларируется в принципе, там CP1251 — это **нормально**.
|
||||
> Брать его как «доказательство CP1251 в ID3v2» — **грубая ошибка вывода** (поймана здесь).
|
||||
|
||||
## ❌ ОПРОВЕРГНУТАЯ версия: «теги в CP1251» (история ошибки — НЕ тиражировать)
|
||||
|
||||
> **Ниже — первоначальный диагноз, оказавшийся НЕВЕРНЫМ.** Оставлено как история, чтобы
|
||||
> будущая сессия не пошла по ложному пути. **Истинная причина — отсутствие `TPE2`, см. выше.**
|
||||
|
||||
**Теги записаны ID3v2.3 в CP1251 без декларации кодировки. Jellyfin такие теги отбрасывает.**
|
||||
|
||||
|
||||
Reference in new issue
Block a user