support playback on programs view

This commit is contained in:
jhays 2021-11-20 14:57:20 -06:00
parent a4d58e3694
commit c98f63c5e4
5 changed files with 74 additions and 22 deletions

View File

@ -28,7 +28,10 @@ struct LiveTVProgramsView: View {
Spacer().frame(width: 45)
ForEach(items, id: \.id) { item in
Button {
self.programsRouter.route(to: \.modalItem, item)
if let chanId = item.channelId,
let chan = viewModel.findChannel(id: chanId) {
self.programsRouter.route(to: \.videoPlayer, chan)
}
} label: {
LandscapeItemElement(item: item)
}
@ -49,7 +52,10 @@ struct LiveTVProgramsView: View {
Spacer().frame(width: 45)
ForEach(items, id: \.id) { item in
Button {
self.programsRouter.route(to: \.modalItem, item)
if let chanId = item.channelId,
let chan = viewModel.findChannel(id: chanId) {
self.programsRouter.route(to: \.videoPlayer, chan)
}
} label: {
LandscapeItemElement(item: item)
}
@ -70,7 +76,10 @@ struct LiveTVProgramsView: View {
Spacer().frame(width: 45)
ForEach(items, id: \.id) { item in
Button {
self.programsRouter.route(to: \.modalItem, item)
if let chanId = item.channelId,
let chan = viewModel.findChannel(id: chanId) {
self.programsRouter.route(to: \.videoPlayer, chan)
}
} label: {
LandscapeItemElement(item: item)
}
@ -91,7 +100,10 @@ struct LiveTVProgramsView: View {
Spacer().frame(width: 45)
ForEach(items, id: \.id) { item in
Button {
self.programsRouter.route(to: \.modalItem, item)
if let chanId = item.channelId,
let chan = viewModel.findChannel(id: chanId) {
self.programsRouter.route(to: \.videoPlayer, chan)
}
} label: {
LandscapeItemElement(item: item)
}
@ -112,7 +124,10 @@ struct LiveTVProgramsView: View {
Spacer().frame(width: 45)
ForEach(items, id: \.id) { item in
Button {
self.programsRouter.route(to: \.modalItem, item)
if let chanId = item.channelId,
let chan = viewModel.findChannel(id: chanId) {
self.programsRouter.route(to: \.videoPlayer, chan)
}
} label: {
LandscapeItemElement(item: item)
}
@ -133,7 +148,10 @@ struct LiveTVProgramsView: View {
Spacer().frame(width: 45)
ForEach(items, id: \.id) { item in
Button {
self.programsRouter.route(to: \.modalItem, item)
if let chanId = item.channelId,
let chan = viewModel.findChannel(id: chanId) {
self.programsRouter.route(to: \.videoPlayer, chan)
}
} label: {
LandscapeItemElement(item: item)
}

View File

@ -22,6 +22,7 @@ final class LiveTVChannelsCoordinator: NavigationCoordinatable {
func makeModalItem(item: BaseItemDto) -> NavigationViewCoordinator<ItemCoordinator> {
return NavigationViewCoordinator(ItemCoordinator(item: item))
}
func makeVideoPlayer(item: BaseItemDto) -> NavigationViewCoordinator<VideoPlayerCoordinator> {
NavigationViewCoordinator(VideoPlayerCoordinator(item: item))
}

View File

@ -17,10 +17,10 @@ final class LiveTVProgramsCoordinator: NavigationCoordinatable {
let stack = NavigationStack(initial: \LiveTVProgramsCoordinator.start)
@Root var start = makeStart
@Route(.modal) var modalItem = makeModalItem
@Route(.fullScreen) var videoPlayer = makeVideoPlayer
func makeModalItem(item: BaseItemDto) -> NavigationViewCoordinator<ItemCoordinator> {
return NavigationViewCoordinator(ItemCoordinator(item: item))
func makeVideoPlayer(item: BaseItemDto) -> NavigationViewCoordinator<VideoPlayerCoordinator> {
NavigationViewCoordinator(VideoPlayerCoordinator(item: item))
}
@ViewBuilder

View File

@ -70,7 +70,7 @@ final class LiveTVChannelsViewModel: ViewModel {
LiveTvAPI.getLiveTvChannels(
userId: SessionManager.main.currentLogin.user.id,
startIndex: 0,
limit: 500,
limit: 1000,
enableImageTypes: [.primary],
enableUserData: false,
enableFavoriteSorting: true

View File

@ -19,18 +19,51 @@ final class LiveTVProgramsViewModel: ViewModel {
@Published var kidsItems = [BaseItemDto]()
@Published var newsItems = [BaseItemDto]()
private var channels = [String:BaseItemDto]()
override init() {
super.init()
loadRecommendedPrograms()
loadSeries()
loadMovies()
loadSports()
loadKids()
loadNews()
getChannels()
}
private func loadRecommendedPrograms() {
func findChannel(id: String) -> BaseItemDto? {
return channels[id]
}
private func getChannels() {
LiveTvAPI.getLiveTvChannels(
userId: SessionManager.main.currentLogin.user.id,
startIndex: 0,
limit: 1000,
enableImageTypes: [.primary],
enableUserData: false,
enableFavoriteSorting: true
)
.trackActivity(loading)
.sink(receiveCompletion: { [weak self] completion in
self?.handleAPIRequestError(completion: completion)
}, receiveValue: { [weak self] response in
LogManager.shared.log.debug("Received \(response.items?.count ?? 0) Channels")
guard let self = self else { return }
if let chans = response.items {
for chan in chans {
if let chanId = chan.id {
self.channels[chanId] = chan
}
}
self.getRecommendedPrograms()
self.getSeries()
self.getMovies()
self.getSports()
self.getKids()
self.getNews()
}
})
.store(in: &cancellables)
}
private func getRecommendedPrograms() {
LiveTvAPI.getRecommendedPrograms(
userId: SessionManager.main.currentLogin.user.id,
limit: 9,
@ -51,7 +84,7 @@ final class LiveTVProgramsViewModel: ViewModel {
.store(in: &cancellables)
}
private func loadSeries() {
private func getSeries() {
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
hasAired: false,
isMovie: false,
@ -77,7 +110,7 @@ final class LiveTVProgramsViewModel: ViewModel {
.store(in: &cancellables)
}
private func loadMovies() {
private func getMovies() {
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
hasAired: false,
isMovie: true,
@ -103,7 +136,7 @@ final class LiveTVProgramsViewModel: ViewModel {
.store(in: &cancellables)
}
private func loadSports() {
private func getSports() {
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
hasAired: false,
isSports: true,
@ -125,7 +158,7 @@ final class LiveTVProgramsViewModel: ViewModel {
.store(in: &cancellables)
}
private func loadKids() {
private func getKids() {
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
hasAired: false,
isKids: true,
@ -147,7 +180,7 @@ final class LiveTVProgramsViewModel: ViewModel {
.store(in: &cancellables)
}
private func loadNews() {
private func getNews() {
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
hasAired: false,
isNews: true,