diff --git a/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate b/Sora.xcodeproj/project.xcworkspace/xcuserdata/Francesco.xcuserdatad/UserInterfaceState.xcuserstate index 80709ed..17d516c 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..97059ba 100644 --- a/Sora/Views/MediaViews/EpisodesCell/EpisodeCell.swift +++ b/Sora/Views/MediaViews/EpisodesCell/EpisodeCell.swift @@ -14,10 +14,12 @@ struct EpisodeCell: View { let imageUrl: String let progress: Double let itemID: Int + let module: ModuleStruct @State private var episodeTitle: String = "" @State private var episodeImageUrl: String = "" @State private var isLoading: Bool = true + @State private var currentProgress: Double = 0.0 var body: some View { HStack { @@ -46,11 +48,12 @@ struct EpisodeCell: View { Spacer() - CircularProgressBar(progress: progress) + CircularProgressBar(progress: currentProgress) .frame(width: 40, height: 40) } .onAppear { fetchEpisodeDetails() + updateProgress() } } @@ -104,4 +107,11 @@ struct EpisodeCell: View { } }.resume() } + + func updateProgress() { + let episodeURL = episode.hasPrefix("https") ? episode : "\(module.module[0].details.baseURL)\(episode)" + let lastPlayedTime = UserDefaults.standard.double(forKey: "lastPlayedTime_\(episodeURL)") + let totalTime = UserDefaults.standard.double(forKey: "totalTime_\(episodeURL)") + currentProgress = totalTime > 0 ? lastPlayedTime / totalTime : 0 + } } diff --git a/Sora/Views/MediaViews/MediaView.swift b/Sora/Views/MediaViews/MediaView.swift index 15b4de3..df3c873 100644 --- a/Sora/Views/MediaViews/MediaView.swift +++ b/Sora/Views/MediaViews/MediaView.swift @@ -24,6 +24,8 @@ struct MediaView: View { @State var itemID: Int? @State private var selectedEpisode: String = "" @State private var selectedEpisodeNumber: Int = 0 + @State private var episodeRange: ClosedRange = 0...99 + @State private var selectedRange: String = "1-100" @AppStorage("externalPlayer") private var externalPlayer: String = "Default" @StateObject private var libraryManager = LibraryManager.shared @@ -134,22 +136,46 @@ struct MediaView: View { if !episodes.isEmpty { VStack(alignment: .leading, spacing: 10) { - Text("Episodes") - .font(.system(size: 18)) - .fontWeight(.bold) - - ForEach(episodes.indices, id: \.self) { index in - let episodeURL = episodes[index].hasPrefix("https") ? episodes[index] : "\(module.module[0].details.baseURL)\(episodes[index])" - let lastPlayedTime = UserDefaults.standard.double(forKey: "lastPlayedTime_\(episodeURL)") - let totalTime = UserDefaults.standard.double(forKey: "totalTime_\(episodeURL)") - let progress = totalTime > 0 ? lastPlayedTime / totalTime : 0 + HStack { + Text("Episodes") + .font(.system(size: 18)) + .fontWeight(.bold) - EpisodeCell(episode: episodes[index], episodeID: index, imageUrl: item.imageUrl, progress: progress, itemID: itemID ?? 0) - .onTapGesture { - selectedEpisode = episodes[index] - selectedEpisodeNumber = index + 1 - fetchEpisodeStream(urlString: episodeURL) + Spacer() + + if episodes.count > 100 { + Menu { + ForEach(0..<(episodes.count / 100) + 1, id: \.self) { index in + let start = index * 100 + 1 + let end = min((index + 1) * 100, episodes.count) + Button(action: { + episodeRange = (start - 1)...(end - 1) + selectedRange = "\(start)-\(end)" + }) { + Text("\(start)-\(end)") + } + } + } label: { + Text(selectedRange) + .font(.system(size: 14)) } + } + } + + ForEach(episodeRange, id: \.self) { index in + if index < episodes.count { + let episodeURL = episodes[index].hasPrefix("https") ? episodes[index] : "\(module.module[0].details.baseURL)\(episodes[index])" + let lastPlayedTime = UserDefaults.standard.double(forKey: "lastPlayedTime_\(episodeURL)") + let totalTime = UserDefaults.standard.double(forKey: "totalTime_\(episodeURL)") + let progress = totalTime > 0 ? lastPlayedTime / totalTime : 0 + + EpisodeCell(episode: episodes[index], episodeID: index, imageUrl: item.imageUrl, progress: progress, itemID: itemID ?? 0, module: module) + .onTapGesture { + selectedEpisode = episodes[index] + selectedEpisodeNumber = index + 1 + fetchEpisodeStream(urlString: episodeURL) + } + } } } }