From ecf92239d2d290ebe5636c1271a5f4c8ea04e018 Mon Sep 17 00:00:00 2001 From: kingbri Date: Wed, 27 Nov 2024 18:20:04 -0500 Subject: [PATCH] Debrid: Add new IA method for AllDebrid and fix cache fetch The new AllDebrid IA method follows the same behavior as RealDebrid. Only add user magnets into the IA if they're actually cached and not caching into the service. Signed-off-by: kingbri --- Ferrite/API/AllDebridWrapper.swift | 43 ++++++++++++++--------------- Ferrite/API/RealDebridWrapper.swift | 8 ++++-- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/Ferrite/API/AllDebridWrapper.swift b/Ferrite/API/AllDebridWrapper.swift index c0083a0..f2d12a2 100644 --- a/Ferrite/API/AllDebridWrapper.swift +++ b/Ferrite/API/AllDebridWrapper.swift @@ -192,31 +192,22 @@ class AllDebrid: PollingDebridSource, ObservableObject { } } - if sendMagnets.isEmpty { - return - } + // Fetch the user magnets to the latest version + try await getUserMagnets() - let queryItems = sendMagnets.map { URLQueryItem(name: "magnets[]", value: $0.hash) } - var request = try URLRequest(url: buildRequestURL(urlString: "\(baseApiUrl)/magnet/instant", queryItems: queryItems)) - - let data = try await performRequest(request: &request, requestName: #function) - let rawResponse = try jsonDecoder.decode(ADResponse.self, from: data).data - - let filteredMagnets = rawResponse.magnets.filter { $0.instant == true && $0.files != nil } - let availableHashes = filteredMagnets.map { magnetResp in - // Force unwrap is OK here since the filter caught any nil values - let files = magnetResp.files!.enumerated().map { index, magnetFile in - DebridIAFile(id: index, name: magnetFile.name) + for cloudMagnet in cloudMagnets { + if cachedStatus.contains(cloudMagnet.status), + sendMagnets.contains(where: { $0.hash == cloudMagnet.hash }) + { + IAValues.append( + DebridIA( + magnet: Magnet(hash: cloudMagnet.hash, link: nil), + expiryTimeStamp: Date().timeIntervalSince1970 + 300, + files: [] + ) + ) } - - return DebridIA( - magnet: Magnet(hash: magnetResp.hash, link: magnetResp.magnet), - expiryTimeStamp: Date().timeIntervalSince1970 + 300, - files: files - ) } - - IAValues += availableHashes } // MARK: - Downloading @@ -225,7 +216,9 @@ class AllDebrid: PollingDebridSource, ObservableObject { func getRestrictedFile(magnet: Magnet, ia: DebridIA?, iaFile: DebridIAFile?) async throws -> (restrictedFile: DebridIAFile?, newIA: DebridIA?) { let selectedMagnetId: String - if let existingMagnet = cloudMagnets.first(where: { $0.hash == magnet.hash && cachedStatus.contains($0.status) }) { + if let existingMagnet = cloudMagnets.first(where: { + $0.hash == magnet.hash && cachedStatus.contains($0.status) + }) { selectedMagnetId = existingMagnet.id } else { let magnetId = try await addMagnet(magnet: magnet) @@ -261,6 +254,10 @@ class AllDebrid: PollingDebridSource, ObservableObject { let rawResponse = try jsonDecoder.decode(ADResponse.self, from: data).data if let magnet = rawResponse.magnets[safe: 0] { + if !magnet.ready { + throw DebridError.IsCaching + } + return magnet.id } else { throw DebridError.InvalidResponse diff --git a/Ferrite/API/RealDebridWrapper.swift b/Ferrite/API/RealDebridWrapper.swift index 411d19b..1441c33 100644 --- a/Ferrite/API/RealDebridWrapper.swift +++ b/Ferrite/API/RealDebridWrapper.swift @@ -274,7 +274,9 @@ class RealDebrid: PollingDebridSource, ObservableObject { try await getUserMagnets() for cloudMagnet in cloudMagnets { - if sendMagnets.contains(where: { $0.hash == cloudMagnet.hash }) { + if cachedStatus.contains(cloudMagnet.status), + sendMagnets.contains(where: { $0.hash == cloudMagnet.hash }) + { IAValues.append( DebridIA( magnet: Magnet(hash: cloudMagnet.hash, link: nil), @@ -294,7 +296,9 @@ class RealDebrid: PollingDebridSource, ObservableObject { do { // Don't queue a new job if the magnet already exists in the user's library - if let existingCloudMagnet = cloudMagnets.first(where: { $0.hash == magnet.hash && $0.status == "downloaded" }) { + if let existingCloudMagnet = cloudMagnets.first(where: { + $0.hash == magnet.hash && cachedStatus.contains($0.status) + }) { selectedMagnetId = existingCloudMagnet.id } else { selectedMagnetId = try await addMagnet(magnet: magnet)