Skip to content

Feature: Downloads widget - #553

Merged
SandObserver merged 2 commits into
mainfrom
feat/downloads-widget
Oct 25, 2026
Merged

SandObserver merged 2 commits into
mainfrom
feat/downloads-widget

Conversation

@SandObserver

@SandObserver SandObserver commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Add the downloads widget (small, medium): each active download is a kraft box on a conveyor belt, with packing tape over the lid as progress and a heading with the finish time or time left.
  • Read qBittorrent 5.2+ (API key as Bearer), SABnzbd (API key), NZBGet (GET JSON-RPC with Basic auth), Transmission (409 session-id handshake, JSON-RPC 2.0 with a fallback to the original protocol) and Deluge (web auth.login session cookie; connects the web UI to its daemon only when exactly one is listed). Every other call is read-only with fixed method names.
  • Parse each client's reply into one item shape in download-items.js with no I/O; compute the heading summary on the server over every download, not only the 12 shown.
  • SABnzbd: show only Downloading slots, each with its own timeleft. NZBGet: subtract PausedSize from size and remaining; each job's ETA counts the jobs ahead of it at the queue rate.
  • Strip bidi controls (including U+061C) and C0/C1 control characters from file names; refuse keys that are not header-safe and usernames with a colon; bound the Transmission and Deluge session caches to 32 servers.
  • States: stalled, failed, waiting with no estimate, nothing downloading with today's count, loading placeholders, and the shared failure and stale states. A failed first load stays free of placeholders across resizes. Medium pages three boxes at a time; the pager sits on the belt rail, is a labelled group and wraps at either end.
  • Right to left: the belt starts at the right; formatted values are wrapped in first-strong isolates, removed again from spoken text. Day periods come from the widget catalog.
  • Add the downloads icon to icon-set.js and the parcel glyph.
  • Bundled widget pages now fill their card and lay out at the card's aspect, so nothing drawn to the page edge leaves strips of card beside it.

Testing
All green, including the Docker build, image scan and e2e. Added 35 tests for the client parsers, session handshakes, the summary, input refusal and the belt logic, plus one for frames filling their card, and an e2e spec for the pager and the failure state.

Changelog

Added

  • Downloads widget for qBittorrent, Transmission, Deluge, SABnzbd and NZBGet.

Fixed

  • Widgets no longer show a strip of card at their sides when the card is wider than the widget's design.

Checklist

  • Stays within the project constraints: one container, no runtime dependencies, no build step (see CONTRIBUTING.md).
  • Tests added or updated for new logic, and the full suite, lint, and typechecks pass.
  • Docs updated if behavior or configuration changed.

Show active downloads from qBittorrent, Transmission, Deluge, SABnzbd and
NZBGet as parcels on a conveyor belt, with the time until the last one
finishes. Bundled widget pages now fill their card.
@SandObserver SandObserver added the enhancement New feature or request label Oct 24, 2026
- NZBGet: leave paused repair files out of size and remaining; later jobs finish after the jobs ahead.
- SABnzbd: show only downloading slots, each with its own time left.
- Deluge: connect the web UI only when exactly one daemon is listed.
- Strip U+061C and C1 control characters from names.
- Pager: expose its position as a group label and wrap at either end.
- Draw no loading placeholders on resize after a failed first load.
@SandObserver
SandObserver merged commit 2eff0a0 into main Oct 25, 2026
8 checks passed
@SandObserver
SandObserver deleted the feat/downloads-widget branch October 25, 2026 00:36
stackyard-release Bot pushed a commit that referenced this pull request Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant