diff options
Diffstat (limited to 'Sora/Data/Booru')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 58 |
1 files changed, 27 insertions, 31 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index ed64cea..9ed01fa 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -24,6 +24,7 @@ class BooruManager: ObservableObject { private let pageCache = NSCache<NSString, BooruPageCacheEntry>() // swiftlint:disable:this legacy_objc_type private let cacheDuration: TimeInterval = 300 private let credentials: BooruProviderCredentials? + private let userAgent: String // MARK: - Computed Properties var tags: [String] { @@ -45,6 +46,11 @@ class BooruManager: ObservableObject { pageCache.countLimit = 50 pageCache.totalCostLimit = 50 * 1_024 * 1_024 + let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0" + let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "1" + + self.userAgent = "Sora/\(version) (Build \(buildNumber))" + let rootQuery = BooruSearchQuery( provider: provider, tags: [] @@ -276,13 +282,19 @@ class BooruManager: ObservableObject { flavor: BooruProviderFlavor, provider: BooruProvider ) -> [BooruPost] { - Array( - Set( - flavor == .danbooru - ? DanbooruPostParser(data: data).parse() - : BooruPostXMLParser(data: data, provider: provider).parse() - ) - ) + let parsedPosts = + flavor == .danbooru + ? DanbooruPostParser(data: data).parse() + : BooruPostXMLParser(data: data, provider: provider).parse() + var uniquePosts: [BooruPost] = [] + var seenIDs: Set<String> = [] + + for post in parsedPosts where !seenIDs.contains(post.id) { + uniquePosts.append(post) + seenIDs.insert(post.id) + } + + return uniquePosts } private func updatePosts(_ newPosts: [BooruPost], replace: Bool) { @@ -295,37 +307,21 @@ class BooruManager: ObservableObject { guard !endOfData else { return } - Task.detached { - let batchSize = 10 + withTransaction(Transaction(animation: nil)) { + let oldCount = self.posts.count - for chunk in newPosts.chunked(into: batchSize) { - try? await Task.sleep(nanoseconds: 30_000_000) // 30 ms + self.posts += newPosts - await MainActor.run { - withTransaction(Transaction(animation: nil)) { - let oldCount = self.posts.count - - self.posts += chunk - - for (offset, post) in chunk.enumerated() { - self.postIndexMap[post.id] = oldCount + offset - } - } - } + for (offset, post) in newPosts.enumerated() { + self.postIndexMap[post.id] = oldCount + offset } } } private func requestURL(_ url: URL) async throws -> Data { - let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0" - let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "1" - - return try await AF.request( - url, - headers: ["User-Agent": "Sora/\(version) (Build \(buildNumber))"] - ) - .serializingData() - .value + try await AF.request(url, headers: ["User-Agent": userAgent]) + .serializingData() + .value } private func cancelCurrentTask() { |