[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

@@ -1,5 +1,8 @@
# Отключение рекламы 1xbet в Lampa (онлайн-балансеры)
> ⚠️ **СТАТУС: НЕ ПРИМЕНЕНО.** Alex сказал: «Я БЛЯДЬ НЕ ПРОСИЛ ГАСИТЬ ОНЛАЙН».
> План оставлен как справка — что где лежит. Ничего не менялось.
**Дата:** 2026-09-22
**Статус:** 🔴 ПЛАН — требует подтверждения Alex перед применением
**Связано:** [[personal/tech/lampac-deployment]], [[personal/plans/watchlist-tmdb-missing-marker]]
+25 -17
View File
@@ -45,28 +45,36 @@ Sonarr : 13 сериалов, added >= 20.09: 0 — авто-закачек НЕ
(вырезанный `sync-down`) в git — **всё ещё НЕ сделан**, единственный хвост
этого пункта.
### 2. Имя в карточке — из источника (TMDB/КП), НЕ из `.md` — ⏳ В РАБОТЕ
### 2. Имя в карточке — из источника (TMDB/КП) — ✅ ВЫПОЛНЕНО (2026-09-22)
Alex: *«че по имени в карточке? оно должно из источника ставиться»* + *«делай»*.
Alex: *«че по имени в карточке? оно должно из источника ставиться»* + *«иди делать он»*.
Сейчас генератор пишет в карточку `it["name"]` = название **из `.md`**:
**Сделано:** `tmdb_details()` теперь тянет `title` (ru-RU) + `original_title` +
`year` из `release_date`. В `enrich()` имя/оригинал/год подставляются из источника,
`.md` остаётся fallback'ом (год из `.md` не перетирается — он может быть точнее
для локальных премьер).
```python
# gen_watchlist.py, блок записи карточки (~строка 733)
card_body = {"card": {
"name": it["name"], # ← из .md, не из TMDB/КП
"title": it["name"], # дублируется намеренно:
"original": it["original"], # CardController ищет attribute name,
"original_title": it["original"], # в ответе ключи title/original_title
...
}}
Прошлая версия этого пункта (объяснение, «что нужно») **отменена — сделано**:
```
в .md: TMDB ru-RU:
'Смерть единорога' → 'Смерть Единорога' ← регистр из источника
'Everything…' → 'Всё везде и сразу'
'Простите за бесп…'→ orig='Sorry to Bother You'
year: null → 2025 / 2018 / 2012 / 1972
```
Требование Alex: «Отображать как в tmdb/kp», «Ничего не укорачивать».
**Нужно:** брать имя из источника (TMDB `title`/`name` из `tmdb_details()`,
либо `name` документа КП) и писать его в `card.title` + `watchlist.json[].name`.
Функция `tmdb_details()` уже тянет детали и кэширует — там есть `poster_path`,
но **имени она сейчас не сохраняет**, надо добавить.
**Миграция кэша:** 367 записей без поля `title` дотягиваются при первом
обращении (проверка `d.get("title")` в начале `tmdb_details`).
**Боевой прогон (EXIT=0):** 376 позиций, без года 1 (`Волшебный участок: Фильм`),
296 с русским названием + оригиналом. Коммит **`53e5803`** (запушен).
🔴 **Питфолл:** `setsid nohup` НЕ спасает от обрыва ssh — прогон умирал дважды.
Решение: `systemd-run --user --unit=gen-watchlist --scope <script>`.
Детали: [[personal/tech/lampac-deployment#✅ Название и год карточки — ИЗ TMDB, не из `.md` (2026-09-22)]]
⚠️ Осторожно с `original`: это EN-название, нужен RU/title из TMDB при
`language=ru-RU`. Проверить на 3 позициях, где `.md`-название ≠ название TMDB
+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)
+180
View File
@@ -0,0 +1,180 @@
# TorrServer на Кра́кене — диагностика (исправен)
**Дата:** 2026-09-22
**Вывод:** 🔴 **ЧИНИТЬ НЕЧЕГО. TorrServer и вся торрент-цепочка работают.**
**Связано:** [[personal/tech/lampac-deployment]], [[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 жив и качает
```bash
# изнутри контейнера (снаружи порт 9085 закрыт!)
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","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 находит раздачи
```bash
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
```bash
curl -s "http://127.0.0.1:9118/lite/pidtor?title=Матрица&year=1999"
# HTTP 200, 8435 байт
```
Ответ содержит рабочий торрент:
`/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
```
## 🔴 Маршруты — главный питфолл разбора
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 с телом [] -> [] ✅ список раздач
POST /ts/torrents с телом {} -> 400 (неверный формат)
GET /ts/torrents -> 404 (метода нет)
GET /ts/settings -> 403 (нужна авторизация ts:tspass)
```
**400 вместо 404 = маршрут существует.** Это ключевой признак при диагностике.
## 🔴 Конфиг: где что лежит
### `current.conf` (эффективный, слитый из base.conf + init.conf)
```json
"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/)
```json
{"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`. Реклама от онлайн-источников.
## Если «Торренты» всё же пусто у Alex — что проверить
1. Что именно за фильм (есть ли раздачи в принципе — старые/редкие могут быть без сидов)
2. `curl "http://127.0.0.1:9118/lite/pidtor?title=<название>&year=<год>"` — отдаёт ли
3. `docker logs lampac | grep -i pidtor` — доходит ли запрос
4. `min_sid: 15` — раздачи с сидами < 15 **отсекаются**. Возможно, поэтому пусто