mirror of
https://github.com/cranci1/Sora.git
synced 2026-05-10 20:10:50 +00:00
parent
2e7687c704
commit
cd73becd03
5 changed files with 110 additions and 3 deletions
|
|
@ -280,6 +280,22 @@ class EpisodeMetadataManager: ObservableObject {
|
||||||
)
|
)
|
||||||
|
|
||||||
// Cache the metadata
|
// Cache the metadata
|
||||||
|
if MetadataCacheManager.shared.isCachingEnabled {
|
||||||
|
let metadata = EpisodeMetadata(
|
||||||
|
title: title,
|
||||||
|
imageUrl: image,
|
||||||
|
anilistId: anilistId,
|
||||||
|
episodeNumber: episodeNumber
|
||||||
|
)
|
||||||
|
|
||||||
|
if let metadataData = metadata.toData() {
|
||||||
|
MetadataCacheManager.shared.storeMetadata(
|
||||||
|
metadataData,
|
||||||
|
forKey: cacheKey
|
||||||
|
)
|
||||||
|
Logger.shared.log("Cached metadata for episode \(episodeNumber)", type: "Debug")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Reset retry count on success (even with missing fields)
|
// Reset retry count on success (even with missing fields)
|
||||||
self.currentRetryAttempts.removeValue(forKey: cacheKey)
|
self.currentRetryAttempts.removeValue(forKey: cacheKey)
|
||||||
|
|
@ -457,6 +473,22 @@ class EpisodeMetadataManager: ObservableObject {
|
||||||
results[episodeNumber] = metadataInfo
|
results[episodeNumber] = metadataInfo
|
||||||
|
|
||||||
// Cache the metadata
|
// Cache the metadata
|
||||||
|
if MetadataCacheManager.shared.isCachingEnabled {
|
||||||
|
let metadata = EpisodeMetadata(
|
||||||
|
title: title,
|
||||||
|
imageUrl: image,
|
||||||
|
anilistId: anilistId,
|
||||||
|
episodeNumber: episodeNumber
|
||||||
|
)
|
||||||
|
|
||||||
|
let cacheKey = "anilist_\(anilistId)_episode_\(episodeNumber)"
|
||||||
|
if let metadataData = metadata.toData() {
|
||||||
|
MetadataCacheManager.shared.storeMetadata(
|
||||||
|
metadataData,
|
||||||
|
forKey: cacheKey
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
missingEpisodes.append(episodeNumber)
|
missingEpisodes.append(episodeNumber)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ struct SoraApp: App {
|
||||||
@StateObject private var jsController = JSController.shared
|
@StateObject private var jsController = JSController.shared
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
_ = MetadataCacheManager.shared
|
||||||
_ = KingfisherCacheManager.shared
|
_ = KingfisherCacheManager.shared
|
||||||
|
|
||||||
if let userAccentColor = UserDefaults.standard.color(forKey: "accentColor") {
|
if let userAccentColor = UserDefaults.standard.color(forKey: "accentColor") {
|
||||||
|
|
|
||||||
|
|
@ -732,6 +732,25 @@ struct EpisodeCell: View {
|
||||||
}
|
}
|
||||||
|
|
||||||
private func fetchEpisodeDetails() {
|
private func fetchEpisodeDetails() {
|
||||||
|
if MetadataCacheManager.shared.isCachingEnabled &&
|
||||||
|
(UserDefaults.standard.object(forKey: "fetchEpisodeMetadata") == nil ||
|
||||||
|
UserDefaults.standard.bool(forKey: "fetchEpisodeMetadata")) {
|
||||||
|
|
||||||
|
let cacheKey = "anilist_\(itemID)_episode_\(episodeID + 1)"
|
||||||
|
|
||||||
|
if let cachedData = MetadataCacheManager.shared.getMetadata(forKey: cacheKey),
|
||||||
|
let metadata = EpisodeMetadata.fromData(cachedData) {
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.episodeTitle = metadata.title["en"] ?? ""
|
||||||
|
self.episodeImageUrl = metadata.imageUrl
|
||||||
|
self.isLoading = false
|
||||||
|
self.loadedFromCache = true
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fetchAnimeEpisodeDetails()
|
fetchAnimeEpisodeDetails()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -808,6 +827,21 @@ struct EpisodeCell: View {
|
||||||
Logger.shared.log("Episode \(episodeKey) missing fields: \(missingFields.joined(separator: ", "))", type: "Warning")
|
Logger.shared.log("Episode \(episodeKey) missing fields: \(missingFields.joined(separator: ", "))", type: "Warning")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if MetadataCacheManager.shared.isCachingEnabled && (!title.isEmpty || !image.isEmpty) {
|
||||||
|
let metadata = EpisodeMetadata(
|
||||||
|
title: title,
|
||||||
|
imageUrl: image,
|
||||||
|
anilistId: self.itemID,
|
||||||
|
episodeNumber: self.episodeID + 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if let metadataData = metadata.toData() {
|
||||||
|
MetadataCacheManager.shared.storeMetadata(
|
||||||
|
metadataData,
|
||||||
|
forKey: metadata.cacheKey
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.isLoading = false
|
self.isLoading = false
|
||||||
|
|
|
||||||
|
|
@ -1891,6 +1891,24 @@ struct MediaInfoView: View {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if MetadataCacheManager.shared.isCachingEnabled {
|
||||||
|
let cacheKey = "anilist_\(anilistId)_episode_\(episode.number)"
|
||||||
|
|
||||||
|
if let cachedData = MetadataCacheManager.shared.getMetadata(forKey: cacheKey),
|
||||||
|
let metadata = EpisodeMetadata.fromData(cachedData) {
|
||||||
|
|
||||||
|
print("[Bulk Download] Using cached metadata for episode \(episode.number)")
|
||||||
|
let metadataInfo = EpisodeMetadataInfo(
|
||||||
|
title: metadata.title,
|
||||||
|
imageUrl: metadata.imageUrl,
|
||||||
|
anilistId: metadata.anilistId,
|
||||||
|
episodeNumber: metadata.episodeNumber
|
||||||
|
)
|
||||||
|
completion(metadataInfo)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fetchEpisodeMetadataFromNetwork(anilistId: anilistId, episodeNumber: episode.number, completion: completion)
|
fetchEpisodeMetadataFromNetwork(anilistId: anilistId, episodeNumber: episode.number, completion: completion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1949,6 +1967,22 @@ struct MediaInfoView: View {
|
||||||
if let imageUrl = episodeDetails["image"] as? String, !imageUrl.isEmpty {
|
if let imageUrl = episodeDetails["image"] as? String, !imageUrl.isEmpty {
|
||||||
image = imageUrl
|
image = imageUrl
|
||||||
}
|
}
|
||||||
|
if MetadataCacheManager.shared.isCachingEnabled {
|
||||||
|
let metadata = EpisodeMetadata(
|
||||||
|
title: title,
|
||||||
|
imageUrl: image,
|
||||||
|
anilistId: anilistId,
|
||||||
|
episodeNumber: episodeNumber
|
||||||
|
)
|
||||||
|
|
||||||
|
let cacheKey = "anilist_\(anilistId)_episode_\(episodeNumber)"
|
||||||
|
if let metadataData = metadata.toData() {
|
||||||
|
MetadataCacheManager.shared.storeMetadata(
|
||||||
|
metadataData,
|
||||||
|
forKey: cacheKey
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let metadataInfo = EpisodeMetadataInfo(
|
let metadataInfo = EpisodeMetadataInfo(
|
||||||
title: title,
|
title: title,
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,7 @@ struct SettingsViewData: View {
|
||||||
isOn: $isMetadataCachingEnabled
|
isOn: $isMetadataCachingEnabled
|
||||||
)
|
)
|
||||||
.onChange(of: isMetadataCachingEnabled) { newValue in
|
.onChange(of: isMetadataCachingEnabled) { newValue in
|
||||||
// MetadataCacheManager removed
|
MetadataCacheManager.shared.isCachingEnabled = newValue
|
||||||
if !newValue {
|
if !newValue {
|
||||||
calculateCacheSize()
|
calculateCacheSize()
|
||||||
}
|
}
|
||||||
|
|
@ -194,8 +194,9 @@ struct SettingsViewData: View {
|
||||||
isOn: $isMemoryOnlyMode
|
isOn: $isMemoryOnlyMode
|
||||||
)
|
)
|
||||||
.onChange(of: isMemoryOnlyMode) { newValue in
|
.onChange(of: isMemoryOnlyMode) { newValue in
|
||||||
// MetadataCacheManager removed
|
MetadataCacheManager.shared.isMemoryOnlyMode = newValue
|
||||||
if newValue {
|
if newValue {
|
||||||
|
MetadataCacheManager.shared.clearAllCache()
|
||||||
calculateCacheSize()
|
calculateCacheSize()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -273,7 +274,9 @@ struct SettingsViewData: View {
|
||||||
.scrollViewBottomPadding()
|
.scrollViewBottomPadding()
|
||||||
.navigationTitle("App Data")
|
.navigationTitle("App Data")
|
||||||
.onAppear {
|
.onAppear {
|
||||||
|
isMetadataCachingEnabled = MetadataCacheManager.shared.isCachingEnabled
|
||||||
isImageCachingEnabled = KingfisherCacheManager.shared.isCachingEnabled
|
isImageCachingEnabled = KingfisherCacheManager.shared.isCachingEnabled
|
||||||
|
isMemoryOnlyMode = MetadataCacheManager.shared.isMemoryOnlyMode
|
||||||
calculateCacheSize()
|
calculateCacheSize()
|
||||||
updateSizes()
|
updateSizes()
|
||||||
}
|
}
|
||||||
|
|
@ -316,6 +319,9 @@ struct SettingsViewData: View {
|
||||||
cacheSizeText = "Calculating..."
|
cacheSizeText = "Calculating..."
|
||||||
DispatchQueue.global(qos: .background).async {
|
DispatchQueue.global(qos: .background).async {
|
||||||
var totalSize: Int64 = 0
|
var totalSize: Int64 = 0
|
||||||
|
let metadataSize = MetadataCacheManager.shared.getCacheSize()
|
||||||
|
totalSize += metadataSize
|
||||||
|
|
||||||
KingfisherCacheManager.shared.calculateCacheSize { imageSize in
|
KingfisherCacheManager.shared.calculateCacheSize { imageSize in
|
||||||
totalSize += Int64(imageSize)
|
totalSize += Int64(imageSize)
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
|
|
@ -327,7 +333,7 @@ struct SettingsViewData: View {
|
||||||
}
|
}
|
||||||
|
|
||||||
func clearAllCaches() {
|
func clearAllCaches() {
|
||||||
// MetadataCacheManager removed
|
MetadataCacheManager.shared.clearAllCache()
|
||||||
KingfisherCacheManager.shared.clearCache {
|
KingfisherCacheManager.shared.clearCache {
|
||||||
calculateCacheSize()
|
calculateCacheSize()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue