jellyflood/Shared/ViewModels/LiveTVProgramsViewModel.swift

215 lines
6.3 KiB
Swift

//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2023 Jellyfin & Jellyfin Contributors
//
import Foundation
import JellyfinAPI
final class LiveTVProgramsViewModel: ViewModel {
@Published
var recommendedItems = [BaseItemDto]()
@Published
var seriesItems = [BaseItemDto]()
@Published
var movieItems = [BaseItemDto]()
@Published
var sportsItems = [BaseItemDto]()
@Published
var kidsItems = [BaseItemDto]()
@Published
var newsItems = [BaseItemDto]()
var channels = [String: BaseItemDto]()
override init() {
super.init()
// getChannels()
}
func findChannel(id: String) -> BaseItemDto? {
channels[id]
}
private func getChannels() {
Task {
let parameters = Paths.GetLiveTvChannelsParameters(
userID: userSession.user.id,
startIndex: 0,
limit: 1000,
enableImageTypes: [.primary],
enableUserData: false,
enableFavoriteSorting: true
)
let request = Paths.getLiveTvChannels(parameters: parameters)
let response = try await userSession.client.send(request)
guard let channels = response.value.items else { return }
for channel in channels {
guard let channelID = channel.id else { continue }
self.channels[channelID] = channel
}
getRecommendedPrograms()
getSeries()
getMovies()
getSports()
getKids()
getNews()
}
}
private func getRecommendedPrograms() {
Task {
let parameters = Paths.GetRecommendedProgramsParameters(
userID: userSession.user.id,
limit: 9,
isAiring: true,
imageTypeLimit: 1,
enableImageTypes: [.primary, .thumb],
fields: [.channelInfo, .primaryImageAspectRatio],
enableTotalRecordCount: false
)
let request = Paths.getRecommendedPrograms(parameters: parameters)
let response = try await userSession.client.send(request)
guard let items = response.value.items else { return }
await MainActor.run {
self.recommendedItems = items
}
}
}
private func getSeries() {
Task {
let request = Paths.getPrograms(.init(
enableImageTypes: [.primary, .thumb],
enableTotalRecordCount: false,
fields: [.channelInfo, .primaryImageAspectRatio],
hasAired: false,
isKids: false,
isMovie: false,
isNews: false,
isSeries: true,
isSports: false,
limit: 9,
userID: userSession.user.id
))
let response = try await userSession.client.send(request)
guard let items = response.value.items else { return }
await MainActor.run {
self.seriesItems = items
}
}
}
private func getMovies() {
Task {
let request = Paths.getPrograms(.init(
enableImageTypes: [.primary, .thumb],
enableTotalRecordCount: false,
fields: [.channelInfo, .primaryImageAspectRatio],
hasAired: false,
isKids: false,
isMovie: true,
isNews: false,
isSeries: false,
isSports: false,
limit: 9,
userID: userSession.user.id
))
let response = try await userSession.client.send(request)
guard let items = response.value.items else { return }
await MainActor.run {
self.movieItems = items
}
}
}
private func getSports() {
Task {
let request = Paths.getPrograms(.init(
enableImageTypes: [.primary, .thumb],
enableTotalRecordCount: false,
fields: [.channelInfo, .primaryImageAspectRatio],
hasAired: false,
isKids: false,
isMovie: false,
isNews: false,
isSeries: false,
isSports: true,
limit: 9,
userID: userSession.user.id
))
let response = try await userSession.client.send(request)
guard let items = response.value.items else { return }
await MainActor.run {
self.sportsItems = items
}
}
}
private func getKids() {
Task {
let request = Paths.getPrograms(.init(
enableImageTypes: [.primary, .thumb],
enableTotalRecordCount: false,
fields: [.channelInfo, .primaryImageAspectRatio],
hasAired: false,
isKids: true,
isMovie: false,
isNews: false,
isSeries: false,
isSports: false,
limit: 9,
userID: userSession.user.id
))
let response = try await userSession.client.send(request)
guard let items = response.value.items else { return }
await MainActor.run {
self.kidsItems = items
}
}
}
private func getNews() {
Task {
let request = Paths.getPrograms(.init(
enableImageTypes: [.primary, .thumb],
enableTotalRecordCount: false,
fields: [.channelInfo, .primaryImageAspectRatio],
hasAired: false,
isKids: false,
isMovie: false,
isNews: true,
isSeries: false,
isSports: false,
limit: 9,
userID: userSession.user.id
))
let response = try await userSession.client.send(request)
guard let items = response.value.items else { return }
await MainActor.run {
self.seriesItems = items
}
}
}
}