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 <bdashore3@proton.me>
This commit is contained in:
kingbri 2024-11-27 18:20:04 -05:00
parent dd54ec027b
commit ecf92239d2
2 changed files with 26 additions and 25 deletions

View file

@ -192,31 +192,22 @@ class AllDebrid: PollingDebridSource, ObservableObject {
} }
} }
if sendMagnets.isEmpty { // Fetch the user magnets to the latest version
return try await getUserMagnets()
}
let queryItems = sendMagnets.map { URLQueryItem(name: "magnets[]", value: $0.hash) } for cloudMagnet in cloudMagnets {
var request = try URLRequest(url: buildRequestURL(urlString: "\(baseApiUrl)/magnet/instant", queryItems: queryItems)) if cachedStatus.contains(cloudMagnet.status),
sendMagnets.contains(where: { $0.hash == cloudMagnet.hash })
let data = try await performRequest(request: &request, requestName: #function) {
let rawResponse = try jsonDecoder.decode(ADResponse<InstantAvailabilityResponse>.self, from: data).data IAValues.append(
DebridIA(
let filteredMagnets = rawResponse.magnets.filter { $0.instant == true && $0.files != nil } magnet: Magnet(hash: cloudMagnet.hash, link: nil),
let availableHashes = filteredMagnets.map { magnetResp in expiryTimeStamp: Date().timeIntervalSince1970 + 300,
// Force unwrap is OK here since the filter caught any nil values files: []
let files = magnetResp.files!.enumerated().map { index, magnetFile in )
DebridIAFile(id: index, name: magnetFile.name) )
} }
return DebridIA(
magnet: Magnet(hash: magnetResp.hash, link: magnetResp.magnet),
expiryTimeStamp: Date().timeIntervalSince1970 + 300,
files: files
)
} }
IAValues += availableHashes
} }
// MARK: - Downloading // MARK: - Downloading
@ -225,7 +216,9 @@ class AllDebrid: PollingDebridSource, ObservableObject {
func getRestrictedFile(magnet: Magnet, ia: DebridIA?, iaFile: DebridIAFile?) async throws -> (restrictedFile: DebridIAFile?, newIA: DebridIA?) { func getRestrictedFile(magnet: Magnet, ia: DebridIA?, iaFile: DebridIAFile?) async throws -> (restrictedFile: DebridIAFile?, newIA: DebridIA?) {
let selectedMagnetId: String 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 selectedMagnetId = existingMagnet.id
} else { } else {
let magnetId = try await addMagnet(magnet: magnet) let magnetId = try await addMagnet(magnet: magnet)
@ -261,6 +254,10 @@ class AllDebrid: PollingDebridSource, ObservableObject {
let rawResponse = try jsonDecoder.decode(ADResponse<AddMagnetResponse>.self, from: data).data let rawResponse = try jsonDecoder.decode(ADResponse<AddMagnetResponse>.self, from: data).data
if let magnet = rawResponse.magnets[safe: 0] { if let magnet = rawResponse.magnets[safe: 0] {
if !magnet.ready {
throw DebridError.IsCaching
}
return magnet.id return magnet.id
} else { } else {
throw DebridError.InvalidResponse throw DebridError.InvalidResponse

View file

@ -274,7 +274,9 @@ class RealDebrid: PollingDebridSource, ObservableObject {
try await getUserMagnets() try await getUserMagnets()
for cloudMagnet in cloudMagnets { 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( IAValues.append(
DebridIA( DebridIA(
magnet: Magnet(hash: cloudMagnet.hash, link: nil), magnet: Magnet(hash: cloudMagnet.hash, link: nil),
@ -294,7 +296,9 @@ class RealDebrid: PollingDebridSource, ObservableObject {
do { do {
// Don't queue a new job if the magnet already exists in the user's library // 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 selectedMagnetId = existingCloudMagnet.id
} else { } else {
selectedMagnetId = try await addMagnet(magnet: magnet) selectedMagnetId = try await addMagnet(magnet: magnet)