summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-07-02 06:24:25 -0700
committerFuwn <[email protected]>2025-07-02 06:24:25 -0700
commit28b263dbf1fe08aaa491d6da10aa7be5fe4feca9 (patch)
tree621f8a17af7266888b0417d4781a56ace145dd43
parentfeat: Development commit (diff)
downloadsora-testing-28b263dbf1fe08aaa491d6da10aa7be5fe4feca9.tar.xz
sora-testing-28b263dbf1fe08aaa491d6da10aa7be5fe4feca9.zip
feat: Development commit
-rw-r--r--Sora/Data/Booru/BooruManager.swift58
-rw-r--r--Sora/Data/ImageCacheManager.swift18
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)
+ }
}
}
}