Files
obsidian-vault/personal/tech/lampac-torrserver.md
T
Taiga b53dd70a15 [2026-09-26 09:10:28] syncthing: personal/tech/archive-org-collection-harvest.md personal/tech/balda-go-fx-pitfalls.md personal/tech/bilety-oxota-interaktiv.md personal/tech/cloudflare-tunnel-ssh-published-route.md personal/tech/deepseek-language-drift.md personal/tech/docker-data-root-mount-race.md personal/tech/docker-mac-disk-issues.md personal/tech/docker_colima_setup.md personal/tech/eagle-dashboard-launchd.md personal/tech/hermes-agent-improvements.md personal/tech/hermes-browser-toolsets.md personal/tech/hermes-fork-vs-upstream.md personal/tech/hermes-git-repo.md personal/tech/hermes-memory-architecture.md personal/tech/hermes-secret-redaction-bypass.md personal/tech/hermes-self-improvement-review.md personal/tech/home-network-config.md personal/tech/inter-site-throughput-taiga-to-mac.md personal/tech/inter-site-throughput-taiga-to-mac.md.bak-nedstab2 personal/tech/jellyfin-db-schema-mismatch.md personal/tech/karabiner-keyboard-config.md personal/tech/kraken-media-inventory-facts.md personal/tech/kraken-truenas-media-copies.md personal/tech/lampa-jellyfin-plugin.md personal/tech/lampac-deployment.md personal/tech/lampac-torrserver.md personal/tech/llm-model-selection-2026.md personal/tech/mac-print-shared-services.md personal/tech/modbus-rtu-sniffer-debugging.md personal/tech/multistream-single-flow-limit.md personal/tech/multistream-single-flow-limit.md.bak-nedstab2 personal/tech/music-tags-repair-truenas.md personal/tech/obsidian-mcp-ecosystem.md personal/tech/original-xbox-2025-guide.md personal/tech/prowlarr-flaresolverr-cloudflare.md personal/tech/radarr-sonarr-phantom-records.md personal/tech/roundtrip-key-verification.md personal/tech/ryujinx-mac-setup.md personal/tech/skill-arr-media-stack-setup-additions.md personal/tech/skill-docker-data-root-mount-race.md personal/tech/skill-lampac-kraken-deploy.md personal/tech/tirith-trust.md personal/tech/truenas-local-tree-comparison.md personal/tech/truenas-nfs4-acl-and-arrmultiuser.md personal/tech/truenas-zfs-panic-recovery.md personal/tech/vault-doc-pruning.md personal/tech/vless-space-subscription-egress.md personal/tech/watchlist-sync-feed.md personal/tech/watchtower-docker-updates.md personal/tech/xray-outbound-subscription-3xui.md personal/tech/xray-reverse-limits-private-network.md personal/tech/xray-reverse-tunnel-kraken-truenas.md personal/tech/xray-reverse-tunnel-kraken-truenas.md.bak-nedstab2 personal/tech/yandex-music-api.md
2026-09-26 09:10:28 +00:00

26 KiB
Executable File
Raw Blame History

TorrServer на Кра́кене — диагностика

Дата: 2026-09-22 · ОБНОВЛЕНО 2026-09-24 (поздний вечер): «Мастерская сатаны» — раздач нет; ниже найден мёртвый FlareSolverr Вывод: ✅ TorrServer исправен. ЗАДАЧА ЗАКРЫТА. «Торренты» пусто было по причине 🔴 redapi указывал на локальный lampac, чей JacRed отдаёт формат БЕЗ поля info → PidTor падал на torrent.info.sizeName → NPE → 500 → кэшировался как 503. ИСПРАВЛЕНО: redapi возвращён на http://jac.red. Приёмка Alex: «Во! теперь появились торренты. запустил F1..» — ✅ видно в UI. Диагноз и фикс — family/how-to/lampac-torrents. Связано: personal/tech/lampac-deployment, family/how-to/lampac-torrents, personal/plans/lampac-disable-1xbet-ads, personal/plans/watchlist-tmdb-missing-marker


🔴 2026-09-24: «Мастерская сатаны» — рецидив симптома 503 + исправление про кэш

Повод: Alex — «в торрентах по нему ничего не нашлось в lampac, надо проверить почему, по каким трекерам он ищет, и можем ли мы влиять на список источников например через prowlarr резолвер?»

