# Формат сообщения торрент-бота

Основной способ добавления загрузки — переслать в jellybit сообщение стороннего
торрент-бота (`exfreedomist`, поиск по rutracker и соседним трекерам). Из
сообщения берутся **источник** (magnet) и **контекст** для распознавания. Формат
чужой, ничем не документирован и может измениться без предупреждения.

**Провенанс.** Образец снят вручную из личного чата Telegram (сообщение
датировано 2026-03-21) и зафиксирован в [BRIEF.md] проекта; второй образец,
меньшего размера, живёт константой `botMessage` в
`internal/tgbot/parse_test.go` и проверяется тестами разборщика. Статистики по
вариантам формата нет — наблюдений всего два, и это условие, а не замер.

[BRIEF.md]: перенесён в [../passport.md](../passport.md); полный текст образца —
ниже и в истории git.

## Образец

```
[1] #6514485 [rutracker], 2026-03-21 (https://hashurl.ru/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…):
Дюна: Часть вторая / Dune: Part Two (Дени Вильнёв / Denis Villeneuve) [2024, США, Канада, фантастика, WEB-DL 2160p, HDR10+, Dolby Vision] Dub (Bravo Records Georgia, RHS, Jaskier, HDrezka) + MVO (LostFilm, TVShows, Jaskier) + AVO (Сербин, Яроцкий) + (Ukr) + Original (Eng) + Sub (Rus, Eng, Ukr)

✅ (проверено) | 34.82 GB

magnet:?xt=urn:btih:541ADCFF3B6DD5DBA7088EA83317D9D6FAC331D6&tr=http%3A%2F%2Fbt.t-ru.org%2Fann%3Fmagnet&dn=rutracker-topic-6514485

Открыть magnet в вашем клиенте  (https://hashurl.ru/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…)
или получить .torrent: /tr_5c054

Оцените раздачу:
👍: /g_eabdce или 👎🏿: /r_eabdce

[список файлов] (https://download.exfreedomist.com/files/541ADCFF3B6DD5DBA7088EA83317D9D6FAC331D6)

Следить: /us_5c054
Добавить в закладки: /mka_96423

cправка: /help, index (https://exfreedomist.com/stats/)
```

## Что из этого наблюдается

- **Заголовок строки 1** — порядковый номер выдачи, `#<topic-id>`, имя трекера в
  квадратных скобках, дата раздачи и ссылка-редирект `hashurl.ru` с JWT в пути.
  Токен в ссылке **имеет срок жизни** (`exp` в payload) — как долгоживущий
  идентификатор он не годится.
- **Строка описания** — самый ценный кусок: локализованное название, оригинальное
  название через `/`, режиссёр в скобках (тоже через `/`), затем блок в
  квадратных скобках `[год, страны, жанры, качество, HDR…]` и перечисление
  дорожек и субтитров. Именно она уходит контекстом в распознавание.
- **Разделитель `/`** используется одновременно для пары «локализованное /
  оригинальное» и для пары «имя режиссёра кириллицей / латиницей». По позиции
  они не различаются — только по тому, что вторая пара стоит в скобках.
- **magnet отдельной строкой**, с `dn=rutracker-topic-<id>` — то есть `dn`
  здесь **не** содержит названия фильма и как имя раздачи бесполезен.
  Инфохэш в magnet — v1, uppercase hex; нормализуем в lowercase.
- **`.torrent` не приложен** — предлагается командой бота (`/tr_…`), то есть
  вторым шагом в чужом чате. Поэтому источник, приходящий этим путём, —
  практически всегда magnet.
- **Размер раздачи** в человекочитаемом виде (`34.82 GB`) и отметка
  «✅ (проверено)».
- **Команды бота** (`/g_…`, `/r_…`, `/us_…`, `/mka_…`, `/help`) и ссылка на
  список файлов — шум для распознавания, но безвредный: попадают в контекст как
  есть.
- Весь текст — **недоверенный вход**: он полностью составляется чужим ботом по
  данным трекера и уезжает в промпт LLM. См. [../security.md](../security.md).

## Чего не знаем

- Насколько формат стабилен: наблюдений два, оба от одного бота, разница между
  ними — только в наличии строки «сохранённая копия описания раздачи».
- Как выглядит сообщение для сериала-сезонника и для аниме — образцов не
  снимали, а именно на них строится самый сложный случай раскладки.
- Что бот присылает при неудачном поиске и при слишком длинном описании
  (лимит Telegram на текст сообщения — 4096 символов UTF-16, по документации
  Bot API `sendMessage`; сами обрезанные сообщения мы не наблюдали, поведение
  бота на обрезке неизвестно).
