Skip to content

feat-homerows - Port custom Seerr, IMDb, TMDb, and Upcoming Calendar rows to Roku - #158

Open
mattsigal wants to merge 8 commits into
Moonfin-Client:masterfrom
mattsigal:feature/roku-custom-rows
Open

feat-homerows - Port custom Seerr, IMDb, TMDb, and Upcoming Calendar rows to Roku#158
mattsigal wants to merge 8 commits into
Moonfin-Client:masterfrom
mattsigal:feature/roku-custom-rows

Conversation

@mattsigal

@mattsigal mattsigal commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

Pull Request

Summary

Add support for custom dynamic home screen rows to Roku. Ported TMDb charts, Seerr rows, and custom Letterboxd/MDBList lists resolved by the server plugin to the Roku client app. Add "External Lists" settings (IMDb, TMDB, Seerr lists, and Upcoming Calendars) with bi-directional server synchronization.

Related Issues

Link related issues or tickets separated by commas.

Type of Change

  • Bug fix
  • New feature
  • Refactor
  • Performance improvement
  • UI/UX update
  • Documentation update
  • Build/CI change
  • Other (describe):

Changes Made

List the key changes included in this PR.

  • Added support in LoadItemsTask.xml and LoadItemsTask.bs to dynamically fetch and process TMDb, Seerr, and custom plugin-dynamic rows.
  • Implemented row creation and asynchronous SceneGraph rendering in HomeRows.bs for these custom server rows.
  • Added an External Lists settings subpage menu in settings.json containing toggles for IMDb Lists, TMDB Lists, Seerr Lists, and Upcoming Calendars.
  • Added bi-directional server-side synchronization for the new settings and nested seerrRows config in settingsSync.bs.

Testing

Describe how this change was tested.

  • Tested on physical Roku device
  • Tested via sideload
  • Manual testing completed
  • Not tested (explain why): To be tested by Jenn later today.

Test Steps

  1. Built the project via npm run build and sideloaded the output zip.
  2. Navigated to Settings -> Moonfin Settings -> External Lists and verified that IMDb, TMDB, Seerr, and Upcoming Calendars submenus render successfully.
  3. Toggled various lists and calendars, and verified that settings sync bi-directionally with the backend settings profile.
  4. Verified that the custom rows load, render titles, and show item posters correctly on the Home screen.

Screenshots (if applicable)

Include screenshots or recordings for UI changes.

Checklist

  • Code builds successfully
  • Code follows project style and conventions
  • No unnecessary commented-out code
  • No new warnings introduced

- Declared additionalData on LoadItemsTask.xml.
- Implemented loadCustomDynamicList in LoadItemsTask.bs to handle custom rows (IMDb/TMDb/Seerr/mdblist/letterboxd).
- Implemented createCustomDynamicRow and updateCustomDynamicRowItems in HomeRows.bs to render custom rows.
- Packed SeerrItem on dynamic nodes to support navigation to SeerrDetailsScreen on selection.
@mattsigal mattsigal changed the title feature: port custom Seerr, IMDb, and TMDb rows to Roku feature: port custom Seerr, IMDb, TMDb, and Upcoming Calendar rows to Roku Jul 20, 2026
@mattsigal mattsigal changed the title feature: port custom Seerr, IMDb, TMDb, and Upcoming Calendar rows to Roku feat-homerows - Port custom Seerr, IMDb, TMDb, and Upcoming Calendar rows to Roku Jul 20, 2026
@jmawet

jmawet commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

Close #123, #132

@jmawet

jmawet commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

When toggling the seerr row settings, the app crashes

Suspending threads...
Thread selected:  1*   ...source/utils/settingsSync.brs(594)          return (userSettings[key] = "true" or userSettings[key] = true)

Current Function:
591:  function settingsSync_GetSeerrRowValue(key as string, defaultValue = true as boolean) as boolean
592:      userSettings = m.global.session.user.settings
593:      if isValid(userSettings) and isValid(userSettings[key])
594:*         return (userSettings[key] = "true" or userSettings[key] = true)
595:      end if
596:      regVal = registry_read(key, m.global.session.user.id)
597:      if isValid(regVal)
598:          return (regVal = "true")
Source Digest(s): 
pkg:    dev 1.4.3 646bec49 Moonfin
pkg: 632126 1.1.5 f61bb4f9 libplayready

