Files
jellybit/openspec/changes/archive/2026-07-04-download-card-lifecycle-overview/proposal.md
T
avandClaude Opus 4.8 bb245a90a3 Веб-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>
2026-07-04 10:34:45 +03:00

4.7 KiB

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/workerLive.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).