mirror of
https://github.com/Ferrite-iOS/Ferrite.git
synced 2026-04-21 00:42:07 +00:00
Tree: Format
Signed-off-by: kingbri <bdashore3@proton.me>
This commit is contained in:
parent
973fbb4099
commit
6192ef1ede
6 changed files with 32 additions and 34 deletions
|
|
@ -13,7 +13,7 @@ public class Premiumize: OAuthDebridSource, ObservableObject {
|
||||||
public let website = "https://premiumize.me"
|
public let website = "https://premiumize.me"
|
||||||
@Published public var authProcessing: Bool = false
|
@Published public var authProcessing: Bool = false
|
||||||
public var isLoggedIn: Bool {
|
public var isLoggedIn: Bool {
|
||||||
return getToken() != nil
|
getToken() != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
public var manualToken: String? {
|
public var manualToken: String? {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public class RealDebrid: PollingDebridSource, ObservableObject {
|
public class RealDebrid: PollingDebridSource, ObservableObject {
|
||||||
public let id = "RealDebrid"
|
public let id = "RealDebrid"
|
||||||
public let abbreviation = "RD"
|
public let abbreviation = "RD"
|
||||||
public let website = "https://real-debrid.com"
|
public let website = "https://real-debrid.com"
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import Foundation
|
||||||
|
|
||||||
public protocol DebridSource: AnyObservableObject {
|
public protocol DebridSource: AnyObservableObject {
|
||||||
// ID of the service
|
// ID of the service
|
||||||
//var id: DebridInfo { get }
|
// var id: DebridInfo { get }
|
||||||
var id: String { get }
|
var id: String { get }
|
||||||
var abbreviation: String { get }
|
var abbreviation: String { get }
|
||||||
var website: String { get }
|
var website: String { get }
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,12 @@
|
||||||
// TODO: Replace with Observable when minVersion >= iOS 17
|
// TODO: Replace with Observable when minVersion >= iOS 17
|
||||||
//
|
//
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import Combine
|
import Combine
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
class ErasedObservableObject: ObservableObject {
|
class ErasedObservableObject: ObservableObject {
|
||||||
let objectWillChange: AnyPublisher<Void, Never>
|
let objectWillChange: AnyPublisher<Void, Never>
|
||||||
|
|
||||||
init(objectWillChange: AnyPublisher<Void, Never>) {
|
init(objectWillChange: AnyPublisher<Void, Never>) {
|
||||||
self.objectWillChange = objectWillChange
|
self.objectWillChange = objectWillChange
|
||||||
}
|
}
|
||||||
|
|
@ -62,14 +62,14 @@ public protocol AnyObservableObject: AnyObject {
|
||||||
public struct Store<ObjectType> {
|
public struct Store<ObjectType> {
|
||||||
/// The underlying object being stored.
|
/// The underlying object being stored.
|
||||||
public let wrappedValue: ObjectType
|
public let wrappedValue: ObjectType
|
||||||
|
|
||||||
// See https://github.com/Tiny-Home-Consulting/Dependiject/issues/38
|
// See https://github.com/Tiny-Home-Consulting/Dependiject/issues/38
|
||||||
fileprivate var _observableObject: ObservedObject<ErasedObservableObject>
|
fileprivate var _observableObject: ObservedObject<ErasedObservableObject>
|
||||||
|
|
||||||
@MainActor internal var observableObject: ErasedObservableObject {
|
@MainActor internal var observableObject: ErasedObservableObject {
|
||||||
return _observableObject.wrappedValue
|
_observableObject.wrappedValue
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A projected value which has the same properties as the wrapped value, but presented as
|
/// A projected value which has the same properties as the wrapped value, but presented as
|
||||||
/// bindings.
|
/// bindings.
|
||||||
///
|
///
|
||||||
|
|
@ -84,55 +84,54 @@ public struct Store<ObjectType> {
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
public var projectedValue: Wrapper {
|
public var projectedValue: Wrapper {
|
||||||
return Wrapper(self)
|
Wrapper(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a stored value on a custom scheduler.
|
/// Create a stored value on a custom scheduler.
|
||||||
///
|
///
|
||||||
/// Use this init to schedule updates on a specific scheduler other than `DispatchQueue.main`.
|
/// Use this init to schedule updates on a specific scheduler other than `DispatchQueue.main`.
|
||||||
public init<S: Scheduler>(
|
public init<S: Scheduler>(wrappedValue: ObjectType,
|
||||||
wrappedValue: ObjectType,
|
on scheduler: S,
|
||||||
on scheduler: S,
|
schedulerOptions: S.SchedulerOptions? = nil)
|
||||||
schedulerOptions: S.SchedulerOptions? = nil
|
{
|
||||||
) {
|
|
||||||
self.wrappedValue = wrappedValue
|
self.wrappedValue = wrappedValue
|
||||||
|
|
||||||
if let observable = wrappedValue as? AnyObservableObject {
|
if let observable = wrappedValue as? AnyObservableObject {
|
||||||
let objectWillChange = observable.objectWillChange
|
let objectWillChange = observable.objectWillChange
|
||||||
.receive(on: scheduler, options: schedulerOptions)
|
.receive(on: scheduler, options: schedulerOptions)
|
||||||
.eraseToAnyPublisher()
|
.eraseToAnyPublisher()
|
||||||
self._observableObject = .init(initialValue: .init(objectWillChange: objectWillChange))
|
_observableObject = .init(initialValue: .init(objectWillChange: objectWillChange))
|
||||||
} else {
|
} else {
|
||||||
assertionFailure(
|
assertionFailure(
|
||||||
"Only use the Store property wrapper with objects conforming to AnyObservableObject."
|
"Only use the Store property wrapper with objects conforming to AnyObservableObject."
|
||||||
)
|
)
|
||||||
self._observableObject = .init(initialValue: .empty())
|
_observableObject = .init(initialValue: .empty())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a stored value which publishes on the main thread.
|
/// Create a stored value which publishes on the main thread.
|
||||||
///
|
///
|
||||||
/// To control when updates are published, see ``init(wrappedValue:on:schedulerOptions:)``.
|
/// To control when updates are published, see ``init(wrappedValue:on:schedulerOptions:)``.
|
||||||
public init(wrappedValue: ObjectType) {
|
public init(wrappedValue: ObjectType) {
|
||||||
self.init(wrappedValue: wrappedValue, on: DispatchQueue.main)
|
self.init(wrappedValue: wrappedValue, on: DispatchQueue.main)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An equivalent to SwiftUI's
|
/// An equivalent to SwiftUI's
|
||||||
/// [`ObservedObject.Wrapper`](https://developer.apple.com/documentation/swiftui/observedobject/wrapper)
|
/// [`ObservedObject.Wrapper`](https://developer.apple.com/documentation/swiftui/observedobject/wrapper)
|
||||||
/// type.
|
/// type.
|
||||||
@dynamicMemberLookup
|
@dynamicMemberLookup
|
||||||
public struct Wrapper {
|
public struct Wrapper {
|
||||||
private var store: Store
|
private var store: Store
|
||||||
|
|
||||||
internal init(_ store: Store<ObjectType>) {
|
internal init(_ store: Store<ObjectType>) {
|
||||||
self.store = store
|
self.store = store
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a binding to the resulting value of a given key path.
|
/// Returns a binding to the resulting value of a given key path.
|
||||||
public subscript<Subject>(
|
public subscript<Subject>(
|
||||||
dynamicMember keyPath: ReferenceWritableKeyPath<ObjectType, Subject>
|
dynamicMember keyPath: ReferenceWritableKeyPath<ObjectType, Subject>
|
||||||
) -> Binding<Subject> {
|
) -> Binding<Subject> {
|
||||||
return Binding {
|
Binding {
|
||||||
self.store.wrappedValue[keyPath: keyPath]
|
self.store.wrappedValue[keyPath: keyPath]
|
||||||
} set: {
|
} set: {
|
||||||
self.store.wrappedValue[keyPath: keyPath] = $0
|
self.store.wrappedValue[keyPath: keyPath] = $0
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ public class DebridManager: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
var enabledDebridCount: Int {
|
var enabledDebridCount: Int {
|
||||||
debridSources.filter{ $0.isLoggedIn }.count
|
debridSources.filter(\.isLoggedIn).count
|
||||||
}
|
}
|
||||||
|
|
||||||
@Published var selectedDebridSource: DebridSource? {
|
@Published var selectedDebridSource: DebridSource? {
|
||||||
|
|
@ -35,6 +35,7 @@ public class DebridManager: ObservableObject {
|
||||||
UserDefaults.standard.set(selectedDebridSource?.id ?? "", forKey: "Debrid.PreferredService")
|
UserDefaults.standard.set(selectedDebridSource?.id ?? "", forKey: "Debrid.PreferredService")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var selectedDebridItem: DebridIA?
|
var selectedDebridItem: DebridIA?
|
||||||
var selectedDebridFile: DebridIAFile?
|
var selectedDebridFile: DebridIAFile?
|
||||||
|
|
||||||
|
|
@ -59,7 +60,6 @@ public class DebridManager: ObservableObject {
|
||||||
var premiumizeAuthProcessing: Bool = false
|
var premiumizeAuthProcessing: Bool = false
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
|
||||||
// Set the preferred service. Contains migration logic for earlier versions
|
// Set the preferred service. Contains migration logic for earlier versions
|
||||||
if let rawPreferredService = UserDefaults.standard.string(forKey: "Debrid.PreferredService") {
|
if let rawPreferredService = UserDefaults.standard.string(forKey: "Debrid.PreferredService") {
|
||||||
let debridServiceId: String?
|
let debridServiceId: String?
|
||||||
|
|
@ -72,8 +72,8 @@ public class DebridManager: ObservableObject {
|
||||||
|
|
||||||
// Only set the debrid source if it's logged in
|
// Only set the debrid source if it's logged in
|
||||||
// Otherwise remove the key
|
// Otherwise remove the key
|
||||||
let tempDebridSource = self.debridSources.first { $0.id == debridServiceId }
|
let tempDebridSource = debridSources.first { $0.id == debridServiceId }
|
||||||
if (tempDebridSource?.isLoggedIn ?? false) {
|
if tempDebridSource?.isLoggedIn ?? false {
|
||||||
selectedDebridSource = tempDebridSource
|
selectedDebridSource = tempDebridSource
|
||||||
} else {
|
} else {
|
||||||
UserDefaults.standard.removeObject(forKey: "Debrid.PreferredService")
|
UserDefaults.standard.removeObject(forKey: "Debrid.PreferredService")
|
||||||
|
|
@ -286,7 +286,7 @@ public class DebridManager: ObservableObject {
|
||||||
|
|
||||||
if let error {
|
if let error {
|
||||||
throw DebridError.AuthQuery(description: "OAuth callback Error: \(error)")
|
throw DebridError.AuthQuery(description: "OAuth callback Error: \(error)")
|
||||||
}
|
}
|
||||||
|
|
||||||
if let callbackUrl = url {
|
if let callbackUrl = url {
|
||||||
try oauthDebridSource.handleAuthCallback(url: callbackUrl)
|
try oauthDebridSource.handleAuthCallback(url: callbackUrl)
|
||||||
|
|
@ -377,7 +377,6 @@ public class DebridManager: ObservableObject {
|
||||||
if error.code != -999 {
|
if error.code != -999 {
|
||||||
await sendDebridError(error, prefix: "\(selectedSource.id) cloud fetch error")
|
await sendDebridError(error, prefix: "\(selectedSource.id) cloud fetch error")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,12 @@ struct CloudTorrentView: View {
|
||||||
if cloudTorrent.status == "downloaded", !cloudTorrent.links.isEmpty {
|
if cloudTorrent.status == "downloaded", !cloudTorrent.links.isEmpty {
|
||||||
navModel.resultFromCloud = true
|
navModel.resultFromCloud = true
|
||||||
navModel.selectedTitle = cloudTorrent.fileName
|
navModel.selectedTitle = cloudTorrent.fileName
|
||||||
|
|
||||||
var historyInfo = HistoryEntryJson(
|
var historyInfo = HistoryEntryJson(
|
||||||
name: cloudTorrent.fileName,
|
name: cloudTorrent.fileName,
|
||||||
source: debridSource.id
|
source: debridSource.id
|
||||||
)
|
)
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
let magnet = Magnet(hash: cloudTorrent.hash, link: nil)
|
let magnet = Magnet(hash: cloudTorrent.hash, link: nil)
|
||||||
await debridManager.populateDebridIA([magnet])
|
await debridManager.populateDebridIA([magnet])
|
||||||
|
|
@ -39,11 +39,11 @@ struct CloudTorrentView: View {
|
||||||
|
|
||||||
if cloudTorrent.links.count == 1 {
|
if cloudTorrent.links.count == 1 {
|
||||||
await debridManager.fetchDebridDownload(magnet: magnet)
|
await debridManager.fetchDebridDownload(magnet: magnet)
|
||||||
|
|
||||||
if !debridManager.downloadUrl.isEmpty {
|
if !debridManager.downloadUrl.isEmpty {
|
||||||
historyInfo.url = debridManager.downloadUrl
|
historyInfo.url = debridManager.downloadUrl
|
||||||
PersistenceController.shared.createHistory(historyInfo, performSave: true)
|
PersistenceController.shared.createHistory(historyInfo, performSave: true)
|
||||||
|
|
||||||
pluginManager.runDefaultAction(
|
pluginManager.runDefaultAction(
|
||||||
urlString: debridManager.downloadUrl,
|
urlString: debridManager.downloadUrl,
|
||||||
navModel: navModel
|
navModel: navModel
|
||||||
|
|
@ -63,7 +63,7 @@ struct CloudTorrentView: View {
|
||||||
.font(.callout)
|
.font(.callout)
|
||||||
.fixedSize(horizontal: false, vertical: true)
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
.lineLimit(4)
|
.lineLimit(4)
|
||||||
|
|
||||||
HStack {
|
HStack {
|
||||||
Text(cloudTorrent.status.capitalizingFirstLetter())
|
Text(cloudTorrent.status.capitalizingFirstLetter())
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue