components_home_HomeItem.bs

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

sub init()
    m.log = log.Logger("HomeItem")
    initItemText()
    initItemPoster()
    m.itemProgress = m.top.findNode("progress")
    m.itemProgressBackground = m.top.findNode("progressBackground")
    initItemIcon()
    initItemTextExtra()
    m.itemPoster.observeField("loadStatus", "onPosterLoadStatusChanged")
    m.unplayedCount = m.top.findNode("unplayedCount")
    m.unplayedEpisodeCount = m.top.findNode("unplayedEpisodeCount")
    initPlayedIndicator()

    m.showProgressBarAnimation = m.top.findNode("showProgressBar")
    m.showProgressBarField = m.top.findNode("showProgressBarField")

    ' Randomize the background colors
    backdropColor = "#00a4db" ' set default in case global var is invalid
    myGlobal = m.global

    if isValid(myGlobal) and isValid(myGlobal.constants) and isValid(myGlobal.constants.poster_bg_pallet)
        posterBackgrounds = myGlobal.constants.poster_bg_pallet
        backdropColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1]
    end if

    ' update the backdrop node
    initBackdrop()
    m.backdrop.color = backdropColor
end sub

sub initItemText()
    m.itemText = m.top.findNode("itemText")
end sub

sub initItemPoster()
    m.itemPoster = m.top.findNode("itemPoster")
end sub

sub initItemTextExtra()
    m.itemTextExtra = m.top.findNode("itemTextExtra")
end sub

sub initBackdrop()
    m.backdrop = m.top.findNode("backdrop")
end sub

sub initItemIcon()
    m.itemIcon = m.top.findNode("itemIcon")
end sub

sub initPlayedIndicator()
    m.playedIndicator = m.top.findNode("playedIndicator")
end sub

