[2026-09-27] eagle: family/how-to/jellyfin-config.md family/plans/lidarr-taiga-deploy.md family/plans/music-jellyfin-lidarr-taiga.md personal/plans/balda-mm-phase4-agents.md personal/plans/balda-mm-phase4-agents.md.bak-20260927-021821
This commit is contained in:
1 parent
51189c64f9
commit
5c0a634f7b
5 files changed
+1522
-75
No files matched your search
@@ -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/<Name>` (создаётся Jellyfin автоматически) и реальный `/storage/<Folder>`. Реальный путь дополнительно виден как `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` (навигация по папкам).
|
||||
> Теперь это **опция удобства**, а не обход битых тегов — теги чистые.
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
|
||||
@@ -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 — приёмка живости стека
|
||||
|
||||
|
||||
@@ -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` в папках.** Положить `<b>``.ignore`**`</b>` в каждую из 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 <c> sh -c '...'` не имеет `wget` в jellyfin** — ошибка `sh: 1: wget: not found`.
|
||||
- **Python-парсеры `os.walk` по 7800 файлам насыщают 2-ядерный NAS** (load 4.9). Прибивать через
|
||||
`pkill -f <script>`, для полного прогона — `ffprobe`.
|
||||
- **`write_file` может покалечить строку с токеном** — проверять `read_file` перед запуском
|
||||
(пойман: `TOKEN=` вместо полного ключа).
|
||||
- **`pkill` в inline ssh возвращает 255** (нет процессов/сужение) → оборачивать в скрипт-файл.
|
||||
- **`docker inspect <c> --format '{{range $n,$c := .NetworkSettings.Networks}}'`** — рабочий способ
|
||||
увидеть все сети контейнера (для проверки, что lidarr попадёт в media_net + caddy_default).
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
|
||||
@@ -1207,8 +1207,19 @@ for _, id := range ids {
|
||||
|
||||
### 19.5 Состояние и остаток работ
|
||||
|
||||
Гейты на момент записи: `go build ./...` → **OK**, `go vet ./agentfactory/` → **OK**.
|
||||
Тесты **не прогнаны** — команда ниже.
|
||||
Гейты (прогнано 2026-09-27): `go build ./...` → **OK**, `go vet ./...` → **OK**,
|
||||
`go test ./...` в форке → **все зелёные**. Целевой прогон:
|
||||
`go test ./agentfactory/ -run 'Toolset|MCPEndpoint|McpToolset' -v` → **6/6 PASS**, в логе
|
||||
видно требуемое поведение: `[mcp] skipping duplicate toolset "balda": endpoint already served
|
||||
by "balda-session-memory-abc123"` — выживает именно scoped-запись.
|
||||
|
||||
🔴 **Проверка чувствительности теста:** отключение keeper-предпочтения (`if false && …`)
|
||||
тест **не ломает** — он проверял только количество. Поэтому добавлен `selectScopedOnly`:
|
||||
теперь тест падает, если выживает не scoped-запись. Слабый тест = ложная уверенность.
|
||||
|
||||
Дополнительно: `mcpEndpointKey`/`mcpURLIsScoped` распространены на **`sse`** (обе ветки switch
|
||||
по `MCPServerTypeHTTP, MCPServerTypeSSE`); `stdio` ключа не даёт и не схлопывается никогда.
|
||||
Тесты `TestMCPEndpointKeySSE`, `TestMCPEndpointKeyStdioNeverCollapses`.
|
||||
|
||||
⚠️ **На Kraken сейчас стоит диагностический образ `0.1.13-diag`** (с временными `fmt.Printf`),
|
||||
не `0.1.11`. Бэкап compose: `docker-compose.yml.bak-diag-<ts>`. Диагностические логи в
|
||||
|
||||
+1255
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user