support playback on programs view
This commit is contained in:
parent
a4d58e3694
commit
c98f63c5e4
|
@ -28,7 +28,10 @@ struct LiveTVProgramsView: View {
|
||||||
Spacer().frame(width: 45)
|
Spacer().frame(width: 45)
|
||||||
ForEach(items, id: \.id) { item in
|
ForEach(items, id: \.id) { item in
|
||||||
Button {
|
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: {
|
} label: {
|
||||||
LandscapeItemElement(item: item)
|
LandscapeItemElement(item: item)
|
||||||
}
|
}
|
||||||
|
@ -49,7 +52,10 @@ struct LiveTVProgramsView: View {
|
||||||
Spacer().frame(width: 45)
|
Spacer().frame(width: 45)
|
||||||
ForEach(items, id: \.id) { item in
|
ForEach(items, id: \.id) { item in
|
||||||
Button {
|
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: {
|
} label: {
|
||||||
LandscapeItemElement(item: item)
|
LandscapeItemElement(item: item)
|
||||||
}
|
}
|
||||||
|
@ -70,7 +76,10 @@ struct LiveTVProgramsView: View {
|
||||||
Spacer().frame(width: 45)
|
Spacer().frame(width: 45)
|
||||||
ForEach(items, id: \.id) { item in
|
ForEach(items, id: \.id) { item in
|
||||||
Button {
|
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: {
|
} label: {
|
||||||
LandscapeItemElement(item: item)
|
LandscapeItemElement(item: item)
|
||||||
}
|
}
|
||||||
|
@ -91,7 +100,10 @@ struct LiveTVProgramsView: View {
|
||||||
Spacer().frame(width: 45)
|
Spacer().frame(width: 45)
|
||||||
ForEach(items, id: \.id) { item in
|
ForEach(items, id: \.id) { item in
|
||||||
Button {
|
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: {
|
} label: {
|
||||||
LandscapeItemElement(item: item)
|
LandscapeItemElement(item: item)
|
||||||
}
|
}
|
||||||
|
@ -112,7 +124,10 @@ struct LiveTVProgramsView: View {
|
||||||
Spacer().frame(width: 45)
|
Spacer().frame(width: 45)
|
||||||
ForEach(items, id: \.id) { item in
|
ForEach(items, id: \.id) { item in
|
||||||
Button {
|
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: {
|
} label: {
|
||||||
LandscapeItemElement(item: item)
|
LandscapeItemElement(item: item)
|
||||||
}
|
}
|
||||||
|
@ -133,7 +148,10 @@ struct LiveTVProgramsView: View {
|
||||||
Spacer().frame(width: 45)
|
Spacer().frame(width: 45)
|
||||||
ForEach(items, id: \.id) { item in
|
ForEach(items, id: \.id) { item in
|
||||||
Button {
|
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: {
|
} label: {
|
||||||
LandscapeItemElement(item: item)
|
LandscapeItemElement(item: item)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ final class LiveTVChannelsCoordinator: NavigationCoordinatable {
|
||||||
func makeModalItem(item: BaseItemDto) -> NavigationViewCoordinator<ItemCoordinator> {
|
func makeModalItem(item: BaseItemDto) -> NavigationViewCoordinator<ItemCoordinator> {
|
||||||
return NavigationViewCoordinator(ItemCoordinator(item: item))
|
return NavigationViewCoordinator(ItemCoordinator(item: item))
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeVideoPlayer(item: BaseItemDto) -> NavigationViewCoordinator<VideoPlayerCoordinator> {
|
func makeVideoPlayer(item: BaseItemDto) -> NavigationViewCoordinator<VideoPlayerCoordinator> {
|
||||||
NavigationViewCoordinator(VideoPlayerCoordinator(item: item))
|
NavigationViewCoordinator(VideoPlayerCoordinator(item: item))
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,10 +17,10 @@ final class LiveTVProgramsCoordinator: NavigationCoordinatable {
|
||||||
let stack = NavigationStack(initial: \LiveTVProgramsCoordinator.start)
|
let stack = NavigationStack(initial: \LiveTVProgramsCoordinator.start)
|
||||||
|
|
||||||
@Root var start = makeStart
|
@Root var start = makeStart
|
||||||
@Route(.modal) var modalItem = makeModalItem
|
@Route(.fullScreen) var videoPlayer = makeVideoPlayer
|
||||||
|
|
||||||
func makeModalItem(item: BaseItemDto) -> NavigationViewCoordinator<ItemCoordinator> {
|
func makeVideoPlayer(item: BaseItemDto) -> NavigationViewCoordinator<VideoPlayerCoordinator> {
|
||||||
return NavigationViewCoordinator(ItemCoordinator(item: item))
|
NavigationViewCoordinator(VideoPlayerCoordinator(item: item))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
|
|
|
@ -70,7 +70,7 @@ final class LiveTVChannelsViewModel: ViewModel {
|
||||||
LiveTvAPI.getLiveTvChannels(
|
LiveTvAPI.getLiveTvChannels(
|
||||||
userId: SessionManager.main.currentLogin.user.id,
|
userId: SessionManager.main.currentLogin.user.id,
|
||||||
startIndex: 0,
|
startIndex: 0,
|
||||||
limit: 500,
|
limit: 1000,
|
||||||
enableImageTypes: [.primary],
|
enableImageTypes: [.primary],
|
||||||
enableUserData: false,
|
enableUserData: false,
|
||||||
enableFavoriteSorting: true
|
enableFavoriteSorting: true
|
||||||
|
|
|
@ -19,18 +19,51 @@ final class LiveTVProgramsViewModel: ViewModel {
|
||||||
@Published var kidsItems = [BaseItemDto]()
|
@Published var kidsItems = [BaseItemDto]()
|
||||||
@Published var newsItems = [BaseItemDto]()
|
@Published var newsItems = [BaseItemDto]()
|
||||||
|
|
||||||
|
private var channels = [String:BaseItemDto]()
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
loadRecommendedPrograms()
|
getChannels()
|
||||||
loadSeries()
|
|
||||||
loadMovies()
|
|
||||||
loadSports()
|
|
||||||
loadKids()
|
|
||||||
loadNews()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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(
|
LiveTvAPI.getRecommendedPrograms(
|
||||||
userId: SessionManager.main.currentLogin.user.id,
|
userId: SessionManager.main.currentLogin.user.id,
|
||||||
limit: 9,
|
limit: 9,
|
||||||
|
@ -51,7 +84,7 @@ final class LiveTVProgramsViewModel: ViewModel {
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func loadSeries() {
|
private func getSeries() {
|
||||||
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
||||||
hasAired: false,
|
hasAired: false,
|
||||||
isMovie: false,
|
isMovie: false,
|
||||||
|
@ -77,7 +110,7 @@ final class LiveTVProgramsViewModel: ViewModel {
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func loadMovies() {
|
private func getMovies() {
|
||||||
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
||||||
hasAired: false,
|
hasAired: false,
|
||||||
isMovie: true,
|
isMovie: true,
|
||||||
|
@ -103,7 +136,7 @@ final class LiveTVProgramsViewModel: ViewModel {
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func loadSports() {
|
private func getSports() {
|
||||||
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
||||||
hasAired: false,
|
hasAired: false,
|
||||||
isSports: true,
|
isSports: true,
|
||||||
|
@ -125,7 +158,7 @@ final class LiveTVProgramsViewModel: ViewModel {
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func loadKids() {
|
private func getKids() {
|
||||||
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
||||||
hasAired: false,
|
hasAired: false,
|
||||||
isKids: true,
|
isKids: true,
|
||||||
|
@ -147,7 +180,7 @@ final class LiveTVProgramsViewModel: ViewModel {
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func loadNews() {
|
private func getNews() {
|
||||||
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
let getProgramsDto = GetProgramsDto(userId: SessionManager.main.currentLogin.user.id,
|
||||||
hasAired: false,
|
hasAired: false,
|
||||||
isNews: true,
|
isNews: true,
|
||||||
|
|
Loading…
Reference in New Issue