diff --git a/Ferrite/API/PremiumizeWrapper.swift b/Ferrite/API/PremiumizeWrapper.swift index d0a0023..8764c3d 100644 --- a/Ferrite/API/PremiumizeWrapper.swift +++ b/Ferrite/API/PremiumizeWrapper.swift @@ -77,13 +77,35 @@ public class Premiumize { } } + // Function to divide and execute cache endpoint requests in parallel + // Calls this for 100 hashes at a time due to API limits + public func divideCacheRequests(magnets: [Magnet]) async throws -> [Magnet] { + let availableMagnets = try await withThrowingTaskGroup(of: [Magnet].self) { group in + for chunk in magnets.chunked(into: 100) { + group.addTask { + try await self.checkCache(magnets: chunk) + } + } + + var chunkedMagnets: [Magnet] = [] + for try await magnetArray in group { + chunkedMagnets += magnetArray + } + + return chunkedMagnets + } + + return availableMagnets + } + // Parent function for initial checking of the cache - public func checkCache(magnets: [Magnet]) async throws -> [Magnet] { + func checkCache(magnets: [Magnet]) async throws -> [Magnet] { var urlComponents = URLComponents(string: "\(baseApiUrl)/cache/check")! urlComponents.queryItems = magnets.map { URLQueryItem(name: "items[]", value: $0.hash) } guard let url = urlComponents.url else { throw PMError.InvalidUrl } + var request = URLRequest(url: url) let data = try await performRequest(request: &request, requestName: #function) diff --git a/Ferrite/ViewModels/DebridManager.swift b/Ferrite/ViewModels/DebridManager.swift index d80a7f4..8cb3c78 100644 --- a/Ferrite/ViewModels/DebridManager.swift +++ b/Ferrite/ViewModels/DebridManager.swift @@ -153,7 +153,7 @@ public class DebridManager: ObservableObject { } if enabledDebrids.contains(.premiumize) { - let availableMagnets = try await premiumize.checkCache(magnets: sendMagnets) + let availableMagnets = try await premiumize.divideCacheRequests(magnets: sendMagnets) // Split DDL requests into chunks of 10 for chunk in availableMagnets.chunked(into: 10) {