🔍 The Problem
On the Wanted page, the "Search All" button initiated a sequential release grab for every missing audiobook in the library at one request per second without user confirmation, ignoring visual filter text, re-searching books with active downloads in progress, remaining enabled when zero audiobooks matched, and leaking background searches across view unmounts.
Root cause analysis identified two architectural gaps across the frontend and backend:
-
In
fe/src/views/content/WantedView.vue, the display table rendered items fromfilteredWanted(scoped tofilterText), but thesearchMissingaction iterated overcategorizedWanted.value.missing. This collection mismatch caused the button to bypass visual filters entirely. In addition,categorizedWanted.missingonly excluded items currently searching in the local UI state rather than checkingactiveDownloadsByAudiobook/hasActiveDownload(item), causing books with downloads in progress to be re-grabbed. The button's:disabledattribute evaluatedcategorizedWanted.missing.length === 0rather than the filtered collection, leaving it enabled even when filtering yielded zero matches. Furthermore,searchMissingexecuted immediately upon click without confirmation, lacked abort capabilities, and lacked anonBeforeUnmountlifecycle hook to clear active delay timers or stop pending iterations when navigating away. -
In
listenarr.application/Downloads/Submission/DownloadService.cs,SearchAndDownloadAsyncqueried external indexers before checking if an active download already existed for the target audiobook, placing unnecessary load on indexers and risking account suspension. Additionally, whenSendToDownloadClientAsyncreturned an empty download identifier (indicating a duplicate download was suppressed),DownloadServicestill proceeded to log history and returned a false positive success status.
🛠️ The Solution
- Scoped Actionable Collection: Replaced `c...
Automated Canary build