215 lines
6.3 KiB
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) 2024 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
|
|
}
|
|
}
|
|
}
|
|
}
|