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 id = "RealDebrid"
|
||||||
let abbreviation = "RD"
|
let abbreviation = "RD"
|
||||||
let website = "https://real-debrid.com"
|
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"]
|
let cachedStatus: [String] = ["downloaded"]
|
||||||
var authTask: Task<Void, Error>?
|
var authTask: Task<Void, Error>?
|
||||||
|
|
||||||
|
|
@ -336,12 +339,34 @@ class RealDebrid: PollingDebridSource, ObservableObject {
|
||||||
try await selectFiles(debridID: selectedMagnetId, fileIds: iaFile?.batchIds ?? [])
|
try await selectFiles(debridID: selectedMagnetId, fileIds: iaFile?.batchIds ?? [])
|
||||||
}
|
}
|
||||||
|
|
||||||
// RealDebrid has 1 as the first ID for a file
|
let response = try await torrentInfo(debridID: selectedMagnetId)
|
||||||
let restrictedFile = try await torrentInfo(
|
let filteredFiles = response.files.filter { $0.selected == 1 }
|
||||||
debridID: selectedMagnetId,
|
|
||||||
selectedFileId: iaFile?.id ?? 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)
|
return (restrictedFile, nil)
|
||||||
} catch {
|
} catch {
|
||||||
if case DebridError.EmptyUserMagnets = error, !selectedMagnetId.isEmpty {
|
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
|
// 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)")!)
|
var request = URLRequest(url: URL(string: "\(baseApiUrl)/torrents/info/\(debridID)")!)
|
||||||
|
|
||||||
let data = try await performRequest(request: &request, requestName: #function)
|
let data = try await performRequest(request: &request, requestName: #function)
|
||||||
let rawResponse = try jsonDecoder.decode(TorrentInfoResponse.self, from: data)
|
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
|
// Let the user know if a magnet is downloading
|
||||||
if let cloudMagnetLink = rawResponse.links[safe: linkIndex ?? -1], rawResponse.status == "downloaded" {
|
switch rawResponse.status {
|
||||||
return DebridIAFile(
|
case "downloaded":
|
||||||
id: 0,
|
return rawResponse
|
||||||
name: rawResponse.filename,
|
case "downloading", "queued":
|
||||||
streamUrlString: cloudMagnetLink
|
|
||||||
)
|
|
||||||
} else if rawResponse.status == "downloading" || rawResponse.status == "queued" {
|
|
||||||
throw DebridError.IsCaching
|
throw DebridError.IsCaching
|
||||||
} else {
|
default:
|
||||||
throw DebridError.EmptyUserMagnets
|
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
|
// Downloads link from selectFiles for playback
|
||||||
|
|
@ -448,7 +484,7 @@ class RealDebrid: PollingDebridSource, ObservableObject {
|
||||||
fileName: response.filename,
|
fileName: response.filename,
|
||||||
status: response.status,
|
status: response.status,
|
||||||
hash: response.hash,
|
hash: response.hash,
|
||||||
links: response.links
|
links: [response.id]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -323,6 +323,11 @@ class DebridManager: ObservableObject {
|
||||||
func fetchDebridDownload(magnet: Magnet?, cloudInfo: String? = nil) async {
|
func fetchDebridDownload(magnet: Magnet?, cloudInfo: String? = nil) async {
|
||||||
defer {
|
defer {
|
||||||
logManager?.hideIndeterminateToast()
|
logManager?.hideIndeterminateToast()
|
||||||
|
|
||||||
|
if !requiresUnrestrict {
|
||||||
|
clearSelectedDebridItems()
|
||||||
|
}
|
||||||
|
|
||||||
currentDebridTask = nil
|
currentDebridTask = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -336,6 +341,9 @@ class DebridManager: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
// Cleanup beforehand
|
||||||
|
requiresUnrestrict = false
|
||||||
|
|
||||||
if let cloudInfo {
|
if let cloudInfo {
|
||||||
downloadUrl = try await debridSource.checkUserDownloads(link: cloudInfo) ?? ""
|
downloadUrl = try await debridSource.checkUserDownloads(link: cloudInfo) ?? ""
|
||||||
return
|
return
|
||||||
|
|
@ -384,6 +392,7 @@ class DebridManager: ObservableObject {
|
||||||
defer {
|
defer {
|
||||||
logManager?.hideIndeterminateToast()
|
logManager?.hideIndeterminateToast()
|
||||||
requiresUnrestrict = false
|
requiresUnrestrict = false
|
||||||
|
clearSelectedDebridItems()
|
||||||
currentDebridTask = nil
|
currentDebridTask = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,8 @@ struct ActionChoiceView: View {
|
||||||
}
|
}
|
||||||
.onDisappear {
|
.onDisappear {
|
||||||
debridManager.downloadUrl = ""
|
debridManager.downloadUrl = ""
|
||||||
|
debridManager.clearSelectedDebridItems()
|
||||||
|
debridManager.requiresUnrestrict = false
|
||||||
navModel.selectedTitle = ""
|
navModel.selectedTitle = ""
|
||||||
navModel.selectedBatchTitle = ""
|
navModel.selectedBatchTitle = ""
|
||||||
navModel.resultFromCloud = false
|
navModel.resultFromCloud = false
|
||||||
|
|
@ -153,8 +155,11 @@ struct ActionChoiceView: View {
|
||||||
ToolbarItem(placement: .navigationBarTrailing) {
|
ToolbarItem(placement: .navigationBarTrailing) {
|
||||||
Button("Done") {
|
Button("Done") {
|
||||||
debridManager.downloadUrl = ""
|
debridManager.downloadUrl = ""
|
||||||
|
debridManager.clearSelectedDebridItems()
|
||||||
|
debridManager.requiresUnrestrict = false
|
||||||
navModel.selectedTitle = ""
|
navModel.selectedTitle = ""
|
||||||
navModel.selectedBatchTitle = ""
|
navModel.selectedBatchTitle = ""
|
||||||
|
navModel.resultFromCloud = false
|
||||||
|
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,10 @@ struct BatchChoiceView: View {
|
||||||
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
|
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
|
||||||
.autocorrectionDisabled(!autocorrectSearch)
|
.autocorrectionDisabled(!autocorrectSearch)
|
||||||
.textInputAutocapitalization(autocorrectSearch ? .sentences : .never)
|
.textInputAutocapitalization(autocorrectSearch ? .sentences : .never)
|
||||||
|
.onDisappear {
|
||||||
|
debridManager.clearSelectedDebridItems()
|
||||||
|
debridManager.requiresUnrestrict = false
|
||||||
|
}
|
||||||
.navigationTitle("Select a file")
|
.navigationTitle("Select a file")
|
||||||
.navigationBarTitleDisplayMode(.inline)
|
.navigationBarTitleDisplayMode(.inline)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue