From b5719e505f1666f6676e32bc3ea54541f5cc35e8 Mon Sep 17 00:00:00 2001 From: jhays Date: Fri, 19 Nov 2021 08:31:11 -0600 Subject: [PATCH] live tv playback, fix dates --- .../Components/LiveTVChannelItemElement.swift | 34 +++++++++---------- .../Views/LiveTVChannelsView.swift | 3 +- .../VideoPlayerViewController.swift | 4 +-- .../LiveTVChannelsCoordinator.swift | 4 +++ .../ViewModels/LiveTVChannelsViewModel.swift | 23 +++++-------- 5 files changed, 33 insertions(+), 35 deletions(-) diff --git a/JellyfinPlayer tvOS/Components/LiveTVChannelItemElement.swift b/JellyfinPlayer tvOS/Components/LiveTVChannelItemElement.swift index 0e2037a9..fe83123c 100644 --- a/JellyfinPlayer tvOS/Components/LiveTVChannelItemElement.swift +++ b/JellyfinPlayer tvOS/Components/LiveTVChannelItemElement.swift @@ -47,29 +47,27 @@ struct LiveTVChannelItemElement: View { } if let currentProgram = program, - let start = currentProgram.startDate?.toLocalTime().timeIntervalSinceReferenceDate, - let end = currentProgram.endDate?.toLocalTime().timeIntervalSinceReferenceDate { + let startDate = currentProgram.startDate, + let endDate = currentProgram.endDate { + let start = startDate.timeIntervalSinceReferenceDate + let end = endDate.timeIntervalSinceReferenceDate let now = Date().timeIntervalSinceReferenceDate let length = end - start let progress = now - start let progPercent = progress / length - VStack { - if let startDate = currentProgram.startDate, - let endDate = currentProgram.endDate { - HStack { - Text(dateFormatter.string(from: startDate.toLocalTime())) - .font(.footnote) - .lineLimit(1) - .frame(alignment: .leading) - - Spacer() - - Text(dateFormatter.string(from: endDate.toLocalTime())) - .font(.footnote) - .lineLimit(1) - .frame(alignment: .trailing) - } + HStack { + Text(dateFormatter.string(from: startDate)) + .font(.footnote) + .lineLimit(1) + .frame(alignment: .leading) + + Spacer() + + Text(dateFormatter.string(from: endDate)) + .font(.footnote) + .lineLimit(1) + .frame(alignment: .trailing) } GeometryReader { gp in ZStack(alignment: .leading) { diff --git a/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift b/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift index 8e2fd05d..d915543d 100644 --- a/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift +++ b/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift @@ -13,7 +13,7 @@ import SwiftUICollection struct LiveTVChannelsView: View { - @EnvironmentObject var programsRouter: LiveTVChannelsCoordinator.Router + @EnvironmentObject var router: LiveTVChannelsCoordinator.Router @StateObject var viewModel = LiveTVChannelsViewModel() var body: some View { @@ -49,6 +49,7 @@ struct LiveTVChannelsView: View { let channel = item.channel{ if channel.type != "Folder" { Button { + self.router.route(to: \.videoPlayer, channel) } label: { LiveTVChannelItemElement(channel: channel, program: item.program) } diff --git a/JellyfinPlayer tvOS/Views/VideoPlayer/VideoPlayerViewController.swift b/JellyfinPlayer tvOS/Views/VideoPlayer/VideoPlayerViewController.swift index 2f0a81d7..f321138e 100644 --- a/JellyfinPlayer tvOS/Views/VideoPlayer/VideoPlayerViewController.swift +++ b/JellyfinPlayer tvOS/Views/VideoPlayer/VideoPlayerViewController.swift @@ -583,7 +583,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, updateNowPlayingCenter(time: nil, playing: mediaPlayer.state == .playing) if (eventName == "timeupdate" && mediaPlayer.state == .playing) || eventName != "timeupdate" { - var ticks: Int64 = Int64(mediaPlayer.position * Float(manifest.runTimeTicks!)) + var ticks: Int64 = Int64(mediaPlayer.position * Float(manifest.runTimeTicks ?? 0)) if ticks == 0 { ticks = manifest.userData?.playbackPositionTicks ?? 0 } @@ -601,7 +601,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, } func sendStopReport() { - let stopInfo = PlaybackStopInfo(item: manifest, itemId: manifest.id, sessionId: playSessionId, mediaSourceId: manifest.id, positionTicks: Int64(mediaPlayer.position * Float(manifest.runTimeTicks!)), liveStreamId: nil, playSessionId: playSessionId, failed: nil, nextMediaType: nil, playlistItemId: "playlistItem0", nowPlayingQueue: []) + let stopInfo = PlaybackStopInfo(item: manifest, itemId: manifest.id, sessionId: playSessionId, mediaSourceId: manifest.id, positionTicks: Int64(mediaPlayer.position * Float(manifest.runTimeTicks ?? 0)), liveStreamId: nil, playSessionId: playSessionId, failed: nil, nextMediaType: nil, playlistItemId: "playlistItem0", nowPlayingQueue: []) PlaystateAPI.reportPlaybackStopped(playbackStopInfo: stopInfo) .sink(receiveCompletion: { result in diff --git a/Shared/Coordinators/LiveTVChannelsCoordinator.swift b/Shared/Coordinators/LiveTVChannelsCoordinator.swift index 17b683d4..d2915f92 100644 --- a/Shared/Coordinators/LiveTVChannelsCoordinator.swift +++ b/Shared/Coordinators/LiveTVChannelsCoordinator.swift @@ -17,10 +17,14 @@ final class LiveTVChannelsCoordinator: NavigationCoordinatable { @Root var start = makeStart @Route(.modal) var modalItem = makeModalItem + @Route(.fullScreen) var videoPlayer = makeVideoPlayer func makeModalItem(item: BaseItemDto) -> NavigationViewCoordinator { return NavigationViewCoordinator(ItemCoordinator(item: item)) } + func makeVideoPlayer(item: BaseItemDto) -> NavigationViewCoordinator { + NavigationViewCoordinator(VideoPlayerCoordinator(item: item)) + } @ViewBuilder func makeStart() -> some View { diff --git a/Shared/ViewModels/LiveTVChannelsViewModel.swift b/Shared/ViewModels/LiveTVChannelsViewModel.swift index 68922adb..f90e573e 100644 --- a/Shared/ViewModels/LiveTVChannelsViewModel.swift +++ b/Shared/ViewModels/LiveTVChannelsViewModel.swift @@ -89,7 +89,7 @@ final class LiveTVChannelsViewModel: ViewModel { let channelIds = channels.compactMap { $0.id } let minEndDate = Date.now.addComponentsToDate(hours: -1) - let maxStartDate = minEndDate.addComponentsToDate(days: 1) + let maxStartDate = minEndDate.addComponentsToDate(hours: 6) NSLog("*** maxStartDate: \(maxStartDate)") NSLog("*** minEndDate: \(minEndDate)") @@ -125,8 +125,9 @@ final class LiveTVChannelsViewModel: ViewModel { let now = Date() let df = DateFormatter() df.dateFormat = "MM/dd h:mm ZZZ" + NSLog("begin processing programs") for channel in self.channels { - // NSLog("\n\(channel.name)") + NSLog("\n\(channel.name)") let prgs = self.programs.filter { item in item.channelId == channel.id } @@ -136,15 +137,15 @@ final class LiveTVChannelsViewModel: ViewModel { for prg in prgs { var startString = "" var endString = "" - if let start = prg.startDate?.toLocalTime() { + if let start = prg.startDate { startString = df.string(from: start) } - if let end = prg.endDate?.toLocalTime() { + if let end = prg.endDate { endString = df.string(from: end) } - //NSLog("\(prg.name) - \(startString) to \(endString)") - if let startDate = prg.startDate?.toLocalTime() , - let endDate = prg.endDate?.toLocalTime(), + NSLog("\(prg.name) - \(startString) to \(endString)") + if let startDate = prg.startDate, + let endDate = prg.endDate, now.timeIntervalSinceReferenceDate > startDate.timeIntervalSinceReferenceDate && now.timeIntervalSinceReferenceDate < endDate.timeIntervalSinceReferenceDate { currentPrg = prg @@ -153,6 +154,7 @@ final class LiveTVChannelsViewModel: ViewModel { channelPrograms.append(LiveTVChannelProgram(channel: channel, program: currentPrg)) } + NSLog("finished processing programs") return channelPrograms } } @@ -192,11 +194,4 @@ extension Date { dc.timeZone = TimeZone(secondsFromGMT: 0) return Calendar.current.date(from: dc)! } - - func toLocalTime() -> Date { - let timezoneOffset = TimeZone.current.secondsFromGMT() - let epochDate = self.timeIntervalSince1970 - let timezoneEpochOffset = (epochDate + Double(timezoneOffset)) - return Date(timeIntervalSince1970: timezoneEpochOffset) - } }