From 9bfc1359e0302da87dd5bbd275f979f560a22444 Mon Sep 17 00:00:00 2001 From: Matthew Sigal Date: Wed, 8 Jul 2026 10:19:09 -0700 Subject: [PATCH 1/2] feat: add sync mappings for hidden Continue Watching and Next Up lists --- source/utils/settingsSync.bs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/utils/settingsSync.bs b/source/utils/settingsSync.bs index 872d9aac7..e1d2c2bfd 100644 --- a/source/utils/settingsSync.bs +++ b/source/utils/settingsSync.bs @@ -34,7 +34,9 @@ namespace settingsSync { pluginKey: "themeMusicEnabled", rokuKey: "playback.thememusic.enabled", type: "bool" }, { pluginKey: "mdblistEnabled", rokuKey: "plugin.mdblist.enabled", type: "bool" }, { pluginKey: "tmdbEpisodeRatingsEnabled", rokuKey: "plugin.tmdb.episodeRatings", type: "bool" }, - { pluginKey: "jellyseerrEnabled", rokuKey: "jellyseerr.enabled", type: "bool" } + { pluginKey: "jellyseerrEnabled", rokuKey: "jellyseerr.enabled", type: "bool" }, + { pluginKey: "hiddenContinueWatchingItems", rokuKey: "ui.home.hiddenContinueWatchingItems", type: "direct" }, + { pluginKey: "hiddenNextUpSeries", rokuKey: "ui.home.hiddenNextUpSeries", type: "direct" } ] end function From 5cc9acf40f01fed3ebee7cf900849bf548433c23 Mon Sep 17 00:00:00 2001 From: RadicalMuffinMan <103554043+RadicalMuffinMan@users.noreply.github.com> Date: Thu, 9 Jul 2026 23:03:11 -0400 Subject: [PATCH 2/2] Actually filter hidden Continue Watching and Next Up items on the home screen Read the synced hidden maps and drop matching items from the continue watching, next up, and merged rows. --- components/home/LoadItemsTask.bs | 56 +++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/components/home/LoadItemsTask.bs b/components/home/LoadItemsTask.bs index b5705dde0..0144312e9 100644 --- a/components/home/LoadItemsTask.bs +++ b/components/home/LoadItemsTask.bs @@ -179,6 +179,52 @@ function loadRecentlyReleased() as object return results end function +' Reads a synced hidden-items map from settings. Keys are item or series ids, +' values are the ISO time each was hidden. +function getHiddenItemsMap(settingKey as string) as object + raw = m.global.session.user.settings[settingKey] + if not isValid(raw) or raw = "" then return {} + parsed = ParseJson(raw) + if not isValid(parsed) or Type(parsed) <> "roAssociativeArray" then return {} + return parsed +end function + +' True when an item is hidden and has not been played since it was hidden. +' seriesOnly keys on the series id only, otherwise it falls back to the item id. +function isHiddenByMap(itemJson as object, hiddenMap as object, seriesOnly as boolean) as boolean + if hiddenMap.Count() = 0 or not isValid(itemJson) then return false + + seriesId = itemJson.SeriesId + key = invalid + if isValid(seriesId) and seriesId <> "" + key = seriesId + else if not seriesOnly + key = itemJson.Id + end if + if not isValid(key) or key = "" then return false + + hideTime = hiddenMap[key] + if not isValid(hideTime) then return false + + userData = itemJson.UserData + if isValid(userData) + lastPlayed = userData.LastPlayedDate + if isValid(lastPlayed) and lastPlayed <> "" and lastPlayed > hideTime then return false + end if + return true +end function + +function filterHiddenResults(results as object, hiddenMap as object, seriesOnly as boolean) as object + if hiddenMap.Count() = 0 then return results + filtered = [] + for each entry in results + if not isHiddenByMap(entry.json, hiddenMap, seriesOnly) + filtered.push(entry) + end if + end for + return filtered +end function + function loadContinueWatching() as object results = [] @@ -230,13 +276,16 @@ function loadContinueWatching() as object results.push(tmp) end for - return results + return filterHiddenResults(results, getHiddenItemsMap("ui.home.hiddenContinueWatchingItems"), false) end function ' Load merged Continue Watching and Next Up items function loadMergedContinueWatching() as object results = [] + hiddenCW = getHiddenItemsMap("ui.home.hiddenContinueWatchingItems") + hiddenNU = getHiddenItemsMap("ui.home.hiddenNextUpSeries") + ' Load Continue Watching items resumeParams = { recursive: true, @@ -280,6 +329,7 @@ function loadMergedContinueWatching() as object ' Add Continue Watching items first if isChainValid(resumeData, "Items") for each item in resumeData.Items + if isHiddenByMap(item, hiddenCW, false) then continue for tmp = createSGNode("HomeData") tmp.Id = item.LookupCI("Id") tmp.name = item.LookupCI("name") @@ -347,6 +397,7 @@ function loadMergedContinueWatching() as object if userData["LastPlayedDate"] = invalid and isValid(seriesId) userData["LastPlayedDate"] = seriesLastPlayedMap[seriesId] end if + if isHiddenByMap(item, hiddenNU, true) then continue for ' Only add if not already in resume items if not resumeItemIds.DoesExist(itemId) tmp = createSGNode("HomeData") @@ -770,6 +821,8 @@ end function function loadNextUp() as object results = [] + hiddenNU = getHiddenItemsMap("ui.home.hiddenNextUpSeries") + params = { recursive: true, SortBy: "DatePlayed", @@ -800,6 +853,7 @@ function loadNextUp() as object if isChainValid(data, "Items") for each item in data.Items + if isHiddenByMap(item, hiddenNU, true) then continue for tmp = createSGNode("HomeData") tmp.json = item results.push(tmp)