diff --git a/Sora/Utils/Cache/KingfisherManager.swift b/Sora/Utils/Cache/KingfisherManager.swift index 1293308..d110d54 100644 --- a/Sora/Utils/Cache/KingfisherManager.swift +++ b/Sora/Utils/Cache/KingfisherManager.swift @@ -54,6 +54,20 @@ class KingfisherCacheManager { cache.memoryStorage.config.cleanInterval = 60 KingfisherManager.shared.downloader.downloadTimeout = 15.0 + + struct CustomJPEGCacheSerializer: CacheSerializer { + let compressionQuality: CGFloat + + func data(with image: KFCrossPlatformImage, original: Data?) -> Data? { + return image.kf.jpegData(compressionQuality: compressionQuality) + } + + func image(with data: Data, options: KingfisherParsedOptionsInfo) -> KFCrossPlatformImage? { + return DefaultCacheSerializer.default.image(with: data, options: options) + } + } + cache.diskStorage.config.cacheSerializer = CustomJPEGCacheSerializer(compressionQuality: jpegCompressionQuality) + Logger.shared.log("Configured Kingfisher cache. Enabled: \(isCachingEnabled)", type: "Debug") } diff --git a/Sora/Utils/Cache/MetadataCacheManager.swift b/Sora/Utils/Cache/MetadataCacheManager.swift index d2f0380..aa1280b 100644 --- a/Sora/Utils/Cache/MetadataCacheManager.swift +++ b/Sora/Utils/Cache/MetadataCacheManager.swift @@ -7,7 +7,6 @@ import Foundation import SwiftUI -import CryptoKit /// A class to manage episode metadata caching, both in-memory and on disk class MetadataCacheManager { @@ -98,23 +97,21 @@ class MetadataCacheManager { /// - Parameters: /// - data: The metadata to cache /// - key: The cache key (usually anilist_id + episode_number) - private func safeFileName(for key: String) -> String { - let hash = SHA256.hash(data: Data(key.utf8)) - return hash.compactMap { String(format: "%02x", $0) }.joined() - } - func storeMetadata(_ data: Data, forKey key: String) { guard isCachingEnabled else { return } + let keyString = key as NSString + + // Always store in memory cache memoryCache.setObject(data as NSData, forKey: keyString) + + // Store on disk if not in memory-only mode if !isMemoryOnlyMode { - let fileName = safeFileName(for: key) - let fileURL = cacheDirectory.appendingPathComponent(fileName) - let tempURL = fileURL.appendingPathExtension("tmp") + let fileURL = cacheDirectory.appendingPathComponent(key) + DispatchQueue.global(qos: .background).async { [weak self] in do { - try data.write(to: tempURL) - try self?.fileManager.moveItem(at: tempURL, to: fileURL) + try data.write(to: fileURL) // Add timestamp as a file attribute instead of using extended attributes let attributes: [FileAttributeKey: Any] = [ @@ -276,4 +273,4 @@ class MetadataCacheManager { } } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/Sulfur.xcodeproj/project.pbxproj b/Sulfur.xcodeproj/project.pbxproj index cb255d0..cc5ca4a 100644 --- a/Sulfur.xcodeproj/project.pbxproj +++ b/Sulfur.xcodeproj/project.pbxproj @@ -46,10 +46,10 @@ 133D7C932D2BE2640075467E /* Modules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133D7C892D2BE2640075467E /* Modules.swift */; }; 133D7C942D2BE2640075467E /* JSController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133D7C8B2D2BE2640075467E /* JSController.swift */; }; 133F55BB2D33B55100E08EEA /* LibraryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133F55BA2D33B55100E08EEA /* LibraryManager.swift */; }; - 134D3A1F2DED84470089C712 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 134D3A1E2DED84470089C712 /* Kingfisher */; }; 1359ED142D76F49900C13034 /* finTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1359ED132D76F49900C13034 /* finTopView.swift */; }; 135CCBE22D4D1138008B9C0E /* SettingsViewPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135CCBE12D4D1138008B9C0E /* SettingsViewPlayer.swift */; }; 13637B8A2DE0EA1100BDA2FC /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13637B892DE0EA1100BDA2FC /* UserDefaults.swift */; }; + 13637B8D2DE0ECCC00BDA2FC /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 13637B8C2DE0ECCC00BDA2FC /* Kingfisher */; }; 13637B902DE0ECD200BDA2FC /* Drops in Frameworks */ = {isa = PBXBuildFile; productRef = 13637B8F2DE0ECD200BDA2FC /* Drops */; }; 13637B932DE0ECDB00BDA2FC /* MarqueeLabel in Frameworks */ = {isa = PBXBuildFile; productRef = 13637B922DE0ECDB00BDA2FC /* MarqueeLabel */; }; 136BBE802DB1038000906B5E /* Notification+Name.swift in Sources */ = {isa = PBXBuildFile; fileRef = 136BBE7F2DB1038000906B5E /* Notification+Name.swift */; }; @@ -201,7 +201,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 134D3A1F2DED84470089C712 /* Kingfisher in Frameworks */, + 13637B8D2DE0ECCC00BDA2FC /* Kingfisher in Frameworks */, 13637B902DE0ECD200BDA2FC /* Drops in Frameworks */, 13637B932DE0ECDB00BDA2FC /* MarqueeLabel in Frameworks */, ); @@ -645,9 +645,9 @@ ); name = Sulfur; packageProductDependencies = ( + 13637B8C2DE0ECCC00BDA2FC /* Kingfisher */, 13637B8F2DE0ECD200BDA2FC /* Drops */, 13637B922DE0ECDB00BDA2FC /* MarqueeLabel */, - 134D3A1E2DED84470089C712 /* Kingfisher */, ); productName = Sora; productReference = 133D7C6A2D2BE2500075467E /* Sulfur.app */; @@ -677,9 +677,9 @@ ); mainGroup = 133D7C612D2BE2500075467E; packageReferences = ( + 13637B8B2DE0ECCC00BDA2FC /* XCRemoteSwiftPackageReference "Kingfisher" */, 13637B8E2DE0ECD200BDA2FC /* XCRemoteSwiftPackageReference "Drops" */, 13637B912DE0ECDB00BDA2FC /* XCRemoteSwiftPackageReference "MarqueeLabel" */, - 134D3A1D2DED84470089C712 /* XCRemoteSwiftPackageReference "Kingfisher" */, ); productRefGroup = 133D7C6B2D2BE2500075467E /* Products */; projectDirPath = ""; @@ -1034,13 +1034,12 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 134D3A1D2DED84470089C712 /* XCRemoteSwiftPackageReference "Kingfisher" */ = { + 13637B8B2DE0ECCC00BDA2FC /* XCRemoteSwiftPackageReference "Kingfisher" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/onevcat/Kingfisher.git"; requirement = { - kind = versionRange; - maximumVersion = 9.0.0; - minimumVersion = 8.0.0; + kind = exactVersion; + version = 7.9.1; }; }; 13637B8E2DE0ECD200BDA2FC /* XCRemoteSwiftPackageReference "Drops" */ = { @@ -1062,9 +1061,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 134D3A1E2DED84470089C712 /* Kingfisher */ = { + 13637B8C2DE0ECCC00BDA2FC /* Kingfisher */ = { isa = XCSwiftPackageProductDependency; - package = 134D3A1D2DED84470089C712 /* XCRemoteSwiftPackageReference "Kingfisher" */; + package = 13637B8B2DE0ECCC00BDA2FC /* XCRemoteSwiftPackageReference "Kingfisher" */; productName = Kingfisher; }; 13637B8F2DE0ECD200BDA2FC /* Drops */ = { diff --git a/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 32d27c4..6bc3765 100644 --- a/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -10,15 +10,6 @@ "version": null } }, - { - "package": "Kingfisher", - "repositoryURL": "https://github.com/onevcat/Kingfisher.git", - "state": { - "branch": null, - "revision": "7deda23bbdca612076c5c315003d8638a08ed0f1", - "version": "8.3.2" - } - }, { "package": "MarqueeLabel", "repositoryURL": "https://github.com/cbpowell/MarqueeLabel",