mirror of
				https://github.com/yattee/yattee.git
				synced 2025-10-31 04:31:54 +00:00 
			
		
		
		
	Locations manifest, reorganized instances settings
This commit is contained in:
		| @@ -5,37 +5,50 @@ struct Account: Defaults.Serializable, Hashable, Identifiable { | ||||
|     static var bridge = AccountsBridge() | ||||
|  | ||||
|     let id: String | ||||
|     let instanceID: String | ||||
|     let app: VideosApp | ||||
|     let instanceID: String? | ||||
|     var name: String? | ||||
|     let url: String | ||||
|     let username: String | ||||
|     let password: String? | ||||
|     var token: String? | ||||
|     let anonymous: Bool | ||||
|     let country: String? | ||||
|     let region: String? | ||||
|  | ||||
|     init( | ||||
|         id: String? = nil, | ||||
|         app: VideosApp? = nil, | ||||
|         instanceID: String? = nil, | ||||
|         name: String? = nil, | ||||
|         url: String? = nil, | ||||
|         username: String? = nil, | ||||
|         password: String? = nil, | ||||
|         token: String? = nil, | ||||
|         anonymous: Bool = false | ||||
|         anonymous: Bool = false, | ||||
|         country: String? = nil, | ||||
|         region: String? = nil | ||||
|     ) { | ||||
|         self.anonymous = anonymous | ||||
|  | ||||
|         self.id = id ?? (anonymous ? "anonymous-\(instanceID!)" : UUID().uuidString) | ||||
|         self.instanceID = instanceID ?? UUID().uuidString | ||||
|         self.id = id ?? (anonymous ? "anonymous-\(instanceID ?? url ?? UUID().uuidString)" : UUID().uuidString) | ||||
|         self.app = app ?? .invidious | ||||
|         self.instanceID = instanceID | ||||
|         self.name = name | ||||
|         self.url = url ?? "" | ||||
|         self.username = username ?? "" | ||||
|         self.token = token | ||||
|         self.password = password ?? "" | ||||
|         self.country = country | ||||
|         self.region = region | ||||
|     } | ||||
|  | ||||
|     var instance: Instance! { | ||||
|         Defaults[.instances].first { $0.id == instanceID } | ||||
|         Defaults[.instances].first { $0.id == instanceID } ?? Instance(app: app, name: url, apiURL: url) | ||||
|     } | ||||
|  | ||||
|     var isPublic: Bool { | ||||
|         instanceID.isNil | ||||
|     } | ||||
|  | ||||
|     var shortUsername: String { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ import Siesta | ||||
| import SwiftUI | ||||
|  | ||||
| final class AccountValidator: Service { | ||||
|     let app: Binding<VideosApp> | ||||
|     let app: Binding<VideosApp?> | ||||
|     let url: String | ||||
|     let account: Account! | ||||
|  | ||||
| @@ -13,8 +13,10 @@ final class AccountValidator: Service { | ||||
|     var isValidating: Binding<Bool> | ||||
|     var error: Binding<String?>? | ||||
|  | ||||
|     private var appsToValidateInstance = VideosApp.allCases | ||||
|  | ||||
|     init( | ||||
|         app: Binding<VideosApp>, | ||||
|         app: Binding<VideosApp?>, | ||||
|         url: String, | ||||
|         account: Account? = nil, | ||||
|         id: Binding<String>, | ||||
| @@ -54,82 +56,128 @@ final class AccountValidator: Service { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     func instanceValidationResource(_ app: VideosApp) -> Resource { | ||||
|         switch app { | ||||
|         case .invidious: | ||||
|             return resource("/api/v1/videos/dQw4w9WgXcQ") | ||||
|  | ||||
|         case .piped: | ||||
|             return resource("/streams/dQw4w9WgXcQ") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     func validateInstance() { | ||||
|         reset() | ||||
|  | ||||
|         neverGonnaGiveYouUp | ||||
|         guard let app = appsToValidateInstance.popLast() else { return } | ||||
|         tryValidatingUsing(app) | ||||
|     } | ||||
|  | ||||
|     func tryValidatingUsing(_ app: VideosApp) { | ||||
|         instanceValidationResource(app) | ||||
|             .load() | ||||
|             .onSuccess { response in | ||||
|                 guard self.url == self.formObjectID.wrappedValue else { | ||||
|                     return | ||||
|                 } | ||||
|  | ||||
|                 guard !response.json.isEmpty else { | ||||
|                     guard let app = self.appsToValidateInstance.popLast() else { | ||||
|                         self.isValid.wrappedValue = false | ||||
|                         self.isValidated.wrappedValue = true | ||||
|                         self.isValidating.wrappedValue = false | ||||
|                         return | ||||
|                     } | ||||
|  | ||||
|                     self.tryValidatingUsing(app) | ||||
|                     return | ||||
|                 } | ||||
|  | ||||
|                 let json = response.json.dictionaryValue | ||||
|                 let author = self.app.wrappedValue == .invidious ? json["author"] : json["uploader"] | ||||
|                 let author = app == .invidious ? json["author"] : json["uploader"] | ||||
|  | ||||
|                 if author == "Rick Astley" { | ||||
|                     self.app.wrappedValue = app | ||||
|                     self.isValid.wrappedValue = true | ||||
|                     self.error?.wrappedValue = nil | ||||
|                 } else { | ||||
|                     self.isValid.wrappedValue = false | ||||
|                 } | ||||
|                 self.isValidated.wrappedValue = true | ||||
|                 self.isValidating.wrappedValue = false | ||||
|             } | ||||
|             .onFailure { error in | ||||
|                 guard self.url == self.formObjectID.wrappedValue else { | ||||
|                     return | ||||
|                 } | ||||
|  | ||||
|                 self.isValid.wrappedValue = false | ||||
|                 self.error?.wrappedValue = error.userMessage | ||||
|             } | ||||
|             .onCompletion { _ in | ||||
|                 self.isValidated.wrappedValue = true | ||||
|                 self.isValidating.wrappedValue = false | ||||
|                 if self.appsToValidateInstance.isEmpty { | ||||
|                     self.isValidating.wrappedValue = false | ||||
|                     self.isValidated.wrappedValue = true | ||||
|                     self.isValid.wrappedValue = false | ||||
|                     self.error?.wrappedValue = error.userMessage | ||||
|                 } else { | ||||
|                     guard let app = self.appsToValidateInstance.popLast() else { return } | ||||
|                     self.tryValidatingUsing(app) | ||||
|                 } | ||||
|             } | ||||
|     } | ||||
|  | ||||
|     func validateAccount() { | ||||
|         reset() | ||||
|  | ||||
|         accountRequest | ||||
|             .onSuccess { response in | ||||
|                 guard self.account!.username == self.formObjectID.wrappedValue else { | ||||
|                     return | ||||
|                 } | ||||
|         guard let request = accountRequest else { | ||||
|             isValid.wrappedValue = false | ||||
|             isValidated.wrappedValue = true | ||||
|             isValidating.wrappedValue = false | ||||
|  | ||||
|                 switch self.app.wrappedValue { | ||||
|                 case .invidious: | ||||
|                     self.isValid.wrappedValue = true | ||||
|                 case .piped: | ||||
|                     let error = response.json.dictionaryValue["error"]?.string | ||||
|                     let token = response.json.dictionaryValue["token"]?.string | ||||
|                     self.isValid.wrappedValue = error?.isEmpty ?? !(token?.isEmpty ?? true) | ||||
|                     self.error!.wrappedValue = error | ||||
|                 } | ||||
|             } | ||||
|             .onFailure { _ in | ||||
|                 guard self.account!.username == self.formObjectID.wrappedValue else { | ||||
|                     return | ||||
|                 } | ||||
|             return | ||||
|         } | ||||
|  | ||||
|                 self.isValid.wrappedValue = false | ||||
|         request.onSuccess { response in | ||||
|             guard self.account!.username == self.formObjectID.wrappedValue else { | ||||
|                 return | ||||
|             } | ||||
|             .onCompletion { _ in | ||||
|                 self.isValidated.wrappedValue = true | ||||
|                 self.isValidating.wrappedValue = false | ||||
|  | ||||
|             switch self.app.wrappedValue { | ||||
|             case .invidious: | ||||
|                 self.isValid.wrappedValue = true | ||||
|             case .piped: | ||||
|                 let error = response.json.dictionaryValue["error"]?.string | ||||
|                 let token = response.json.dictionaryValue["token"]?.string | ||||
|                 self.isValid.wrappedValue = error?.isEmpty ?? !(token?.isEmpty ?? true) | ||||
|                 self.error!.wrappedValue = error | ||||
|             default: | ||||
|                 return | ||||
|             } | ||||
|         } | ||||
|         .onFailure { _ in | ||||
|             guard self.account!.username == self.formObjectID.wrappedValue else { | ||||
|                 return | ||||
|             } | ||||
|  | ||||
|             self.isValid.wrappedValue = false | ||||
|         } | ||||
|         .onCompletion { _ in | ||||
|             self.isValidated.wrappedValue = true | ||||
|             self.isValidating.wrappedValue = false | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     var accountRequest: Request { | ||||
|     var accountRequest: Request? { | ||||
|         switch app.wrappedValue { | ||||
|         case .invidious: | ||||
|             return feed.load() | ||||
|         case .piped: | ||||
|             return login.request(.post, json: ["username": account.username, "password": account.password]) | ||||
|         default: | ||||
|             return nil | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     func reset() { | ||||
|         appsToValidateInstance = VideosApp.allCases | ||||
|         app.wrappedValue = nil | ||||
|         isValid.wrappedValue = false | ||||
|         isValidated.wrappedValue = false | ||||
|         isValidating.wrappedValue = false | ||||
|   | ||||
| @@ -12,7 +12,7 @@ struct AccountsBridge: Defaults.Bridge { | ||||
|  | ||||
|         return [ | ||||
|             "id": value.id, | ||||
|             "instanceID": value.instanceID, | ||||
|             "instanceID": value.instanceID ?? "", | ||||
|             "name": value.name ?? "", | ||||
|             "apiURL": value.url, | ||||
|             "username": value.username, | ||||
|   | ||||
| @@ -8,6 +8,8 @@ final class AccountsModel: ObservableObject { | ||||
|     @Published private var invidious = InvidiousAPI() | ||||
|     @Published private var piped = PipedAPI() | ||||
|  | ||||
|     @Published var publicAccount: Account? | ||||
|  | ||||
|     private var cancellables = [AnyCancellable]() | ||||
|  | ||||
|     var all: [Account] { | ||||
| @@ -70,7 +72,7 @@ final class AccountsModel: ObservableObject { | ||||
|             piped.setAccount(account) | ||||
|         } | ||||
|  | ||||
|         Defaults[.lastAccountID] = account.anonymous ? nil : account.id | ||||
|         Defaults[.lastAccountID] = account.anonymous ? (account.isPublic ? "public" : nil) : account.id | ||||
|         Defaults[.lastInstanceID] = account.instanceID | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Arkadiusz Fal
					Arkadiusz Fal