import "pkg:/source/utils/misc.bs" import "pkg:/source/utils/config.bs" sub init() m.title = m.top.findNode("title") m.title.text = tr("Loading...") m.overview = m.top.findNode("overview") m.poster = m.top.findNode("poster") m.rating = m.top.findnode("rating") m.infoBar = m.top.findnode("infoBar") m.progressBackground = m.top.findNode("progressBackground") m.progressBar = m.top.findnode("progressBar") m.playedIndicator = m.top.findNode("playedIndicator") m.checkmark = m.top.findNode("checkmark") m.checkmark.font.size = 35 m.videoCodec = m.top.findNode("video_codec") end sub sub itemContentChanged() item = m.top.itemContent itemData = item.json ' Set default video source if user hasn't selected one yet if item.selectedVideoStreamId = "" and isValid(itemData.MediaSources) item.selectedVideoStreamId = itemData.MediaSources[0].id end if if isValid(itemData.indexNumber) indexNumber = itemData.indexNumber.toStr() + ". " else indexNumber = "" end if m.title.text = indexNumber + item.title m.overview.text = item.overview if isValid(itemData.PremiereDate) airDate = CreateObject("roDateTime") airDate.FromISO8601String(itemData.PremiereDate) m.top.findNode("aired").text = tr("Aired") + ": " + airDate.AsDateString("short-month-no-weekday") end if imageUrl = item.posterURL if m.global.session.user.settings["ui.tvshows.blurunwatched"] = true if itemData.lookup("Type") = "Episode" if not itemData.userdata.played imageUrl = imageUrl + "&blur=15" end if end if end if m.poster.uri = imageUrl if type(itemData.RunTimeTicks) = "roInt" or type(itemData.RunTimeTicks) = "LongInteger" runTime = getRuntime() if runTime < 2 m.top.findNode("runtime").text = "1 min" else m.top.findNode("runtime").text = stri(runTime).trim() + " mins" end if if m.global.session.user.settings["ui.design.hideclock"] <> true m.top.findNode("endtime").text = tr("Ends at %1").Replace("%1", getEndTime()) end if end if if m.global.session.user.settings["ui.tvshows.disableCommunityRating"] = false if isValid(itemData.communityRating) m.top.findNode("star").visible = true m.top.findNode("communityRating").text = str(int(itemData.communityRating * 10) / 10) else m.top.findNode("star").visible = false end if else m.rating.visible = false m.infoBar.itemSpacings = [20, -25, 20, 20] end if ' Add checkmark in corner (if applicable) if isValid(itemData.UserData) and isValid(itemData.UserData.Played) and itemData.UserData.Played = true m.playedIndicator.visible = true end if ' Add progress bar on bottom (if applicable) if isValid(itemData.UserData) and isValid(itemData.UserData.PlayedPercentage) and itemData.UserData.PlayedPercentage > 0 m.progressBackground.width = m.poster.width m.progressBackground.visible = true progressWidthInPixels = int(m.progressBackground.width * itemData.UserData.PlayedPercentage / 100) m.progressBar.width = progressWidthInPixels m.progressBar.visible = true end if ' Display current video_codec and check if there is more than one video to choose from... m.videoCodec.visible = false if isValid(itemData.MediaSources) for i = 0 to itemData.MediaSources.Count() - 1 if item.selectedVideoStreamId = itemData.MediaSources[i].id and isValid(itemData.MediaSources[i].MediaStreams[0]) m.videoCodec.text = tr("Video") + ": " + itemData.MediaSources[i].MediaStreams[0].DisplayTitle SetupAudioDisplay(itemData.MediaSources[i].MediaStreams, item.selectedAudioStreamIndex) exit for end if end for m.videoCodec.visible = true DisplayVideoAvailable(itemData.MediaSources) end if end sub ' Display current audio_codec and check if there is more than one audio track to choose from... sub SetupAudioDisplay(mediaStreams as object, selectedAudioStreamIndex as integer) audioIdx = invalid if isValid(mediaStreams) for i = 0 to mediaStreams.Count() - 1 if LCase(mediaStreams[i].Type) = "audio" and audioIdx = invalid if selectedAudioStreamIndex > 0 and selectedAudioStreamIndex < mediaStreams.Count() audioIdx = selectedAudioStreamIndex else audioIdx = i end if m.top.findNode("audio_codec").text = tr("Audio") + ": " + mediaStreams[audioIdx].DisplayTitle end if if isValid(audioIdx) then exit for end for end if if isValid(audioIdx) m.top.findNode("audio_codec").visible = true DisplayAudioAvailable(mediaStreams) else m.top.findNode("audio_codec").visible = false end if end sub ' Adds "+N" (e.g. +1) if there is more than one video version to choose from sub DisplayVideoAvailable(streams as object) count = 0 for i = 0 to streams.Count() - 1 if LCase(streams[i].VideoType) = "videofile" count++ end if end for if count > 1 m.top.findnode("video_codec_count").text = "+" + stri(count - 1).trim() end if end sub ' Adds "+N" (e.g. +1) if there is more than one audio track to choose from sub DisplayAudioAvailable(streams as object) count = 0 for i = 0 to streams.Count() - 1 if streams[i].Type = "Audio" count++ end if end for if count > 1 m.top.findnode("audio_codec_count").text = "+" + stri(count - 1).trim() end if end sub function getRuntime() as integer itemData = m.top.itemContent.json ' A tick is .1ms, so 1/10,000,000 for ticks to seconds, ' then 1/60 for seconds to minutess... 1/600,000,000 return int(itemData.RunTimeTicks / 600000000.0) end function function getEndTime() as string itemData = m.top.itemContent.json date = CreateObject("roDateTime") duration_s = int(itemData.RunTimeTicks / 10000000.0) date.fromSeconds(date.asSeconds() + duration_s) date.toLocalTime() return formatTime(date) end function sub focusChanged() if m.top.itemHasFocus = true ' text to speech for accessibility if m.global.device.isAudioGuideEnabled = true txt2Speech = CreateObject("roTextToSpeech") txt2Speech.Flush() txt2Speech.Say(m.title.text) txt2Speech.Say(m.overview.text) end if end if end sub