Веб-UI: обзор жизненного цикла в карточке загрузки
Карточка списка на главной теперь даёт краткий обзор «от загрузки до
решения об удалении»: метка «ID:» перед идентификатором, дата добавления
(абсолютная + относительная, всегда), размер раздачи и рейтинг отдачи.
Спойлер контекста убран — контекст смотрят на /download/{id}.
Данные:
- рейтинг и общий размер — из живого снимка воркера (qbt total_size →
worker.Live.TotalSize); размер доступен для любой раздачи в снимке;
- размер-фолбэк, когда торрента нет в qBittorrent (orphaned) — сумма
размеров разложенных файлов: новая колонка file_link.size, layouter
пишет размер при линковке, ридер LayoutSizeByDownload суммирует по
странице одним запросом (дедуп по dst_path);
- дата — source_added_at → фолбэк created_at, показ в TZ сервера.
handleIndex читает снимок для всех карточек (map-lookup), рейтинг/размер
статичны на рендере (без поллинга). Миграция 0007, ER-схема обновлена.
Change download-card-lifecycle-overview влит в спеки и заархивирован.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
## Why
|
||||
|
||||
Карточка загрузки в списке на главной сейчас показывает состояние, заголовок,
|
||||
идентификатор и (для качающихся) прогресс. Для решения «пора ли удалять
|
||||
раздачу» этого мало: пользователь удаляет по **возрасту** и по **рейтингу
|
||||
отдачи**, а этих полей в обзоре нет. Одновременно карточка тратит место на
|
||||
спойлер контекста, который логичнее смотреть на странице загрузки. Цель —
|
||||
сделать карточку кратким обзором жизненного цикла: от загрузки до момента, когда
|
||||
раздачу пора убирать.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Убрать из карточки списка спойлер «контекст»; контекст остаётся доступен на
|
||||
странице загрузки `/download/{id}`.
|
||||
- Дописать метку `ID:` перед идентификатором загрузки — чтобы было понятно, что
|
||||
за значение копируется.
|
||||
- Показывать в карточке **всегда** дату добавления раздачи в формате
|
||||
«`2026-06-30 · 5 дней назад`» (абсолютная + относительная). Источник — время
|
||||
добавления в источник (`source_added_at`, qBittorrent `added_on`) с фолбэком
|
||||
на время создания загрузки (`created_at`).
|
||||
- Показывать в карточке **рейтинг отдачи** (ratio) из живого снимка воркера;
|
||||
если торрента нет в qBittorrent — прочерк «—».
|
||||
- Показывать в карточке **размер раздачи**: из живого снимка (общий размер
|
||||
торрента), а когда торрента нет в qBittorrent — из суммарного размера
|
||||
разложенных файлов.
|
||||
- Расширить состав живой телеметрии общим размером раздачи (доступен для любой
|
||||
раздачи в снимке, не только сидирующей).
|
||||
- Раскладка при линковке SHALL сохранять размер каждого созданного файла — чтобы
|
||||
фолбэк размера работал и после исчезновения торрента (`orphaned`).
|
||||
|
||||
Явно вне объёма: сиды/пиры, время сидирования и объём отданного в карточку не
|
||||
добавляем — пользователю для решения об удалении достаточно возраста и рейтинга.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
Нет.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `web-ui`: карточка списка получает обзорную мета-строку (ID-метка, дата
|
||||
добавления всегда, размер, рейтинг); спойлер контекста уходит из карточки на
|
||||
страницу загрузки.
|
||||
- `live-status`: состав телеметрии дополняется общим размером раздачи, доступным
|
||||
для любой раздачи в снимке (не только сидирующей).
|
||||
- `file-layout`: раскладка сохраняет размер каждого разложенного файла (основа
|
||||
фолбэка размера раздачи, когда торрента нет в qBittorrent).
|
||||
|
||||
## Impact
|
||||
|
||||
- `internal/qbt` — поле `TotalSize` (`json:"total_size"`) в `Torrent`.
|
||||
- `internal/worker` — `Live.TotalSize`, проброс из `qbt.Torrent`.
|
||||
- `internal/store` — колонка `file_link.size` (миграция goose), запись размера
|
||||
при линковке, чтение суммарного размера разложенных файлов для карточки.
|
||||
- `internal/httpapi` — новые поля `downloadView`, форматтеры даты/относительного
|
||||
времени/размера/рейтинга; `handleIndex` читает живой снимок для всех карточек
|
||||
списка, а не только качающихся.
|
||||
- `web/templates/index.html` — мета-строка карточки (+ возможный партиал), удаление
|
||||
спойлера контекста.
|
||||
- `docs/specs/database.md` — обновить ER-схему (новая колонка `file_link.size`).
|
||||
Reference in New Issue
Block a user