summaryrefslogtreecommitdiff
path: root/Sora/Data
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-03-22 13:20:36 +0000
committerFuwn <[email protected]>2026-03-22 13:20:36 +0000
commit2b62f719849cce5dd43fef1b679fff3a2243fcdf (patch)
treecf49424478aa71fcfb8a94b9af4a7b3b01f49908 /Sora/Data
parentperf: cache danbooru page token floor and reuse search-history payloads (diff)
downloadsora-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.swift38
-rw-r--r--Sora/Data/Settings/SettingsManager.swift6
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)