Факт: /lite/pidtor?title=Мастерская сатаны&year=2025 → HTTP 503, Content-Length: 0, X-Invoke-Cache: HIT, t=0.007–0.035s. Это кэшированный отказ, а не «0 раздач». Делать вывод о трекерах по такому ответу нельзя.

🔴 Исправление: «кэш в cache/fdb/» — НЕВЕРНО (прожило сутки в двух доках)

$H/lampac/cache/fdb/     → 13 каталогов 0/ 1/ 2/ 3/ 4/ 5/ 7/ 9/ a/ b/ d/ e/ f/,
                            ВСЕ ПУСТЫЕ — find … -type f | wc -l  →  0
$H/lampac/cache/module/  → 76 файлов без расширений (OEdMn4LsmVEkyTEYgfu5dg),
                            file → PE32 executable (DLL) Mono/.Net assembly

cache/module/ — сборки .NET-модулей, не JSON-ответы PidTor. Опознать модуль: grep -l "pidtor" $H/lampac/cache/module/* → strings <файл> | grep -iE "pidtor|\.dll" → PidTor.dll, lite/pidtor, lite/pidtor/serial/{id}, lite/pidtor/s{id}.

📌 Практика при 503: пробовать заголовок, который ещё не запрашивался (другой год / title) — свежий ключ минует кэш и даёт честный ответ. docker restart lampac кэш ответов не снимает.

По каким трекерам ищет PidTor

Своего списка нет. Ходит на {redapi}/api/v2.0/indexers/all/results?title=..&year=.. — суффикс all = все индексеры JacRed разом; состав определяет сторона jac.red (внешний, 144.31.3.10), не lampac.

🔴 Prowlarr тут ни при чём — у него свои 6 индексера и он питает Radarr/Sonarr (family/how-to/arr-stack-kraken). Моста «Prowlarr → источники Lampa» не существует.

Влияние на список источников: (а) локальный JacRed lampac — править трекеры в $H/lampac/data/, redapi переключать только после появления поля info; (б) Prowlarr в обход PidTor — в плеере таких источников не будет.

Статус: ✅ ДИАГНОСТИКА ДОВЕДЕНА (2026-09-24, продолжение)

Шаги 2–3 выполнены на Кра́кене (не из Mac — апрувы на curl к внешнему хосту истекали):

jac.red …results?title=Мастерская сатаны&year=2025  → 200, {"Results":[],"jacred":true}
jac.red …results?title=Матрица&year=1999            → 200, 132 раздачи   (контроль)
jac.red …results?title=Devils Workshop              → 200, 2 раздачи (фильм 2022, НЕ тот)

Итог по фильму: раздач у него действительно нет на 25 трекерах jac.red. Механизм PidTor исправен — доказано контролем на «Матрице». Версия «сломан поиск» неверна.

🔴 Второй, более важный слой нашёлся ниже: 3 из 6 индексеров Prowlarr (RuTracker, Kinozal, Kinozal M) заблокированы с EscalationLevel=9 до 2026-09-25 10:17 из-за мёртвого FlareSolverr (Chrome не стартует). К пустой выдаче Lampa это прямого отношения не имеет (Prowlarr в цепочку PidTor не входит), но ломает Radarr/Sonarr — то есть автозакачку. Разбор и незавершённый фикс: personal/tech/prowlarr-flaresolverr-cloudflare §«2026-09-24».

Список индексеров jac.red (25 шт.) — измеримо, не догадкой: GET http://jac.red/api/v2.0/indexers?configured=true → массив с name.


✅ Статус закрытия (2026-09-22 вечер)

Пункт Статус
PidTor 500/503 ✅ исправлено, redapi=http://jac.red
Приёмка в UI ✅ Alex запустил F1 в плеере
Тестовая раздача probe ✅ убрана сама (сброс при рестарте)
min_sid ✅ min_sid: 3 убран → сток 15
Минус год у «Волшебный участок: Фильм» ✅ ЗАКРЫТО — оставлено пусто (данных нет в TMDB, фильм в производстве)
Документация ✅ саммари → family/how-to/lampac-torrents, план снесён
Запись про cache/fdb/ ⚠️ исправлена 2026-09-24 — папка пустая, см. выше

Итог задачи (2026-09-22)

Задача про торренты закрыта полностью. Единственный дефект был внесён мной (переключение redapi на локальный JacRed) и откачен. Разбор → саммари-док family/how-to/lampac-torrents.md; детальный план personal/plans/lampac-pidtor-503-fix.md снесён по требованию Alex, 8 ссылок на него перебиты.

Онлайн НЕ гасим — Alex запретил (personal/plans/lampac-disable-1xbet-ads не применён).


Вопрос Alex

«по просмотру: у меня есть определенные сомнения что через torrserver идут, там только пункт "смотреть онлайн" работает и он добавляет вотермарк и рекламу 1xbet - это точно с торрентов? потому что если пункт "торренты" выбрать при просмотре - то там пусто.»

Ответ: сомнения Alex верны по рекламе. Но TorrServer исправен.

Реклама 1xbet — НЕ от TorrServer

Пункт UI Механизм Источник потока Реклама
«Торренты» PidTor → JacRed → magnet → TorrServer P2P-раздача НЕТ
«Смотреть онлайн» Online + OnlineRUS (20 балансеров) чужой CDN сайта ЕСТЬ (1xbet)

TorrServer не вставляет рекламу. Баннеры рисует плеер-обёртка онлайн-источника.

🔴 Все проверки — сырьём, не догадкой

1. TorrServer жив и качает

# изнутри контейнера (снаружи порт 9085 закрыт!)
docker exec lampac sh -c 'curl -s http://127.0.0.1:9085/echo'
# -> MatriX.135

✅ Раздача добавилась и пошла качаться (тест магнитом Big Buck Bunny):

{"title":"probe","name":"Big Buck Bunny","hash":"dd8255ec...","stat":3,
 "stat_string":"Torrent working","total_peers":343,"active_peers":7,
 "connected_seeders":5,"bytes_written":6918,"bytes_read":49072,
 "torrent_size":276445467}

⚠️ Тестовая раздача удалена после проверки: POST /ts/torrents {"action":"rem","hash":"..."} → HTTP 200.

2. JacRed находит раздачи

curl -s "http://127.0.0.1:9118/api/v1.0/torrents?search=Матрица"
# HTTP 200, 74 КБ

Трекеры в выдаче: kinozal, torrentby, rutor, rutracker. Магниты на месте: magnet:?xt=urn:btih:3A44F276AA59110B5765458EA013863CFD5BFBFA

3. PidTor выдаёт торренты в UI

curl -s "http://127.0.0.1:9118/lite/pidtor?title=Матрица&year=1999"
# HTTP 200, 8435 байт, 12 раздач

Ответ содержит рабочий торрент: /lite/pidtor/s61065ea115b7cc3e8db9fb5ab1f6f327f08bd1c9?tr=...

В /lite/events PidTor присутствует как источник: "name":"Pid<s>T</s>or".

4. jac.red резолвится

getent hosts jac.red  ->  144.31.3.10
curl http://jac.red   ->  HTTP 200

5. 🔴 НО: часть фильмов отдаёт 503 ИЗ КЭША

Массовая проверка 12 позиций каталога дала 11 × HTTP 503, 1 × HTTP 200. При этом JacRed по тем же фильмам отдаёт раздачи:

F1 (2025)          -> /api/v2.0/indexers/all/results  -> 200, 72 раздачи (sid=203,26,18…)
Гамнет (2025)      -> 200, 14 раздач (max sid=79, 6 проходят min_sid=15)
А /lite/pidtor?title=F1 -> 503  с заголовком  X-Invoke-Cache: HIT

X-Invoke-Cache: HIT + время ответа 0.0016s = ответ из памяти, запроса к JacRed НЕ было. Один раз источник отказал → lampac закэшировал 503 на ~40 мин.

🔴 Диагностический признак: смотреть заголовки, не только код. 503 ≠ «раздач нет» (тогда был бы 200 с пустым списком). 503 = отказ источника, закэшированный процессом. Сброс — docker restart lampac.

🔴 Роли в цепочке: поиск НАРУЖУ, качание локально

Lampa → lampac PidTor → jac.red (ПОИСК раздач — ЧУЖОЙ хост 144.31.3.10)
                      → magnet → TorrServer Кра́кена (КАЧАЕТ, локально)
                      → поток /lite/pidtor/s<id>

⚠️ Поиск раздач не локален — PidTor.redapi = "http://jac.red". TorrServer только качает то, что нашёл чужой сервер. Не путать эти роли при диагностике.

🔴🔴 Локальный JacRed — НЕ альтернатива. Он ломает PidTor

Проверено 2026-09-22 (стоило полной поломки): переключение redapi на http://127.0.0.1:9118 (локальный JacRed lampac) роняет ВСЕ фильмы в HTTP 500.

НАШ JacRed  отдаёт поля: Tracker, Details, Title, Size, PublishDate,
                         Category, Seeders, Peers, MagnetUri
                         ^^^ поля "info" НЕТ

jac.red     отдаёт ещё:  info{quality, voices[], sizeName, name, originalname,
                         relased}, ffprobe, languages, CategoryDesc

PidTor/Controller.cs:97:
  string mediainfo = torrent.info.sizeName ?? string.Empty;
                     ^^^^^^^^^^^^^^ info == null -> NullReferenceException -> 500

Локальный JacRed быстрее (0.12s против 0.35s), но несовместим по формату. redapi обязан оставаться http://jac.red. Подробно: family/how-to/lampac-torrents

🔴 min_sid: 15 — второй фильтр, режущий выдачу

Реальные сиды по свежим фильмам: 1–37. Порог 15 отсекает большинство:

Гамнет: из 14 раздач проходят только 6
F1:     отсекаются раздачи с sid=1, 4, 7 (рабочие)

Понижение min_sid — решение Alex (низкий sid = медленнее качает). Варианты: 1 (показывать всё) · 3..5 (компромисс) · оставить 15.

🔴 Маршруты — главный питфолл разбора

TorrServer НЕ доступен по порту 9085 напрямую — lampac проксирует его под префиксом /ts/ на порт 9118:

http://127.0.0.1:9118/ts/echo        -> MatriX.135  (кто ты)
http://127.0.0.1:9118/ts/{*suffix}   -> прокси на TorrServer API
http://127.0.0.1:9118/ts/stream      -> воспроизведение
http://127.0.0.1:9118/ts/playlist    -> плейлист
http://127.0.0.1:9118/ts/download/   -> скачивание

Проверять только изнутри контейнера (docker exec lampac) — снаружи порт 9085 даёт Connection refused.

Метод запроса ВАЖЕН

POST /ts/torrents  -d '{"action":"list"}'  -> 200, []    ✅ ТОЛЬКО ТАК
POST /ts/torrents  с телом []              -> 400
POST /ts/torrents  без тела                -> 400
POST /ts/torrents  с телом {}              -> 400
GET  /ts/torrents                          -> 404  (метода нет)
GET  /ts/torrents/list                     -> 404
GET  /ts/settings                          -> 403  (нужна авторизация ts:tspass)

400 вместо 404 = маршрут существует. Это ключевой признак при диагностике.

🔴 Проверено 2026-09-22: список раздач отдаёт ТОЛЬКО -d '{"action":"list"}' с заголовком Content-Type: application/json. Пустое тело, [] и {} → 400. Верный вызов:

ssh kraken "curl -s -m 15 -X POST http://127.0.0.1:9118/ts/torrents \
  -H 'Content-Type: application/json' -d '{\"action\":\"list\"}'"

Удаление раздачи

ssh kraken "curl -s -X POST http://127.0.0.1:9118/ts/torrents \
  -H 'Content-Type: application/json' \
  -d '{\"action\":\"rem\",\"hash\":\"<hash>\"}'"

⚠️ Раздачи живут в памяти процесса TorrServer. docker restart lampac их выгружает — тестовая раздача probe (Big Buck Bunny), добавленная 2026-09-22, после рестарта исчезла сама, список вернулся пустым. Убирать вручную не потребовалось.

🔴 Конфиг: где что лежит

current.conf (эффективный, слитый из base.conf + init.conf)

"TorrServer": {
  "releases": "MatriX.135",
  "tsport": 9085,
  "defaultPasswd": "ts",
  "limit_map": [{ "pattern": "^/ts/", "map": { "limit": 50, "second": 1 } }]
},
"JacRed": {
  "typesearch": "webapi",
  "disableJackett": true,
  "webApiHost": "http://ns3bg91xvuqfvq9h.cfhttp.top",
  "Red": { "trackers": ["rutracker","rutor","kinozal","nnmclub",
           "megapeer","bitru","toloka","lostfilm","baibako","torrentby",
           "hdrezka","selezen","animelayer","anilibria","anifilm"] }
},
"PidTor": {
  "enable": true,
  "enabled": false,
  "redapi": "http://jac.red",
  "min_sid": 15,
  "torrs": null,          ← README: без этого список ПУСТОЙ
  "auth_torrs": null      ← ...но фактически /lite/pidtor работает
}

⚠️ Расхождение с README PidTor: README говорит «пункт появляется только если заданы torrs/auth_torrs, иначе список пустой». Фактически при null /lite/pidtor отдал 8435 байт с рабочей раздачей. README устарел для этой сборки (MatriX.135).

API JacRed

GET /api/v1.0/conf                              -> {"apikey":true}
GET /api/v1.0/torrents?search=...               -> список раздач
GET /api/v2.0/indexers/{status}/results?Query=  -> JacRed/Jackett-формат

⚠️ /jacred, /jacred/api → 404. Не те пути.

Секция TorrServer.settings.json (data/ts/)

{"BitTorr": {"CacheSize": 100663296, "ConnectionsLimit": 25,
 "DisableDHT": false, "DisablePEX": false, "DisableTCP": false,
 "EnableIPv6": false, "PreloadCache": 0, "ReaderReadAHead": 83,
 "TorrentDisconnectTimeout": 180, "TorrentsSavePath": "",
 "UseDisk": false, "RetrackersMode": 1}}

Питфоллы сессии

  1. 🔴 /media/movies-radarr — два разных каталога. Снаружи /media/movies-radarr это SD-пустышка (0 файлов). Реальный путь Radarr = монтируется ИЗ ДРУГОГО диска: /srv/dev-disk-by-uuid-49e8f586-…/media/movies-radarr (17 каталогов). Отдельный диск от lampac (6194539b). Проверять docker inspect маунты, а не find по наружному пути.
  2. 🔴 setsid nohup НЕ спасает от ssh-обрыва. Прогон генератора дважды умирал (client_loop: send disconnect: Broken pipe). Рабочее решение — systemd-run --user --unit=<name> --scope <script>: отвязывает от сессии.
  3. 🔴 strings в контейнере не даёт маршрутов TS — пустой вывод. Смотреть README.md модуля и пробовать запросы (404 vs 400), а не парсить бинарник.
  4. 🔴 vast.js и modification.js — НЕ источники рекламы. VASTPlayer не подключён в sisi/index.html; modification.js (22 КБ) даёт 0 совпадений на 1xbet|vast|adTag, домены только w3.org. Реклама от онлайн-источников.

Итог: что реально делает «Смотреть онлайн» vs «Торренты»

«Смотреть онлайн» = 20 источников из /lite/events. Из них ТОРРЕНТНЫЙ — РОВНО ОДИН:
   Pid<s>T</s>or   http://127.0.0.1:9118/lite/pidtor   balanser=pidtor

   Остальные 19 — онлайн-балансеры (чужой CDN, реклама 1xbet):
   Filmix · pizdatoehd · Kinobase · Phantom · Kinogo · AniDub · LeProduction ·
   VeoVeo · Collaps · HDVB · Rutube · VK Видео · Kinoteatr.kg · Vibix ·
   Kinotochka · Eneyida · UaKino · UAFilm · Geosaitebi

Отдельного пункта «Торренты» в /lite/events НЕТ — это не источник, а интерфейс выбора раздачи внутри PidTor. Путь в UI: карточка → «Смотреть онлайн» → PidTor → список раздач → выбор качества.

# проверка количества раздач на фильме из терминала
ssh kraken 'curl -s "http://127.0.0.1:9118/lite/pidtor?title=Матрица&year=1999" \
  | grep -c data-json='      # -> 12

# пакетная проверка позиций каталога
python3 /tmp/probe_pidtor_batch.py

Если пусто — порядок проверки (по реальной причине, 2026-09-22)

  1. СНАЧАЛА проверить redapi: docker exec lampac sh -c 'grep -o "\"redapi\": \"[^\"]*\"" /lampac/current.conf' → должно быть http://jac.red. Если 127.0.0.1:9118 — PidTor отдаст 500 (см. выше)
  2. curl -i "…/lite/pidtor?title=<название>&year=<год>" — смотреть заголовки: X-Invoke-Cache: HIT → это кэш, лечение docker restart lampac
  3. 500 → реальная ошибка (чаще всего info-несовместимость источника)
  4. 503 → источник отказал, кэш держит ~45 мин (extend: 2700)
  5. 200, но 0 раздач → реально нет раздач у трекеров
  6. min_sid: 15 (сток) — сиды < 15 отсекаются (свежие фильмы часто 1–37)

🔴 Порядок сброса кэша (если 503 застрял)

Кэш переживает docker restart — он на диске:

H=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac
docker stop lampac
cp -r "$H/cache/fdb" /tmp/fdb-backup-$(date +%Y%m%d-%H%M%S)/   # бэкап обязателен
rm -rf "$H/cache/fdb"; mkdir -p "$H/cache/fdb"
docker start lampac

⚠️ После чистки 503 сменится на 500 — это признак, что кэш больше не маскирует настоящую причину. Дальше искать причину 500 (пункт 2 выше), а не радоваться.


🔴 «Волшебный участок: Фильм» — year: null. НЕ БАГ, данных нет в источнике

Дата разбора: 2026-09-22 · Статус: ✅ ЗАКРЫТО. Оставлено пусто (решение Alex).

Сырьё

watchlist.json (единственная позиция без года из 376):

{
  "name": "Волшебный участок: Фильм",
  "original": "Волшебный участок: Фильм",
  "year": null,                    <- год отсутствует
  "rating": 0.0,
  "image": "",                     <- 🔴 постера ТОЖЕ нет
  "href": "https://www.themoviedb.org/movie/1272100"
}

Что реально отдаёт TMDB по ID 1272100

curl "https://api.themoviedb.org/3/movie/1272100?api_key=$TMDB_KEY&language=ru-RU"
ru-RU: title='Волшебный участок: Фильм'   original_title='Волшебный участок: Фильм'
en-US: title='The Magic District. The Movie'
release_date = ''                 <- ПУСТО
status       = 'In Production'    <- 🔴 ФИЛЬМ ЕЩЁ НЕ ВЫШЕЛ
poster_path  = None / poster=False  <- постера нет
runtime = 0   imdb_id = None   vote_average = 0.0

TMDB поиск по названию подтверждает: ровно один результат, id=1272100.

Вывод: генератор работает правильно

release_date пуст у самого TMDB, потому что фильм в производстве. Генератор честно пишет null. Это не дефект tmdb_details().

Кинопоиск как fallback не подходит: запрос kinopoiskapiunofficial.tech/api/v2.1/films/search-by-keyword?keyword=Волшебный участок вернул HTTP 400 Bad Request (баг API на :keyword-маршруте). Плюс КП-карточки фильма может ещё не существовать — сериал есть, фильм в производстве.

Решение: НЕ ВЫДУМЫВАТЬ год

Вариант Оценка
Оставить null (рекомендовано) ✅ не выдумываем данные; когда фильм выйдет — TMDB отдаст release_date, генератор подхватит сам
Заполнить год вручную ❌ премьера неизвестна → выдуманный год хуже пустоты
Год из КП как fallback ❌ КП отдаёт 400; ~30-40 мин работы, риск сломать резолв

Косметическая опция (если Alex захочет, ~15 мин): выводить "скоро" вместо пустого года при status == "In Production".

Правило «фильм есть → добавлять» соблюдено: позиция в каталоге, карточка откроется, торренты найдутся когда фильм выйдет.

Решение Alex (2026-09-22): «Ок, закрывай задачу» — оставлено как есть, косметику "скоро" не делаем. Вопрос закрыт.

Питфолл: где лежат ключи TMDB/KP

🔴 .env в $H/lampac/ НЕТ — ключи в $H/watchlist-sync/.env
   (TMDB_KEY, KP_KEY). Генератор читает через load_env() — 5 мест поиска.

Питфолл: пути на Кра́кене

🔴 HDD lampac = /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f
   НЕ ...6194539b-ec7d-4b5e-9cb2-2a4e0b0a3a1a  (этот UUID не существует)
   watchlist.json  = $H/lampac/wwwroot/watchlist.json     (376 записей)
   боевой .md      = $H/obsidian/family/documents/movies-watchlist.md
   скрипты         = $H/lampac/scripts/{gen_watchlist.py,mark_missing.py}

⚠️ find /srv -name watchlist.json — единственный надёжный способ уточнить путь; UUID в памяти/доках может быть устаревшим или обрезанным.