Принимаем .torrent как загруженные байты — через файл-пикер в веб-форме и Telegram-документ, наряду с magnet. Файл несёт полные метаданные: работает там, где magnet не резолвится (закрытые трекеры, без DHT), и даёт максимум контекста для распознавания без сети. - internal/torrent: парсер поверх anacrolix/torrent/metainfo — инфохэш(и) (v1 SHA1 исходных байтов info; v2 BEP52 при наличии) + Context() из имени, дерева файлов, размера, трекеров. Извлечение файлов панико-безопасно (недоверенный вход). - Персистентность байтов: таблица-спутник download_torrent (миграция 0009); пишется в транзакции создания загрузки, только на ветке создания (не при дедупе). Байты живут весь срок строки — нужны для повторного добавления при retry. - ingest: Request.TorrentData/TorrentName, диспетч парсера; source_ref — человекочитаемый референс (имя раздачи/файла), не адрес добавления. - worker: общий sourceAddParts ветвит по source_type в ОБОИХ add-путях — processCatched и Retry (torrent добавляется файлом, не magnet-хешем). - Транспорты: multipart-форма с файл-пикером (деградация без JS) и приём Telegram-документа (скачивание с редактированием токена из ошибок — секрет не в логи; обработка до ветки pending/текста). Разработка по OpenSpec (SDD): change torrent-file-ingest, два чекпоинта ревью (дизайн до кода, код до архива) сабагентами; дельты влиты в спеки, change архивирован. Ручная проверка на живом qBittorrent (7.3) — за деплоем. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 lines
1.9 KiB
AMPL
49 lines
1.9 KiB
AMPL
module git.vakhrushev.me/av/jellybit
|
|
|
|
go 1.26
|
|
|
|
require (
|
|
github.com/anacrolix/torrent v1.61.0
|
|
github.com/go-chi/chi/v5 v5.1.0
|
|
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
|
|
github.com/jmoiron/sqlx v1.4.0
|
|
github.com/middelink/go-parse-torrent-name v0.0.0-20190301154245-3ff4efacd4c4
|
|
github.com/oklog/ulid/v2 v2.1.1
|
|
github.com/pelletier/go-toml/v2 v2.2.3
|
|
github.com/pressly/goose/v3 v3.22.1
|
|
modernc.org/sqlite v1.34.1
|
|
)
|
|
|
|
require (
|
|
github.com/anacrolix/generics v0.1.1-0.20251125230353-15d98d46693b // indirect
|
|
github.com/anacrolix/missinggo v1.3.0 // indirect
|
|
github.com/anacrolix/missinggo/v2 v2.10.0 // indirect
|
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
|
github.com/google/uuid v1.6.0 // indirect
|
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
|
github.com/huandu/xstrings v1.3.2 // indirect
|
|
github.com/klauspost/cpuid/v2 v2.2.3 // indirect
|
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
|
github.com/mfridman/interpolate v0.0.2 // indirect
|
|
github.com/minio/sha256-simd v1.0.0 // indirect
|
|
github.com/mr-tron/base58 v1.2.0 // indirect
|
|
github.com/multiformats/go-multihash v0.2.3 // indirect
|
|
github.com/multiformats/go-varint v0.0.6 // indirect
|
|
github.com/ncruces/go-strftime v0.1.9 // indirect
|
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
|
github.com/sethvargo/go-retry v0.3.0 // indirect
|
|
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
|
go.uber.org/multierr v1.11.0 // indirect
|
|
golang.org/x/crypto v0.44.0 // indirect
|
|
golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 // indirect
|
|
golang.org/x/sync v0.18.0 // indirect
|
|
golang.org/x/sys v0.38.0 // indirect
|
|
lukechampine.com/blake3 v1.1.6 // indirect
|
|
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
|
|
modernc.org/libc v1.55.3 // indirect
|
|
modernc.org/mathutil v1.6.0 // indirect
|
|
modernc.org/memory v1.8.0 // indirect
|
|
modernc.org/strutil v1.2.0 // indirect
|
|
modernc.org/token v1.1.0 // indirect
|
|
)
|