diff options
| author | Fuwn <[email protected]> | 2025-07-02 06:24:25 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-07-02 06:24:25 -0700 |
| commit | 28b263dbf1fe08aaa491d6da10aa7be5fe4feca9 (patch) | |
| tree | 621f8a17af7266888b0417d4781a56ace145dd43 | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-28b263dbf1fe08aaa491d6da10aa7be5fe4feca9.tar.xz sora-testing-28b263dbf1fe08aaa491d6da10aa7be5fe4feca9.zip | |
feat: Development commit
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 58 | ||||
| -rw-r--r-- | Sora/Data/ImageCacheManager.swift | 18 |
2 files changed, 38 insertions, 38 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() { diff --git a/Sora/Data/ImageCacheManager.swift b/Sora/Data/ImageCacheManager.swift index 5da8614..e789b74 100644 --- a/Sora/Data/ImageCacheManager.swift +++ b/Sora/Data/ImageCacheManager.swift @@ -13,22 +13,26 @@ final class ImageCacheManager { .appendingPathComponent("SoraImageCache", isDirectory: true) ) private var cancellables = Set<AnyCancellable>() + private let downloadQueue = OperationQueue() // MARK: - Initialisation private init() { URLCache.shared = cache + downloadQueue.maxConcurrentOperationCount = 5 } // MARK: - Public Methods func preloadImages(_ urls: [URL]) { urls.forEach { url in - URLSession.shared.dataTaskPublisher(for: url) - .map { CachedURLResponse(response: $0.response, data: $0.data) } - .sink( - receiveCompletion: { _ in () }, - receiveValue: { [cache] in cache.storeCachedResponse($0, for: URLRequest(url: url)) } - ) - .store(in: &cancellables) + downloadQueue.addOperation { + URLSession.shared.dataTaskPublisher(for: url) + .map { CachedURLResponse(response: $0.response, data: $0.data) } + .sink( + receiveCompletion: { _ in () }, + receiveValue: { [self] in cache.storeCachedResponse($0, for: URLRequest(url: url)) } + ) + .store(in: &self.cancellables) + } } } } |