[2026-09-20] eagle: family/how-to/arr-stack-kraken.md family/projects/watchlist-automation.md family/projects/watchlist-sync.md
This commit is contained in:
1 parent
abee5a86d1
commit
33e1607a43
3 files changed
+149
-40
No files matched your search
@@ -400,6 +400,30 @@ sudo docker start prowlarr
|
||||
- `POST /api/v3/indexer/test` с телом `{"indexerId":N}` → HTTP 400 (валидирует как НОВЫЙ индексер, требует Name/Implementation). Для теста всех сразу: `POST /api/v3/indexer/testall`.
|
||||
- `GET /api/v1/health` в Prowlarr и `/api/v1/indexerstatus` НЕ показывают причины блокировки. Смотреть `.../docker/prowlarr/config/logs/prowlarr.debug.txt` (grep по имени индексера и `Cloudflare`/`403`).
|
||||
|
||||
## Sonarr `sonarr_add()` не проверяет дубли → `400 SeriesExistsValidator` (2026-09-20)
|
||||
|
||||
**Симптом:** при `sync-down` для уже существующей серии в логе появляется шум:
|
||||
```
|
||||
[!] 'Волшебный участок' — error: Client error '400 Bad Request' for url
|
||||
'http://localhost:8989/sonarr/api/v3/series?apikey=...'
|
||||
```
|
||||
|
||||
**Причина (безобидная):** серия **уже есть** в Sonarr. Тело ответа:
|
||||
```json
|
||||
[{"propertyName":"TvdbId","errorMessage":"This series has already been added",
|
||||
"attemptedValue":442038,"errorCode":"SeriesExistsValidator"}]
|
||||
```
|
||||
«Волшебный участок» → TVDB **Magical Police Department** (tvdbId=442038).
|
||||
|
||||
**Корень:** `watchlist_sync/arr.py::sonarr_add()` шлёт `POST /api/v3/series` **без pre-check**, в отличие от `radarr_add()`, где есть `radarr_exists()`. Sonarr отвечает ошибкой валидатора, `sync_down` ловит её как исключение и печатает `[!]`, не помечая позицию `⬇️`.
|
||||
|
||||
**Следствие:** позиция остаётся `[ ]` и будет заново пытаться добавиться на каждом прогоне, каждый раз занимая слот батча и не помечаясь.
|
||||
|
||||
**Починка (не сделана):** добавить проверку по `tvdbId` перед POST — как в Radarr. Реэкспорт `series/lookup` в Sonarr дубли не отсекает, проверять надо по библиотеке:
|
||||
```
|
||||
GET /api/v3/series → сверить tvdbId
|
||||
```
|
||||
|
||||
## Обновление Radarr / Sonarr (2026-09-20)
|
||||
|
||||
Watchtower их не обновлял (см. [[family/how-to/kraken-watchtower]]), поэтому обновлено вручную:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
created: '2026-05-20'
|
||||
updated: '2026-09-20'
|
||||
status: degraded
|
||||
status: active
|
||||
tags:
|
||||
- kraken
|
||||
- watchlist
|
||||
@@ -48,6 +48,11 @@ Jellyfin (8096) → rescan → виден контент
|
||||
| `🗓️` | upcoming (ещё не вышел) | discover помечает, не скачивается |
|
||||
| `❓` | не найдено / ambiguous | ждёт ручного уточнения |
|
||||
| `🧟♀️` | horror (genre_id=27) | информационный маркер |
|
||||
| `⭐` | **приоритет к загрузке** (U+2B50) | sync-down берёт в первую очередь (ПЛАН, не реализован) |
|
||||
|
||||
⚠️ **`✭` (U+272D) — НЕ приоритет.** Alex 2026-09-20 явно указал: звёздочкой-приоритетом считается только `⭐` (U+2B50). Символ `✭` используется в файле как обычная пометка «выделенное», приоритетом не является.
|
||||
|
||||
Также: `⭐` засчитывается **только в строке фильма** (`- [ ] Название ⭐ …`), НЕ в под-буллетах кандидатов, которые генерирует `mark_ambiguous` (там формат «Название (год) ★N.N»). `[x]` (просмотренные) с `⭐` игнорируются.
|
||||
|
||||
## Структура секций movies-watchlist.md
|
||||
|
||||
@@ -62,9 +67,9 @@ Jellyfin (8096) → rescan → виден контент
|
||||
|
||||
**Важно:** `process_thumbs` автоматически определяет отступ из `## Фильмы` и сохраняет при переносе. `SECTION_THUMBDN = "## Новинки👎"` (без пробела) — должно точно совпадать с заголовком.
|
||||
|
||||
## 🔴 Pipeline МЁРТВ с 2026-06-20 (аудит 2026-09-20)
|
||||
## 🔴 Крон pipeline ОТСУТСТВУЕТ (аудит 2026-09-20) — но баг с мусором УЖЕ ИСПРАВЛЕН
|
||||
|
||||
**Автодобавление фильмов НЕ работает.** Скрипты живы, но их никто не запускает.
|
||||
**Автодобавление фильмов НЕ работает по расписанию.** Скрипты живы, но их никто не запускает.
|
||||
|
||||
Доказательства (проверено 2026-09-20):
|
||||
- `crontab -l` юзера `kraken` — watchlist-строк **НЕТ**. Есть только `sync-vault.sh` (каждый час) и два `pgs-to-srt` (часовой + 03:00).
|
||||
@@ -79,11 +84,7 @@ Jellyfin (8096) → rescan → виден контент
|
||||
~/scripts/watchlist-discover.sh mtime 2026-05-29
|
||||
```
|
||||
|
||||
**Побочный эффект — файл засран `❓`-мусором.** Так как `resolve --recheck` не бегает, ambiguous-строки копят дампы кандидатов: «Крестный отец» ×4 блока по 6 строк, «Nightmare Alley» ×31 строка, «Stand by me» ×40 строк, «Фарго» ×30. Секции `👍/👎` не обрабатываются — 40+ позиций висят в «Новинки», не переехав в основной список.
|
||||
|
||||
> ⚠️ **Уточнение (2026-09-20, позже в тот же день):** изначальная гипотеза «мусор скопился от многомесячного простоя» **НЕВЕРНА**. Дубли создавались на **каждом** прогоне `resolve` из-за бага в `mark_ambiguous()` (см. ниже). 33 строки у «Nightmare Alley» = 11 прогонов. Простой лишь позволил мусору накопиться незамеченным.
|
||||
|
||||
**Крон по-прежнему НЕ восстановлен** — Alex не просил, прогон делался вручную (см. «Ручной прогон»).
|
||||
> ⚠️ **Изначальная гипотеза «файл засран от многомесячного простоя» — НЕВЕРНА.** Дубли создавались на **каждом** прогоне `resolve` из-за бага в `mark_ambiguous()` (см. ниже, **исправлен**). 33 строки у «Nightmare Alley» = 11 прогонов. Простой лишь позволил мусору накопиться незамеченным. Мусор вычищен, баг закрыт.
|
||||
|
||||
## ✅ Баг дублирования кандидатов в `mark_ambiguous()` — НАЙДЕН И ИСПРАВЛЕН (2026-09-20)
|
||||
|
||||
@@ -191,37 +192,87 @@ resolved.sort(key=lambda x: x[1].rating or 0, reverse=True)
|
||||
|
||||
⚠️ **Отдельный случай:** `rating == 0.0` означает «TMDB не дал оценку», а НЕ «плохой фильм». Таких двое: `Уроки благи`, `Годзилла и конг`. Наивный фильтр `< 6.0` их отсечёт и потеряет нормальное кино.
|
||||
|
||||
### 📋 ПЛАН (согласован с Alex 2026-09-20, НЕ реализован)
|
||||
### ✅ РЕАЛИЗОВАНО (2026-09-20): `sync_down` следует порядку файла + фильтр `MIN_RATING`
|
||||
|
||||
Alex выбрал **вариант 1** («только порядок в файле») + добавил требование фильтра по рейтингу. Итоговая формула: **порядок файла = приоритет, рейтинг = отбор**.
|
||||
План из «📋 ПЛАН» **выполнен**. Alex подтвердил: **порядок файла = приоритет, рейтинг = отбор**, нулевые рейтинги (`0.0`) **отсекать** вместе с остальными ниже порога.
|
||||
|
||||
**Файл:** `watchlist_sync/sync_down.py`, две правки.
|
||||
**Коммиты в репо watchlist-sync (оба сделаны в этой сессии):**
|
||||
```
|
||||
ada47da feat(sync-down): follow file order, filter by MIN_RATING
|
||||
2dab180 fix(parser): mark_ambiguous replaces candidate block instead of prepending
|
||||
```
|
||||
Предыдущий HEAD до сессии — `20ca511`. Рабочее дерево чистое.
|
||||
|
||||
**1. Убрать сортировку (строка 41)** — удалить `resolved.sort(...)`, `resolved` остаётся в порядке `parse()` = сверху вниз.
|
||||
**Правка 1 — убран `resolved.sort()`** (был на строке 41). `resolved` заполняется циклом по `parse()`, то есть остаётся в порядке файла сверху вниз.
|
||||
|
||||
**2. Добавить фильтр по рейтингу** при заполнении `resolved`:
|
||||
**Правка 2 — добавлена константа и фильтр** в начало `sync_down.py`:
|
||||
```python
|
||||
# Minimum TMDB/KP rating for a title to be queued. 0.0 means "no rating in
|
||||
# the database" -- per Alex it is discarded together with everything below
|
||||
# the threshold, so unrated items never reach Radarr/Sonarr.
|
||||
MIN_RATING = 6.0
|
||||
```
|
||||
```python
|
||||
if result.status == "ok":
|
||||
if (result.candidate.rating or 0) >= MIN_RATING:
|
||||
resolved.append((item, result.candidate))
|
||||
else:
|
||||
print(f" [−] {item.title!r} — rating ... < {MIN_RATING}, skipped")
|
||||
if (result.candidate.rating or 0) < MIN_RATING:
|
||||
skipped_low += 1
|
||||
print(f" [−] {item.title!r} — rating "
|
||||
f"{result.candidate.rating or 0:.1f} < {MIN_RATING}, skipped")
|
||||
continue
|
||||
resolved.append((item, result.candidate))
|
||||
else:
|
||||
deferred.append((item, result))
|
||||
```
|
||||
`MIN_RATING = 6.0` — вынести константой в начало файла (сейчас захардкожено в двух местах в разных видах).
|
||||
Плюс итоговая строка `(N item(s) below rating 6.0 skipped)` — чтобы отсев был виден в логе, а не молчал.
|
||||
|
||||
**Явно решено НЕ трогать `process_thumbs`:** 👍 остаются в верхней части списка, то есть свежие новинки намеренно идут в первую очередь.
|
||||
**`process_thumbs` сознательно НЕ тронут** — 👍 по-прежнему уезжают в верх основного списка, то есть свежие новинки намеренно идут первыми (выбор Alex, «вариант 1»).
|
||||
|
||||
**Открытый вопрос (задан Alex, ответа ещё НЕТ):** отсекать ли `rating == 0.0` вместе с остальными, или пропускать нули как «неизвестно ≠ плохо». Рекомендация — пропускать.
|
||||
**Dry-run после правки (проверено):**
|
||||
```
|
||||
[−] ... 18 строк «skipped» (все < 6.0, включая два нуля: Уроки благи 0.0, Годзилла и конг 0.0)
|
||||
(18 item(s) below rating 6.0 skipped)
|
||||
[→] 'Под огнём' (2025) ★7.1 [dry-run]
|
||||
[→] 'Секретный агент' (2025) ★7.3 [dry-run]
|
||||
[→] 'Охота на воров 2: Пантера' (2025) ★6.6 [dry-run]
|
||||
[→] 'Гадкая сестра' (2025) ★7.3 [dry-run]
|
||||
[→] 'Семья в аренду' (2025) ★7.8 [dry-run]
|
||||
Queued 5/5 items [dry-run]
|
||||
```
|
||||
Порядок ровно как в файле, с самого верха `## Новинки`. Рейтинг больше не влияет на очерёдность — только на отбор.
|
||||
|
||||
**Порядок работы (шаги 1-4 выполнены ранее, 5-6 ожидают ответа):**
|
||||
1. ✅ Бэкап `sync_down.py`
|
||||
2. 🔴 Отдельный коммит `parser.py` (фикс дедупа) — **всё ещё не закоммичен**
|
||||
3. ⏸ Правка `sync_down.py` скриптом в файле
|
||||
4. ⏸ Коммит `feat: sync-down follows file order + rating filter`
|
||||
5. ⏸ Dry-run — показать первые 10 и что отсеивается
|
||||
6. ⏸ ОК Alex → реальный прогон
|
||||
⚠️ **Реальный прогон (`bash ~/scripts/watchlist-nightly.sh`) после этой правки был ПРЕРВАН** — не отработал. Vault проверен: рабочее дерево чистое, `movies-watchlist.md` остался на коммите `d7ce0a9` (результат первого прогона), частичных изменений нет.
|
||||
|
||||
**Что покажет вариант 1 (симуляция file-order, первые 5):** `Под огнём` (7.1), `Секретный агент` (7.3), `Охота на воров 2: Пантера` (6.6), `Гадкая сестра` (7.3), `Семья в аренду` (7.8) — все свежие новинки из `## Новинки`, рейтинги в норме.
|
||||
### ⭐ Приоритет по звёздочке `⭐` (U+2B50) — ПЛАН, НЕ реализован
|
||||
|
||||
**Требование Alex (2026-09-20, после реализации «порядка файла»):** фильмы, отмеченные звёздочкой `⭐`, должны идти **в первую очередь** к загрузке — приоритет поверх порядка файла.
|
||||
|
||||
**Уточнения Alex:**
|
||||
- Только символ **`⭐` (U+2B50)**. Символ `✭` (U+272D) приоритетом **НЕ является**.
|
||||
- Только те `⭐`, что стоят **в названии фильма в списке**, а не в под-буллетах кандидатов («Название (год) ★N.N»), которые генерирует скрипт.
|
||||
- `[x]` (просмотренные) — **пропускать**.
|
||||
|
||||
**Аудит файла на 2026-09-20:**
|
||||
| Символ | Где | Значение |
|
||||
|--------|-----|----------|
|
||||
| `⭐` U+2B50 | строка 79: `- [ ] Простите за беспокойство ⭐ 2018` | **единственный** приоритетный кандидат |
|
||||
| `✭` U+272D | `⬇️ Наш флаг означает смерть ✭`, `⬇️ Битва за битвой ✭` | не приоритет (уже в очереди) |
|
||||
| `✭` U+272D | `[x] Бруталист ✭`, `[x] Анора ✭` | не приоритет (просмотрены) |
|
||||
|
||||
**Проверено:** `parser._clean()` **НЕ срезает** `⭐` (срезает только `✭★☆✩✪✫✬✮✯✰`) — символ остаётся и в `item.raw`, и в `item.title`. Значит проверку можно делать по `item.raw`. Элемент имеет `status=UNWATCHED, queued=False, ambiguous=False` → уже попадает в `candidates_raw`.
|
||||
|
||||
**Согласованный подход (двухпроходная выборка):**
|
||||
```python
|
||||
starred = [i for i in candidates_raw if "\u2b50" in i.raw]
|
||||
rest = [i for i in candidates_raw if "\u2b50" not in i.raw]
|
||||
for item in starred + rest: # приоритетный проход первым
|
||||
...
|
||||
```
|
||||
|
||||
**Открытые вопросы (заданы Alex, ответа ещё НЕТ):**
|
||||
1. **Фильтр рейтинга vs ⭐** — если `⭐`-фильм имеет рейтинг < 6.0, качать всё равно или отсеять? Рекомендация: **отсеять** (⭐ меняет очерёдность, не отменяет фильтр качества). Сейчас конфликта нет — `Простите за беспокойство` имеет 6.8.
|
||||
2. **Чистить `⭐` из поискового запроса** перед TMDB? Сейчас не чистится и работает (TMDB находит), но это случайность. Рекомендация: добавить `⭐` в класс срезаемых символов `_clean()`.
|
||||
|
||||
Ответы нужны до начала правки. Правка будет **отдельным коммитом** поверх `ada47da`.
|
||||
|
||||
### 📦 Результат закачки по итогам прогона 2026-09-20
|
||||
|
||||
@@ -251,22 +302,37 @@ if result.status == "ok":
|
||||
/srv/.../watchlist-sync/watchlist_sync/parser.py.bak-20260920-192909
|
||||
```
|
||||
|
||||
### Статус на конец сессии
|
||||
- ✅ Фикс `parser.py` применён на Кракене, записан на диск, **`ast.parse` OK**, проверен 3 прогонами (размер стабилен).
|
||||
- 🔴 **Фикс НЕ закоммичен** в репо watchlist-sync (git status показывает только `?? arr.py.bak-web4k-...`). Нужен коммит.
|
||||
### Статус на конец сессии (обновлено)
|
||||
- ✅ Фикс `parser.py` применён, проверен 3 прогонами, **ЗАКОММИЧЕН** — `2dab180`.
|
||||
- ✅ Фикс `sync_down.py` (порядок файла + `MIN_RATING = 6.0`) **ЗАКОММИЧЕН** — `ada47da`. Dry-run подтверждён (18 отсеяно, 5 в батче по порядку файла).
|
||||
- ✅ Файл watchlist вычищен (168 дублей убрано) и закоммичен в vault.
|
||||
- ✅ Ручной прогон `watchlist-nightly.sh` прошёл чисто, 4 фильма ушли в закачку.
|
||||
- ✅ Ручной прогон `watchlist-nightly.sh` прошёл чисто, 4 фильма ушли в закачку (3 качаются, 1 ждёт релиз).
|
||||
- 🔴 **Реальный прогон ПОСЛЕ правки `sync_down` был прерван** — не выполнен. Новый отбор (порядок файла + фильтр) пока проверен только в dry-run.
|
||||
- 🔴 Крон по-прежнему отсутствует — pipeline живёт только вручную.
|
||||
- 🔴 Найден и задокументирован баг отбора в `sync_down` (сортировка по рейтингу вместо порядка файла) + отсутствие фильтра по рейтингу. План фикса согласован, реализация ждёт решения по нулевым рейтингам.
|
||||
- ⏸ **Ожидает решения Alex:** приоритет `⭐` (U+2B50) и два связанных вопроса (см. секцию «⭐ Приоритет по звёздочке»).
|
||||
- ℹ️ Доки [[watchlist-automation]] и [[watchlist-sync]] были обновлены агентом Eagle в этой же сессии (коммиты `bd743da`, `abee5a8` в vault) — при дальнейших правках свериться, чтобы не затереть.
|
||||
|
||||
**Бэкапы, созданные в этой сессии:**
|
||||
```
|
||||
~/obsidian/family/documents/movies-watchlist.md.bak-20260920-192909 (838 строк, 26430 б — ДО фикса)
|
||||
~/obsidian/family/documents/movies-watchlist.md.dedupe-backup-20260920-193111 (до дедупа)
|
||||
/srv/.../watchlist-sync/watchlist_sync/parser.py.bak-20260920-192909 (md5 0f597606fa14f357ff3b25547bd18ea6)
|
||||
/srv/.../watchlist-sync/watchlist_sync/sync_down.py.bak-20260920-194447
|
||||
```
|
||||
⚠️ `.bak-*` добавлены в `.gitignore` репо watchlist-sync, чтобы не попадать в коммиты.
|
||||
|
||||
**Скрипты диагностики/фикса (на Кракене, `/tmp/`):** `wl_dedupe.py`, `wl_verify_final.py`, `wl_postcheck.py`, `wl_order2.py`, `wl_grab_check.py`, `wl_fix_parser3.py`. `wl_dedupe.py` пригоден для повторного использования при накоплении дублей.
|
||||
**Скрипты диагностики/фикса (на Кракене, `/tmp/`):** `wl_dedupe.py`, `wl_verify_final.py`, `wl_postcheck.py`, `wl_order2.py`, `wl_grab_check.py`, `wl_fix_parser3.py`, `wl_fix_syncdown.py`, `wl_star.py`, `wl_star_check.py`. `wl_dedupe.py` пригоден для повторного использования при накоплении дублей; `wl_postcheck.py` — для проверки дублей после прогона.
|
||||
|
||||
### Пути к конфигам *arr (проверено 2026-09-20, в доке ранее были ошибочны)
|
||||
Конфиги Radarr/Sonarr/Transmission лежат на **втором диске** (`6194539b-03e0-4f33-986b-4da09834e82f`), не на том же, что медиа:
|
||||
```
|
||||
Radarr API key: /srv/dev-disk-by-uuid-6194539b-.../docker/radarr/config/config.xml
|
||||
Sonarr: /srv/dev-disk-by-uuid-6194539b-.../docker/sonarr/config/config.xml
|
||||
Transmission: /srv/dev-disk-by-uuid-6194539b-.../docker/transmission/settings.json
|
||||
Radarr API base: http://localhost:7878/radarr/api/v3/ (ключ из config.xml)
|
||||
Sonarr API base: http://localhost:8989/sonarr/api/v3/
|
||||
```
|
||||
Проверка закачки: `queue` в Radarr показывает `grabbed/downloading`; `history` даёт точное имя взятого релиза. Transmission — `docker exec transmission transmission-remote --list` (RPC-юзер в `settings.json` пустой).
|
||||
|
||||
## Cron Jobs (на Кракене с 2026-05-27)
|
||||
|
||||
@@ -382,8 +448,10 @@ Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + ep
|
||||
|
||||
## Open Tasks
|
||||
|
||||
- 🔴 **[2026-09-20] РЕАЛИЗОВАТЬ согласованный фикс `sync_down.py`** — ждёт ответа Alex по нулевым рейтингам. Детали плана в секции «📋 ПЛАН» выше. Две правки: убрать `resolved.sort()` (строка 41), добавить фильтр `MIN_RATING = 6.0` с видимым `print`.
|
||||
- 🔴 **[2026-09-20] Закоммитить фикс `parser.py`** в репо watchlist-sync. Правка применена на Кракене, но не в git — при следующем `git pull`/пересоздании `.venv` можно потерять. Файл: `watchlist_sync/parser.py` (функция `mark_ambiguous`, `_SUB_BULLETS`).
|
||||
- ✅ **[2026-09-20] Фикс `sync_down.py` РЕАЛИЗОВАН** — коммит `ada47da`. Убран `resolved.sort()`, добавлен `MIN_RATING = 6.0` с видимым `print`. Нулевые рейтинги отсекаются (решение Alex: «отсекать»).
|
||||
- ⏸ **[2026-09-20] Приоритет `⭐` (U+2B50) в `sync_down` НЕ реализован** — ждёт ответа Alex на два вопроса (фильтр рейтинга vs ⭐; чистить ли `⭐` из поискового запроса). Детали в секции «⭐ Приоритет по звёздочке» выше. Только `⭐` (U+2B50), `✭` (U+272D) не считается; `[x]` пропускать; только строки фильмов, не под-буллеты кандидатов.
|
||||
- 🔴 **[2026-09-20] Догнать реальный прогон** — после правки `sync_down` полный `watchlist-nightly.sh` ни разу не отработал (был прерван). Прогнать и убедиться, что батч = `Под огнём`, `Секретный агент`, `Охота на воров 2`, `Гадкая сестра`, `Семья в аренду` (dry-run это предсказал).
|
||||
- 🟡 **[2026-09-20] `sync-down` берёт всего 5 за прогон** — при 254 кандидатах разбор очереди займёт ~50 ночей. Рассмотреть увеличение `--batch` (сейчас `--batch 5` в `watchlist-nightly.sh`).
|
||||
- 🔴 **[2026-09-20] Восстановить cron для watchlist pipeline** — pipeline мёртв с 20 июня. Скрипты готовы и проверены вручную (прогон 2026-09-20 прошёл чисто), нужно вернуть в crontab юзера `kraken`:
|
||||
```
|
||||
0 1 * * * bash ~/scripts/watchlist-nightly.sh
|
||||
@@ -393,7 +461,7 @@ Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + ep
|
||||
- 🟡 **[2026-09-20] Разобрать 5 застрявших закачек в очереди Radarr** со статусом `warning`: `Brokeback Mountain`, `Мортал Комбат 2`, `Sorry to Bother You`, `Город бога`, `День хомячка`. Висят давно, релиз не находится/не качается.
|
||||
- 🟡 **[2026-09-20] Настроить Zulip-пинг** — `ZULIP_URL` / `ZULIP_API_KEY` / `ZULIP_BOT_EMAIL` отсутствуют в `.env` watchlist-sync, 59 нерезолвленных items ушли в никуда без уведомления.
|
||||
- 🟡 **[2026-09-20] Добавить pre-check дублей в `sonarr_add()`** — сейчас при уже существующей серии прилетает `400 SeriesExistsValidator` и шумит в логе. В `radarr_add()` проверка есть.
|
||||
- 🟡 **[2026-09-20] Синхронизировать документацию с кодом** — [[watchlist-sync]] §1.2 и §1.3 описывают порог `min_rating: 6.0` и «приоритет = порядок в файле», которых в коде нет. Обновить после реализации фикса.
|
||||
- 🟡 **[2026-09-20] Синхронизировать документацию с кодом** — [[watchlist-sync]] §1.2 и §1.3 описывают порог `min_rating: 6.0` и «приоритет = порядок в файле», которых в коде не было. Порог теперь реализован (`MIN_RATING`), приоритет по порядку тоже — обновить формулировки в [[watchlist-sync]].
|
||||
- 🔴 **[2026-09-04] Решить стратегию качества загрузки новых фильмов** — уже РЕШЕНО 2026-09-04 (профиль `WEB-4K (no remux)`, id 7 для Radarr и Sonarr). Осталось только убедиться, что старые `⬇️`-позиции, добавленные до фикса, не тянут remux.
|
||||
- 🟡 Оставшиеся `❓`-позиции (71 маркер) — **намеренно не чистятся вручную** (решение Alex 2026-09-20). Разбираются через `resolve --recheck` при работающем кроне.
|
||||
- 🟡 Передавать Transmission locations через router script при каждом импорте (сейчас вручную)
|
||||
|
||||
@@ -75,9 +75,10 @@ Hermes Kraken cron job
|
||||
### 1.3 Загрузка (sync-down)
|
||||
|
||||
**Батчинг:**
|
||||
- Максимум **5 новых** в одном прогоне (защита от flood)
|
||||
- ⚠️🔴 **Приоритет — НЕ порядок в файле.** Дизайн заявлял «порядок в файле (выше = важнее)», но фактически в коде `sync_down.py:41` стоит `resolved.sort(key=lambda x: x[1].rating or 0, reverse=True)` — отбор идёт **по рейтингу TMDB/KP**, позиция строки игнорируется. Найдено 2026-09-20, фикс согласован (см. [[family/projects/watchlist-automation]] → «📋 ПЛАН»).
|
||||
- ⚠️🔴 **Фильтр по рейтингу в `sync_down` ОТСУТСТВУЕТ.** Порог `min_rating: 6.0` ниже описан как дизайн, но в коде `sync_down.py` его нет — в очередь могут попасть фильмы с рейтингом 0.0-5.9. На 2026-09-20 таких 18 из 251 кандидатов. `discover.py` фильтрует, `sync_down.py` — нет.
|
||||
- Максимум **5 новых** в одном прогоне (защита от flood) — задаётся `--batch 5` в `watchlist-nightly.sh`
|
||||
- ✅ **Приоритет — порядок в файле** (исправлено 2026-09-20, коммит `ada47da`). Раньше стоял `resolved.sort(key=lambda x: x[1].rating or 0, reverse=True)`, из-за чего позиция строки игнорировалась и в батч попадал топ-5 по рейтингу. Сортировка убрана, `resolved` заполняется в порядке `parse()` = сверху вниз.
|
||||
- ✅ **Фильтр по рейтингу реализован** (там же). Константа `MIN_RATING = 6.0` в начале `sync_down.py`; всё, что ниже, печатается как `[−] … skipped` и не попадает в очередь. **Нулевые рейтинги (`0.0`) отсекаются вместе с остальными** — решение Alex 2026-09-20. На момент замера отсеивалось 18 из 251 кандидатов.
|
||||
- ⏸ **Приоритет `⭐` (U+2B50)** — согласован, но НЕ реализован: такие фильмы должны идти в первую очередь. Детали и открытые вопросы — в [[family/projects/watchlist-automation]] → «⭐ Приоритет по звёздочке».
|
||||
- После добавления в Radarr/Sonarr → заменить `- [ ]` на `- [ ] ⬇️` в .md
|
||||
|
||||
**API:**
|
||||
@@ -123,6 +124,22 @@ WATCHLIST_PATH=/vault/family/documents/movies-watchlist.md
|
||||
|
||||
⚠️🔴 **Cron НЕ восстановлен после 2026-06-20** — pipeline запускается только вручную. См. [[family/projects/watchlist-automation]].
|
||||
|
||||
---
|
||||
|
||||
## Разделение приоритета: порядок / рейтинг / ⭐ (итог обсуждения 2026-09-20)
|
||||
|
||||
Три разных механизма, которые легко перепутать:
|
||||
|
||||
| Механизм | Роль | Где в коде |
|
||||
|----------|------|-----------|
|
||||
| **Порядок в файле** | **приоритет** — что качать раньше | `sync_down.py` (порядок `parse()`, сортировки нет) |
|
||||
| **Рейтинг ≥ 6.0** | **отбор** — что вообще качать | `MIN_RATING` в `sync_down.py` |
|
||||
| **`⭐` (U+2B50)** | **приоритет поверх порядка** | ⏸ не реализовано |
|
||||
|
||||
**Ключевое правило:** порядок и `⭐` влияют на **очерёдность**, рейтинг — на **допуск**. Рейтинг не поднимает фильм выше в очереди; `⭐` не отменяет порог рейтинга (по предложению; ждёт подтверждения Alex).
|
||||
|
||||
**`✭` (U+272D) приоритетом НЕ является** — только `⭐` (U+2B50), и только в строке фильма, не в под-буллетах кандидатов; `[x]` пропускается.
|
||||
|
||||
Используют `~/scripts/sync-vault.sh` для всех git-операций (stash/pull/pop/commit/push). **Не агентные** — скрипты вызывают CLI напрямую, никакого LLM в pipeline.
|
||||
|
||||
**Cron: каждые 6 часов**
|
||||
|
||||
Reference in new issue
Block a user