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