Files
obsidian-vault/family/how-to/jellyfin-config.md
T

17 KiB
Executable File
Raw Blame History

title, created, updated, type, namespace, tags, related
title created updated type namespace tags related
Jellyfin Config 2026-05-23 2026-09-26 tech family
jellyfin
infra
media
credentials
api
tech/arr-stack-kraken
tech/router-py

Jellyfin Config

⚠️ Обновлено 2026-09-26. Раздел ниже «URL / API Base / пути» описывает Kraken-инсталляцию (/opt/jellyfin/, /media/*, префикс /jellyfin) и устарел для TrueNAS. Живой инстанс — на TrueNAS/Taiga, раздел «### Taiga (TrueNAS) — ЖИВОЙ ИНСТАНС» ниже. Проверено фактом 2026-09-26.

Users

User Password Notes
alex (set) Admin
lisa (none) Cartoons library only

API Key

87af49b6ff62ea68da6abdab0d7a4fbc

Used by automation scripts (watchlist-sync, media-pipeline agents). ⚠️ Для TrueNAS-инстанса этот ключ НЕ работает (проверено 2026-09-26: 401 Unauthorized, в логе Invalid token). Живой ключ — в разделе Taiga ниже.

Database / Maintenance

  • Before any DB operation: docker stop jellyfin first
  • Jellyfin runs as a Docker container on Kraken
  • Config stored in /opt/jellyfin/config/ (check docker-compose for exact path)

API Endpoints (base: http://kraken:8096/jellyfin/)

Авторизация: заголовок X-MediaBrowser-Token: <API_KEY>

Что Endpoint Метод
Инфо о сервере /System/Info GET
Библиотеки (виртуальные папки) /Library/VirtualFolders GET
Поиск по типу /Items?includeItemTypes=Series&recursive=true&searchTerm=...&fields=Path GET
Удалить item /Items/{id} DELETE
Полный рескан /Items/Refresh?Recursive=true&RefreshMode=FullRefresh POST (требует Content-Type: application/json)

Библиотеки

Название Путь Назначение
Series /media/series Сериалы (симлинки от router.py из sonarr)
Movies /media/movies Фильмы
Cartoon Series /media/cartoons-series Мультсериалы
Cartoons /media/cartoons Мультфильмы
Documentaries /media/documentaries Документалки
Documentary Series /media/documentaries-series Документальные сериалы
Music (пусто — библиотека не создана) Музыка — заблокировано до починки тегов (см. Taiga-раздел ниже)

Важно: Прямые пути sonarr (/media/series-sonarr/, /media/movies-radarr/) не должны быть в библиотеках Jellyfin. Router.py создаёт симлинки из sonarr-папок в /media/series/ и /media/movies/. Если symlink уже есть — дубли не появятся. Если есть старые дубли — удалить orphaned items через DELETE /Items/{id}.


### Taiga (TrueNAS) — ЖИВОЙ ИНСТАНС

✅ Факт-проверка 2026-09-26. Всё ниже — с живой машины, не из Kraken-доки.

✅ Проверено 2026-09-26 (повторно, разведка под Lidarr): нижеприведённые данные подтверждены на живой машине. Музыкальной библиотеки по-прежнему нет, ремонт тегов не начат (этап 3 плана — апрув Alex по CSV v2). Дополнительно найдено: индексеры Prowlarr не работают (DNS-фильтр провайдера Тайги) → новый контент в Music через Lidarr сейчас невозможен. См. personal/plans/lidarr-taiga-and-indexer-unblock.

🔴 ДИАГНОСТИЧЕСКАЯ ЛОВУШКА, проверено 2026-09-26. Ранее в этой доке было записано «ключ 87af49b6ff62ea68da6abdab0d7a4fbc НЕ работает для TrueNAS (401 Unauthorized)». Это НЕВЕРНО. GET /System/Info без токена → 401 — это нормальное поведение живого сервера, а не признак неверного ключа. С префиксом /jellyfin/System/Info → 404 (префикса на Тайге нет). Оба наблюдения легко принять за поломку. Живой ключ — eaglesetup2026taiga (раздел Taiga ниже); проверять ключ запросом с заголовком, а не по 401 на запросе без токена.

Расположение и монтирование

Параметр Значение
Хост TrueNAS (192.168.2.197), доступ ssh truenas_admin@mallexxx.duckdns.org
Контейнер jellyfin, образ из /mnt/RED_2TB/docker/arr/docker-compose.yml
URL (наружу) https://jellyfin.mallexxx.duckdns.org (Caddy)
Внутренний порт 8096 — БЕЗ префикса /jellyfin (префикс был Kraken-спецификой)
Монтирование 1 /mnt/RED_2TB/docker/arr/jellyfin → /config (rw)
Монтирование 2 /mnt/RED_2TB/storage → /storage (ro)
Сеть caddy_default (только; media_net не подключён)

API-ключ (живой)

eaglesetup2026taiga — имя ключа eagle-setup.

Источник (когда нужно перечитать): таблица ApiKeys в /mnt/RED_2TB/docker/arr/jellyfin/data/data/jellyfin.db.

# Снять копию БД (безопасно; контейнер не останавливать для ЧТЕНИЯ копии)
cd /tmp && ssh truenas_admin@mallexxx.duckdns.org \
  'cat /mnt/RED_2TB/docker/arr/jellyfin/data/data/jellyfin.db' > jf-copy.db
sqlite3 jf-copy.db "SELECT Name, AccessToken FROM ApiKeys;"

🔴 sqlite3 на TrueNAS-хосте НЕ установлен (в доке встречается обратное). Рабочий приём: скопировать .db на Mac (cat через ssh) → читать локальным sqlite3. ⚠️ Копия .db без -wal может отставать (WAL-режим). Для чтения ключа/списка библиотек этого достаточно — проверено, значения совпали с живыми.

Библиотеки (фактическое состояние 2026-09-26)

6 библиотек в BaseItems (тип MediaBrowser.Controller.Entities.CollectionFolder):

Название CollectionType PhysicalLocationsList
Movies movies /config/data/root/default/Movies, /storage/Movies
Cartoons movies /config/data/root/default/Cartoons, /storage/Cartoons
Documentaries movies /config/data/root/default/Documentaries, /storage/documentaries
Series tvshows /config/data/root/default/Series, /storage/series
Cartoon Series tvshows /config/data/root/default/Cartoon Series, /storage/cartoons-series
Documentary Series tvshows /config/data/root/default/Documentary Series, /storage/documentaries-series

📌 У каждой виртуальной папки ДВА пути: служебный /config/data/root/default/<Name> (создаётся Jellyfin автоматически) и реальный /storage/<Folder>. Реальный путь дополнительно виден как MediaBrowser.Controller.Entities.Folder с собственным Id. Music-библиотеки на 2026-09-26 НЕТ (в доке строка Music была пустой и остаётся незаполненной — см. план ниже).

Папка музыки — разведка 2026-09-26

Параметр Значение
Хост-путь /mnt/RED_2TB/storage/Music
В контейнере /storage/Music — уже смонтировано, доп. монтирование НЕ нужно
Объём 7890 аудиофайлов (mp3/flac/m4a/ogg/wav/opus/aac)
Структура 8 категорий: !A Not sorted, !Pop, Club, Любэ, !Retro, !Rock&Folk, !Барды, !Детские, !Классика, !Рэп, z Другое, Enigma, Ленинград
Мусор bootmgr, .DS_Store, desktop.ini, Thumbs.db, convert_wma.sh, wma_convert.log — Jellyfin игнорирует
Права truenas_admin:truenas_admin, drwxrwx--- (для PUID/PGID 921 путь доступен — /storage монтируется целиком)

⚠️ Структура папок НЕ соответствует музыкальной раскладке (Artist/Album). Jellyfin для collectionType=music раскладывает по тегам, а не по папкам. Категории вида !Rock&Folk — «мусорные» имена из файловой системы, не артисты. Ожидаемый риск: файлы с пустыми тегами уедут в Unknown Artist. Вариант митигации — EnableFolderView в настройках библиотеки (даёт навигацию по физическим папкам).

🔴 ПОДТВЕРЖДЕНО ФАКТОМ 2026-09-26: теги массово битые. Полная инвентаризация v2 (7906 файлов) дала точные цифры: partial 2920, mojibake 2759, empty 1026, lost 662 (\ufffd — данные уничтожены, только перезапись из имён), clean 537, corrupt 2, probe_failed 0. Полный разбор, план ремонта и CSV с предлагаемыми исправлениями — personal/tech/music-tags-repair-truenas. Пока теги не починены — Music-библиотеку не создавать.

🔴 ПИТФОЛЛ ffprobe (2026-09-26): ffprobe молча отдаёт пустые теги для валидного ID3v2.3 с битым фреймом (напр. comment='eng') — exit=0, пустой JSON, без ошибки. Так было потеряно 343 файла (Высоцкий и др.). Читать ID3 напрямую из байтов (id3_direct.py). Детали — personal/tech/music-tags-repair-truenas.

📋 ДОКУМЕНТЫ РЕВЬЮ ДЛЯ ALEX (2026-09-26, редакция v7) — CSV с предлагаемыми исправлениями выдан не только файлом, но и нотами в vault (personal/plans/music-tags-review/): обзор + 3 блока. Формат v7 (утверждён Alex): 1-needs-decision — папки + чекбоксы (осталось 4 файла); 2-medium-confidence (5811) и 3-high-confidence (958) — плоские списки - **файл.mp3** → artist — title, без заголовков и оглавлений. Один файл = одна строка. Это вход для апрува (шаг 3 плана ремонта). Генератор — render_grouped_doc.py в ~/Developer/personal-os/tools/music-tags/. Залито коммитом 4464e64, синкнуто. Разбор волн 5–8 и питфоллы — personal/tech/music-tags-repair-truenas.

✅ Порядок работ (решение Alex 2026-09-26): ремонт тегов → валидация Alex → удаление Music/backup/ → только потом создание Music-библиотеки. Бэкап кладётся в Music/backup/ и сносится до добавления библиотеки, поэтому исключать backup в настройках Jellyfin не нужно.

🔴 НОВЫЙ БЛОКЕР (2026-09-26, девятая волна): NAS mallexxx НЕ резолвится с Mac. Проверено: ssh truenas_admin@mallexxx → Could not resolve hostname; 192.168.1.100 → timeout (реальный IP в этой доке — 192.168.2.197); ~/.ssh/config записи про NAS не содержит. /mnt/RED_2TB на Mac не смонтирован. Следствие: ни создание библиотеки (шаг 2), ни применение тегов сейчас невозможны — mp3 и API Jellyfin недостижимы. Работа идёт в локальном CSV. Перед планированием любых операций с Music сначала проверять доступность NAS.

⚠️ Ориентир для плана: NAS-хост в этой доке — 192.168.2.197 (не 192.168.1.100). Доступ объявлен как ssh truenas_admin@mallexxx.duckdns.org — в девятой волне он не разрешился, причина не выяснена (сеть на Mac / DNS / NAS выключен).

API-команды (Taiga, без префикса)

TOKEN=eaglesetup2026taiga
# Список библиотек
curl -s -H "X-MediaBrowser-Token: $TOKEN" http://localhost:8096/Library/VirtualFolders
# Инфо о сервере
curl -s -H "X-MediaBrowser-Token: $TOKEN" http://localhost:8096/System/Info

🔴 /System/Info без токена → 401 — это НЕ поломка. Именно так и выглядит живой сервер. С префиксом /jellyfin/System/Info → 404 (префикса нет). Оба наблюдения 2026-09-26, оба могут сбить с толку при диагностике.

🔴 ПИТФОЛЛ: name и paths — в QUERY STRING, не в body

Создание библиотеки (Jellyfin 10.11):

# ПРАВИЛЬНО:
curl -s -X POST -H "X-MediaBrowser-Token: $TOKEN" \
  "http://localhost:8096/Library/VirtualFolders?name=Music&collectionType=music&paths=/storage/Music"
# НЕПРАВИЛЬНО: name/paths в JSON-body → библиотека не создаётся

ПЛАН: добавить музыкальную библиотеку (согласован 2026-09-26, ЗАБЛОКИРОВАН)

🔴 ПЛАН ПЕРЕСМОТРЕН 2026-09-26 (позже в тот же день). Полная инвентаризация тегов (7906 файлов) подтвердила массовую порчу метаданных: mojibake + уничтоженные теги. Решение Alex: сначала починить теги, потом создавать библиотеку. Текущая работа — personal/tech/music-tags-repair-truenas (этапы 1–2 готовы в редакции v2, ждём апрув по CSV; CSV v1 был отклонён Alex за неразобранные probe_failed). Создавать collectionType=music на битых тегах бессмысленно: Jellyfin раскладывает музыку по тегам, не по папкам — получится свалка Unknown Artist.

6 шагов, в порядке исполнения (шаг 2 заблокирован до починки тегов):

  1. Бэкап конфига — docker stop jellyfin → tar /mnt/RED_2TB/docker/arr/jellyfin/ → docker start jellyfin. Без остановки бэкап БД битый (WAL).
  2. Создать библиотеку — POST /Library/VirtualFolders?name=Music&collectionType=music&paths=/storage/Music (query string!).
  3. Проверка API — GET /Library/VirtualFolders → Music в списке.
  4. Скан — дождаться индексации 7890 файлов (~10–30 мин).
  5. ПРИЁМКА ALEX — открыть https://jellyfin.mallexxx.duckdns.org → вкладка Music → треки видны. Приёмка = видно в UI, не «API отвечает».
  6. Обновить доки после подтверждения — таблица библиотек здесь + family/projects/media-toolbox-taiga.md.

❓ Открытый выбор перед шагом 2: включать ли EnableFolderView (навигация по папкам вместо тегов). Решается после выборочной проверки тегов файлов.

Связанные заметки