feat: add qBittorrent download client integration

Send Prowlarr search results directly to qBittorrent from the modal.
Backend authenticates via SID cookie (login + add torrent endpoints).

- Backend: qbittorrent module with add and test endpoints
- Migration: add qbittorrent settings (url, username, password)
- Settings UI: qBittorrent config card with test connection
- ProwlarrSearchModal: send-to-qBittorrent button per result row
  with spinner/checkmark state progression
- Button only shown when qBittorrent is configured

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-19 21:51:28 +01:00
parent 57bc82703d
commit c04d4fb618
11 changed files with 493 additions and 1 deletions

View File

@@ -910,3 +910,18 @@ export type ProwlarrTestResponse = {
message: string;
indexer_count: number | null;
};
// ---------------------------------------------------------------------------
// qBittorrent
// ---------------------------------------------------------------------------
export type QBittorrentAddResponse = {
success: boolean;
message: string;
};
export type QBittorrentTestResponse = {
success: boolean;
message: string;
version: string | null;
};

View File

@@ -491,6 +491,18 @@ const en: Record<TranslationKey, string> = {
"prowlarr.notConfigured": "Prowlarr is not configured",
"prowlarr.download": "Download",
"prowlarr.info": "Info",
"prowlarr.sendToQbittorrent": "Send to qBittorrent",
"prowlarr.sending": "Sending...",
"prowlarr.sentSuccess": "Sent to qBittorrent",
"prowlarr.sentError": "Failed to send to qBittorrent",
// Settings - qBittorrent
"settings.qbittorrent": "qBittorrent",
"settings.qbittorrentDesc": "Configure qBittorrent as a download client. Torrents found via Prowlarr can be sent directly to qBittorrent.",
"settings.qbittorrentUrl": "qBittorrent URL",
"settings.qbittorrentUrlPlaceholder": "http://localhost:8080",
"settings.qbittorrentUsername": "Username",
"settings.qbittorrentPassword": "Password",
// Settings - Language
"settings.language": "Language",

View File

@@ -489,6 +489,18 @@ const fr = {
"prowlarr.notConfigured": "Prowlarr n'est pas configuré",
"prowlarr.download": "Télécharger",
"prowlarr.info": "Info",
"prowlarr.sendToQbittorrent": "Envoyer à qBittorrent",
"prowlarr.sending": "Envoi...",
"prowlarr.sentSuccess": "Envoyé à qBittorrent",
"prowlarr.sentError": "Échec de l'envoi à qBittorrent",
// Settings - qBittorrent
"settings.qbittorrent": "qBittorrent",
"settings.qbittorrentDesc": "Configurer qBittorrent comme client de téléchargement. Les torrents trouvés via Prowlarr peuvent être envoyés directement à qBittorrent.",
"settings.qbittorrentUrl": "URL qBittorrent",
"settings.qbittorrentUrlPlaceholder": "http://localhost:8080",
"settings.qbittorrentUsername": "Nom d'utilisateur",
"settings.qbittorrentPassword": "Mot de passe",
// Settings - Language
"settings.language": "Langue",