From 3871f24724666f9aa9165da2cecafb9480d945bd Mon Sep 17 00:00:00 2001 From: Developer Date: Tue, 14 Jul 2026 21:46:20 +0000 Subject: [PATCH] fix: show only live torrent transfers --- .../media_library_viewer_api/widgets/sources.py | 14 +++++++++----- backend/tests/test_widgets.py | 17 ++++++----------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/backend/src/media_library_viewer_api/widgets/sources.py b/backend/src/media_library_viewer_api/widgets/sources.py index 2b4f987..adeb02d 100644 --- a/backend/src/media_library_viewer_api/widgets/sources.py +++ b/backend/src/media_library_viewer_api/widgets/sources.py @@ -462,9 +462,13 @@ def _qbit_torrent_direction(torrent: dict[str, Any]) -> str | None: return None -def _qbit_torrent_is_active(torrent: dict[str, Any]) -> bool: - state = str(torrent.get("state") or "").lower() - return bool(_qbit_torrent_direction(torrent)) or state in _QBITTORRENT_OTHER_ACTIVE_STATES +def _qbit_torrent_transfer_direction(torrent: dict[str, Any]) -> str | None: + """Return a direction only while qBittorrent reports nonzero throughput.""" + if _safe_int(torrent.get("dlspeed")) > 0: + return "downloading" + if _safe_int(torrent.get("upspeed")) > 0: + return "uploading" + return None class QbittorrentWidgetSource: @@ -529,9 +533,9 @@ class QbittorrentWidgetSource: if widget_kind == "active": active = [] for torrent in torrents.values(): - if not _qbit_torrent_is_active(torrent): + direction = _qbit_torrent_transfer_direction(torrent) + if not direction: continue - direction = _qbit_torrent_direction(torrent) active.append( { "name": torrent.get("name"), diff --git a/backend/tests/test_widgets.py b/backend/tests/test_widgets.py index 5ca3f78..8d125b1 100644 --- a/backend/tests/test_widgets.py +++ b/backend/tests/test_widgets.py @@ -1158,8 +1158,8 @@ async def test_qbittorrent_totals_counts_all_torrents(): @pytest.mark.asyncio -async def test_qbittorrent_active_filters_dl_ul_only(): - """Active kind returns all active download/upload states, including queued work.""" +async def test_qbittorrent_active_filters_current_transfers_only(): + """Active kind returns only torrents with current download or upload throughput.""" from media_library_viewer_api.widgets.sources import QbittorrentWidgetSource adapter = QbittorrentWidgetSource() @@ -1175,15 +1175,10 @@ async def test_qbittorrent_active_filters_dl_ul_only(): result = await adapter.fetch(service, "active", {}) active = result["torrents"] - assert len(active) == 5 - names = [t["name"] for t in active] - assert "Movie.mkv" in names - assert "Show.mkv" in names - assert "Forced download" in names - assert "Stalled upload" in names - assert "Queued" in names - # Paused torrents remain excluded, but queued transfer work is visible. - assert "Paused" not in names + assert len(active) == 2 + names = [torrent["name"] for torrent in active] + assert names == ["Movie.mkv", "Show.mkv"] + assert all((torrent["dl_speed"] or 0) > 0 or (torrent["up_speed"] or 0) > 0 for torrent in active) @pytest.mark.asyncio