Type Mismatch. Operator "=" can't be applied to "roBoolean" and "String". (runtime error &h18) in pkg:/source/utils/settingsSync.brs(594)
Backtrace:
#3  Function settingssync_getseerrrowvalue(key As String, defaultvalue As Boolean) As Boolean
   file/line: pkg:/source/utils/settingsSync.brs(594)
#2  Function settingssync_preparepush(rokukey As String, rokuvalue As Dynamic) As Dynamic
   file/line: pkg:/source/utils/settingsSync.brs(535)
#1  Function syncsettingtoserver(rokukey As String, rokuvalue As Dynamic) As Void
   file/line: pkg:/components/settings/settings.brs(644)
#0  Function boolsettingchanged() As Void
   file/line: pkg:/components/settings/settings.brs(2105)
Local Variables:
key              String (VT_STR_CONST) val:"seerr.row.trending_movies"
defaultvalue     Boolean val:true
global           Interface:ifGlobal
m                roAssociativeArray refcnt=5 count:39
usersettings     roAssociativeArray refcnt=1 count:173
regval           <uninitialized>
Threads:
ID    Location                                Source Code
 0    pkg:/source/Main.brs(116)                      msg = wait(0, m.port)
 1*   ...source/utils/settingsSync.brs(594)          return (userSettings[key] = "true" or userSettings[key] = true)
  *selected

I can tell you're trying to catch both the bool and the string versions of "true", but roku does not like that one bit.
You should be able to change it to just "return userSettings[key]" since they're all bools only. I'll test and request change if it works

@jmawet

jmawet commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Also the imdb row did not appear on the home screen, even after I enabled it in home sections (although the home sections options do appear to be following the toggles at least, as in I only see options for rows I've enabled, so that part is working at least)

@mattsigal

Copy link
Copy Markdown
Collaborator Author

OK! I'll review and update after dinner :)

@jmawet

jmawet commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

ok I was able to fix 2 issues so far mattsigal#2

  1. the new "external lists" settings section was not getting placed in the right parent section
  2. toggling/enabling the seerr lists crashed the app

remaining issues to fix:

  1. imdb rows not populating (i got an empty row to appear for a sec, but after restart it's gone?)
  2. seerr rows are getting placed 2-3 rows above where they're supposed to?

@mattsigal

Copy link
Copy Markdown
Collaborator Author

Thanks! Still cookin' but I'll look soon 👍

@jmawet

jmawet commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

for more info, here is my home row order in settings:

  • my media
  • cwnu
  • recently added
  • recently released
  • seerr trending

and here is what shows up on the home screen:

  • my media
  • cwnu
  • seerr trending??
  • recently added
  • recently released

same in #160 those rows show up between cwnu and recents rows. now I'm hoping it's not the recents rows that are putting themselves on the bottom :(

@jmawet

jmawet commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator
image image (the missing posters is just roku being dumb and slow)

the rows work, but order is wrong

- Use getOriginalSectionIndex to insert favorites, mylist, nextup, and custom dynamic rows into their settings-configured slots.
- Initialize paramsJson to "{}" to prevent the Jellyfin server plugin from throwing a 400 Bad Request error when loading IMDb list rows.
- Introduce a stable `sortHomeRows()` function in `HomeRows.bs` using insertion sort on settings indices to resolve row ordering bugs.
- Centralize row insertion and replacement in a new `addOrUpdateHomeRow()` helper.
- Update favorites, mylist, resume, nextup, and custom dynamic lists to use the new helper, preserving the configured order regardless of asynchronous load speed.
@mattsigal
mattsigal force-pushed the feature/roku-custom-rows branch from 79b542a to 5ec8bf5 Compare July 21, 2026 04:06
@jmawet

jmawet commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator
image

winner winner chicken dinner

@mattsigal

Copy link
Copy Markdown
Collaborator Author

winner winner chicken dinner

we came
we saw
we roku'd

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] New external home rows [Feature] Seerr rows

2 participants