Живые обновления прогресса и раздел «Раздача» (live-status)

Воркер ведёт in-memory снимок телеметрии раздач (прогресс, скорость, ETA,
рейтинг, сиды/пиры, отдано) под отдельным RWMutex, обновляя его на каждом
тике поллинга сразу после построения byHash — без лишних вызовов qBittorrent
и без хранения в БД (волатильно). qbt.Torrent дополнен полями телеметрии.

Веб-UI читает снимок через узкий контракт LiveStatus: карточки активных
загрузок показывают живой прогресс-бар (htmx-поллинг фрагмента every 3s,
точечно — без сброса фильтров), на странице загрузки появилась секция
«Раздача» для сидирующих задач. Начальный кадр рендерится сразу со
значениями; при отсутствии данных UI деградирует штатно.

Капабилити live-status (OpenSpec), web-ui дополнен. Change заархивирован.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-06-30 20:38:25 +03:00
co-authored by Claude Opus 4.8
parent b646381cf9
commit ef75a0d302
22 changed files with 1094 additions and 14 deletions
+13 -1
View File
@@ -44,7 +44,10 @@ type Client struct {
mu sync.Mutex // сериализует логин
}
// Torrent — подмножество полей /torrents/info, нужное jellybit.
// Torrent — подмножество полей /torrents/info, нужное jellybit. Помимо полей
// для машины состояний и сопоставления несёт живую телеметрию (скорости, ETA,
// статистика раздачи) — её собирает снимок воркера для веб-UI; все эти поля
// приходят в том же ответе, отдельного вызова не нужно.
type Torrent struct {
Hash string `json:"hash"`
Name string `json:"name"`
@@ -58,6 +61,15 @@ type Torrent struct {
AddedOn int64 `json:"added_on"`
InfohashV1 string `json:"infohash_v1"`
InfohashV2 string `json:"infohash_v2"`
// Живая телеметрия (для снимка воркера и веб-UI).
Dlspeed int64 `json:"dlspeed"` // скорость загрузки, байт/с
Upspeed int64 `json:"upspeed"` // скорость отдачи, байт/с
Eta int64 `json:"eta"` // оценка до завершения, с (8640000 ≈ ∞)
Ratio float64 `json:"ratio"` // рейтинг отдачи (может быть -1 = ∞/н/д)
NumSeeds int `json:"num_seeds"` // подключённые сиды
NumLeechs int `json:"num_leechs"` // подключённые личи (пиры)
Uploaded int64 `json:"uploaded"` // отдано всего, байт
}
// File — элемент /torrents/files: путь файла относительно save_path