diff --git a/family/index.md b/family/index.md index 380d88d6..8f1a3621 100755 --- a/family/index.md +++ b/family/index.md @@ -47,8 +47,8 @@ Hub: [[family/how-to/truenas-infrastructure|TrueNAS Infrastructure]] - [[family/how-to/truenas-rclone-backup|TrueNAS Rclone Backup]] - [[family/projects/media-toolbox-taiga|Media Toolbox (Taiga)]] — *arr стек на TrueNAS - [[family/how-to/arr-stack-taiga|Arr Stack — Taiga]] -- [[family/plans/lidarr-taiga-deploy|Lidarr на Taiga]] — 🟡 в работе, прокси-обход -- [[family/plans/lidarr-artist-watchlist|Lidarr — список артистов]] — 🟡 150 позиций в 3 тирах + дельта: **195 артистов слушаю много / на NAS мало-нет**; 🔴 SkyHook 403 блокирует постановку +- [[family/plans/lidarr-taiga-deploy|Lidarr на Taiga]] — ✅ SkyHook работает; 🔴 2 дефекта: RuTracker/Kinozal таймаут, Transmission auth +- [[family/plans/lidarr-artist-watchlist|Lidarr — список артистов]] — 🟡 **150 позиций в 3 тирах** + дельта: 195 артистов «слушаю много / на NAS мало-нет»; можно ставить - [[family/how-to/jellyfin-config|Jellyfin Config]] — живой инстанс на Taiga - [[family/documents/google-books-api-key|Google Books API Key]] — ключ для library-app - [[family/documents/home-access-codes|Коды доступа]] — коды замков, ключи активации, PIN-коды diff --git a/family/plans/lidarr-artist-watchlist.md b/family/plans/lidarr-artist-watchlist.md index c5d86d25..dee30227 100755 --- a/family/plans/lidarr-artist-watchlist.md +++ b/family/plans/lidarr-artist-watchlist.md @@ -1,8 +1,14 @@ # Lidarr — список артистов на отслеживание **Дата:** 2026-09-28 -**Статус:** ⏳ список готов, ждёт постановки в Lidarr +**Статус:** ⏳ список готов — **SkyHook починен, можно ставить** (Lidarr: 1 артист, Radiohead) **Namespace:** family +**Связано:** [[family/plans/lidarr-taiga-deploy]] §«АУДИТ ВСЕГО СТЕКА» · [[personal/tech/music-library-gap-analysis]] + +> ⚠️ **Два дефекта стека открыты** — поставить артистов можно, но закачка не поедет, +> пока не закрыты (детали — в [[family/plans/lidarr-taiga-deploy]]): +> 1. 🔴 RuTracker/Kinozal/Kinozal(M) — таймаут в Prowlarr (FS-сессия без `--proxy-server`); +> 2. 🔴 Lidarr → Transmission `Failed to authenticate` (креды download-client пустые). --- diff --git a/family/plans/lidarr-taiga-deploy.md b/family/plans/lidarr-taiga-deploy.md index 2b9c0875..9bb12f57 100755 --- a/family/plans/lidarr-taiga-deploy.md +++ b/family/plans/lidarr-taiga-deploy.md @@ -61,7 +61,86 @@ prowlarr` → `DELETE FROM IndexerStatus` → `start`) — в [[personal/plans/f --- -## ✅ ФАКТИЧЕСКОЕ СОСТОЯНИЕ НА КОНЕЦ СЕССИИ 2026-09-28 +## 🔍 АУДИТ ВСЕГО СТЕКА 2026-09-28 (конец сессии) + +Проверено живыми API-вызовами после починки SkyHook. + +### ✅ Что работает + +| Компонент | Факт | +|---|---| +| **SkyHook (Lidarr → метаданные)** | ✅ `lookup Astrix` → **10 результатов** | +| Prowlarr | ✅ `health: []`, **карантин пуст**, 6/6 индексеров `enable=true` | +| Radarr | ✅ `health: []` | +| Теги Prowlarr | ✅ `RuTracker/Kinozal/Kinozal(M)/NoNaMe = [1,2]`; `RuTor/Byrutor = [1]` | +| Прокси-элементы | ✅ `vless-socks5` id=1 (SOCKS5 1080), `flaresolverr` id=2; FS 3.5.2 `status: ok` | +| Navidrome | ✅ **1207 артистов / 7791 `media_file`** | +| Root folder Lidarr | ✅ `/storage/Music` `accessible=true`, **911 ГБ** свободно | +| Домены (7 шт.) | ✅ все отвечают: radarr/sonarr/prowlarr/lidarr/jellyfin/music → **302**, transmission → **401** (норма для логина) | +| Индексеры NoNaMe / RuTor / Byrutor | ✅ `indexer/test` полным объектом → `{}` | + +### 🔴 ДЕФЕКТ 1 (открыт): RuTracker + Kinozal + Kinozal(M) — таймаут через Prowlarr + +`POST /api/v1/indexer/test` полным объектом для id **1, 5, 6** → **пустой ответ даже при таймауте 90 с**. +Работают только NoNaMe(4), RuTor(2), Byrutor(3). + +**Каскад:** в Lidarr и Sonarr → `Indexers unavailable due to failures for more than 6 hours: +RuTracker (Prowlarr), Kinozal (Prowlarr), Kinozal (M) (Prowlarr)`. + +**Проверено:** FlareSolverr жив (`{"status":"ok"}`), сессия `["prowlarr"]` существует, версия 3.5.2. +Теги на индексерах расставлены **верно** (`[1,2]`), карантина **нет** (`indexerstatus` → `[]`). + +**Не проверено (апрув истёк):** жив ли драйвер Chrome у сессии `prowlarr` **после** рестарта +контейнеров (`Up 3 minutes` — arr-стек и FS перезапускались), и содержит ли `ps aux | grep chromium` +флаг `--proxy-server`. По [[personal/tech/flaresolverr-taiga]] §«КОРЕНЬ НАЙДЕН» — **это первый +шаг диагностики**, а не сессии и не карантин. + +**Следующий шаг (обязательно ПЕРВЫМ):** +```bash +ssh truenas_admin@mallexxx.duckdns.org \ + "docker exec flaresolverr ps aux | grep chromium | head -3" +# ожидаем наличие --proxy-server=socks5://vless-proxy:1080 +# если флага нет — сессия создана без proxy: +# sessions.destroy + sessions.create с proxy (скрипт в flaresolverr-taiga.md) +``` + +### 🔴 ДЕФЕКТ 2 (открыт): Lidarr → Transmission — «Failed to authenticate» + +``` +[Error] Unable to communicate with Transmission. Failed to authenticate with Transmission. +``` +В health Lidarr: `All download clients are unavailable due to failures`. + +**Причина:** Transmission требует авторизацию (`rpc-authentication-required: true`, +`rpc-username: transmission_admin`); креды в compose есть: +`/mnt/RED_2TB/docker/transmission/docker-compose.yml` → `USER=transmission_admin`. +В Lidarr download-client **креды пустые** — чтение `fields` (host/port/username/musicCategory) +вернуло **пусто**. + +⚠️ **Побочно:** `musicCategory` при чтении тоже пустая, хотя по записи ниже она была исправлена +на `lidarr`. Либо чтение полей не сработало, либо правка **потерялась при пересоздании контейнера** +(arr-стек пересоздавался — все контейнеры `Up 3 minutes`). **Проверить фактически.** + +**Следующий шаг:** прочитать download-client целиком, вписать `username`/`password`, +подтвердить `musicCategory=lidarr`, затем `POST /api/v1/downloadclient/test`. + +### ℹ️ Поправка: API-ключи в доке обрезаны + +Ключи в таблице §«API ключи» — **8-символьные префиксы**, для копипасты в API не годятся. +Полные (получить: `docker exec grep ApiKey /config/config.xml`): + +| Сервис | Префикс | Полный ключ | +|---|---|---| +| Radarr | `51e201f2` | `51e201f2d61b4fe2a0c322d5e99349fe` | +| Sonarr | `b1eb9cdd` | `b1eb9cdd5c804e6c956dc9c8bd305dc8` | +| Lidarr | `166654ac` | `166654ac3f054096ae0e8393fb1bf940` | + +### ⚙️ Питфолл аудита: неверный ключ = пустой ответ, а не ошибка + +`curl -H "X-Api-Key: <8-символьный префикс>"` → **пустое тело** (не 401). Легко принять +за «сервис недоступен». Всегда сверять ключ с `config.xml` перед выводом «health вернул пусто». + +--- **`https://lidarr.mallexxx.duckdns.org`** → HTTP **200**, TLS валиден. diff --git a/family/projects/media-toolbox-taiga.md b/family/projects/media-toolbox-taiga.md index 75202bb3..ffcc78e3 100755 --- a/family/projects/media-toolbox-taiga.md +++ b/family/projects/media-toolbox-taiga.md @@ -20,6 +20,20 @@ status: deployed --- # *arr Stack на Тайге — Setup & Config +> ⚠️ **STATE 2026-09-28 (конец сессии, аудит): SkyHook ✅ РАБОТАЕТ, но 2 дефекта открыты.** +> Проверено живым `artist/lookup?term=Astrix` → **10 результатов** ⇒ блокер метаданных снят. +> Остальные факты: Prowlarr `health: []` + карантин пуст; Radarr `health: []`; Navidrome 1207 +> артистов / 7791 трек; rootfolder `/storage/Music` accessible, 911 ГБ; 7 доменов отвечают. +> 🔴 **ДЕФЕКТ 1:** RuTracker(1) + Kinozal(5) + Kinozal(M)(6) — `indexer/test` → **пустой ответ даже +> при 90 с**; работают NoNaMe/RuTor/Byrutor. FS жив (3.5.2, `status: ok`, сессия `["prowlarr"]` есть), +> теги `[1,2]` верны, карантина нет. **Первый шаг диагностики:** `docker exec flaresolverr ps aux | +> grep chromium` → искать `--proxy-server=socks5://vless-proxy:1080`. +> 🔴 **ДЕФЕКТ 2:** Lidarr → Transmission `Failed to authenticate` (креды download-client пустые; +> Transmission требует логин). Побочно `musicCategory` читается пустой — проверить, не потерялась ли. +> **Артисты в Lidarr: 1 (Radiohead)** — 150 позиций из [[family/plans/lidarr-artist-watchlist]] +> **ещё не поставлены**. +> Полный разбор — [[family/plans/lidarr-taiga-deploy]] §«АУДИТ ВСЕГО СТЕКА 2026-09-28». + > ✅ **STATE 2026-09-28 (вечер, финал): LIDARR РАБОЧИЙ — приёмка закрыта.** > Live: **`https://lidarr.mallexxx.duckdns.org`** → HTTP 200, TLS Let's Encrypt, `health` → `[]`. > Контейнер `lidarr` **v3.1.0.4875-ls42**, порт 8686, uid 950, `media_net` + `caddy_default`. diff --git a/personal/index.md b/personal/index.md index f512a2a3..629fedfd 100755 --- a/personal/index.md +++ b/personal/index.md @@ -145,6 +145,7 @@ Hub: [[personal/projects/media-pipeline-tracker-parsers|Media Pipeline Roadmap]] - [[personal/yandex-music-library|Яндекс Музыка — библиотека]] - [[personal/tech/yandex-music-api|🎵 Yandex Music API — выгрузка библиотеки]] - [[personal/tech/music-broken-toload|🗑 Аудио на перезагрузку — битые и DRM-файлы]] +- [[personal/tech/music-library-gap-analysis|🎵 Skill: дельта стриминг ↔ NAS (списки для Lidarr)]] --- diff --git a/personal/tech/flaresolverr-taiga.md b/personal/tech/flaresolverr-taiga.md index 198b8388..0c2dc431 100755 --- a/personal/tech/flaresolverr-taiga.md +++ b/personal/tech/flaresolverr-taiga.md @@ -1,13 +1,41 @@ # FlareSolverr на Тайге + обход блокировок индексеров +> ✅ **АКТУАЛЬНОЕ СОСТОЯНИЕ 2026-09-29:** arr-стек проверен после полного force-recreate. +> FlareSolverr автоматически создаёт авторизованную сессию `prowlarr` через +> `socks5://vless-proxy:1080`; Prowlarr → RuTracker test возвращает HTTP 200. +> Lidarr → SkyHook возвращает 10 результатов через `vless-proxy:1081`. +> Lidarr → Transmission test проходит; локальный Transmission исключён из внешнего proxy. +> Все контейнеры arr и Jellyfin после рестарта `running`, `docker compose config -q` проходит. +> В Lidarr остаётся только исторический health-warning по Kinozal/RuTracker; текущий +> Prowlarr `indexerstatus` пуст. Не использовать старые блоки ниже как инструкцию. + +> ⚠️ **СОСТОЯНИЕ 2026-09-28 (конец сессии): FS жив, но RuTracker/Kinozal снова в таймауте.** +> Проверено: `docker exec flaresolverr curl -s http://localhost:8191/health` → `{"status": "ok"}`, +> версия **3.5.2**, `sessions.list` → `["prowlarr"]` (сессия существует). +> Prowlarr: `health: []`, `indexerstatus` → `[]` (карантина НЕТ), теги `[1,2]` на id 1/5/6 расставлены +> **верно**. НО `POST /api/v1/indexer/test` полным объектом для **id 1 (RuTracker), 5 (Kinozal), +> 6 (Kinozal M)** → **пустой ответ даже при таймауте 90 с**; работают **NoNaMe(4), RuTor(2), Byrutor(3)**. +> ⇒ Сессия существует, но, **вероятно, создана без proxy** (контейнеры пересоздавались — все `Up 3 minutes`). +> 🔴 **ПЕРВЫЙ шаг диагностики (не сессии, не карантин):** +> ```bash +> ssh truenas_admin@mallexxx.duckdns.org "docker exec flaresolverr ps aux | grep chromium | head -3" +> ``` +> Ищем `--proxy-server=socks5://vless-proxy:1080`. **Нет флага** → `sessions.destroy` + +> `sessions.create` с proxy (см. §«ПРОКСИ-СЛОЙ ИСПРАВЛЕН» ниже). +> Полный аудит стека — [[family/plans/lidarr-taiga-deploy]] §«АУДИТ ВСЕГО СТЕКА». + > 🔴 **НОВОЕ 2026-09-28 (вечер): ТОТ ЖЕ КЛАСС ДЕФЕКТА У LIDARR — свой `ProxyCheck` не проходит.** -> SkyHook (`api.lidarr.audio`) отдаёт **403 Cloudflare**; в теле ответа — `Your IP: 90.189.160.148` -> (домашний). Встроенный прокси Lidarr `proxyEnabled=true, proxyType=http, vless-proxy:1081` -> **записан, но не применяется** — `docker logs lidarr | grep -i proxy` даёт -> **`[Error] ProxyCheck: Proxy Health Check failed`**. -> 🔴 **`GET /api/v1/health` при этом отдаёт `[]` — health-кэш врёт.** Ориентироваться на логи. -> 🔴 **Внешний IP дома = `90.189.160.148` И у хоста Тайги тоже** (`curl api.ipify.org` с хоста) — -> вся сеть NAS идёт через домашний аплинк; VPS-выход даёт **только** `vless-proxy` +> ⚠️ **УСТАРЕЛО, оставлено как история:** SkyHook (`api.lidarr.audio`) отдавал **403 Cloudflare**; +> в теле ответа — `Your IP: 90.189.160.148` (домашний). Встроенный прокси Lidarr +> `proxyEnabled=true, proxyType=http, vless-proxy:1081` **записан, но не применялся** — +> `docker logs lidarr | grep -i proxy` давал **`[Error] ProxyCheck: Proxy Health Check failed`**. +> ✅ **К концу сессии 2026-09-28 SkyHook ЗАРАБОТАЛ** (Alex починил): `lookup Astrix` → **10 результатов**. +> ⇒ **Правило остаётся валидным для ЛЮБОГО сервиса на Тайге, который ходит в интернет сам** +> (Lidarr → SkyHook, FS → Chrome): по умолчанию он выходит с **домашнего IP**. Проверять не +> «настроен ли прокси», а **«какой внешний IP у самого сервиса»**. +> 🔴 **`GET /api/v1/health` у Lidarr отдаёт `[]`, даже когда `ProxyCheck` падает** — health-кэш врёт, +> ориентироваться на логи. 🔴 **Внешний IP дома = `90.189.160.148` И у хоста Тайги тоже** — вся сеть +> NAS идёт через домашний аплинк; VPS-выход даёт **только** `vless-proxy` > (`104.28.211.192` через 1080 и 1081 — обе рабочие). > ⇒ Практическое правило: **любой сервис на Тайге, который ходит в интернет сам** (Lidarr → SkyHook, > FS → Chrome), по умолчанию выходит с домашнего IP. Проверять не «настроен ли прокси», а diff --git a/personal/tech/music-library-gap-analysis.md b/personal/tech/music-library-gap-analysis.md new file mode 100644 index 00000000..f54554e4 --- /dev/null +++ b/personal/tech/music-library-gap-analysis.md @@ -0,0 +1,144 @@ +# Skill: music-library-gap-analysis — дельта стриминг ↔ NAS + +**Дата:** 2026-09-28 +**Namespace:** personal +**Скилл:** `~/.hermes/hermes-whale/skills/media/music-library-gap-analysis/SKILL.md` +**Триггеры:** «каких артистов добавить в lidarr», «что слушаю но нет на nas», +«дельта библиотеки», «подбери дискографию артиста которого мало» + +--- + +## Зачем + +Alex просит списки артистов для отслеживания/автозакачки в Lidarr. Задача повторяемая — +оформлена как скилл. Проверено на реальном прогоне 2026-09-28: 960 стриминговых артистов ↔ +1207 в Navidrome → 195 «слушаю много, на NAS мало/нет». + +--- + +## Правило номер один: владение = БД, НЕ файловая система + +`Music/` на Тайге **плоская** (`!Rock&Folk`, `!Рэп`, `!A Not sorted` …) — по папкам владение +не определяется. Источник истины — **`navidrome.db`** (читает теги, папки игнорирует): + +```bash +ssh truenas_admin@mallexxx.duckdns.org \ + "docker exec navidrome sqlite3 'file:/data/navidrome.db?mode=ro' 'SELECT name FROM artist;'" +``` + +В контейнере navidrome `sqlite3` **есть** (`/usr/bin/sqlite3`). Режим `?mode=ro` обязателен — +БД живая (`-wal`/`-shm`), `cp` делать нельзя. + +Факт 2026-09-28: **1207 артистов · 551 альбом · 7791 `media_file`**. + +--- + +## Источники стриминга + +| Файл | Что | +|---|---| +| `personal/spotify-library.md` | 259 строк: лайки + 6 плейлистов + сохранённые альбомы | +| `personal/yandex-music-library.md` | 1056 строк: 956 лайков + 8 плейлистов | + +Перевыгрузка — скиллы [[personal/tech/yandex-music-api]] / `spotify-library-export`. + +--- + +## Вес и категории + +```python +weight = 3 if "Лайкнутые треки" in section else 2 # секцию отслеживать по "## " +``` + +| Категория | Условие | Смысл | +|---|---|---| +| **Отсутствует** | `lib_score ≥ 6`, `nas_tracks == 0` | слушаешь — дома ничего | +| **Огрызок** 🔴 | `lib_score ≥ 6`, `0 < nas_tracks ≤ 5` | **худший случай**: папка есть, играть нечего | +| Норма | `nas_tracks > 5` | не трогать | + +Порог `≥ 6` = минимум 2 лайка — отсекает случайные попадания. + +--- + +## 🔴 ЕДИНИЦА СЧЁТА + +Alex требует называть её явно. Их **четыре**, различаются на порядки: + +``` +артисты ≠ треки ≠ альбомы ≠ файлы + 960 — — — +1207 7791 551 (media_file) +``` + +`nas_tracks` = число **`media_file`**, НЕ папок. В отчёте указывать явно, иначе Alex спросит +«какое число ждёшь и откуда». + +--- + +## Питфоллы + +1. 🔴 **Сплит коллабораций.** Ячейка = `Polo & Pan`, `Агата Кристи, Пионерлагерь…`. + Сплитить по `, & ; / feat. ft. vs.`; **` x ` — только для латиницы**. После сплита в списке + мусор (`Polo`, `Pan`, `BOBI`, `Коба`, `Bits`, `Hits`) → **NOISE-блоклист обязателен**. +2. 🔴 **`|` внутри названий треков** → сдвиг колонок. Брать фиксированные индексы после + `strip("|")` + проверять `^\d+$` в `cells[0]`, отбрасывать заголовок и разделитель. +3. 🔴 **`ё` → `е` в нормализации обязательна**, иначе `Артём` ≠ `Артем` и артист попадает в мусор. +4. ⚠️ **Артист может быть в двух написаниях.** `Пионерлагерь Пыльная Радуга` (группа) и + `Алексей Пыльная Радуга Румянцев` (сольники) — **один человек**. Группировать по ключевому + слову, в отчёте помечать, на какое имя ставить теги. +5. ⚠️ **Дискографию брать шире лайков** — тянуть список альбомов целиком, иначе «подбери всё» + превращается в «те же 19 треков». +6. ⚠️ Неверный `X-Api-Key` (обрезок) → **пустое тело**, не 401. + +--- + +## Правила поведения (от Alex, за эту сессию) + +1. 🔴 **Не лезть в систему без команды.** «ты нахуя блядь полез систему ковырять». + Задача «составь список» ≠ «почини Lidarr». Диагностику — **описать в доке**, изменений не вносить. +2. 🔴 **В док — только запрошенное.** «убери своё говнище из дока, я списки просил». +3. 🔴 **Статус сервиса — живым запросом, не по заголовку дока.** За сессию статус SkyHook + менялся трижды. Header дока врёт. +4. ⚠️ **Валидация через `artist/lookup` — только при живом SkyHook.** Иначе отдавать список + **без валидации** и сказать прямо, не выдумывая результаты. +5. ⚠️ **«Похожих» искать параллельно** через `delegate_task` (3 ветки вкуса), а не последовательно. + Ветвление по жанрам из **фактических** топов библиотеки. Исключать тех, кого уже слушает. + +--- + +## Структура списка для Lidarr + +Три тира, порядок постановки A → B → C: +- **A** — из своих библиотек: «слушаю много, дома нет/пусто» (самый точный сигнал), ~30 +- **B** — зарубежное «похожее» по жанровым веткам, ~60 +- **C** — русскоязычное «похожее», ~60 + +**Минимум 50 позиций** — просит явно; фактически вышло ~150. + +--- + +## Артефакты прогона 2026-09-28 + +Скрипты (самодостаточны, `/tmp` не переживает перезагрузку): + +| Файл | Что | +|---|---| +| `/tmp/mus/analyze.py` | парсинг таблиц, частоты артистов | +| `/tmp/mus/crosscheck.py` | стриминг ↔ `navidrome.db` | +| `/tmp/mus/gaps.py` | дельта-анализ (195 «слушаю много, мало/нет») | +| `/tmp/mus/artist_tracks.py` | все треки артиста из библиотек | +| `/tmp/mus/build_final.py` | сведение в 3 тира | + +Результат: [[family/plans/lidarr-artist-watchlist]] — 150 позиций + разбор Пыльной Радуги. + +--- + +## Связанное + +- [[family/plans/lidarr-artist-watchlist]] — результат +- [[family/plans/lidarr-taiga-deploy]] — деплой Lidarr, §АУДИТ СТЕКА +- [[personal/music-download-practices]] — как качать (hitmotop/mp3party) +- `music-batch-download-nas` — скилл загрузки на NAS + +--- +*Создано: 2026-09-28*