diff options
Diffstat (limited to 'Sora/Data/Booru')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 17 | ||||
| -rw-r--r-- | Sora/Data/Booru/Provider/BooruProviderCredentials.swift | 40 |
2 files changed, 54 insertions, 3 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index 12d96f0..ce61644 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -28,6 +28,7 @@ class BooruManager: ObservableObject { .appendingPathComponent("\(BooruProvider.safebooru.asFileNameComponent)_tags.json") private let pageCache = NSCache<NSString, BooruPageCacheEntry>() // swiftlint:disable:this legacy_objc_type private let cacheDuration: TimeInterval = 300 + private let credentials: BooruProviderCredentials? // MARK: - Computed Properties var tags: [String] { @@ -42,10 +43,11 @@ class BooruManager: ObservableObject { var canGoForwardInHistory: Bool { historyIndex < searchHistory.count - 1 } // MARK: - Initialisation - init(_ provider: BooruProvider) { + init(_ provider: BooruProvider, credentials: BooruProviderCredentials? = nil) { self.provider = provider self.flavor = BooruProviderFlavor(provider: provider) self.domain = provider.domain + self.credentials = credentials pageCache.countLimit = 50 pageCache.totalCostLimit = 50 * 1_024 * 1_024 @@ -226,9 +228,18 @@ class BooruManager: ObservableObject { return URL(string: "https://\(domain)/post.xml?page=\(page)&limit=\(limit)&tags=\(tagString)") case .gelbooru: + var urlString = + "https://\(domain)/index.php?page=dapi&s=post&q=index&pid=\(page)&limit=\(limit)&tags=\(tagString)" + + if let validCredentials = credentials, + !validCredentials.apiKey.isEmpty, + validCredentials.userID != 0 + { + urlString += "&api_key=\(validCredentials.apiKey)&user_id=\(validCredentials.userID)" + } + return URL( - string: - "https://\(domain)/index.php?page=dapi&s=post&q=index&pid=\(page)&limit=\(limit)&tags=\(tagString)" + string: urlString ) } } diff --git a/Sora/Data/Booru/Provider/BooruProviderCredentials.swift b/Sora/Data/Booru/Provider/BooruProviderCredentials.swift new file mode 100644 index 0000000..898201a --- /dev/null +++ b/Sora/Data/Booru/Provider/BooruProviderCredentials.swift @@ -0,0 +1,40 @@ +import Foundation + +struct BooruProviderCredentials: Codable, Identifiable, Equatable { + let id: UUID + let provider: BooruProvider + var apiKey: String + var userID: Int + + init(provider: BooruProvider, apiKey: String, userID: Int, id: UUID = UUID()) { + self.id = id + self.provider = provider + self.apiKey = apiKey + self.userID = userID + } + + static func from( + // swiftlint:disable:next large_tuple + _ rawCredentials: [(provider: BooruProvider, apiKey: String, userID: Int)], + existingCredentials: [Self] + ) -> [Self] { + rawCredentials.map { credentials in + if let existingKey = existingCredentials.first( + where: { $0.provider == credentials.provider } + ) { + return Self( + provider: credentials.provider, + apiKey: credentials.apiKey, + userID: credentials.userID, + id: existingKey.id + ) + } + + return Self( + provider: credentials.provider, + apiKey: credentials.apiKey, + userID: credentials.userID + ) + } + } +} |