diff options
| author | Fuwn <[email protected]> | 2025-08-28 15:39:59 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-08-28 15:39:59 -0700 |
| commit | add606fb0555a9a73f624e15e5fd916a49469ab8 (patch) | |
| tree | 27ff8daf5e3fee1a97970ca9bc70f26ab690c570 /Sora/Data/Booru | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-add606fb0555a9a73f624e15e5fd916a49469ab8.tar.xz sora-testing-add606fb0555a9a73f624e15e5fd916a49469ab8.zip | |
feat: Development commit
Diffstat (limited to 'Sora/Data/Booru')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 41 |
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() + } } |