162 lines
7.9 KiB
Markdown
162 lines
7.9 KiB
Markdown
---
|
||
title: Watchlist Automation — Полный Flow
|
||
namespace: personal
|
||
created: '2026-05-20'
|
||
updated: '2026-05-27'
|
||
last_synced: '2026-05-27'
|
||
type: concept
|
||
tags:
|
||
- kraken
|
||
- watchlist
|
||
- automation
|
||
- synthesis
|
||
confidence: 0.9
|
||
---
|
||
# Watchlist Automation — Полный Flow
|
||
|
||
Синтез: как `family/documents/movies-watchlist.md` превращается в скачанный контент. Объединяет [[tech/arr-stack-kraken]], [[concepts/kraken-media-stack]], [[tech/hermes-docker-kraken]].
|
||
|
||
## Полная цепочка
|
||
|
||
```
|
||
[вс 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: migrated to Kraken)
|
||
|
||
Watchlist pipeline runs entirely on Kraken (migrated from Eagle 2026-05-27).
|
||
Eagle previously ran `watchlist-nightly` via SSH; now Kraken runs it locally.
|
||
|
||
| Job | Расписание | Хост | Скрипт |
|
||
|-----|-----------|------|--------|
|
||
| `watchlist-nightly` | ежедн. 01:00 | Kraken | `~/.hermes/scripts/watchlist-nightly.sh` |
|
||
| `watchlist-discover` | вс 09:00 | Kraken | `~/.hermes/scripts/watchlist-discover.sh` |
|
||
|
||
**watchlist-nightly.sh** (на Kraken):
|
||
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)
|
||
|
||
**Paths on Kraken HDD (UUID 49e8f586-3839-4c5d-a1e1-58bfc3579ade):**
|
||
- `/home/kraken/obsidian` → symlink to `/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 pitfall:** блокирует `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/`
|
||
|
||
Kopirует NFO + постер рядом с symlink (Jellyfin не видит метадату через symlink напрямую).
|
||
|
||
## Open Tasks (2026-05-20)
|
||
|
||
- 🟡 Передавать Transmission locations через router script при каждом импорте (сейчас вручную)
|
||
- 🔴 rsync невыполненных фильмов с HTPC на Кракен (`Фильмы не перенесенные с htpc на кракен.md`)
|
||
- 🟡 Watchlist sync-up: добавить перенесённые фильмы в нужные разделы
|
||
|
||
## Pitfalls
|
||
|
||
### KP Markdown Link Parsing Bug
|
||
Items added from Kinopoisk with full markdown link syntax
|
||
`[Title](https://kinopoisk.ru/film/12345/) (2025)` were passed raw to TMDB
|
||
search → not found → marked `❓` permanently (`not i.ambiguous` skips on
|
||
next run). Fix: commit `2db1ed9` — extract plain title from markdown links
|
||
before passing to TMDB. Items incorrectly marked ❓ require manual `--recheck`.
|
||
|
||
### KP API Endpoint
|
||
`api.kinopoisk.dev` redirects to `api.poiskkino.dev/v1.4/movie`. Use the
|
||
redirect destination directly to avoid DNS issues.
|
||
|
||
## 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).
|
||
|
||
## See Also
|
||
|
||
- [[tech/arr-stack-kraken]] — детальные питфоллы *arr стека
|
||
- [[tech/arr-stack-taiga]] — *arr stack на Тайге (аналогичная архитектура)
|
||
- [[concepts/kraken-media-stack]] — полная архитектура медиасервера
|
||
- [[tech/hermes-docker-kraken]] — Hermes на Кракене
|
||
- [[tech/jellyfin-transcode-rpi5]] — Jellyfin PGS/ASS питфоллы
|