components_ItemGrid_LoadItemsTask2.bs

import "pkg:/source/api/Items.bs"
import "pkg:/source/api/baserequest.bs"
import "pkg:/source/utils/config.bs"
import "pkg:/source/utils/misc.bs"
import "pkg:/source/api/Image.bs"
import "pkg:/source/utils/deviceCapabilities.bs"
import "pkg:/source/roku_modules/log/LogMixin.brs"
import "pkg:/source/api/sdk.bs"

sub init()
    m.log = log.Logger("LoadItemsTask2")
    m.top.functionName = "loadItems"

    m.top.limit = 60
    usersettingLimit = m.global.session.user.settings["itemgrid.Limit"]

    if usersettingLimit <> invalid
        m.top.limit = usersettingLimit
    end if
end sub

sub loadItems()
    results = []

    sort_field = m.top.sortField

    if m.top.sortAscending = true
        sort_order = "Ascending"
    else
        sort_order = "Descending"
    end if

    if m.top.ItemType = "LogoImage"
        logoImageExists = api.items.HeadImageURLByName(m.top.itemId, "logo")
        if logoImageExists
            m.top.content = [api.items.GetImageURL(m.top.itemId, "logo", 0, { "maxHeight": 500, "maxWidth": 500, "quality": "90" })]
        else
            m.top.content = []
        end if

        return
    end if

    params = {
        limit: m.top.limit,
        StartIndex: m.top.startIndex,
        parentid: m.top.itemId,
        SortBy: sort_field,
        SortOrder: sort_order,
        recursive: m.top.recursive,
        Fields: "Overview",
        StudioIds: m.top.studioIds,
        genreIds: m.top.genreIds
    }

    ' Handle special case when getting names starting with numeral
    if m.top.NameStartsWith <> ""
        if m.top.NameStartsWith = "#"
            if m.top.ItemType = "LiveTV" or m.top.ItemType = "TvChannel"
                params.searchterm = "A"
                params.append({ parentid: " " })
            else
                params.NameLessThan = "A"
            end if
        else
            if m.top.ItemType = "LiveTV" or m.top.ItemType = "TvChannel"
                params.searchterm = m.top.nameStartsWith
                params.append({ parentid: " " })
            else
                params.NameStartsWith = m.top.nameStartsWith
            end if
        end if
    end if

    'reset data
    if LCase(m.top.searchTerm) = LCase(tr("all"))
        params.searchTerm = " "
    else if m.top.searchTerm <> ""
        params.searchTerm = m.top.searchTerm
    end if

    filter = LCase(m.top.filter)
    if filter = "all"
        ' do nothing
    else if filter = "favorites"
        params.append({ Filters: "IsFavorite" })
        params.append({ isFavorite: true })
    else if filter = "unplayed"
        params.append({ Filters: "IsUnplayed" })
    else if filter = "played"
        params.append({ Filters: "IsPlayed" })
    else if filter = "resumable"
        params.append({ Filters: "IsResumable" })
    end if

    if isValid(m.top.filterOptions)
        if m.top.filterOptions.count() > 0
            params.append(m.top.filterOptions)
        end if
    end if

    if m.top.ItemType <> ""
        params.append({ IncludeItemTypes: m.top.ItemType })
    end if

    if m.top.ItemType = "LiveTV"
        url = "LiveTv/Channels"
        params.append({ UserId: m.global.session.user.id })
    else if m.top.view = "Networks"
        url = "Studios"
        params.append({ UserId: m.global.session.user.id })
    else if m.top.view = "Genres"
        url = "Genres"
        params.append({ UserId: m.global.session.user.id, includeItemTypes: m.top.itemType })
    else if m.top.ItemType = "MusicArtist"
        url = "Artists"
        params.append({
            UserId: m.global.session.user.id,
            Fields: "Genres"
        })
        params.IncludeItemTypes = "MusicAlbum,Audio"
    else if m.top.ItemType = "AlbumArtists"
        url = "Artists/AlbumArtists"
        params.append({
            UserId: m.global.session.user.id,
            Fields: "Genres"
        })
        params.IncludeItemTypes = "MusicAlbum,Audio"
    else if m.top.ItemType = "MusicAlbum"
        url = Substitute("Users/{0}/Items/", m.global.session.user.id)
        params.append({ ImageTypeLimit: 1 })
        params.append({ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" })
    else
        url = Substitute("Users/{0}/Items/", m.global.session.user.id)
    end if

    resp = APIRequest(url, params)
    data = getJson(resp)
    if data <> invalid

        if data.TotalRecordCount <> invalid then m.top.totalRecordCount = data.TotalRecordCount

        for each item in data.Items
            tmp = invalid
            if item.Type = "Movie" or item.Type = "MusicVideo"
                tmp = CreateObject("roSGNode", "MovieData")
            else if item.Type = "Series"
                tmp = CreateObject("roSGNode", "SeriesData")
            else if item.Type = "BoxSet" or item.Type = "ManualPlaylistsFolder"
                tmp = CreateObject("roSGNode", "CollectionData")
            else if item.Type = "TvChannel"
                tmp = CreateObject("roSGNode", "ChannelData")
            else if item.Type = "Folder" or item.Type = "ChannelFolderItem" or item.Type = "CollectionFolder"
                tmp = CreateObject("roSGNode", "FolderData")
            else if item.Type = "Video" or item.Type = "Recording"
                tmp = CreateObject("roSGNode", "VideoData")
            else if item.Type = "Photo"
                tmp = CreateObject("roSGNode", "PhotoData")
            else if item.type = "PhotoAlbum"
                tmp = CreateObject("roSGNode", "FolderData")
            else if item.type = "Playlist"
                tmp = CreateObject("roSGNode", "PlaylistData")
                tmp.type = "Playlist"
                tmp.image = PosterImage(item.id, { "maxHeight": 425, "maxWidth": 290, "quality": "90" })
            else if item.type = "Episode"
                tmp = CreateObject("roSGNode", "TVEpisode")
            else if item.Type = "Genre"
                tmp = CreateObject("roSGNode", "ContentNode")
                tmp.title = item.name

                genreData = api.users.GetItemsByQuery(m.global.session.user.id, {
                    SortBy: "Random",
                    SortOrder: "Ascending",
                    IncludeItemTypes: m.top.itemType,
                    Recursive: true,
                    Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
                    ImageTypeLimit: 1,
                    EnableImageTypes: "Primary",
                    Limit: 6,
                    GenreIds: item.id,
                    EnableTotalRecordCount: false,
                    ParentId: m.top.itemId
                })

                if genreData.Items.Count() > 5
                    ' Add View All item to the start of the row
                    row = tmp.createChild("FolderData")
                    row.parentFolder = m.top.itemId
                    row.title = tr("View All") + " " + item.name
                    item.name = tr("View All") + " " + item.name
                    row.json = item
                    row.type = "Folder"

                    if LCase(m.top.itemType) = "movie"
                        genreItemImage = api.items.GetImageURL(item.id)
                    else
                        genreItemImage = invalid
                        row.posterURL = invalid
                    end if

                    row.FHDPOSTERURL = genreItemImage
                    row.HDPOSTERURL = genreItemImage
                    row.SDPOSTERURL = genreItemImage
                end if

                for each genreItem in genreData.Items
                    if LCase(m.top.itemType) = "movie"
                        row = tmp.createChild("MovieData")
                    else
                        row = tmp.createChild("SeriesData")
                    end if

                    genreItemImage = api.items.GetImageURL(genreItem.id)
                    row.title = genreItem.name
                    row.FHDPOSTERURL = genreItemImage
                    row.HDPOSTERURL = genreItemImage
                    row.SDPOSTERURL = genreItemImage
                    row.json = genreItem
                    row.id = genreItem.id
                    row.type = genreItem.type
                end for

            else if item.Type = "Studio"
                tmp = CreateObject("roSGNode", "FolderData")
            else if item.Type = "MusicAlbum"
                tmp = CreateObject("roSGNode", "MusicAlbumData")
                tmp.type = "MusicAlbum"
                if api.items.HeadImageURLByName(item.id, "primary")
                    tmp.posterURL = ImageURL(item.id, "Primary")
                else
                    tmp.posterURL = ImageURL(item.id, "backdrop")
                end if
            else if item.Type = "MusicArtist"
                tmp = CreateObject("roSGNode", "MusicArtistData")
            else if item.Type = "Audio"
                tmp = CreateObject("roSGNode", "MusicSongData")
                tmp.type = "Audio"
                tmp.image = api.items.GetImageURL(item.id, "primary", 0, { "maxHeight": 280, "maxWidth": 280, "quality": "90" })
            else if item.Type = "MusicGenre"
                tmp = CreateObject("roSGNode", "FolderData")
                tmp.title = item.name
                tmp.parentFolder = m.top.itemId
                tmp.json = item
                tmp.type = "Folder"
                tmp.posterUrl = api.items.GetImageURL(item.id, "primary", 0, { "maxHeight": 280, "maxWidth": 280, "quality": "90" })

            else
                m.log.warn("Unknown Type", item.Type)
            end if

            if tmp <> invalid
                if item.Type <> "Genre" and item.Type <> "MusicGenre"
                    tmp.parentFolder = m.top.itemId
                    tmp.json = item
                    if item.UserData <> invalid and item.UserData.isFavorite <> invalid
                        tmp.favorite = item.UserData.isFavorite
                    end if
                end if

                results.push(tmp)
            end if
        end for
    end if
    m.top.content = results
end sub