diff --git a/components/ItemGrid/GridItem.bs b/components/ItemGrid/GridItem.bs index 400a77e3f..4df67550a 100644 --- a/components/ItemGrid/GridItem.bs +++ b/components/ItemGrid/GridItem.bs @@ -112,6 +112,21 @@ sub itemContentChanged() else m.itemText.text = itemData.Title end if + ' Adjust to wide posters for "View All Next Up" + if m.topParent.overhangTitle = tr("View All Next Up") + m.posterMask.maskUri = "" + + m.itemPoster.height = 300 + m.itemPoster.width = 400 + m.itemPoster.loadDisplayMode = "scaleToFit" + + m.backdrop.height = 300 + m.backdrop.width = 400 + m.backdrop.loadDisplayMode = "scaleToFit" + + m.itemText.translation = [0, m.itemPoster.height + 7] + m.itemText.maxWidth = 400 + end if else if itemData.type = "MusicArtist" m.itemPoster.uri = itemData.PosterUrl m.itemText.text = itemData.Title diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index 654b232a6..6a5e768a2 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -198,6 +198,14 @@ sub loadInitialItems() ' non recursive for collections (folders, boxsets, photo albums, etc) m.loadItemsTask.recursive = false end if + + if getCollectionType() = "nextup" + m.loadItemsTask.itemType = "NextUp" + m.itemGrid.itemSize = "[400, 300]" + m.top.imageDisplayMode = "scaleToFit" + m.itemGrid.numColumns = 4 + m.alpha.visible = false + end if else if m.top.parentItem.json.type = "Studio" m.loadItemsTask.itemId = m.top.parentItem.parentFolder m.loadItemsTask.itemType = "Series,Movie" @@ -402,7 +410,6 @@ sub SetUpOptions() setPhotoAlbumOptions(options) else if getCollectionType() = "music" setMusicOptions(options) - else setDefaultOptions(options) end if @@ -786,7 +793,7 @@ function onKeyEvent(key as string, press as boolean) as boolean searchGrp.setFocus(false) end if - if key = "options" + if key = "options" and getCollectionType() <> "nextup" if m.options.visible = true m.options.visible = false m.top.removeChild(m.options) @@ -836,7 +843,7 @@ function onKeyEvent(key as string, press as boolean) as boolean m.top.quickPlayNode = itemToPlay return true end if - else if key = "left" and topGrp.isinFocusChain() + else if key = "left" and topGrp.isinFocusChain() and m.alpha.visible m.top.alphaActive = true topGrp.setFocus(false) m.alphaMenu.setFocus(true) diff --git a/components/ItemGrid/LoadItemsTask2.bs b/components/ItemGrid/LoadItemsTask2.bs index 2a7292d90..2290103d1 100644 --- a/components/ItemGrid/LoadItemsTask2.bs +++ b/components/ItemGrid/LoadItemsTask2.bs @@ -130,6 +130,11 @@ sub loadItems() url = Substitute("Users/{0}/Items/", m.global.session.user.id) params.append({ ImageTypeLimit: 1 }) params.append({ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }) + else if LCase(m.top.ItemType) = "nextup" + url = "Shows/NextUp" + params.limit = 100 ' If you have more than 100 in your Next Up queue, maybe go outside a bit more. + params.append({ ImageTypeLimit: 1 }) + params.append({ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }) else url = Substitute("Users/{0}/Items/", m.global.session.user.id) end if @@ -194,6 +199,10 @@ sub loadItems() tmp.image = PosterImage(item.id, { "maxHeight": 425, "maxWidth": 290, "quality": "90" }) else if item.type = "Episode" tmp = CreateObject("roSGNode", "TVEpisode") + if LCase(m.top.ItemType) = "nextup" + tmp.title = item.name + tmp.type = "Episode" + end if else if LCase(item.Type) = "recording" tmp = CreateObject("roSGNode", "RecordingData") else if item.Type = "Genre" @@ -281,7 +290,7 @@ sub loadItems() end if if tmp <> invalid - if item.Type <> "Genre" and item.Type <> "MusicGenre" + if LCase(item.Type) <> "genre" and LCase(item.Type) <> "musicgenre" tmp.parentFolder = m.top.itemId tmp.json = item if item.UserData <> invalid and item.UserData.isFavorite <> invalid diff --git a/components/data/HomeData.bs b/components/data/HomeData.bs index 196274507..01b00be21 100644 --- a/components/data/HomeData.bs +++ b/components/data/HomeData.bs @@ -19,15 +19,17 @@ sub setData() ' Set appropriate Images for Wide and Tall based on type - if datum.type = "CollectionFolder" or datum.type = "UserView" - params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 } - m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) - m.top.widePosterUrl = m.top.thumbnailURL + if LCase(datum.type) = "collectionfolder" or LCase(datum.type) = "userview" + if IsValid(datum.ImageTags) + params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 } + m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) + m.top.widePosterUrl = m.top.thumbnailURL + end if ' Add Icon URLs for display if there is no Poster - if datum.CollectionType = "livetv" + if LCase(m.top.CollectionType) = "livetv" m.top.iconUrl = "pkg:/images/media_type_icons/live_tv_white.png" - else if datum.CollectionType = "folders" + else if LCase(m.top.CollectionType) = "folders" or LCase(m.top.CollectionType) = "nextup" m.top.iconUrl = "pkg:/images/media_type_icons/folder_white.png" end if diff --git a/components/home/LoadItemsTask.bs b/components/home/LoadItemsTask.bs index 1c3049e9e..f947d1250 100644 --- a/components/home/LoadItemsTask.bs +++ b/components/home/LoadItemsTask.bs @@ -85,6 +85,9 @@ sub loadItems() end if end if + addViewAll = true ' Assume there will be a "View All" to start + checkViewAll = false ' Only need to check if we don't have anything in the Next Up home row + resp = APIRequest(url, params) data = getJson(resp) if isValid(data) and isValid(data.Items) @@ -93,6 +96,36 @@ sub loadItems() tmp.json = item results.push(tmp) end for + if data.Items.Count() = 0 + checkViewAll = true + end if + else + checkViewAll = true + end if + + ' Add "View All" + if checkViewAll + ' Nothing to show in Next Up, but are there hidden items (e.g. > 365 days old)? + params.Delete("NextUpDateCutoff") + params["limit"] = 1 ' if there is even one, then we know we need to show "View All" + resp = APIRequest(url, params) + data = getJson(resp) + if not isValid(data) or isValid(data) and isValid(data.Items) and data.Items.Count() = 0 + addViewAll = false + end if + end if + + if addViewAll + tmp = CreateObject("roSGNode", "HomeData") + tmp.type = "CollectionFolder" + tmp.usePoster = false + tmp.json = { + IsFolder: true, + Name: tr("View All Next Up"), + Type: "CollectionFolder", + CollectionType: "nextup" + } + results.push(tmp) end if ' Load Continue Watching else if m.top.itemsToLoad = "continue" diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index 81c122358..fe5666d25 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1271,6 +1271,11 @@ Ratings for how good a movie is User Setting - Setting description + + View All Next Up + View All Next Up + Title for viewing all episodes available in the Next Up section + Rewatching Next Up Rewatching Next Up diff --git a/source/Main.bs b/source/Main.bs index 814d1dff7..14e25f93b 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -268,6 +268,9 @@ sub Main (args as dynamic) as void group = CreateMovieLibraryView(selectedItem) else if selectedItem.collectionType = "music" group = CreateMusicLibraryView(selectedItem) + else if selectedItem.collectionType = "nextup" + group = CreateItemGrid(selectedItem) + group.optionsAvailable = false else group = CreateItemGrid(selectedItem) end if