--- created: '2026-05-20' updated: '2026-05-27' status: active tags: - kraken - watchlist - automation - movies --- # Watchlist Automation — Полный Flow Полная цепочка: как `family/documents/movies-watchlist.md` превращается в скачанный контент. ## Полная цепочка ``` [вс 09:00] watchlist-discover ← KP API топ фильмов 2024-2025 ↓ добавляет в секцию "Новинки 👍/👎" movies-watchlist.md Alex ставит 👍 / 👎 ↓ [ежедн 09:00] watchlist-resolve ← SSH Кракен → resolve → commit [ежедн 10:00] watchlist-sync-down → process-thumbs (перемещает 👍 → начало списка) → sync-down (добавляет батч в Radarr/Sonarr) ↓ Radarr (7878) / Sonarr (8989) → Prowlarr (9696) → RuTracker / Kinozal(M) / NoNaMe / etc. → Transmission (9091) → /media/movies-radarr или /media/series-sonarr ↓ router.py (Custom Script) → читает жанры из NFO/TMDb → symlink в /media/{movies,cartoons,documentaries,...}/ ↓ Jellyfin (8096) → rescan → виден контент ``` ## Статусы в movies-watchlist.md | Символ | Значение | Действие | |--------|---------|---------| | `[ ]` | не смотрел, в очереди | sync-down добавляет в Radarr/Sonarr | | `[x]` | просмотрено | sync-up из Jellyfin watched history | | `⬇️` | добавлено в Radarr/Sonarr | ждёт скачки | | `👍` | нравится (новинка) | process-thumbs переносит в начало → попадёт в sync-down | | `👎` | не хочу (новинка) | process-thumbs перемещает в `## Новинки👎` | | `🗓️` | upcoming (ещё не вышел) | discover помечает, не скачивается | | `❓` | не найдено / ambiguous | ждёт ручного уточнения | | `🧟‍♀️` | horror (genre_id=27) | информационный маркер | ## Структура секций movies-watchlist.md ``` ## Новинки - 👍/👎 ← discover добавляет сюда ## Фильмы ← основной список, отступ 2 пробела ( - [ ]) ## Мультфильмы ## Аниме ## Новинки👎 ← без пробела перед 👎 ## Связанные заметки ``` **Важно:** `process_thumbs` автоматически определяет отступ из `## Фильмы` и сохраняет при переносе. `SECTION_THUMBDN = "## Новинки👎"` (без пробела) — должно точно совпадать с заголовком. ## Cron Jobs (на Кракене с 2026-05-27) Весь watchlist pipeline работает на Кракене (мигрировал с Eagle 2026-05-27). | Job | Расписание | Скрипт | |-----|-----------|--------| | `watchlist-nightly` | ежедн. 01:00 | `~/.hermes/scripts/watchlist-nightly.sh` | | `watchlist-discover` | вс 09:00 | `~/.hermes/scripts/watchlist-discover.sh` | **watchlist-nightly.sh** (на Кракене): 1. `sync-vault.sh` (pull) → `process-thumbs --apply` → `sync-vault.sh` (push) 2. `resolve --recheck --apply` → `sync-down --apply --batch 5` → `sync-up --apply` → `sync-vault.sh` (push) **Пути на Кракене (HDD UUID 49e8f586-3839-4c5d-a1e1-58bfc3579ade):** - `/home/kraken/obsidian` → symlink на `/srv/dev-disk-by-uuid-.../obsidian` - watchlist-sync: `/srv/dev-disk-by-uuid-.../Developer/watchlist-sync` ## Discover — Фильтрация | Тип | Порог | |-----|-------| | Мировые | IMDb ≥ 7.0 или KP ≥ 7.0 | | Российские | KP ≥ 8.5 (защита от накрутки) | | Upcoming | год ≥ текущий−1 | | Минимум голосов | IMDb ≥ 1000 или KP ≥ 500 | KP API endpoint: `https://api.poiskkino.dev/v1.4/movie` (redirect с api.kinopoisk.dev). ## *arr Stack — Индексеры (Prowlarr) | ID | Имя | Тип | Примечание | |----|-----|-----|-----------| | 1 | RuTracker | semi-private | блокирует при rate limit на сутки | | 2 | RuTor | public | поиск по imdbid | | 3 | Byrutor | public | | | 4 | NoNaMe Club | semi-private | анонимный | | 5 | Kinozal | semi-private | резерв | | 6 | Kinozal (M) | semi-private | магнет ✅ — без grab limit, **предпочтительный** | **Pi-hole питфолл:** блокирует `skyhook.sonarr.tv` → Sonarr/Radarr поиск молча не запускается. Фикс: `dns: [8.8.8.8]` в docker-compose.yml. ## Router Script — Маршрутизация по жанру После импорта Sonarr/Radarr: `router.py --apply` создаёт symlinks: - Animation (не R/18+) → `/media/cartoons/` или `/media/cartoons-series/` - Documentary → `/media/documentaries/` или `/media/documentaries-series/` - Прочее → `/media/movies/` или `/media/series/` Копирует NFO + постер рядом с symlink (Jellyfin не видит метадату через symlink напрямую). ## watchlist-sync — Python CLI Репо: `~/Developer/watchlist-sync` (GitHub: `mallexxx/watchlist-sync`). ``` watchlist-sync resolve — TMDB + KP API → ID, тип (movie/tv) watchlist-sync sync-down — добавить батч (max 5) в Radarr/Sonarr, поставить ⬇️ watchlist-sync sync-up — Jellyfin watched → [x] в .md ``` **Резолвер:** TMDB `/search/multi` + KP fallback. Пороги: `min_rating: 6.0`, `min_score: 0.75`. При 2+ кандидатах → `❓` (LLM разрешает в cron каждые 6ч, нерешённые → уточнение в Zulip). **Stage 2 (после ≥50 просмотров):** AI-curated recommendations — три списка (с женой / один / семья) на основе TMDB профиля, добавляются в конец watchlist как `## 🤖 Рекомендации (YYYY-WNN)`. Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + episodes). ## Питфоллы ### KP Markdown Link Parsing Bug Фильмы из Kinopoisk с синтаксисом `[Title](https://kinopoisk.ru/film/12345/) (2025)` передавались как есть в TMDB search → не находились → помечались `❓` навсегда (`not i.ambiguous` пропускает при следующем запуске). Фикс: commit `2db1ed9` — извлекать plain title из markdown link до передачи в TMDB. Ошибочно помеченные `❓` требуют ручного `--recheck`. ### KP API Endpoint `api.kinopoisk.dev` редиректит на `api.poiskkino.dev/v1.4/movie`. Использовать destination redirect напрямую. ## Open Tasks (2026-05-20) - 🟡 Передавать Transmission locations через router script при каждом импорте (сейчас вручную) - 🔴 rsync невыполненных фильмов с HTPC на Кракен (`Фильмы не перенесенные с htpc на кракен.md`) - 🟡 Watchlist sync-up: добавить перенесённые фильмы в нужные разделы ## Связанные заметки - [[watchlist-discover]] — шаг discover: KP API, format, CLI команды - [[watchlist-sync]] — основной проект (resolve, sync-down, sync-up) - [[arr-stack-kraken]] — детальные питфоллы *arr стека - [[jellyfin-transcode-rpi5]] — Jellyfin PGS/ASS питфоллы