summaryrefslogtreecommitdiff
path: root/Sora/Data/Booru
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Data/Booru')
-rw-r--r--Sora/Data/Booru/BooruManager.swift17
-rw-r--r--Sora/Data/Booru/Provider/BooruProviderCredentials.swift40
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
+ )
+ }
+ }
+}