From 2dbe8e66855e74d325a73a5f5994b84851246552 Mon Sep 17 00:00:00 2001 From: DDSRem <1448139087@qq.com> Date: Sun, 22 Feb 2026 13:12:56 +0800 Subject: [PATCH] feat(downloader): add rTorrent UI support Add rTorrent as a downloader option in settings, setup wizard, and downloader card with config form (host, username, password) and ruTorrent logo. Include i18n translations for zh-CN, zh-TW, and en-US. Co-Authored-By: Claude Opus 4.6 --- src/api/constants.ts | 4 ++ src/assets/images/logos/rtorrent.png | Bin 0 -> 3965 bytes src/components/cards/DownloaderCard.vue | 47 +++++++++++++ src/locales/en-US.ts | 2 + src/locales/zh-CN.ts | 2 + src/locales/zh-TW.ts | 2 + src/utils/imageUtils.ts | 2 + src/views/setup/DownloaderSettingsStep.vue | 74 ++++++++++++++++++++- 8 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 src/assets/images/logos/rtorrent.png diff --git a/src/api/constants.ts b/src/api/constants.ts index 6231c1fb..2af3f9f8 100644 --- a/src/api/constants.ts +++ b/src/api/constants.ts @@ -52,6 +52,10 @@ export const downloaderOptions = [ value: 'transmission', title: i18n.global.t('setting.system.transmission'), }, + { + value: 'rtorrent', + title: i18n.global.t('setting.system.rtorrent'), + }, ] export const downloaderDict = downloaderOptions.reduce((dict, item) => { diff --git a/src/assets/images/logos/rtorrent.png b/src/assets/images/logos/rtorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..08b06b3acc92ceba008646fe027b3cb7fd8d6d75 GIT binary patch literal 3965 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 { return getLogoUrl('qbittorrent') case 'transmission': return getLogoUrl('transmission') + case 'rtorrent': + return getLogoUrl('rtorrent') default: return getLogoUrl('downloader') } @@ -443,6 +445,51 @@ onUnmounted(() => { /> + + + + + + + + + + + + + + = { qbittorrent: qbittorrentLogo, transmission: transmissionLogo, + rtorrent: rtorrentLogo, emby: embyLogo, jellyfin: jellyfinLogo, plex: plexLogo, diff --git a/src/views/setup/DownloaderSettingsStep.vue b/src/views/setup/DownloaderSettingsStep.vue index 13baaa6d..3e8c1d8f 100644 --- a/src/views/setup/DownloaderSettingsStep.vue +++ b/src/views/setup/DownloaderSettingsStep.vue @@ -27,7 +27,7 @@ const { wizardData, selectDownloader, validationErrors } = useSetupWizard()

{{ t('setupWizard.downloader.type') }}

- + - + + + + + +
rTorrent
+
+
+
@@ -203,6 +216,63 @@ const { wizardData, selectDownloader, validationErrors } = useSetupWizard() />
+ + + + + + + + + + + + + +