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:
Ashik K 2025-10-17 09:53:23 +02:00
parent f1615f9078
commit e3bcd8638a
2 changed files with 33 additions and 1 deletions

View File

@ -19,6 +19,11 @@ final class ItemLibraryViewModel: PagingLibraryViewModel<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 request = Paths.getItemsByUserID(userID: userSession.user.id, parameters: parameters)
let response = try await userSession.client.send(request)
@ -46,6 +51,33 @@ final class ItemLibraryViewModel: PagingLibraryViewModel<BaseItemDto> {
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
private func itemParameters(for page: Int?) -> Paths.GetItemsByUserIDParameters {

View File

@ -101,7 +101,7 @@ struct PagingLibraryView<Element: Poster & Identifiable>: View {
private func select(item: BaseItemDto) {
switch item.type {
case .collectionFolder, .folder:
case .collectionFolder, .folder, .channelFolderItem:
let viewModel = ItemLibraryViewModel(parent: item, filters: .default)
router.route(to: \.library, viewModel)
case .person: