diff --git a/family/projects/watchlist-automation.md b/family/projects/watchlist-automation.md index 87a77952..e70854e3 100644 --- a/family/projects/watchlist-automation.md +++ b/family/projects/watchlist-automation.md @@ -52,6 +52,30 @@ tags: Похожий по классу инцидент уже был — захардкоженный `qualityProfileId` (см. питфоллы ниже). +### ✅ 2026-09-22 (вечер): `sync-down` вырезан из крона — дыра закрыта СНАРУЖИ + +Второй слой защиты после ручного снятия `monitored`. Даже если `arr.py` не тронут, +**автоматического пути в закачку больше нет вообще**: + +`watchlist-nightly.sh` вызывал `sync-down --apply --batch 2`. Вызов **убран**. +Крон теперь: `sync-vault → process-thumbs → resolve --recheck → sync-up → sync-vault`. + +Бэкап: `/home/kraken/scripts/watchlist-nightly.sh.bak-20260922-182655`. +Сумма новой: `4401882e3b1307a73b3330a70b59ecfe`. + +🔴 **Порядок защиты теперь такой:** +1. Фикс `arr.py` (`searchForMovie: False`) — **ещё не сделан**, на апруве. +2. Ручное снятие `monitored` + `rssSyncInterval: 0` — сделано, но сбрасывается при `add`. +3. **`sync-down` вне крона** — сделано. Блокирует автозапуск независимо от 1 и 2. + +`sync_down.py` как код оставлен — ручной запуск возможен. +Проверка отсутствия автозакачки: +```bash +ssh kraken "grep -ln 'radarr_add\|sonarr_add\|radarr_search\|sync-down --apply' \ + /home/kraken/scripts/*.sh" +``` +Должны быть только комментарии. Детали — [[family/projects/watchlist-sync]]. + ### Правильные вызовы API (проверено) ```bash diff --git a/family/projects/watchlist-sync.md b/family/projects/watchlist-sync.md index 16ae9801..5fdf48a4 100644 --- a/family/projects/watchlist-sync.md +++ b/family/projects/watchlist-sync.md @@ -20,6 +20,50 @@ tags: --- +## 🔴 2026-09-22 — АВТОЗАКАЧКА ОТКЛЮЧЕНА: `sync-down` убран из крона + +**Решение Alex:** закачек быть не должно. Формулировка: +*«ТЕБЕ БЛЯДЬ ЕЩЁ СУКА НЕ ОЧЕВИДНО ЧТО БЛЯДЬ ЗАКАЧЕК БЫТЬ НЕ ДОЛЖНО СКОТИНА?!»* + +**Что было:** `watchlist-nightly.sh` вызывал `sync-down --apply --batch 2` → +`sync_down.py` через `radarr_add()` + `radarr_search()` (`sync_down.py:155,158`) +**добавлял фильмы в Radarr/Sonarr и триггерил поиск раздач**. До 2 позиций за прогон. + +**Что стало:** вызов `sync-down` вырезан из cron-скрипта. + +``` +sync-vault → process-thumbs → resolve --recheck --apply → sync-up → sync-vault +``` + +Бэкап прежнего скрипта: `/home/kraken/scripts/watchlist-nightly.sh.bak-20260922-182655` +Сумма новой версии: `4401882e3b1307a73b3330a70b59ecfe` + +🔴 **`sync_down.py` как КОД сохранён** — запускается вручную (`watchlist-sync sync-down +--dry-run` для проверки, `--apply --batch N` для реальной закачки). Отключён +**автоматический прогон по крону**, а не возможность. Возврат в крон — только по +прямому указанию Alex. + +**Проверка отсутствия автозакачки:** +```bash +ssh kraken "grep -ln 'radarr_add\|sonarr_add\|radarr_search\|sync-down --apply' \ + /home/kraken/scripts/*.sh" +``` +Активных вызовов быть не должно — только комментарии. + +⚠️ **Radarr уже получил закачки за прошлые прогоны** (9 фильмов). Их судьба не решена. + +### Разграничение двух «лимитов» — частый источник путаницы + +| Лимит | Что ограничивает | Где | +|---|---|---| +| `batch=N` | сколько позиций **уходит в Radarr на закачку** за прогон | `sync_down.py` (был в кроне) | +| **лимита нет** | **выдача в Lampa** — отдаётся весь `watchlist.json` | `lampac/wwwroot/` | + +⚠️ Каталог Lampa строится `.md` → `watchlist.json`; **Radarr в отображении НЕ участвует.** +Когда Alex спрашивал про «лимит обработки/выдачи в lampa» — это НЕ `batch`. + +--- + ## 2026-09-22 — `discover` больше не добавляет кино, которого нет в TMDB (коммит `396acc3`) **Проблема:** `discover.py` фильтровал новинки **только по рейтингу и голосам** @@ -108,6 +152,7 @@ Hermes Kraken cron job **Батчинг:** - Максимум **5 новых** в одном прогоне (защита от flood) — задаётся `--batch 5` в `watchlist-nightly.sh` + ⚠️ **С 2026-09-22 `sync-down` из крона УБРАН** (автозакачка отключена) — см. раздел выше. `--batch` актуален только для ручного запуска. Исторически стоял `--batch 2` (снижен с 5 после инцидента 2026-09-21: диск 100%). - ✅ **Приоритет — порядок в файле** (исправлено 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) РЕАЛИЗОВАН** (2026-09-20, коммит `7db9385`). Двухпроходная выборка: `starred + rest`. Два важных свойства: (а) ⭐ **обходит фильтр `MIN_RATING`** — условие в коде `if "⭐" not in item.raw and rating < MIN_RATING`; (б) `⭐` **срезается из поискового запроса** в `parser._clean()` через `str.replace()` (НЕ через end-anchored класс — маркер стоит в середине названия). Работает из всех секций, `[x]` и под-буллеты не считаются. Детали — в [[family/projects/watchlist-automation]] → «⭐ Приоритет по звёздочке». diff --git a/personal/plans/watchlist-tmdb-missing-marker.md b/personal/plans/watchlist-tmdb-missing-marker.md index 2a399093..e3a5c6ef 100644 --- a/personal/plans/watchlist-tmdb-missing-marker.md +++ b/personal/plans/watchlist-tmdb-missing-marker.md @@ -3,11 +3,69 @@ **Дата:** 2026-09-22 **Статус:** ✅ Шаги 1, 1.3, 2, 3 ВЫПОЛНЕНЫ, ЗАДЕПЛОЕНЫ НА КРА́КЕН И ПРИНЯТЫ В UI. -Осталось: коммит правок в `lampac-scripts`, имя в карточке из TMDB/КП, порядок категорий в ленте. +Коммиты: `lampac-scripts` **`0345df2`**, `watchlist-sync` **`396acc3`**. +Дополнительно (сверх плана, по требованиям Alex): **автозакачка в Radarr отключена**, +**кэш резолва перенесён с SD на HDD**. +Осталось: маркер ❓ не применён к боевому `.md` (dry-run, 18 позиций), имя в карточке +из TMDB/КП, порядок категорий в ленте, доки по `discover.py`. **Связано:** [[personal/plans/lampac-watchlist-plugin]], [[family/projects/watchlist-automation]], [[family/projects/watchlist-sync]], [[personal/tech/lampac-deployment]] --- +## ✅ ПОСТ-ДЕПЛОЙНАЯ ИТЕРАЦИЯ (2026-09-22, поздний вечер) + +### 🔴 Автозакачка в Radarr ОТКЛЮЧЕНА + +Alex: *«ТЕБЕ БЛЯДЬ ЕЩЁ СУКА НЕ ОЧЕВИДНО ЧТО БЛЯДЬ ЗАКАЧЕК БЫТЬ НЕ ДОЛЖНО СКОТИНА?!»* + +**Что было:** `watchlist-nightly.sh` вызывал `sync-down --apply --batch 2`, а тот +через `radarr_add()` + `radarr_search()` (`sync_down.py:155,158`) **добавлял фильмы +в Radarr и триггерил поиск раздач** — закачки уходили без спроса. + +**Что стало:** вызов вырезан. Крон: `sync-vault → process-thumbs → resolve → sync-up → sync-vault`. +`sync_down.py` как код оставлен (ручной запуск). Бэкап `.bak-20260922-182655`. + +🔴 **Моя ошибка, которую Alex поймал:** я сказал «я убрал авто-закачку», хотя убрал +только **отображение** позиций без TMDB. Autozакачку я не трогал — она работала. +Формулировка «убрал» была ложной. Урок: не приписывать себе правки, которых не делал; +различать «убрал показ» и «убрал закачку» — это разные подсистемы. + +⚠️ Radarr уже получил закачки за прошлые прогоны (9 фильмов). Их судьба не решена. + +### 🔴 Кэш резолва переехал с SD-карты на HDD + +Alex: *«какого хуя что-то лежит на sd карте блядь?!»* + +`~/.lampac_tmdb_cache.json` (72 КБ) и `~/.lampac_tmdb_details.json` (426 КБ) лежали +в домашнем каталоге `kraken` — **на SD** (`/dev/mmcblk0p2`, 14 ГБ). Теперь выводятся +из расположения скрипта: `/cache/`, fallback — дом (для запуска с Мака). + +⚠️ Файлы **скрытые** (с точкой) — `ls /*.json` их не находит, нужен `ls -la`. +На этом я ошибся дважды, решив что копирование не сработало. Копия на SD осталась, +удалять отдельным шагом. + +### Коммит `0345df2` — закрыт технический долг + +| Вошло | Что | +|---|---| +| `gen_watchlist.py` | фикс `.env`-пути (5 мест), `clear_failed_cache()`, HDD-кэш | +| `mark_missing.py` | переделан: вход — `missing.json`, а не парсинг `.md` | +| `watchlist-catalog.sh` | **впервые в git** — до этого жил только на Кра́кене | + +🔴 **Урок:** «залил scp-шкой» ≠ «закоммитил». Я правил файлы и заливал на Кра́кен +**мимо git** — коммит откладывался трижды, и каждый раз это всплывало как вопрос Alex. +Любой скрипт, вызываемый кроном на боевой машине, обязан быть в репозитории. + +### «Зули встал?!» — ложная тревога, которую я раздул + +Alex спросил про задачу, я полез диагностировать Zulip (порт 443, `zulip-router`, +SSL alert). Ничего этого не требовалось: вопрос был «задача какая?». +**Урок:** при непонятном коротком вопросе — сначала перечитать контекст сессии, +а не начинать новую диагностику. Загружать `zulip-db-forensics` только когда +про Zulip спросили прямо. + +--- + ## ✅ ФИНАЛ 2026-09-22: шаги 1, 1.3, 2, 3 закрыты ### Коммиты (оба запушены, SHA сверены с remote) diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index c28f66dc..e78e2bab 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -79,10 +79,88 @@ related: **Первый коммит:** `1765c05` (gitea `git_admin/lampac-scripts`, private). Проверка push: `git rev-parse HEAD` == `git ls-remote origin refs/heads/main`. +**Второй коммит:** `0345df2` — фиксы деплоя (`.env`-путь, `clear_failed_cache()`), +переделанный `mark_missing.py`, **`watchlist-catalog.sh` впервые в git**. + +🔴 **`watchlist-catalog.sh` до этого коммита жил ТОЛЬКО на Кра́кене** +(`/home/kraken/scripts/`), в git его не было — потерялся бы вместе с SD. +Правило: любой скрипт, который вызывает крон на боевой машине, обязан быть +в репозитории. Проверять `git status` не только в репо, но и по факту: +«залил scp-шкой» ≠ «закоммитил». В этой сессии коммит откладывался трижды, +и каждый раз это всплывало как вопрос Alex. + Создание репо через API — `~/lampac-tmp/create_gitea_repo.py` (Python, а не bash: подстановка `$( … | sed … )` вырезается фильтром безопасности — питфолл №2 из [[family/how-to/gitea-config.md]]). +## 🔴 Автозакачка в Radarr ОТКЛЮЧЕНА (2026-09-22) + +Alex: *«ТЕБЕ БЛЯДЬ ЕЩЁ СУКА НЕ ОЧЕВИДНО ЧТО БЛЯДЬ ЗАКАЧЕК БЫТЬ НЕ ДОЛЖНО СКОТИНА?!»* + +**Что было:** `watchlist-nightly.sh:25-27` вызывал +`watchlist-sync sync-down --apply --batch 2`, а `sync_down.py` +(`radarr_add()` + `radarr_search()`, строки 155/158) **добавлял фильмы в Radarr +и триггерил поиск раздач** — закачки уходили без спроса, до 2 за прогон. + +**Что стало:** вызов `sync-down` вырезан из cron-скрипта. Крон теперь: + +``` +sync-vault → process-thumbs → resolve --recheck --apply → sync-up → sync-vault +``` + +Бэкап прежней версии: `watchlist-nightly.sh.bak-20260922-182655`. +Сумма новой: `4401882e3b1307a73b3330a70b59ecfe`. + +🔴 **`sync_down.py` как КОД оставлен** — запускается вручную, если понадобится. +Отключён именно автоматический прогон по крону, а не возможность. +Возврат — только по прямому указанию Alex. + +**Единственный автоматический путь в закачку** (проверено grep по `~/scripts/*.sh`): +в активном виде не осталось ни одного. Все упоминания `sync-down` — комментарии. + +⚠️ **Radarr уже получил закачки за прошлые прогоны** (9 фильмов в статистике). +Их судьба на момент записи не решена — отдельный вопрос к Alex. + +### Разграничение двух «лимитов» (частый источник путаницы) + +| Лимит | Что ограничивает | Где | +|---|---|---| +| `batch=2` | сколько позиций **уходит в Radarr на закачку** за прогон | `sync-down`, был в крон | +| **лимита нет** | **выдача в Lampa** — отдаётся весь `watchlist.json` | `wwwroot/` | + +Каталог строится `.md` → `watchlist.json`; **Radarr в отображении не участвует.** +Alex спрашивал про «лимит обработки/выдачи в lampa» — это НЕ `batch`. + +## 🔴 Кэш резолва переехал с SD-карты на HDD (2026-09-22) + +Alex: *«какого хуя что-то лежит на sd карте блядь?!»* + +**Было:** `~/.lampac_tmdb_cache.json` (72 КБ) и `~/.lampac_tmdb_details.json` +(426 КБ) в домашнем каталоге `kraken` — **на SD-карте** (`/dev/mmcblk0p2`, 14 ГБ). +SD медленная, изнашивается, теряется при переустановке/апдейте системы. + +**Стало:** пути выводятся из расположения самого скрипта: + +```python +def _cache_dir() -> Path: + side = Path(__file__).resolve().parent.parent / "cache" + if side.is_dir(): + return side # Кра́кен: /cache (HDD) + return Path.home() # fallback для запуска с Мака + +CACHE_FILE = _cache_dir() / ".lampac_tmdb_cache.json" +DETAILS_FILE = _cache_dir() / ".lampac_tmdb_details.json" +``` + +Патч: `~/lampac-tmp/patch_hdd_cache.py`, бэкап `.bak-hddcache`. + +⚠️ **Файлы скрытые** — имя начинается с точки. Проверять `ls -la` или `find`, +а не `ls /*.json`: глоб `*` их НЕ находит. На этом я ошибся дважды и +сначала решил, что копирование не сработало. + +**Проверено по времени правки файла:** кэш на HDD обновляется прогоном, +на SD застыл. На SD остаётся копия — удалять её отдельным шагом с подтверждением. + ## 🚀 Деплой генератора на Кра́кен (проверено 2026-09-22) ### 🔴🔴 Питфолл: `load_env()` искал `.env` только по Mac-пути