[2026-09-22] eagle: personal/plans/lampac-disable-1xbet-ads.md personal/plans/watchlist-tmdb-missing-marker.md personal/tech/lampac-deployment.md personal/tech/lampac-torrserver.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 19:10:02 +06:00
1 parent c835707a13
commit c9d1f21383
4 files changed
+392 -24

No files matched your search

+184 -7
View File
@@ -394,6 +394,107 @@ if norm(title) not in missing:
(`$H` = `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac`),
`kraken:kraken`, бэкапы `/tmp/movies-watchlist.md.bak-*` + `.bak-questions` рядом.
## ✅ Название и год карточки — ИЗ TMDB, не из `.md` (2026-09-22)
**Требование Alex (дословно):** *«че по имени в карточке? оно должно из источника
ставиться.»* + ранее *«БЛЯДЬ ... Ничего не укорачивать. Отображать как в tmdb/kp.»*
### Что было не так
Генератор писал `it["name"] = название из .md`, `it["year"] = год из .md`.
Проверено сырьём — TMDB отдаёт **другое**:
```
в .md: TMDB ru-RU: TMDB en-US:
'Смерть единорога' → 'Смерть Единорога' 'Death of a Unicorn' ← регистр!
'Everything…' → 'Всё везде и сразу' 'Everything…' ← русское
'Духless' → 'Духless' 'Soulless'
```
Плюс `year` вообще приходил `null`, хотя TMDB знает `release_date`, а в кэше
деталей **не было поля с названием** — только `cast/country/genres/overview/
poster_path/runtime/tagline/vote`.
### Фикс: `tmdb_details()` тянет имя + год
```python
url = (f"https://api.themoviedb.org/3/{mtype}/{tmdb_id}"
f"?api_key={api_key}&language=ru-RU&append_to_response=credits")
ru_title = d.get("title") or d.get("name") or ""
orig_title = d.get("original_title") or d.get("original_name") or ""
date = d.get("release_date") or d.get("first_air_date") or ""
year = int(date[:4]) if re.match(r"^\d{4}", date) else None
out = {..., "title": ru_title, "original_title": orig_title,
"en_title": en_title, "year": year, "release_date": date}
```
В `enrich()` — приоритет **источник → `.md` как fallback**:
```python
src_name = (d.get("title") or "").strip()
if src_name:
it["name"] = src_name # русское название TMDB
src_orig = (d.get("original_title") or "").strip()
if src_orig:
it["original"] = src_orig # оригинал
if it.get("year") is None and d.get("year"):
it["year"] = d["year"] # год из release_date
```
⚠️ Год из `.md` **не перетирается**, если он там был — он может быть точнее для
локальных премьер РФ.
### 🔴 Миграция старого кэша деталей
367 записей были **без поля `title`**. Добавлена проверка в начале
`tmdb_details()`: если у записи нет `title` — перезапрашивается из TMDB
(остальные 8 полей не теряются, запись заменяется целиком).
```python
if key in details:
d = details[key]
if d.get("title"): # уже мигрировано
return d
# иначе падаем дальше в запрос
```
### Боевой прогон (EXIT=0)
```
376 позиций | без года: 1 (из 376) | 296 с русским названием + оригиналом
'Смерть единорога' → 'Смерть Единорога' orig='Death of a Unicorn' year=2025
'Everything…' → 'Всё везде и сразу' orig='Everything…' year=2022
'Простите за бесп…' → чисто orig='Sorry to Bother You' year=2018
'Духless' → 'Духless' orig='Духless' year=2012
'Бумбараш' → 'Бумбараш' orig='Бумбараш' year=1972
'Я ругаюсь' → orig='I Swear' · 'Гамнет' → orig='Hamnet'
'Марти Великолепный'→ orig='Marty Supreme'
```
Единственная позиция без года: **`Волшебный участок: Фильм`** — в TMDB год
не проставлен.
Коммит `lampac-scripts` **`53e5803`** (запушен: `1122b71..53e5803 main -> main`).
### 🔴 Питфолл прогона: `setsid nohup` НЕ спасает от обрыва ssh
Прогон умирал **дважды** на `client_loop: send disconnect: Broken pipe` —
ssh-сессия забирала группу процессов с собой. Рабочее решение:
```bash
systemd-run --user --unit=gen-watchlist --scope /tmp/gen-runner.sh
# Running scope as unit: gen-watchlist.scope ← отвязан от сессии
```
Обёртка `~/lampac-tmp/run_gen_systemd.sh` пишет лог в `/tmp/gen-run.log`
и добавляет `EXIT=$?` в конец. Проверка: `pgrep -f gen_watchlist.py`.
⚠️ **Путь к `.md` — на уровень ВЫШЕ lampac:**
`$H/obsidian/family/documents/movies-watchlist.md`, где
`$H` = `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f`.
Ошибочно подставлял `$H/lampac/obsidian/...` → `[ERR] нет источника`.
## 🔴🔴 Источники воспроизведения: торренты ≠ «смотреть онлайн» (2026-09-22)
**Вопрос Alex:** *«у меня есть определенные сомнения что через torrserver идут,
@@ -438,14 +539,85 @@ FlixCDN · Gencit · HDVB · Kinobase · Kinogo · Kinoteatrkg · Kinotochka ·
LeProduction · Mirage · Phantom · PizdatoeHD · RuDub · RutubeMovie · Spectre ·
VeoVeo · Vibix · VideoDB · Videoseed · VkMovie · Zetflix · ZetflixDB`
### Почему «Торренты» пусто
### Почему «Торренты» пусто — ✅ РАЗОБРАНО ПОЛНОСТЬЮ (2026-09-22)
TorrServer **работает** (`docker exec lampac curl -s http://127.0.0.1:9085/echo`
→ `MatriX.135`), но по этим фильмам **нет раздач** — нет сидов в трекере.
Это не поломка.
**Вывод: TorrServer и вся торрент-цепочка ИСПРАВНЫ. Чинить нечего.**
🔴 **TorrServer НЕДОСТУПЕН снаружи контейнера** — `curl http://127.0.0.1:9085/*`
с хоста даёт `Connection refused`. Проверять **только** через `docker exec lampac`.
Первая версия объяснения («нет раздач — нет сидов») была **неполной**. Полная
диагностика ниже доказала, что раздачи находятся. Отдельный док:
[[personal/tech/lampac-torrserver]].
#### TorrServer жив и качает
```bash
docker exec lampac sh -c 'curl -s http://127.0.0.1:9085/echo' # -> MatriX.135
```
Тест живым магнитом (Big Buck Bunny) — раздача добавилась и пошла:
```json
{"title":"probe","name":"Big Buck Bunny","stat":3,
"stat_string":"Torrent working","total_peers":343,"active_peers":7,
"connected_seeders":5,"bytes_written":6918,"bytes_read":49072}
```
⚠️ Тестовая раздача **удалена** после проверки:
`POST /ts/torrents {"action":"rem","hash":"<hash>"}` → HTTP 200.
#### Торрент-поиск работает по всей цепочке
```
JacRed /api/v1.0/torrents?search=Матрица → HTTP 200, 74 КБ, magnet ✅
трекеры: kinozal, torrentby, rutor, rutracker
PidTor /lite/pidtor?title=Матрица&year=1999 → HTTP 200, 8435 Б, раздача ✅
jac.red → 144.31.3.10, HTTP 200 ✅
/lite/events → "Pid<s>T</s>or" присутствует ✅
```
#### 🔴 Почему я поначалу решил, что TorrServer сломан — питфолл маршрутов
**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/ -> скачивание
```
Мои первые запросы `GET http://127.0.0.1:9085/torrents` → 404, и я принял это
за поломку. Снаружи контейнера порт 9085 вообще даёт `Connection refused`.
Проверять **только** через `docker exec lampac` либо через `/ts/` на 9118.
🔴 **Метод запроса ВАЖЕН — и `400` вместо `404` = маршрут существует:**
```
POST /ts/torrents с телом [] -> [] ✅ список раздач
POST /ts/torrents с телом {} -> 400 (неверный формат тела)
GET /ts/torrents -> 404 (метода нет)
GET /ts/settings -> 403 (нужна авторизация ts:tspass)
```
#### 🔴 Вероятная причина пустого списка у Alex: `min_sid: 15`
```json
"PidTor": { "enable": true, "enabled": false, "redapi": "http://jac.red",
"min_sid": 15, "torrs": null, "auth_torrs": null }
```
Раздачи с числом сидов **< 15 отсекаются**. Редкие/старые фильмы дадут пусто
именно из-за этого. Проверка по конкретному фильму:
```bash
curl -s "http://127.0.0.1:9118/lite/pidtor?title=<название>&year=<год>"
docker logs lampac 2>&1 | grep -i pidtor
```
⚠️ **README PidTor устарел:** там написано «пункт появляется только если заданы
`torrs`/`auth_torrs`, иначе список пустой». Фактически при `null` `/lite/pidtor`
отдал 8435 байт с рабочей раздачей. Верить факту, не README.
### `vast.js` — НЕ виновник (проверено сырьём)
@@ -490,7 +662,12 @@ $H/wwwroot/sisi/plugins/modification.js (22 КБ):
```
План и варианты: [[personal/plans/lampac-disable-1xbet-ads]].
Статус: **ждёт выбора Alex** (гасить онлайн полностью / частично / оставить).
🔴🔴 **СТАТУС: НЕ ПРИМЕНЕНО И НЕ БУДЕТ.** Alex: *«Я БЛЯДЬ НЕ ПРОСИЛ ГАСИТЬ
ОНЛАЙН, ЕБЛАН! Я СКАЗАЛ ЧИНИТЬ torrserver!»* Задача была — **диагностировать
TorrServer**, а не гасить онлайн. План откачен, `init.conf` не менялся.
Док оставлен как справка, где лежит выключатель; применять только по прямому
указанию Alex.
## 🚀 Деплой генератора на Кра́кен (проверено 2026-09-22)