summaryrefslogtreecommitdiff
path: root/Sora/Data/Booru
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-08-28 15:39:59 -0700
committerFuwn <[email protected]>2025-08-28 15:39:59 -0700
commitadd606fb0555a9a73f624e15e5fd916a49469ab8 (patch)
tree27ff8daf5e3fee1a97970ca9bc70f26ab690c570 /Sora/Data/Booru
parentfeat: Development commit (diff)
downloadsora-testing-add606fb0555a9a73f624e15e5fd916a49469ab8.tar.xz
sora-testing-add606fb0555a9a73f624e15e5fd916a49469ab8.zip
feat: Development commit
Diffstat (limited to 'Sora/Data/Booru')
-rw-r--r--Sora/Data/Booru/BooruManager.swift41
1 files changed, 33 insertions, 8 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift
index b5b5ea7..f8aa9d0 100644
--- a/Sora/Data/Booru/BooruManager.swift
+++ b/Sora/Data/Booru/BooruManager.swift
@@ -25,6 +25,8 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng
private let cacheDuration: TimeInterval
private let credentials: BooruProviderCredentials?
private let userAgent: String
+ private var urlCache: [String: URL] = [:]
+ private var lastPostCount = 0
// MARK: - Computed Properties
var tags: [String] {
@@ -146,6 +148,7 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng
func clearCachedPages() {
pageCache.removeAllObjects()
+ urlCache.removeAll()
}
func performSearch(settings: SettingsManager? = nil) async {
@@ -240,13 +243,20 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng
// MARK: - Private Methods
func urlForPosts(page: Int, limit: Int, tags: [String]) -> URL? {
let tagString = tags.joined(separator: "+")
+ let cacheKey = "posts_\(page)_\(limit)_\(tagString)"
+
+ if let cachedURL = urlCache[cacheKey] {
+ return cachedURL
+ }
+
+ let url: URL?
switch flavor {
case .danbooru:
- return URL(string: "https://\(domain)/posts.json?page=\(page)&tags=\(tagString)")
+ url = URL(string: "https://\(domain)/posts.json?page=\(page)&tags=\(tagString)")
case .moebooru:
- return URL(string: "https://\(domain)/post.xml?page=\(page)&limit=\(limit)&tags=\(tagString)")
+ url = URL(string: "https://\(domain)/post.xml?page=\(page)&limit=\(limit)&tags=\(tagString)")
case .gelbooru:
var urlString =
@@ -259,10 +269,14 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng
urlString += "&api_key=\(validCredentials.apiKey)&user_id=\(validCredentials.userID)"
}
- return URL(
- string: urlString
- )
+ url = URL(string: urlString)
+ }
+
+ if let constructedURL = url {
+ urlCache[cacheKey] = constructedURL
}
+
+ return url
}
private func urlForTags(limit: Int, order: String = "count") -> URL? {
@@ -328,6 +342,10 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng
if replace {
posts = []
currentPage = 1
+
+ postIndexMap.removeAll()
+
+ lastPostCount = 0
}
endOfData = newPosts.isEmpty
@@ -339,8 +357,12 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng
self.posts += newPosts
- for (offset, post) in newPosts.enumerated() {
- self.postIndexMap[post.id] = oldCount + offset
+ if newPosts.count > 10 || self.posts.count - lastPostCount > 50 {
+ for (offset, post) in newPosts.enumerated() {
+ self.postIndexMap[post.id] = oldCount + offset
+ }
+
+ lastPostCount = self.posts.count
}
}
}
@@ -358,5 +380,8 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng
}
// MARK: - Deinitialisation
- deinit { currentTask?.cancel() }
+ deinit {
+ currentTask?.cancel()
+ urlCache.removeAll()
+ }
}