From 4561d6ee1b30acbf19fc860e693b2ef69bfcb420 Mon Sep 17 00:00:00 2001 From: himsin Date: Mon, 1 Jun 2026 11:54:00 +0530 Subject: [PATCH 1/2] Fix prowlarr grab error --- src/server/routes/integrations.ts | 4 ++-- src/server/utils/crossSeedWorker.ts | 4 ++-- src/server/utils/qbt.ts | 27 +++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/server/routes/integrations.ts b/src/server/routes/integrations.ts index def7dfb..6a0be99 100644 --- a/src/server/routes/integrations.ts +++ b/src/server/routes/integrations.ts @@ -2,7 +2,7 @@ import { Hono } from 'hono' import { db, type Integration } from '../db' import { encrypt, decrypt } from '../utils/crypto' import { validateUrl } from '../utils/url' -import { loginToQbt } from '../utils/qbt' +import { loginToQbt, isTorrentAddSuccessful } from '../utils/qbt' import { authMiddleware } from '../middleware/auth' import { log } from '../utils/logger' @@ -289,7 +289,7 @@ integrations.post('/:id/grab', async (c) => { }) const addText = await addRes.text() - if (!addRes.ok || (addText.trim() !== 'Ok.' && addText.trim() !== 'Ok')) { + if (!addRes.ok || !isTorrentAddSuccessful(addText)) { return c.json({ error: `Failed to add torrent: ${addText || `HTTP ${addRes.status}`}` }, 400) } diff --git a/src/server/utils/crossSeedWorker.ts b/src/server/utils/crossSeedWorker.ts index a6a7b04..8e4845b 100644 --- a/src/server/utils/crossSeedWorker.ts +++ b/src/server/utils/crossSeedWorker.ts @@ -11,7 +11,7 @@ import { CrossSeedDecisionType, MatchMode, } from '../db' -import { loginToQbt } from './qbt' +import { loginToQbt, isTorrentAddSuccessful } from './qbt' import { fetchWithTls } from './fetch' import { decrypt } from './crypto' import { log } from './logger' @@ -314,7 +314,7 @@ async function addTorrentToQbt( body: formData, }) const text = await res.text() - const apiSuccess = res.ok && text.trim().startsWith('Ok') + const apiSuccess = res.ok && isTorrentAddSuccessful(text) if (!apiSuccess) { log.error(`[CrossSeed] API returned failure: ${text}`) diff --git a/src/server/utils/qbt.ts b/src/server/utils/qbt.ts index 11bd5c9..d1ec727 100644 --- a/src/server/utils/qbt.ts +++ b/src/server/utils/qbt.ts @@ -169,3 +169,30 @@ export async function fetchInstanceTransferStats( return null } } + +export function isTorrentAddSuccessful(addText: string): boolean { + const trimmed = addText.trim() + if (trimmed === 'Ok.' || trimmed === 'Ok') { + return true + } + try { + const json = JSON.parse(trimmed) + if (json && typeof json === 'object') { + const successCount = json.success_count !== undefined ? Number(json.success_count) : 0 + const pendingCount = json.pending_count !== undefined ? Number(json.pending_count) : 0 + const failureCount = json.failure_count !== undefined ? Number(json.failure_count) : 0 + const addedIds = Array.isArray(json.added_torrent_ids) ? json.added_torrent_ids : [] + + if (successCount > 0 || addedIds.length > 0 || pendingCount > 0) { + return true + } + if (failureCount > 0) { + return false + } + } + } catch { + // Not JSON, and not 'Ok'/'Ok.' -> treat as failed + } + return false +} + From b8d274a69e5db0f9908a60ab043f74645f6685a0 Mon Sep 17 00:00:00 2001 From: himsin Date: Mon, 1 Jun 2026 17:01:02 +0530 Subject: [PATCH 2/2] Fix ci build. --- __tests__/server/crossSeedWorker.test.ts | 10 +++++++--- bun.lock | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/__tests__/server/crossSeedWorker.test.ts b/__tests__/server/crossSeedWorker.test.ts index 16862d8..77d02c6 100644 --- a/__tests__/server/crossSeedWorker.test.ts +++ b/__tests__/server/crossSeedWorker.test.ts @@ -189,9 +189,13 @@ vi.mock('../../src/server/db', () => ({ }, })) -vi.mock('../../src/server/utils/qbt', () => ({ - loginToQbt: vi.fn(), -})) +vi.mock('../../src/server/utils/qbt', async (importOriginal) => { + const actual = await importOriginal() + return { + ...actual, + loginToQbt: vi.fn(), + } +}) vi.mock('../../src/server/utils/crypto', () => ({ decrypt: vi.fn(() => 'apikey'), diff --git a/bun.lock b/bun.lock index 62cb482..7a5fc81 100644 --- a/bun.lock +++ b/bun.lock @@ -5,24 +5,24 @@ "": { "name": "qbitwebui", "dependencies": { - "@tanstack/react-query": "^5.99.0", + "@tanstack/react-query": "^5.100.9", "colord": "^2.9.3", - "hono": "^4.12.14", + "hono": "^4.12.18", "jszip": "^3.10.1", "lucide-react": "^0.563.0", - "react": "^19.2.5", + "react": "^19.2.6", "react-colorful": "^5.6.1", - "react-dom": "^19.2.5", - "tar-stream": "^3.1.8", + "react-dom": "^19.2.6", + "tar-stream": "^3.2.0", "vaul": "^1.1.2", "xml2js": "^0.6.2", }, "devDependencies": { "@eslint/js": "^9.39.4", - "@tailwindcss/vite": "^4.2.2", + "@tailwindcss/vite": "^4.2.4", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", - "@types/bun": "^1.3.12", + "@types/bun": "^1.3.13", "@types/jsdom": "^27.0.0", "@types/node": "^24.12.2", "@types/react": "^19.2.14", @@ -33,18 +33,18 @@ "@vitest/coverage-v8": "4.0.17", "concurrently": "^9.2.1", "eslint": "^9.39.4", - "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.4.26", "globals": "^16.5.0", "jsdom": "^27.4.0", "picocolors": "^1.1.1", "prettier": "^3.8.3", - "tailwindcss": "^4.2.2", + "tailwindcss": "^4.2.4", "typescript": "~5.9.3", - "typescript-eslint": "^8.58.2", - "vite": "^7.3.2", + "typescript-eslint": "^8.59.2", + "vite": "^7.3.3", "vitepress": "^1.6.4", - "vitest": "^4.1.4", + "vitest": "^4.1.5", }, }, },