diff --git a/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate b/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate index 0001ddf..30ca667 100644 Binary files a/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate and b/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Sora/Views/MediaViews/EpisodesCell/EpisodeCell.swift b/Sora/Views/MediaViews/EpisodesCell/EpisodeCell.swift index 03d3c14..298e764 100644 --- a/Sora/Views/MediaViews/EpisodesCell/EpisodeCell.swift +++ b/Sora/Views/MediaViews/EpisodesCell/EpisodeCell.swift @@ -55,6 +55,12 @@ struct EpisodeCell: View { } func fetchEpisodeDetails() { + let cacheKey = "episodeDetails_\(itemID)_\(episodeID)" + + if let cachedData = UserDefaults.standard.data(forKey: cacheKey) { + parseEpisodeDetails(data: cachedData) + } + guard let url = URL(string: "https://api.ani.zip/mappings?anilist_id=\(itemID)") else { isLoading = false return @@ -63,6 +69,7 @@ struct EpisodeCell: View { URLSession.custom.dataTask(with: url) { data, response, error in if let error = error { print("Failed to fetch episode details: \(error)") + Logger.shared.log("Failed to fetch episode details: \(error)") DispatchQueue.main.async { self.isLoading = false } @@ -71,37 +78,45 @@ struct EpisodeCell: View { guard let data = data else { print("No data received") + Logger.shared.log("No data received") DispatchQueue.main.async { self.isLoading = false } return } - do { - let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) - guard let json = jsonObject as? [String: Any], - let episodes = json["episodes"] as? [String: Any], - let episodeDetails = episodes["\(episodeID + 1)"] as? [String: Any], - let title = episodeDetails["title"] as? [String: String], - let image = episodeDetails["image"] as? String else { - print("Invalid response format") - DispatchQueue.main.async { - self.isLoading = false - } - return - } - - DispatchQueue.main.async { - self.episodeTitle = title["en"] ?? "" - self.episodeImageUrl = image - self.isLoading = false - } - } catch { - print("Failed to parse JSON: \(error)") - DispatchQueue.main.async { - self.isLoading = false - } - } + UserDefaults.standard.set(data, forKey: cacheKey) + self.parseEpisodeDetails(data: data) }.resume() } + + func parseEpisodeDetails(data: Data) { + do { + let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) + guard let json = jsonObject as? [String: Any], + let episodes = json["episodes"] as? [String: Any], + let episodeDetails = episodes["\(episodeID + 1)"] as? [String: Any], + let title = episodeDetails["title"] as? [String: String], + let image = episodeDetails["image"] as? String else { + print("Invalid response format") + Logger.shared.log("Invalid response format") + DispatchQueue.main.async { + self.isLoading = false + } + return + } + + DispatchQueue.main.async { + self.episodeTitle = title["en"] ?? "" + self.episodeImageUrl = image + self.isLoading = false + } + } catch { + print("Failed to parse JSON: \(error)") + Logger.shared.log("Failed to parse JSON: \(error)") + DispatchQueue.main.async { + self.isLoading = false + } + } + } } diff --git a/Sora/Views/MediaViews/MediaExtraction.swift b/Sora/Views/MediaViews/MediaExtraction.swift index 0536b50..d42c62b 100644 --- a/Sora/Views/MediaViews/MediaExtraction.swift +++ b/Sora/Views/MediaViews/MediaExtraction.swift @@ -12,7 +12,6 @@ extension MediaView { func fetchItemDetails() { guard let url = URL(string: item.href.hasPrefix("https") ? item.href : "\(module.module[0].details.baseURL.hasSuffix("/") ? module.module[0].details.baseURL : "\(module.module[0].details.baseURL)/")\(item.href.hasPrefix("/") ? String(item.href.dropFirst()) : item.href)") else { return } - print(url) URLSession.custom.dataTask(with: url) { data, response, error in defer { isLoading = false } guard let data = data, error == nil else { return }