components_liveTv_LoadChannelsTask.bs
import "pkg:/source/api/ApiClient.bs"
import "pkg:/source/api/baserequest.bs"
import "pkg:/source/api/Image.bs"
import "pkg:/source/data/JellyfinDataTransformer.bs"
import "pkg:/source/utils/config.bs"
import "pkg:/source/utils/misc.bs"
sub init()
m.top.functionName = "loadChannels"
end sub
sub loadChannels()
globalUser = m.global.user
results = []
sort_field = m.top.sortField
if m.top.sortAscending = true
sort_order = "Ascending"
else
sort_order = "Descending"
end if
params = {
includeItemTypes: "LiveTvChannel",
SortBy: sort_field,
SortOrder: sort_order,
recursive: m.top.recursive,
UserId: globalUser.id
}
' Handle special case when getting names starting with numeral
if m.top.NameStartsWith <> ""
if m.top.NameStartsWith = "#"
params.searchterm = "A"
else
params.searchterm = m.top.nameStartsWith
end if
end if
'Append voice search when there is text
if m.top.searchTerm <> ""
params.searchTerm = m.top.searchTerm
end if
if m.top.filter = "Favorites"
params.append({ isFavorite: true })
end if
data = GetApi().GetItemsByQuery(params)
if not isValid(data.TotalRecordCount)
m.top.channels = results
return
end if
transformer = JellyfinDataTransformer()
for each item in data.Items
node = transformer.transformBaseItem(item)
' Format title with channel number for TimeGrid channel gutter display
if isValidAndNotEmpty(node.channelNumber)
node.title = `${tr("CH")} ${node.channelNumber} ${node.name}`
end if
' Set hdSmallIconUrl for TimeGrid channel icon (ContentNode built-in read by Roku TimeGrid)
if isValidAndNotEmpty(node.primaryImageTag)
node.hdsmalliconurl = ImageURL(node.id, "Primary", { maxHeight: 60, tag: node.primaryImageTag })
end if
' Favorites appear at the top of the channel list
if node.isFavorite
results.Unshift(node)
else
results.push(node)
end if
end for
m.top.channels = results
end sub