diff --git a/family/how-to/jellyfin-config.md b/family/how-to/jellyfin-config.md index 9efa43c4..36a48276 100755 --- a/family/how-to/jellyfin-config.md +++ b/family/how-to/jellyfin-config.md @@ -70,11 +70,12 @@ Used by automation scripts (watchlist-sync, media-pipeline agents). > ✅ Факт-проверка **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-27 (третья сессия подряд):** данные подтверждены на живой машине. +> Музыкальной библиотеки по-прежнему **нет**, но **блокер «битые теги» СНЯТ** — ремонт сработал +> (выборка 108/108, `artist`+`title` на месте). Новая задача — создать библиотеку с исключением +> 4 бэкап-папок через `.ignore`. См. [[family/plans/music-jellyfin-lidarr-taiga]]. +> ⚠️ По-прежнему: **индексеры Prowlarr работают 3/6** (RuTor/Byrutor/NoNaMe ✅; +> RuTracker/Kinozal — Cloudflare, нужен FlareSolverr, не установлен). > 🔴 **ДИАГНОСТИЧЕСКАЯ ЛОВУШКА, проверено 2026-09-26.** Ранее в этой доке было записано > «ключ `87af49b6ff62ea68da6abdab0d7a4fbc` НЕ работает для TrueNAS (`401 Unauthorized`)». @@ -126,31 +127,43 @@ sqlite3 jf-copy.db "SELECT Name, AccessToken FROM ApiKeys;" | Documentary Series | `tvshows` | `/config/data/root/default/Documentary Series`, `/storage/documentaries-series` | > 📌 **У каждой виртуальной папки ДВА пути:** служебный `/config/data/root/default/` (создаётся Jellyfin автоматически) и реальный `/storage/`. Реальный путь дополнительно виден как `MediaBrowser.Controller.Entities.Folder` с собственным `Id`. -> **Music-библиотеки на 2026-09-26 НЕТ** (в доке строка `Music` была пустой и остаётся незаполненной — см. план ниже). +> **Music-библиотеки на 2026-09-27 по-прежнему НЕТ** — но блокер снят (теги чистые, см. ниже). +> Готова к созданию: [[family/plans/music-jellyfin-lidarr-taiga]] (ждёт ответа Alex по конфликту решений). -## Папка музыки — разведка 2026-09-26 +## Папка музыки — разведка 2026-09-27 (обновлено) | Параметр | Значение | |---|---| | Хост-путь | `/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, Ленинград` | +| Объём (без бэкапов) | **7861** mp3/аудио в **9** категориях | +| Объём (бэкап-папки) | **7316** файлов, ~48 ГБ — исключить из библиотеки | +| Структура | 9 категорий: `!A Not sorted` (203), `!Pop, Club, Любэ` (1766), `!Retro` (236), `!Rock&Folk` (3199), `!Барды` (291), `!Детские` (570), `!Классика` (20), `!Рэп` (537), `z Другое, Enigma, Ленинград` (1039) | +| Бэкап-папки | `backup` (7041), `backup_conv40` (40), `backup_fix` (165), `backup_raw` (70) | | Мусор | `bootmgr`, `.DS_Store`, `desktop.ini`, `Thumbs.db`, `convert_wma.sh`, `wma_convert.log` — Jellyfin игнорирует | -| Права | `truenas_admin:truenas_admin`, `drwxrwx---` (для `PUID/PGID 921` путь доступен — `/storage` монтируется целиком) | +| Права | `truenas_admin:truenas_admin`, `drwxrwx---`; в контейнере видны как `abc abc` (uid 950) | -> ⚠️ **Структура папок НЕ соответствует музыкальной раскладке** (`Artist/Album`). Jellyfin для `collectionType=music` раскладывает по **тегам**, а не по папкам. Категории вида `!Rock&Folk` — «мусорные» имена из файловой системы, не артисты. Ожидаемый риск: файлы с пустыми тегами уедут в `Unknown Artist`. Вариант митигации — `EnableFolderView` в настройках библиотеки (даёт навигацию по физическим папкам). +> ❌ **НЕ выдумывать категорию «композиторы»** — категорий ровно 9, список выше исчерпывающий. -> 🔴 **ПОДТВЕРЖДЕНО ФАКТОМ 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-библиотеку не создавать.** +> 🎉 **ТЕГИ ЧИСТЫЕ (проверено фактом 2026-09-27).** Выборка **108 файлов** — по 12 из каждой +> из 9 категорий, через `/usr/lib/jellyfin-ffmpeg/ffprobe` внутри контейнера jellyfin: +> **108/108 имеют `artist`+`title`. Мойибаке — 0. Пустых — 0.** +> Полная инвентаризация 7861 файла не завершена (скрипт `survey_ff.sh` на NAS). +> Прежние цифры (`mojibake` 2759, `lost` 662) — **состояние ДО 38-й волны**, а не текущее. +> Детали ремонта — [[personal/tech/music-tags-repair-truenas]]. + +> ⚠️ **Структура папок НЕ соответствует музыкальной раскладке** (`Artist/Album`). Jellyfin для `collectionType=music` раскладывает по **тегам**, а не по папкам — при чистых тегах это даст нормальные `Artist/Album`. `EnableFolderView` остаётся полезным как дополнение (навигация по категориям-папкам), но больше не обязателен. + +> ✅ **Про 29 остаточных дефектов:** 16 битых + 13 DRM (нерепарируемы, `backup_raw` идентичен +> диску) — [[personal/tech/music-broken-toload]]. Ждут перезагрузки. **Не блокер библиотеки** — +> можно исключить точечно или оставить уехать в `Unknown`. > 🔴 **ПИТФОЛЛ `ffprobe` (2026-09-26):** `ffprobe` **молча отдаёт пустые теги** для валидного > ID3v2.3 с битым фреймом (напр. `comment='eng'`) — `exit=0`, пустой JSON, без ошибки. Так было > потеряно 343 файла (Высоцкий и др.). Читать ID3 **напрямую из байтов** (`id3_direct.py`). > Детали — [[personal/tech/music-tags-repair-truenas]]. +> ⚠️ **Дополнение 2026-09-27:** при парсинге вывода ffprobe использовать `-of default` +> (префиксы `TAG:`), **не** `=nw=1:nk=1` — иначе `grep "^TAG:artist="` даёт ложный «все теги пустые». > 📋 **ДОКУМЕНТЫ РЕВЬЮ ДЛЯ ALEX (2026-09-26, редакция v7)** — CSV с предлагаемыми исправлениями выдан > не только файлом, но и нотами в vault (`personal/plans/music-tags-review/`): обзор + 3 блока. @@ -161,9 +174,39 @@ sqlite3 jf-copy.db "SELECT Name, AccessToken FROM ApiKeys;" > в `~/Developer/personal-os/tools/music-tags/`. Залито коммитом `4464e64`, синкнуто. > Разбор волн 5–8 и питфоллы — [[personal/tech/music-tags-repair-truenas]]. +> 🎉 **ОБНОВЛЕНО 2026-09-27: БЛОКЕР «битые теги» СНЯТ — ремонт сработал.** +> Выборка 108 файлов (12 на каждую из 9 категорий) через `ffprobe` из контейнера jellyfin: +> **108/108 имеют `artist`+`title`, мойибаке — 0, пустых — 0.** Цифры «2759 mojibake / 662 lost» +> относились к состоянию **ДО** 38-й волны (7041+165+41 правка применены). +> 40 файлов, «убитых» `fix40.py`, восстановлены из `backup_conv40` — целые, с тегами. +> **Следствие: Фаза 3 (создание Music-библиотеки) разблокирована.** +> Актуальный план — [[family/plans/music-jellyfin-lidarr-taiga]] (v2, статус: ждёт ответа Alex +> по конфликту с его же решением от 2026-09-26 «Music не трогать»). +> Остаточные дефекты — 29 файлов (16 битых + 13 DRM, нерепарируемы) в [[personal/tech/music-broken-toload]]. + > ✅ **Порядок работ (решение Alex 2026-09-26):** ремонт тегов → валидация Alex → удаление > `Music/backup/` → **только потом** создание Music-библиотеки. Бэкап кладётся в `Music/backup/` > и сносится до добавления библиотеки, поэтому исключать `backup` в настройках Jellyfin не нужно. +> +> ⚠️ **ПОПРАВКА 2026-09-27:** на диске **4** бэкап-папки (не одна): `backup` (7041 файл), +> `backup_conv40` (40), `backup_fix` (165), `backup_raw` (70) — итого 7316 файлов, 48 ГБ. +> Задача Alex 2026-09-27: «добавляй библиотеку за исключением бэкап-папок» → исключать +> **все 4** через пустой `.ignore` (механизм подтверждён официальной докой Jellyfin: +> пустой `.ignore` внутри папки исключает её целиком со всем содержимым, работает в 10.11.x). + +> 🎉 **`.ignore` — подтверждённый механизм исключения (2026-09-27).** +> https://jellyfin.org/docs/general/server/media/excluding-directory/ +> Пустой `.ignore` = исключить всю папку. Непустой = список паттернов в формате `.gitignore`. +> **Создать ДО первого скана** — иначе нужен рескан. Regex-исключений путей в API нет. + +> 🔧 **`ffprobe` доступен через `docker exec jellyfin`** — `/usr/lib/jellyfin-ffmpeg/ffprobe` +> (версия 7.1.4-Jellyfin). Позволяет инспектировать медиа без `docker run`: +> ```bash +> docker exec jellyfin /usr/lib/jellyfin-ffmpeg/ffprobe -v error \ +> -show_entries format_tags=artist,title -of default "/storage/Music/<файл>" +> ``` +> ⚠️ Использовать `-of default`, **НЕ** `=nw=1:nk=1` — с `nk=1` срезаются префиксы `TAG:` +> и парсинг даёт ложный «все теги пустые». > 🔴 **НОВЫЙ БЛОКЕР (2026-09-26, девятая волна): NAS `mallexxx` НЕ резолвится с Mac.** > Проверено: `ssh truenas_admin@mallexxx` → `Could not resolve hostname`; @@ -200,26 +243,28 @@ curl -s -X POST -H "X-MediaBrowser-Token: $TOKEN" \ # НЕПРАВИЛЬНО: name/paths в JSON-body → библиотека не создаётся ``` -## ПЛАН: добавить музыкальную библиотеку (согласован 2026-09-26, ЗАБЛОКИРОВАН) +## ПЛАН: добавить музыкальную библиотеку — ✅ РАЗБЛОКИРОВАН 2026-09-27 -> 🔴 **ПЛАН ПЕРЕСМОТРЕН 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`. +> 🎉 **БЛОКЕР СНЯТ 2026-09-27.** Ремонт тегов сработал (выборка 108/108 — `artist`+`title` на месте, +> мойибаке 0). Прежнее условие «сначала починить теги, потом создавать библиотеку» **выполнено**. +> Актуальный план с точными шагами и исключением бэкапов — [[family/plans/music-jellyfin-lidarr-taiga]]. +> **Статус: ждёт ответа Alex** по конфликту (его решение 2026-09-26 «Music не трогать» +> vs задача 2026-09-27 «добавляй библиотеку»). Изменений в Jellyfin не внесено. -6 шагов, в порядке исполнения (**шаг 2 заблокирован до починки тегов**): +6 шагов, в порядке исполнения (**шаг 2 разблокирован 2026-09-27**): +0. **Создать `.ignore` в 4 бэкап-папках** (`backup`, `backup_conv40`, `backup_fix`, `backup_raw`) — + ДО скана. Иначе бэкап-треки (7316 файлов) попадут в библиотеку. 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 отвечает». +4. **Скан** — дождаться индексации 7861 файла (~20–60 мин на Pentium G2020). +5. **ПРИЁМКА ALEX** — открыть `https://jellyfin.mallexxx.duckdns.org` → вкладка Music → треки видны. + Также проверить, что бэкап-папки **не** проиндексированы. Приёмка = видно в UI, не «API отвечает». 6. **Обновить доки** после подтверждения — таблица библиотек здесь + `family/projects/media-toolbox-taiga.md`. -> ❓ **Открытый выбор перед шагом 2:** включать ли `EnableFolderView` (навигация по папкам вместо тегов). Решается после выборочной проверки тегов файлов. +> ❓ **Открытый выбор перед шагом 2:** включать ли `EnableFolderView` (навигация по папкам). +> Теперь это **опция удобства**, а не обход битых тегов — теги чистые. ## Связанные заметки diff --git a/family/plans/lidarr-taiga-deploy.md b/family/plans/lidarr-taiga-deploy.md index da529f6b..c470e506 100755 --- a/family/plans/lidarr-taiga-deploy.md +++ b/family/plans/lidarr-taiga-deploy.md @@ -1,7 +1,9 @@ # Lidarr на Taiga — деплой + прокси для индексеров -**Дата:** 2026-09-26 -**Статус:** 🟡 Фаза 0 частично выполнена (3/6 индексеров зелёные), ждём решение Alex по FlareSolverr +**Дата:** 2026-09-26 (обновлено 2026-09-27) +**Статус:** 🟡 Фаза 0 выполнена (прокси, 3/6 индексеров зелёные). **Блокер тегов снят 2026-09-27.** +Актуальный план — [[family/plans/music-jellyfin-lidarr-taiga]] (ждёт ответа Alex по конфликту решений). +Открыто: FlareSolverr (RuTracker/Kinozal), Lidarr не установлен. **Namespace:** family ## Задача @@ -9,13 +11,43 @@ Поставить Lidarr на TrueNAS/Taiga в дополнение к Prowlarr/Radarr/Sonarr/Transmission/Jellyfin, настроить на музыку, обеспечить синк с Jellyfin, провести проверку живости всего стека. -## Решения Alex (2026-09-26) +## ✅ ОБНОВЛЕНО 2026-09-27: блокер тегов снят, задача переставлена + +**Сессия 2026-09-27 (новая задача Alex):** «Добавляй библиотеку музыки на TrueNAS в jellyfin +за исключением бэкап-папок. Потом поднимай lidarr в связку к нему и существующему arr stack.» + +> 🎉 **Ремонт тегов СРАБОТАЛ.** Выборка 108 файлов (12 × 9 категорий) через `ffprobe` +> из контейнера jellyfin: **108/108 имеют `artist`+`title`, мойибаке 0, пустых 0.** +> 40 файлов, «убитых» `fix40.py`, восстановлены из `backup_conv40` — целые, с тегами. +> **Поэтому решение «Jellyfin Music — НЕ ТРОГАТЬ» (2026-09-26, пункт 3 таблицы выше) устарело.** + +> 🔴 **КОНФЛИКТ, ВЫНЕСЕН НА ALEX:** его решение 2026-09-26 «Music не трогать» против +> задачи 2026-09-27 «добавляй библиотеку». Задан вопрос, **ответа нет, изменений не внесено**. +> **Актуальный план — [[family/plans/music-jellyfin-lidarr-taiga]]** (этот документ — история Фазы 0). + +Что изменилось против Фазы 3 ниже: + +| Было (2026-09-26) | Стало (2026-09-27) | +|---|---| +| Фаза 3 «НЕ ТРОГАТЬ» | Фаза 3 = основная задача сессии | +| Блокер: 2759 mojibake / 662 lost | Блокер снят: теги чистые (108/108) | +| Бэкап-папка одна — `Music/backup/` | Бэкап-папок **4** (7316 файлов, 48 ГБ) | +| Исключать бэкап не нужно (снести до создания) | Исключать все 4 через пустой `.ignore` | +| Библиотеку не создавать | Создать `collectionType=music` | + +**Стек без изменений:** lidarr **не установлен**, в Prowlarr его нет, Caddy-блока `lidarr` нет. +Индексеры: 3/6 живые (RuTor/Byrutor/NoNaMe ✅; RuTracker/Kinozal — Cloudflare). +Обход `docker run`-блокировки: `ffprobe` есть внутри контейнера `jellyfin` (`/usr/lib/jellyfin-ffmpeg/ffprobe`). + +--- + +## Решения Alex (2026-09-26) — ⚠️ пункт 3 УСТАРЕЛ | # | Вопрос | Решение | |---|---|---| | 1 | Куда Lidarr складывает музыку | **`/storage/Music`** — существующая папка как root folder | | 2 | Как обходить блокировку индексеров | **Через прокси** (`vless-proxy`) | -| 3 | Jellyfin Music-библиотека | **НЕ ТРОГАТЬ** — отдельная задача, заблокирована до ремонта тегов | +| 3 | ~~Jellyfin Music-библиотека~~ | ~~**НЕ ТРОГАТЬ**~~ → **УСТАРЕЛО 2026-09-27** (теги починены, задача переставлена) | ## 🔴 Результат разведки (факты с живой машины, 2026-09-26) @@ -270,16 +302,24 @@ https://kinozal.tv/ → 000 5. **Качество/маска переименования** — решить при настройке (Lidarr переименовывает файлы по маске). 6. **ПРИЁМКА ALEX:** тестовый поиск → торрент появился в Transmission. -### Фаза 3 — синк с Jellyfin +### Фаза 3 — синк с Jellyfin — ✅ РАЗБЛОКИРОВАНА 2026-09-27 -🔴 **По решению Alex (2026-09-26) НЕ ТРОГАТЬ.** Музыкальная библиотека Jellyfin остаётся как есть: -её нет, и она не создаётся в рамках этой задачи. Причина — 7890 файлов с массово битыми тегами -(см. `[[personal/tech/music-tags-repair-truenas]]`), ремонт на апруве Alex. +> 🔴 **БЫЛО (2026-09-26): НЕ ТРОГАТЬ** — блокировано до ремонта тегов (2759 mojibake / 662 lost). +> ✅ **СТАЛО (2026-09-27):** теги починены (108/108 подтверждено), Фаза 3 = **основная задача**. +> Полные шаги (создание библиотеки + исключение 4 бэкап-папок через `.ignore`) — +> [[family/plans/music-jellyfin-lidarr-taiga]] §Фаза 1. + +Что нужно знать (проверено): -Что нужно знать для будущей работы (не действие сейчас): - `/storage/Music` **уже смонтирован** в Jellyfin (ro) — доп. монтирование не требуется. -- Создание библиотеки возможно одной командой, но **до ремонта тегов бессмысленно**. -- Порядок из прошлого плана: ремонт тегов → валидация Alex → удаление `Music/backup/` → библиотека. +- Создание: `POST /Library/VirtualFolders?name=Music&collectionType=music&paths=/storage/Music` + (**query string**, не body). +- Бэкап-папок **4** (не одна): `backup` 7041, `backup_conv40` 40, `backup_fix` 165, `backup_raw` 70. + Исключать через **пустой `.ignore`** в каждой — механизм подтверждён официальной докой Jellyfin + (https://jellyfin.org/docs/general/server/media/excluding-directory/), работает в 10.11.x. + Создавать **ДО** первого скана. +- Объём к индексации: **7861** файл, ожидание 20–60 мин на Pentium G2020. +- Остаточные дефекты — 29 файлов (16 битых + 13 DRM) — [[personal/tech/music-broken-toload]]. Не блокер. ### Фаза 4 — приёмка живости стека diff --git a/family/plans/music-jellyfin-lidarr-taiga.md b/family/plans/music-jellyfin-lidarr-taiga.md index e67431e8..1d8f6c28 100644 --- a/family/plans/music-jellyfin-lidarr-taiga.md +++ b/family/plans/music-jellyfin-lidarr-taiga.md @@ -21,26 +21,44 @@ **Сегодняшняя команда прямо противоречит пункту 3** («Добавляй библиотеку музыки в jellyfin»). Задача ставится как «в прод качестве, ничего не проебать» — поэтому я не молчу про это. -### Разведка тегов 2026-09-27 (что реально с тегами сейчас) +### 🎉 РАЗВЕДКА ТЕГОВ 2026-09-27: РЕМОНТ СРАБОТАЛ — БЛОКЕР СНЯТ Инвентаризация v2 (2026-09-26) давала: `partial` 2920, `mojibake` **2759**, `empty` 1026, -`lost` 662, `clean` 537, `corrupt` 2. **После 38-й волны** применены правки: 7041 (основной apply) -+ 165 (дельта) + 41 конвертация + ремонт 40 файлов (Кирпичи/Muse/Бутусов) — проверено сегодня: -**все 40 целые и с тегами** (`artist`+`title` есть, MPEG-поток валиден). +`lost` 662, `clean` 537, `corrupt` 2. **Это цифры ДО 38-й волны.** После неё применены правки: +7041 (основной apply) + 165 (дельта) + 41 конвертация + ремонт 40 файлов (Кирпичи/Muse/Бутусов). -Цифры выше — **до** применения. Фактическое состояние тегов после применения -проверяется скриптом `survey_fast.py` (результат — раздел «Проверка» ниже). +**Проверено фактом сегодня, `ffprobe` из контейнера jellyfin, выборка 108 файлов +(12 на каждую из 9 категорий):** -### Практический вывод +| Показатель | Результат | +|---|---| +| `artist` + `title` заполнены | **108 / 108** | +| Мойибаке | **0** | +| Пустые теги | **0** | -Создать `collectionType=music` **технически можно прямо сейчас** — папки монтируются, -API работает. Вопрос не в возможности, а в **качестве выдачи**: Jellyfin раскладывает музыку -**по тегам**, а структура `Music/` — плоские категории (`!Rock&Folk`, `!Retro`), не `Artist/Album`. -Файлы с пустыми/битыми тегами уедут в `Unknown Artist`. +**40 «убитых» `fix40.py` файлов — целые.** Проверены все 40 (Muse/Absolution 14, Кирпичи 13, +Бутусов 8 + прочие): размер 1.2–10 МБ, MPEG-поток валиден, теги на месте. Откат из +`backup_conv40` прошёл успешно. -**Митигация, которая делает задачу выполнимой без ожидания ремонта тегов:** -`EnableFolderView=true` — Jellyfin даёт навигацию по физическим папкам. Тогда даже при битых -тегах библиотека структурирована. Это **не отменяет** ремонта тегов, но снимает блокировку. +> 🔑 **Вывод:** аргумент «сначала ремонт тегов, библиотеку не создавать» **устарел**. +> Именно он блокировал Фазу 3 в [[family/plans/lidarr-taiga-deploy]]. +> Остаточные дефекты — 29 файлов (16 битых + 13 DRM) из [[personal/tech/music-broken-toload]]; +> они и раньше объявлялись нерепарируемыми и ждут перезагрузки. **Это не блокер библиотеки.** + +### Практический вывод (смягчён по сравнению с v1) + +Создать `collectionType=music` **можно прямо сейчас** — папки монтируются, API работает, теги чистые. +Остаточный риск: структура `Music/` — плоские категории (`!Rock&Folk`, `!Retro`), не `Artist/Album`. +Jellyfin раскладывает **по тегам** — при чистых тегах это даст нормальные `Artist/Album`. +29 битых файлов уедут в мусор — их можно исключить точечно. + +**`EnableFolderView=true` остаётся полезным** (навигация по категориям-папкам как дополнение +к тегам), но **больше не обязателен** как обход битых тегов. + +> ⏳ **Полная инвентаризация 7861 файла не завершена** — скрипты на Python на хосте +> насыщали 2-ядерный NAS (load 4.9), были прибиты. Быстрый путь для полного прогона — +> `survey_ff.sh` (ffprobe внутри контейнера jellyfin, нативный код, не Python). +> Запуск: `nohup bash /tmp/survey_ff.sh > /tmp/survey_ff2.out 2>&1 &` --- @@ -138,20 +156,40 @@ Caddyfile (88 строк, root-owned) содержит блоки: `radarr`, `so **Р1.2. Создать библиотеку.** `POST /Library/VirtualFolders?name=Music&collectionType=music&paths=/storage/Music` (**name/paths в query string**, не в body — Jellyfin 10.11). -**Р1.3. Исключить бэкап-папки.** Три способа, по приоритету: +**Р1.3. Исключить бэкап-папки — ✅ МЕХАНИЗМ ПОДТВЕРЖДЁН.** -- **(а) рекомендуемый — `.ignore` в папках.** Положить ```.ignore`**`` в каждую из 4 бэкап-папок. - Jellyfin (как и Emby-линия) не рекурсирует в папку, содержащую `.ignore`. Работает на уровне файловой - системы → переживает пересоздание библиотеки, ничего не ломает. ⚠️ Jellyfin читает `.ignore` через - библиотечный ридер — проверить фактом после скана (в логах `Ignoring ...`). -- **(б) `EnableFolderView` + без исключения.** Библиотека с папками; бэкапы видны как папки, - но не мешают навигации по категориям. -- **(в) отдельная библиотека на подпапки.** Создать 9 библиотек-категорий — **не рекомендую**: - ломает единую вкладку Music, множит сущности. +**Выбран способ (а): пустой файл `.ignore` в каждой из 4 бэкап-папок.** -> **Решение:** сделать **(а)**, при неработоспособности `.ignore` (проверить в логах) — откат к **(б)**. -> Никаких фильтров-`IgnorePaths` в API нет: Jellyfin 10.11 не поддерживает regex-исключения путей -> в `VirtualFolder` — только `.ignore`-файлы. 🔴 **Это надо подтвердить фактом ДО скана.** +Подтверждено **официальной документацией Jellyfin** +(https://jellyfin.org/docs/general/server/media/excluding-directory/): + +> «To exclude an entire directory, place an **empty** file named `.ignore` inside the directory. +> This directory, and all files and subdirectories within it, will be excluded.» + +- Работает в **Jellyfin 10.11.x** (наша версия — 10.11.11) ✅ +- Непустой `.ignore` трактуется как список паттернов в формате `.gitignore` (новое в 10.11) +- Требует рескана после создания: «ensure that you refresh/rescan the library afterwards + for it to be applied» → создать `.ignore` **ДО** первого скана +- Работает на уровне файловой системы → переживает пересоздание библиотеки + +```bash +# 4 папки-бэкапа: создать ПУСТОЙ .ignore в каждой +for d in backup backup_conv40 backup_fix backup_raw; do + touch "/mnt/RED_2TB/storage/Music/$d/.ignore" +done +``` + +⚠️ **Проверить фактом после скана**, что бэкап-треки не проиндексированы (Р1.5). +⚠️ **НЕ путать с плагином** `jellyfin-plugin-ignore` (`.jellyfinignore`) — это сторонний +плагин, у нас не установлен и не нужен. + +Отвергнутые варианты: + +- **(б) `EnableFolderView` + без исключения.** Бэкапы видны как папки — мусор в UI. Только как дополнение. +- **(в) 9 отдельных библиотек-категорий** — ломает единую вкладку Music, множит сущности. Не делать. + +> 🔴 **Regex-исключений путей в API Jellyfin нет** — `VirtualFolder` в 10.11 не поддерживает +> фильтры путей. Только `.ignore`-файлы. **Р1.4. Скан.** `POST /Items/Refresh?Recursive=true&RefreshMode=FullRefresh`. 7861 файл на Pentium G2020 — **ожидание 20–60 мин**, не 10–30 (прошлая оценка была для 7890 без @@ -248,11 +286,35 @@ lidarr.mallexxx.duckdns.org { Следствия, уже подтверждённые фактом: - Caddyfile через `docker run alpine` — **заблокировано**, нужен обход (Р2.4). -- Проверка `ffprobe`/`mutagen` через `docker run tagwriter` — **заблокировано**. - Обход: валидатор без ffprobe (`/tmp/verify_pure.py`, `/tmp/survey_fast.py`) — парсит ID3-фреймы - и MPEG-синки из первых 128 КБ. Проверен на 14 файлах Muse — 14/14 OK, теги 14/14. +- `docker compose up` / `docker run tagwriter` — **заблокировано** (проверено дважды). + +### ✅ НАЙДЕН ОБХОД: `ffprobe` есть внутри контейнера `jellyfin` + +**`/usr/lib/jellyfin-ffmpeg/ffprobe`** — версия **7.1.4-Jellyfin**, доступен через `docker exec` +(разрешённый путь). Это снимает нужду в образе `tagwriter` для медиа-проверок: + +```bash +# Валидация/инспекция любого аудио/видео без docker run +docker exec jellyfin /usr/lib/jellyfin-ffmpeg/ffprobe -v error \ + -show_entries format_tags=artist,title -of default "/storage/Music/<файл>" +``` + +⚠️ **Питфолл парсинга:** использовать `-of default` (сохраняет префиксы `TAG:artist=`), +**НЕ** `-of default=nw=1:nk=1`. С `nk=1` префиксы срезаются, и `grep "^TAG:artist="` +даёт **0 совпадений** → ложный вывод «все теги пустые» (пойман на живой машине: скрипт +показал `0 / 1467` на папке, где реально `203` файла и теги на месте). + +Готовый скрипт полного прогона: `/tmp/survey_ff.sh` (на NAS) — считает `artist`+`title` +по всем 9 категориям через ffprobe. + +**Прочее:** + - В контейнере `jellyfin` **нет** `wget`/`curl`/`python3` → API дёргать `python3` **на хосте NAS** (`urllib`, `http://127.0.0.1:8096`), скрипт класть через `scp`. +- Валидатор MP3 без ffprobe (если контейнер недоступен): `/tmp/verify_pure.py`, + `/tmp/survey_fast.py` — парсит ID3-фреймы и MPEG-синки из первых 128 КБ. +- ⚠️ **Python-сканы по 7800 файлам НАСЫЩАЮТ NAS** (load 4.9 на 2 ядрах, RAM 16/21 ГБ занято). + Для полного прогона использовать `ffprobe` (нативный код), не Python-парсеры. --- @@ -276,11 +338,45 @@ lidarr.mallexxx.duckdns.org { ## Проверка (результаты разведки) - ✅ Доступ к NAS: `ssh truenas_admin@mallexxx.duckdns.org` работает. -- ✅ Jellyfin API: 6 библиотек, версия 10.11.11, Music отсутствует. -- ✅ Music: 7861 файл в 9 категориях; 7316 в 4 бэкап-папках. -- ✅ Восстановленные 40 файлов (Кирпичи/Muse/Бутусов): аудио целое, теги `artist`+`title` на месте. -- ✅ Prowlarr: 3/6 индексеров живые, прокси-тег на всех 6. -- ⏳ Полная инвентаризация тегов (7861 файл) — `survey_fast.py` в фоне на NAS. +- ✅ Jellyfin API: 6 библиотек, версия 10.11.11, имя сервера `Taiga`, Music отсутствует. +- ✅ Music: 7861 файл в 9 категориях; 7316 в 4 бэкап-папках (48 ГБ). +- ✅ **Теги чистые — выборка 108/108** (`artist`+`title`), мойибаке 0. +- ✅ Восстановленные 40 файлов (Кирпичи/Muse/Бутусов): аудио целое (1.2–10 МБ, MPEG-поток валиден), теги на месте. +- ✅ Prowlarr: 3/6 индексеров живые, прокси-тег `[1]` на всех 6. +- ✅ `.ignore`-механизм исключения папок подтверждён официальной докой Jellyfin. +- ✅ `ffprobe` 7.1.4-Jellyfin доступен через `docker exec jellyfin`. +- ✅ Запись в `/mnt/RED_2TB/docker/arr/` от `truenas_admin` работает (проверено `touch`). +- ✅ `media_net` состав, `caddy_default` состав, `docker compose` на хосте — см. разведку. +- ⏳ Полная инвентаризация тегов (7861 файл) — `survey_ff.sh` на NAS, не завершена. + +## Статус: что сделано / что нет + +| # | Пункт | Статус | +|---|---|---| +| 1 | Разведка живой машины (стек, Jellyfin, Music, Prowlarr, Caddy) | ✅ выполнено | +| 2 | План + конфликт с решением Alex вынесен | ✅ выполнено | +| 3 | Тег-аудит (выборка 108) | ✅ выполнено | +| 4 | `.ignore`-механизм подтверждён | ✅ выполнено | +| 5 | **Р1.1–Р1.6 (Music-библиотека)** | 🔴 **НЕ НАЧАТО** — ждёт ответа Alex по конфликту | +| 6 | **Р2.1–Р2.7 (Lidarr)** | 🔴 **НЕ НАЧАТО** | +| 7 | Полная тег-инвентаризация 7861 | ⏳ в фоне | + +> 🔴 **Блокирующий вопрос Alex (задан, ответа нет):** создавать Music-библиотеку сейчас +> (теги уже чистые, бэкапы выключим через `.ignore`) или сначала Alex сам откроет Jellyfin +> и проверит, что теги читаются? **Изменений в Jellyfin/arr НЕ внесено.** + +## Дополнительные питфоллы, найденные в этой сессии + +- **`ffprobe -of default=nw=1:nk=1` срезает префиксы `TAG:`** → `grep "^TAG:artist="` даёт 0 совпадений + → **ложный вывод «все теги пустые»**. Использовать `-of default` + grep. (Кейс: `0 / 1467` vs реальные `203`.) +- **`docker exec sh -c '...'` не имеет `wget` в jellyfin** — ошибка `sh: 1: wget: not found`. +- **Python-парсеры `os.walk` по 7800 файлам насыщают 2-ядерный NAS** (load 4.9). Прибивать через + `pkill -f