mirror of
https://github.com/Ferrite-iOS/Ferrite.git
synced 2026-01-11 20:10:27 +00:00
Debrid: Fixes for RealDebrid cloud magnets
Cloud magnets are now under a rate limit and links are no longer present per entry. Remove rich display for that section only and present a batch sheet on click. Also add more spots for cleaning up variables. Signed-off-by: kingbri <bdashore3@proton.me>
This commit is contained in:
parent
9213b8627b
commit
215cd0feec
4 changed files with 71 additions and 17 deletions
|
|
@ -11,6 +11,9 @@ class RealDebrid: PollingDebridSource, ObservableObject {
|
|||
let id = "RealDebrid"
|
||||
let abbreviation = "RD"
|
||||
let website = "https://real-debrid.com"
|
||||
let description: String? = "RealDebrid is a debrid service that is used for downloads and media playback. " +
|
||||
"You must pay to access this service. \n\n" +
|
||||
"This service does not inform if a magnet link in a user's cloud library is a batch before downloading."
|
||||
let cachedStatus: [String] = ["downloaded"]
|
||||
var authTask: Task<Void, Error>?
|
||||
|
||||
|
|
@ -336,12 +339,34 @@ class RealDebrid: PollingDebridSource, ObservableObject {
|
|||
try await selectFiles(debridID: selectedMagnetId, fileIds: iaFile?.batchIds ?? [])
|
||||
}
|
||||
|
||||
// RealDebrid has 1 as the first ID for a file
|
||||
let restrictedFile = try await torrentInfo(
|
||||
debridID: selectedMagnetId,
|
||||
selectedFileId: iaFile?.id ?? 1
|
||||
)
|
||||
let response = try await torrentInfo(debridID: selectedMagnetId)
|
||||
let filteredFiles = response.files.filter { $0.selected == 1 }
|
||||
|
||||
if filteredFiles.count > 1, iaFile == nil {
|
||||
// Need to return this to the user
|
||||
|
||||
var copiedIA = ia
|
||||
|
||||
copiedIA?.files = response.files.enumerated().compactMap { index, file in
|
||||
DebridIAFile(
|
||||
id: index,
|
||||
name: file.path,
|
||||
streamUrlString: response.links[safe: index]
|
||||
)
|
||||
}
|
||||
|
||||
return (nil, copiedIA)
|
||||
}
|
||||
|
||||
// RealDebrid has 1 as the first ID for a file
|
||||
let selectedFileId = iaFile?.id ?? 1
|
||||
let linkIndex = filteredFiles.firstIndex(where: { $0.id == selectedFileId })
|
||||
|
||||
guard let cloudMagnetLink = response.links[safe: linkIndex ?? -1] else {
|
||||
throw DebridError.EmptyUserMagnets
|
||||
}
|
||||
|
||||
let restrictedFile = DebridIAFile(id: 0, name: response.filename, streamUrlString: cloudMagnetLink)
|
||||
return (restrictedFile, nil)
|
||||
} catch {
|
||||
if case DebridError.EmptyUserMagnets = error, !selectedMagnetId.isEmpty {
|
||||
|
|
@ -395,26 +420,37 @@ class RealDebrid: PollingDebridSource, ObservableObject {
|
|||
}
|
||||
|
||||
// Gets the info of a torrent from a given ID
|
||||
func torrentInfo(debridID: String, selectedFileId: Int?) async throws -> DebridIAFile {
|
||||
func torrentInfo(debridID: String) async throws -> TorrentInfoResponse {
|
||||
var request = URLRequest(url: URL(string: "\(baseApiUrl)/torrents/info/\(debridID)")!)
|
||||
|
||||
let data = try await performRequest(request: &request, requestName: #function)
|
||||
let rawResponse = try jsonDecoder.decode(TorrentInfoResponse.self, from: data)
|
||||
let filteredFiles = rawResponse.files.filter { $0.selected == 1 }
|
||||
let linkIndex = filteredFiles.firstIndex(where: { $0.id == selectedFileId })
|
||||
|
||||
// Let the user know if a magnet is downloading
|
||||
if let cloudMagnetLink = rawResponse.links[safe: linkIndex ?? -1], rawResponse.status == "downloaded" {
|
||||
return DebridIAFile(
|
||||
id: 0,
|
||||
name: rawResponse.filename,
|
||||
streamUrlString: cloudMagnetLink
|
||||
)
|
||||
} else if rawResponse.status == "downloading" || rawResponse.status == "queued" {
|
||||
switch rawResponse.status {
|
||||
case "downloaded":
|
||||
return rawResponse
|
||||
case "downloading", "queued":
|
||||
throw DebridError.IsCaching
|
||||
} else {
|
||||
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
|
||||
|
|
@ -448,7 +484,7 @@ class RealDebrid: PollingDebridSource, ObservableObject {
|
|||
fileName: response.filename,
|
||||
status: response.status,
|
||||
hash: response.hash,
|
||||
links: response.links
|
||||
links: [response.id]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -323,6 +323,11 @@ class DebridManager: ObservableObject {
|
|||
func fetchDebridDownload(magnet: Magnet?, cloudInfo: String? = nil) async {
|
||||
defer {
|
||||
logManager?.hideIndeterminateToast()
|
||||
|
||||
if !requiresUnrestrict {
|
||||
clearSelectedDebridItems()
|
||||
}
|
||||
|
||||
currentDebridTask = nil
|
||||
}
|
||||
|
||||
|
|
@ -336,6 +341,9 @@ class DebridManager: ObservableObject {
|
|||
}
|
||||
|
||||
do {
|
||||
// Cleanup beforehand
|
||||
requiresUnrestrict = false
|
||||
|
||||
if let cloudInfo {
|
||||
downloadUrl = try await debridSource.checkUserDownloads(link: cloudInfo) ?? ""
|
||||
return
|
||||
|
|
@ -384,6 +392,7 @@ class DebridManager: ObservableObject {
|
|||
defer {
|
||||
logManager?.hideIndeterminateToast()
|
||||
requiresUnrestrict = false
|
||||
clearSelectedDebridItems()
|
||||
currentDebridTask = nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -143,6 +143,8 @@ struct ActionChoiceView: View {
|
|||
}
|
||||
.onDisappear {
|
||||
debridManager.downloadUrl = ""
|
||||
debridManager.clearSelectedDebridItems()
|
||||
debridManager.requiresUnrestrict = false
|
||||
navModel.selectedTitle = ""
|
||||
navModel.selectedBatchTitle = ""
|
||||
navModel.resultFromCloud = false
|
||||
|
|
@ -153,8 +155,11 @@ struct ActionChoiceView: View {
|
|||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
Button("Done") {
|
||||
debridManager.downloadUrl = ""
|
||||
debridManager.clearSelectedDebridItems()
|
||||
debridManager.requiresUnrestrict = false
|
||||
navModel.selectedTitle = ""
|
||||
navModel.selectedBatchTitle = ""
|
||||
navModel.resultFromCloud = false
|
||||
|
||||
dismiss()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,10 @@ struct BatchChoiceView: View {
|
|||
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
|
||||
.autocorrectionDisabled(!autocorrectSearch)
|
||||
.textInputAutocapitalization(autocorrectSearch ? .sentences : .never)
|
||||
.onDisappear {
|
||||
debridManager.clearSelectedDebridItems()
|
||||
debridManager.requiresUnrestrict = false
|
||||
}
|
||||
.navigationTitle("Select a file")
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.toolbar {
|
||||
|
|
|
|||
Loading…
Reference in a new issue