diff --git a/Ferrite/API/RealDebridWrapper.swift b/Ferrite/API/RealDebridWrapper.swift index 6cd3d62..f966df3 100644 --- a/Ferrite/API/RealDebridWrapper.swift +++ b/Ferrite/API/RealDebridWrapper.swift @@ -255,17 +255,34 @@ class RealDebrid: PollingDebridSource, ObservableObject { // Post-API changes // Use user magnets to check for IA instead func instantAvailability(magnets: [Magnet]) async throws { + let now = Date().timeIntervalSince1970 + + let sendMagnets = magnets.filter { magnet in + if let IAIndex = IAValues.firstIndex(where: { $0.magnet.hash == magnet.hash }) { + if now > IAValues[IAIndex].expiryTimeStamp { + IAValues.remove(at: IAIndex) + return true + } else { + return false + } + } else { + return true + } + } + // Fetch the user magnets to the latest version try await getUserMagnets() for cloudMagnet in cloudMagnets { - IAValues.append( - DebridIA( - magnet: Magnet(hash: cloudMagnet.hash, link: nil), - expiryTimeStamp: Date().timeIntervalSince1970 + 300, - files: [] + if sendMagnets.contains(where: { $0.hash == cloudMagnet.hash }) { + IAValues.append( + DebridIA( + magnet: Magnet(hash: cloudMagnet.hash, link: nil), + expiryTimeStamp: Date().timeIntervalSince1970 + 300, + files: [] + ) ) - ) + } } } @@ -381,22 +398,6 @@ class RealDebrid: PollingDebridSource, ObservableObject { default: throw DebridError.EmptyUserMagnets } - /* - if rawResponse.status == "downloaded" { - //let cloudMagnetLink = rawResponse.links[safe: linkIndex ?? -1], - /* - return DebridIAFile( - id: 0, - name: rawResponse.filename, - streamUrlString: cloudMagnetLink - ) - */ - } else if rawResponse.status == "downloading" || rawResponse.status == "queued" { - throw DebridError.IsCaching - } else { - throw DebridError.EmptyUserMagnets - } - */ } // Downloads link from selectFiles for playback diff --git a/Ferrite/ViewModels/DebridManager.swift b/Ferrite/ViewModels/DebridManager.swift index 9f5f373..99f4e3c 100644 --- a/Ferrite/ViewModels/DebridManager.swift +++ b/Ferrite/ViewModels/DebridManager.swift @@ -174,7 +174,7 @@ class DebridManager: ObservableObject { return true } else { - logManager?.error("DebridManager: Could not find the associated \(selectedSource.id) entry for magnet hash \(magnetHash)") + logManager?.warn("DebridManager: Could not find the associated \(selectedSource.id) entry for magnet hash \(magnetHash)") return false } } diff --git a/Ferrite/Views/ComponentViews/Library/BookmarksView.swift b/Ferrite/Views/ComponentViews/Library/BookmarksView.swift index c0b7d5e..86a64e6 100644 --- a/Ferrite/Views/ComponentViews/Library/BookmarksView.swift +++ b/Ferrite/Views/ComponentViews/Library/BookmarksView.swift @@ -56,20 +56,27 @@ struct BookmarksView: View { .frame(height: 15) } .task { - if !debridManager.enabledDebrids.isEmpty { - let magnets = bookmarks.compactMap { - if let magnetHash = $0.magnetHash { - return Magnet(hash: magnetHash, link: $0.magnetLink) - } else { - return nil - } - } - await debridManager.populateDebridIA(magnets) - } + await matchAgainstIA() + } + .refreshable { + await matchAgainstIA() } } func fetchPredicate() { bookmarks.nsPredicate = searchText.isEmpty ? nil : NSPredicate(format: "title CONTAINS[cd] %@", searchText) } + + func matchAgainstIA() async { + if !debridManager.enabledDebrids.isEmpty { + let magnets = bookmarks.compactMap { + if let magnetHash = $0.magnetHash { + return Magnet(hash: magnetHash, link: $0.magnetLink) + } else { + return nil + } + } + await debridManager.populateDebridIA(magnets) + } + } } diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift index 18f0f62..f7a576d 100644 --- a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift +++ b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift @@ -102,10 +102,13 @@ struct SearchResultButtonView: View { Button { if debridManager.currentDebridTask == nil { - if !debridManager.selectDebridResult(magnet: result.magnet) { + let foundIAResult = debridManager.selectDebridResult(magnet: result.magnet) + + // Add a fake IA because we don't know if the magnet is cached at this point + if !foundIAResult { debridManager.selectedDebridItem = DebridIA( magnet: result.magnet, - expiryTimeStamp: Date().timeIntervalSince1970 + 200, + expiryTimeStamp: Date().timeIntervalSince1970, files: [] ) } @@ -113,8 +116,10 @@ struct SearchResultButtonView: View { debridManager.currentDebridTask = Task { await downloadToDebrid() - // Re-populate the IA cache - await debridManager.populateDebridIA([result.magnet]) + // Re-populate the IA cache if a result wasn't initially found + if !foundIAResult { + await debridManager.populateDebridIA([result.magnet]) + } } } } label: {