sub itemContentChanged()
    if isValid(m.unplayedCount) then m.unplayedCount.visible = false
    itemData = m.top.itemContent
    if itemData = invalid then return

    itemData.Title = itemData.name ' Temporarily required while we move from "HomeItem" to "JFContentItem"

    ' validate to prevent crash
    userSettings = invalid
    if isValid(m.global) and isValid(m.global.session) and isValid(m.global.session.user) and isValid(m.global.session.user.settings)
        userSettings = m.global.session.user.settings
    end if

    ' validate to prevent crash
    if not isValid(m.itemPoster) then initItemPoster()
    if not isValid(m.itemText) then initItemText()
    if not isValid(m.itemTextExtra) then initItemTextExtra()
    if not isValid(m.backdrop) then initBackdrop()
    if not isValid(m.itemIcon) then initItemIcon()
    if not isValid(m.playedIndicator) then initPlayedIndicator()

    m.itemPoster.width = itemData.imageWidth
    m.itemText.maxWidth = itemData.imageWidth
    m.itemTextExtra.width = itemData.imageWidth
    m.itemTextExtra.visible = true
    m.itemTextExtra.text = ""
    m.backdrop.width = itemData.imageWidth


    if isValid(itemData.iconUrl)
        m.itemIcon.uri = itemData.iconUrl
    end if

    if itemData.isWatched
        m.playedIndicator.visible = true
    else
        m.playedIndicator.visible = false

        if LCase(itemData.type) = "series"
            if isValid(userSettings)
                unwatchedEpisodeCountSetting = userSettings["ui.tvshows.disableUnwatchedEpisodeCount"]
                if isValid(unwatchedEpisodeCountSetting) and not unwatchedEpisodeCountSetting
                    if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount)
                        if itemData.json.UserData.UnplayedItemCount > 0
                            if isValid(m.unplayedCount) then m.unplayedCount.visible = true
                            if isValid(m.unplayedEpisodeCount)
                                m.unplayedEpisodeCount.text = itemData.json.UserData.UnplayedItemCount
                            end if
                        end if
                    end if
                end if
            end if
        end if
    end if

    ' Format the Data based on the type of Home Data
    if itemData.type = "CollectionFolder" or itemData.type = "UserView" or itemData.type = "Channel"
        m.itemText.font.size = 35
        m.itemText.height = 64
        m.itemText.horizAlign = "center"
        m.itemText.vertAlign = "bottom"
        m.itemText.text = itemData.name
        m.itemPoster.uri = itemData.widePosterURL
        return
    end if

    if itemData.type = "UserView"
        m.itemPoster.width = "96"
        m.itemPoster.height = "96"
        m.itemPoster.translation = "[192, 88]"
        m.itemText.text = itemData.name
        m.itemPoster.uri = itemData.widePosterURL
        return
    end if

    playedIndicatorLeftPosition = m.itemPoster.width - 60
    m.playedIndicator.translation = [playedIndicatorLeftPosition, 0]

    m.itemText.height = 34
    m.itemText.font.size = 25
    m.itemText.horizAlign = "left"
    m.itemText.vertAlign = "bottom"
    m.itemTextExtra.visible = true
    m.itemTextExtra.font.size = 22

    ' "Program" is from clicking on an "On Now" item on the Home Screen
    if itemData.type = "Program"
        m.itemText.Text = itemData.json.name
        m.itemTextExtra.Text = itemData.json.ChannelName
        if itemData.usePoster
            m.itemPoster.uri = itemData.thumbnailURL
        else
            m.itemPoster.uri = ImageURL(itemData.json.ChannelId)
        end if
        m.itemPoster.loadDisplayMode = "scaleToFill"

        ' Set Episode title if available
        if isValid(itemData.json.EpisodeTitle)
            m.itemTextExtra.text = itemData.json.EpisodeTitle
        end if

        return
    end if

    if itemData.type = "Episode" or LCase(itemData.type) = "recording"
        m.itemText.text = itemData.json.SeriesName

        if itemData.PlayedPercentage > 0
            drawProgressBar(itemData)
        end if

        if isValid(userSettings)
            if userSettings["ui.general.episodeimagesnextup"] = "webclient"
                tmpSetting = m.global.session.user.Configuration.useEpisodeImagesInNextUpAndResume
                if isValid(tmpSetting) and tmpSetting
                    m.itemPoster.uri = itemData.thumbnailURL
                else
                    m.itemPoster.uri = itemData.widePosterURL
                end if
            else if userSettings["ui.general.episodeimagesnextup"] = "show"
                m.itemPoster.uri = itemData.widePosterURL
            else if userSettings["ui.general.episodeimagesnextup"] = "episode"
                m.itemPoster.uri = itemData.thumbnailURL
            end if
        else
            ' use show image if user settings are invalid for some reason
            m.itemPoster.uri = itemData.widePosterURL
        end if

        ' Set Series and Episode Number for Extra Text
        extraPrefix = ""
        if isValid(itemData.json.ParentIndexNumber)
            extraPrefix = "S" + StrI(itemData.json.ParentIndexNumber).trim()
        end if
        if isValid(itemData.json.IndexNumber)
            extraPrefix = extraPrefix + "E" + StrI(itemData.json.IndexNumber).trim()
        end if
        if extraPrefix.len() > 0
            extraPrefix = extraPrefix + " - "
        end if

        m.itemTextExtra.text = extraPrefix + itemData.name
        return
    end if

    if itemData.type = "Movie" or itemData.type = "MusicVideo"
        m.itemText.text = itemData.name

        if itemData.PlayedPercentage > 0
            drawProgressBar(itemData)
        end if

        ' Use best image, but fallback to secondary if it's empty
        if (itemData.imageWidth = 180 and itemData.posterURL <> "") or itemData.thumbnailURL = ""
            m.itemPoster.uri = itemData.posterURL
        else
            m.itemPoster.uri = itemData.thumbnailURL
        end if

        ' Set Release Year and Age Rating for Extra Text
        textExtra = ""
        if isValid(itemData.json.ProductionYear)
            textExtra = StrI(itemData.json.ProductionYear).trim()
        end if
        if isValid(itemData.json.OfficialRating)
            if textExtra <> ""
                textExtra = textExtra + " - " + itemData.json.OfficialRating
            else
                textExtra = itemData.json.OfficialRating
            end if
        end if
        m.itemTextExtra.text = textExtra

        return
    end if

    if itemData.type = "Video"
        m.itemText.text = itemData.name

        if itemData.PlayedPercentage > 0
            drawProgressBar(itemData)
        end if

        if itemData.imageWidth = 180
            m.itemPoster.uri = itemData.posterURL
        else
            m.itemPoster.uri = itemData.thumbnailURL
        end if

        return
    end if

    if itemData.type = "BoxSet"
        m.itemText.text = itemData.name
        m.itemPoster.uri = itemData.posterURL

        ' Set small text to number of items in the collection
        if isValid(itemData.json) and isValid(itemData.json.ChildCount)
            m.itemTextExtra.text = StrI(itemData.json.ChildCount).trim() + " item"
            if itemData.json.ChildCount > 1
                m.itemTextExtra.text += "s"
            end if
        end if
        return
    end if

    if itemData.type = "Series"

        m.itemText.text = itemData.name

        if itemData.usePoster = true
            if itemData.imageWidth = 180
                m.itemPoster.uri = itemData.posterURL
            else
                m.itemPoster.uri = itemData.widePosterURL
            end if
        else
            m.itemPoster.uri = itemData.thumbnailURL
        end if

        textExtra = ""
        if isValid(itemData.json.ProductionYear)
            textExtra = StrI(itemData.json.ProductionYear).trim()
        end if

        ' Set Years Run for Extra Text
        if itemData.json.Status = "Continuing"
            textExtra = textExtra + " - Present"
        else if itemData.json.Status = "Ended" and isValid(itemData.json.EndDate)
            textExtra = textExtra + " - " + LEFT(itemData.json.EndDate, 4)
        end if
        m.itemTextExtra.text = textExtra

        return
    end if

    if itemData.type = "MusicAlbum"
        m.itemText.text = itemData.name
        m.itemTextExtra.text = itemData.json.AlbumArtist
        m.itemPoster.uri = itemData.posterURL
        return
    end if

    if itemData.type = "MusicArtist"
        m.itemText.text = itemData.name
        m.itemTextExtra.text = itemData.json.AlbumArtist
        m.itemPoster.uri = ImageURL(itemData.id)
        return
    end if

    if itemData.type = "Audio"
        m.itemText.text = itemData.name
        m.itemTextExtra.text = itemData.json.AlbumArtist
        m.itemPoster.uri = ImageURL(itemData.id)
        return
    end if

    if itemData.type = "TvChannel"
        m.itemText.text = itemData.name
        m.itemTextExtra.text = itemData.json.AlbumArtist
        m.itemPoster.uri = ImageURL(itemData.id)
        return
    end if

    if itemData.type = "Season"
        m.itemText.text = itemData.json.SeriesName
        m.itemTextExtra.text = itemData.name
        m.itemPoster.uri = ImageURL(itemData.id)
        return
    end if

    if itemData.type = "Photo"
        m.itemText.text = itemData.name
        m.itemPoster.uri = ImageURL(itemData.id)

        ' subtext
        if isValidAndNotEmpty(itemData.json)
            if isValid(itemData.json.ProductionYear)
                m.itemTextExtra.text = itemData.json.ProductionYear.ToStr().trim()
            end if
            if isValidAndNotEmpty(itemData.json.Album)
                if m.itemTextExtra.text = ""
                    m.itemTextExtra.text = tr("Album") + ": " + itemData.json.Album.trim()
                else
                    m.itemTextExtra.text = m.itemTextExtra.text + " - " + tr("Album") + ": " + itemData.json.Album.trim()
                end if
            end if
        end if
        return
    end if

    if itemData.type = "PhotoAlbum"
        m.itemText.text = itemData.name
        m.itemPoster.uri = ImageURL(itemData.id)

        ' subtext
        if isValid(itemData.json.ChildCount)
            m.itemTextExtra.text = itemData.json.ChildCount.ToStr().trim() + " items"
        end if

        return
    end if

    m.log.warn("Unhandled Home Item Type", itemData.type)
end sub

'
' Draws and animates item progress bar
sub drawProgressBar(itemData)
    m.itemProgressBackground.width = itemData.imageWidth
    m.itemProgressBackground.visible = true
    m.showProgressBarField.keyValue = [0, m.itemPoster.width * (itemData.PlayedPercentage / 100)]
    m.showProgressBarAnimation.control = "Start"
end sub

'
' Enable title scrolling based on item Focus
sub focusChanged()

    if m.top.itemHasFocus = true
        m.itemText.repeatCount = -1
    else
        m.itemText.repeatCount = 0
    end if

end sub

'Hide backdrop and icon when poster loaded
sub onPosterLoadStatusChanged()
    if m.itemPoster.loadStatus = "ready" and m.itemPoster.uri <> ""
        m.backdrop.visible = false
        m.itemIcon.visible = false
    else
        m.backdrop.visible = true
        m.itemIcon.visible = true
    end if
end sub