Implemented season seperator for tv shows 2 (#47)

This commit is contained in:
cranci 2025-03-19 06:38:04 +01:00 committed by GitHub
commit b0c02df8f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -50,14 +50,7 @@ struct MediaInfoView: View {
@State private var selectedRange: Range<Int> = 0..<100 @State private var selectedRange: Range<Int> = 0..<100
private var isGroupedBySeasons: Bool { private var isGroupedBySeasons: Bool {
var lastEpisodeNumber = 0 return groupedEpisodes().count > 1
for episode in episodeLinks {
if episode.number == 1 && lastEpisodeNumber > 1 {
return true
}
lastEpisodeNumber = episode.number
}
return false
} }
var body: some View { var body: some View {
@ -205,9 +198,7 @@ struct MediaInfoView: View {
if !isGroupedBySeasons, episodeLinks.count > episodeChunkSize { if !isGroupedBySeasons, episodeLinks.count > episodeChunkSize {
Menu { Menu {
ForEach(generateRanges(), id: \.self) { range in ForEach(generateRanges(), id: \.self) { range in
Button(action: { Button(action: { selectedRange = range }) {
selectedRange = range
}) {
Text("\(range.lowerBound + 1)-\(range.upperBound)") Text("\(range.lowerBound + 1)-\(range.upperBound)")
} }
} }
@ -218,12 +209,10 @@ struct MediaInfoView: View {
} }
} else if isGroupedBySeasons { } else if isGroupedBySeasons {
let seasons = groupedEpisodes() let seasons = groupedEpisodes()
if !seasons.isEmpty { if seasons.count > 1 {
Menu { Menu {
ForEach(0..<seasons.count, id: \.self) { index in ForEach(0..<seasons.count, id: \.self) { index in
Button(action: { Button(action: { selectedSeason = index }) {
selectedSeason = index
}) {
Text("Season \(index + 1)") Text("Season \(index + 1)")
} }
} }
@ -234,19 +223,17 @@ struct MediaInfoView: View {
} }
} }
} }
} }
if isGroupedBySeasons { if isGroupedBySeasons {
let seasons = groupedEpisodes() let seasons = groupedEpisodes()
if !seasons.isEmpty, selectedSeason < seasons.count { if !seasons.isEmpty, selectedSeason < seasons.count {
ForEach(episodeLinks.indices.filter { selectedRange.contains($0) }, id: \.self) { i in ForEach(seasons[selectedSeason]) { ep in
let ep = episodeLinks[i]
let lastPlayedTime = UserDefaults.standard.double(forKey: "lastPlayedTime_\(ep.href)") let lastPlayedTime = UserDefaults.standard.double(forKey: "lastPlayedTime_\(ep.href)")
let totalTime = UserDefaults.standard.double(forKey: "totalTime_\(ep.href)") let totalTime = UserDefaults.standard.double(forKey: "totalTime_\(ep.href)")
let progress = totalTime > 0 ? lastPlayedTime / totalTime : 0 let progress = totalTime > 0 ? lastPlayedTime / totalTime : 0
EpisodeCell( EpisodeCell(
episodeIndex: i, episodeIndex: selectedSeason,
episode: ep.href, episode: ep.href,
episodeID: ep.number - 1, episodeID: ep.number - 1,
progress: progress, progress: progress,
@ -263,13 +250,13 @@ struct MediaInfoView: View {
} }
}, },
onMarkAllPrevious: { onMarkAllPrevious: {
for idx in 0..<i { for ep2 in seasons[selectedSeason] {
let href = episodeLinks[idx].href let href = ep2.href
UserDefaults.standard.set(99999999.0, forKey: "lastPlayedTime_\(href)") UserDefaults.standard.set(99999999.0, forKey: "lastPlayedTime_\(href)")
UserDefaults.standard.set(99999999.0, forKey: "totalTime_\(href)") UserDefaults.standard.set(99999999.0, forKey: "totalTime_\(href)")
} }
refreshTrigger.toggle() refreshTrigger.toggle()
Logger.shared.log("Marked \(ep.number - 1) episodes watched within anime \"\(title)\".", type: "General") Logger.shared.log("Marked episodes watched within season \(selectedSeason + 1) of \"\(title)\".", type: "General")
} }
) )
.id(refreshTrigger) .id(refreshTrigger)
@ -447,10 +434,10 @@ struct MediaInfoView: View {
private func groupedEpisodes() -> [[EpisodeLink]] { private func groupedEpisodes() -> [[EpisodeLink]] {
guard !episodeLinks.isEmpty else { return [] } guard !episodeLinks.isEmpty else { return [] }
var groups: [[EpisodeLink]] = [] var groups: [[EpisodeLink]] = []
var currentGroup: [EpisodeLink] = [] var currentGroup: [EpisodeLink] = [episodeLinks[0]]
for ep in episodeLinks { for ep in episodeLinks.dropFirst() {
if let last = currentGroup.last, ep.number <= last.number { if let last = currentGroup.last, ep.number < last.number {
groups.append(currentGroup) groups.append(currentGroup)
currentGroup = [ep] currentGroup = [ep]
} else { } else {
@ -458,11 +445,10 @@ struct MediaInfoView: View {
} }
} }
if !currentGroup.isEmpty { groups.append(currentGroup)
groups.append(currentGroup)
}
return groups return groups
} }
func fetchDetails() { func fetchDetails() {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {