Implement channel navigation for Jellyfin plugin channels
- Modified ItemLibraryViewModel to detect channel/channelFolderItem types - Added getChannelItems() method to use Paths.getChannelItems API for channels - Channel folders now use channelID and folderID parameters correctly - Modified PagingLibraryView to route .channelFolderItem to library grid view This enables proper navigation for Jellyfin.Xtream plugin channels: Channel → Grid of Categories → Grid of Content → Item Detail 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
f1615f9078
commit
e3bcd8638a
|
@ -19,6 +19,11 @@ final class ItemLibraryViewModel: PagingLibraryViewModel<BaseItemDto> {
|
||||||
|
|
||||||
override func get(page: Int) async throws -> [BaseItemDto] {
|
override func get(page: Int) async throws -> [BaseItemDto] {
|
||||||
|
|
||||||
|
// Use channel API for channels and channel folders
|
||||||
|
if let parent = parent as? BaseItemDto, parent.type == .channel || parent.type == .channelFolderItem {
|
||||||
|
return try await getChannelItems(page: page, parent: parent)
|
||||||
|
}
|
||||||
|
|
||||||
let parameters = itemParameters(for: page)
|
let parameters = itemParameters(for: page)
|
||||||
let request = Paths.getItemsByUserID(userID: userSession.user.id, parameters: parameters)
|
let request = Paths.getItemsByUserID(userID: userSession.user.id, parameters: parameters)
|
||||||
let response = try await userSession.client.send(request)
|
let response = try await userSession.client.send(request)
|
||||||
|
@ -46,6 +51,33 @@ final class ItemLibraryViewModel: PagingLibraryViewModel<BaseItemDto> {
|
||||||
return items
|
return items
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: getChannelItems
|
||||||
|
|
||||||
|
private func getChannelItems(page: Int, parent: BaseItemDto) async throws -> [BaseItemDto] {
|
||||||
|
|
||||||
|
guard let channelID = parent.channelID ?? parent.id else {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
var parameters = Paths.GetChannelItemsParameters()
|
||||||
|
parameters.userID = userSession.user.id
|
||||||
|
parameters.fields = .MinimumFields
|
||||||
|
|
||||||
|
// If parent is a channel folder, set the folderID
|
||||||
|
if parent.type == .channelFolderItem {
|
||||||
|
parameters.folderID = parent.id
|
||||||
|
}
|
||||||
|
|
||||||
|
// Page size
|
||||||
|
parameters.limit = pageSize
|
||||||
|
parameters.startIndex = page * pageSize
|
||||||
|
|
||||||
|
let request = Paths.getChannelItems(channelID: channelID, parameters: parameters)
|
||||||
|
let response = try await userSession.client.send(request)
|
||||||
|
|
||||||
|
return response.value.items ?? []
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: item parameters
|
// MARK: item parameters
|
||||||
|
|
||||||
private func itemParameters(for page: Int?) -> Paths.GetItemsByUserIDParameters {
|
private func itemParameters(for page: Int?) -> Paths.GetItemsByUserIDParameters {
|
||||||
|
|
|
@ -101,7 +101,7 @@ struct PagingLibraryView<Element: Poster & Identifiable>: View {
|
||||||
|
|
||||||
private func select(item: BaseItemDto) {
|
private func select(item: BaseItemDto) {
|
||||||
switch item.type {
|
switch item.type {
|
||||||
case .collectionFolder, .folder:
|
case .collectionFolder, .folder, .channelFolderItem:
|
||||||
let viewModel = ItemLibraryViewModel(parent: item, filters: .default)
|
let viewModel = ItemLibraryViewModel(parent: item, filters: .default)
|
||||||
router.route(to: \.library, viewModel)
|
router.route(to: \.library, viewModel)
|
||||||
case .person:
|
case .person:
|
||||||
|
|
Loading…
Reference in New Issue