diff options
| author | Fuwn <[email protected]> | 2026-03-22 13:20:36 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-03-22 13:20:36 +0000 |
| commit | 2b62f719849cce5dd43fef1b679fff3a2243fcdf (patch) | |
| tree | cf49424478aa71fcfb8a94b9af4a7b3b01f49908 /Sora/Data | |
| parent | perf: cache danbooru page token floor and reuse search-history payloads (diff) | |
| download | sora-testing-2b62f719849cce5dd43fef1b679fff3a2243fcdf.tar.xz sora-testing-2b62f719849cce5dd43fef1b679fff3a2243fcdf.zip | |
feat: add configurable booru user agent settings
Diffstat (limited to 'Sora/Data')
| -rw-r--r-- | Sora/Data/Booru/BooruManager.swift | 38 | ||||
| -rw-r--r-- | Sora/Data/Settings/SettingsManager.swift | 6 |
2 files changed, 38 insertions, 6 deletions
diff --git a/Sora/Data/Booru/BooruManager.swift b/Sora/Data/Booru/BooruManager.swift index 2957fcd..68d5079 100644 --- a/Sora/Data/Booru/BooruManager.swift +++ b/Sora/Data/Booru/BooruManager.swift @@ -26,7 +26,7 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng private let pageCache = NSCache<NSString, BooruPageCacheEntry>() // swiftlint:disable:this legacy_objc_type private let cacheDuration: TimeInterval private let credentials: BooruProviderCredentials? - private let userAgent: String + private let userAgent: String? private let showHeldMoebooruPosts: Bool private var urlCache: [String: URL] = [:] private var lastPostCount = 0 @@ -48,6 +48,8 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng _ provider: BooruProvider, credentials: BooruProviderCredentials? = nil, cacheDuration: TimeInterval = BooruPageCacheEntry.defaultExpiration, + sendUserAgent: Bool = true, + customUserAgent: String = "", showHeldMoebooruPosts: Bool = false ) { self.provider = provider @@ -59,10 +61,10 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng 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))" + self.userAgent = Self.resolvedUserAgent( + sendUserAgent: sendUserAgent, + customUserAgent: customUserAgent + ) let rootQuery = BooruSearchQuery( provider: provider, @@ -198,6 +200,26 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng return components.url } + private static func resolvedUserAgent( + sendUserAgent: Bool, + customUserAgent: String + ) -> String? { + guard sendUserAgent else { return nil } + + let trimmedCustomUserAgent = customUserAgent.trimmingCharacters( + in: .whitespacesAndNewlines + ) + + guard trimmedCustomUserAgent.isEmpty else { + return trimmedCustomUserAgent + } + + let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0" + let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "1" + + return "Sora/\(version) (Build \(buildNumber))" + } + func clearCachedPages() { pageCache.removeAllObjects() urlCache.removeAll() @@ -571,7 +593,11 @@ class BooruManager: ObservableObject { // swiftlint:disable:this type_body_leng } func requestURL(_ url: URL) async throws -> Data { - try await AF.request(url, headers: ["User-Agent": userAgent]) + let headers = userAgent.map { value in + HTTPHeaders([HTTPHeader(name: "User-Agent", value: value)]) + } + + return try await AF.request(url, headers: headers) .validate(statusCode: 200..<300) .serializingData() .value diff --git a/Sora/Data/Settings/SettingsManager.swift b/Sora/Data/Settings/SettingsManager.swift index 78aef7c..f59db1a 100644 --- a/Sora/Data/Settings/SettingsManager.swift +++ b/Sora/Data/Settings/SettingsManager.swift @@ -38,6 +38,12 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l @AppStorage("showHeldMoebooruPosts") var showHeldMoebooruPosts = false + @AppStorage("sendBooruUserAgent") + var sendBooruUserAgent = true + + @AppStorage("customBooruUserAgent") + var customBooruUserAgent = "" + private var syncObservation: NSObjectProtocol? #if os(macOS) |