From 98a11ce3038cdec0f88e65a2fa64007fe9b5a623 Mon Sep 17 00:00:00 2001 From: jhays Date: Wed, 22 Dec 2021 12:23:51 -0600 Subject: [PATCH] refresh programs on channel view every 10 mins --- .../Views/LiveTVChannelsView.swift | 7 ++- .../ViewModels/LiveTVChannelsViewModel.swift | 44 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift b/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift index 1068225b..69f34e51 100644 --- a/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift +++ b/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift @@ -31,7 +31,12 @@ struct LiveTVChannelsView: View { } .frame(maxWidth: .infinity, maxHeight: .infinity) .ignoresSafeArea() - + .onAppear { + viewModel.startScheduleCheckTimer() + } + .onDisappear { + viewModel.stopScheduleCheckTimer() + } } else { VStack { Text("No results.") diff --git a/Shared/ViewModels/LiveTVChannelsViewModel.swift b/Shared/ViewModels/LiveTVChannelsViewModel.swift index fb92cc1d..626f3924 100644 --- a/Shared/ViewModels/LiveTVChannelsViewModel.swift +++ b/Shared/ViewModels/LiveTVChannelsViewModel.swift @@ -40,6 +40,7 @@ final class LiveTVChannelsViewModel: ViewModel { private var programs = [BaseItemDto]() private var channelProgramsList = [BaseItemDto: [BaseItemDto]]() + private var timer: Timer? var timeFormatter: DateFormatter { let df = DateFormatter() @@ -51,6 +52,11 @@ final class LiveTVChannelsViewModel: ViewModel { super.init() getChannels() + startScheduleCheckTimer() + } + + deinit { + stopScheduleCheckTimer() } private func getGuideInfo() { @@ -131,7 +137,9 @@ final class LiveTVChannelsViewModel: ViewModel { let prgs = self.programs.filter { item in item.channelId == channel.id } - channelProgramsList[channel] = prgs + DispatchQueue.main.async { + self.channelProgramsList[channel] = prgs + } var currentPrg: BaseItemDto? for prg in prgs { @@ -147,6 +155,40 @@ final class LiveTVChannelsViewModel: ViewModel { } return channelPrograms } + + func startScheduleCheckTimer() { + let date = Date() + let calendar = Calendar.current + var components = calendar.dateComponents([.era, .year, .month, .day, .hour, .minute], from: date) + + // Run on 10th min of every hour + guard let minute = components.minute else { return } + components.second = 0 + components.minute = minute + (10 - (minute % 10)) + + guard let nextMinute = calendar.date(from: components) else { return } + + if let existingTimer = timer { + existingTimer.invalidate() + } + timer = Timer(fire: nextMinute, interval: 60 * 10, repeats: true) { [weak self] timer in + guard let self = self else { return } + LogManager.shared.log.debug("LiveTVChannels schedule check...") + DispatchQueue.global(qos: .background).async { + let newChanPrgs = self.processChannelPrograms() + DispatchQueue.main.async { + self.channelPrograms = newChanPrgs + } + } + } + if let timer = timer { + RunLoop.main.add(timer, forMode: .default) + } + } + + func stopScheduleCheckTimer() { + timer?.invalidate() + } } extension Array {