Skip to content

feat: add themes, release date sorting and navigation fixes - #37

Merged
blurbery merged 2 commits into
mainfrom
feat/home-themes-navigation-polish
Sep 27, 2026
Merged

blurbery merged 2 commits into
mainfrom
feat/home-themes-navigation-polish

Conversation

@blurbery

@blurbery blurbery commented Sep 27, 2026 •

Copy link
Copy Markdown
Owner

Problem and reproduction

  • Traversing long Home rows could leave vertical navigation laggy. Home also prepared destination details and playback metadata while browsing.
  • Cold launch could leave profiles unfocused or briefly show the loading logo over them. Privacy and licence text could overlap About, and moving down from a series Resume action could select the wrong season or episode.
  • Movies and Series needed release-date sorting, backgrounds needed a saved theme choice, and Emby posters lacked years despite Title & Year being selected.

Implementation and impact

  • Added Release Date sorting in Movies and Series, with newest and oldest first across Silo, Emby and Jellyfin.
  • Added Graphite, Black and Native themes in General settings, retained across updates and applied to launch, profiles and browsing.
  • Applied the six-media-row Home limit across iOS and tvOS, with a seventh slot reserved for Spotlight even when hidden.
  • Kept empty enabled rows available in both Home settings editors so their reserved slots can be freed.
  • Removed speculative detail and playback loading while browsing Apple TV Home, while retaining the profile Home cache.
  • Released retired Home poster decodes, preserved artwork when returning from details and warmed neighbouring rows around their remembered card.
  • Fixed initial focus on the first Apple TV profile and kept the loading logo out of the profile reveal.
  • Fixed Privacy Policy and Open Source Licences appearing over the About menu on Apple TV.
  • Fixed downward navigation from a series Resume action selecting the wrong season or episode.
  • Fixed Emby poster years across Home, Search, Movies, Series and For You when Title & Year is selected.

Validation

  • Built the device-tested baseline c0b1ba0 with xcodebuild -project iosApp/Vivid.xcodeproj -scheme VividTV -configuration Release -destination 'generic/platform=tvOS' CURRENT_PROJECT_VERSION=57 MARKETING_VERSION=0.14.3 build, using the existing signing configuration and incremental caches.
  • Verified the app and Top Shelf versions and codesign --verify --deep --strict; installed version 0.14.3 (57) was read back successfully.
  • Focused catalogue sorting and Emby field/mapping/caption checks passed during implementation. git diff --cached --check passed before committing.
  • Player regression passed both iOS tests and the tvOS build for c0b1ba0.
  • The empty-row editor follow-up ff83cf2 passed Swift compiler parsing, focused source checks of both cached/fetched editor paths, and whitespace checks. CI passed both iOS tests and the tvOS build for this revision; it has not received a new device installation.

Performance

  • The capped Home configuration was accepted after physical Apple TV testing. No new quantitative benchmark is claimed, and this does not establish smooth uncapped navigation or performance on every device.

Testing status

  • Tested on a physical Apple TV through the local build cycle, ending with 0.14.3 (57), with final confirmation from blurbery.
  • Device-tested source revision: c0b1ba0356e990883bd620d4f7e87a0be9be4f2a.
  • Native focus, themes, launch handoff, legal-page navigation, series entry and Emby captions received device feedback. Fresh iPhone/iPad device checks and broader playback coverage were not performed for this final revision.

Design impact and approval

  • blurbery requested and approved the Home cap, theme options, release-date menu, first-profile focus and navigation/transition corrections in the development conversation.
  • Graphite remains the default. Native retains dark appearance and draws no custom background. Existing profile preferences and playback behaviour are retained.

Documentation impact

  • Updated the existing app design, Apple TV focus, server connections and Emby guides to describe the final behaviour and limits.

AI disclosure

Implemented these changes with Codex as a tool.

Release-Notes:
- Added Release Date sorting in Movies and Series, with newest and oldest first across Silo, Emby and Jellyfin.
- Added Graphite, Black and Native themes in General settings, retained across updates and applied to launch, profiles and browsing.
- Applied the six-media-row Home limit across iOS and tvOS, with a seventh slot reserved for Spotlight even when hidden.
- Removed speculative detail and playback loading while browsing Apple TV Home, while retaining the profile Home cache.
- Released retired Home poster decodes, preserved artwork when returning from details and warmed neighbouring rows around their remembered card.
- Fixed initial focus on the first Apple TV profile and kept the loading logo out of the profile reveal.
- Fixed Privacy Policy and Open Source Licences appearing over the About menu on Apple TV.
- Fixed downward navigation from a series Resume action selecting the wrong season or episode.
- Fixed Emby poster years across Home, Search, Movies, Series and For You when Title & Year is selected.

Implemented these changes with Codex as a tool.
@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Warning

Review limit reached

Next included review available in 40 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository: blurbery/vivid/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: b871d7df-3697-4c8f-9ad0-72da02d8e2c4

📥 Commits

Reviewing files that changed from the base of the PR and between c0b1ba0 and ff83cf2.

📒 Files selected for processing (3)
  • docs/apple-tv-focus.md
  • iosApp/iosApp/Screens/Settings/InterfaceCustomizationView.swift
  • iosApp/iosApp/tvOS/Screens/Settings/TVGeneralSettingsView.swift
📝 Walkthrough

Walkthrough

The changes add saved appearance themes, update Home row and artwork handling, adjust tvOS profile and episode focus, add catalogue metadata and sorting, and change tvOS Settings reading-page navigation.

Changes

Saved appearance and startup

Layer / File(s) Summary
Theme options and settings
iosApp/iosApp/Theme/VividAppTheme.swift, iosApp/iosApp/Screens/Settings/GeneralSettingsView.swift, iosApp/iosApp/tvOS/Screens/Settings/TVGeneralSettingsView.swift, iosApp/iosApp/tvOS/Screens/Settings/TVSettingsView.swift, docs/app-design.md, docs/apple-tv-focus.md
Adds persisted Graphite, Black and Native theme choices and selection controls. Documentation describes the themes and their use.
Theme canvas across pages
iosApp/iosApp/Extensions/ViewExtensions.swift, iosApp/iosApp/Downloads/DownloadsView.swift, iosApp/iosApp/Screens/..., iosApp/iosApp/tvOS/Profiles/TVLoginPreparation.swift, iosApp/iosApp/tvOS/Profiles/TVSavedAccountViews.swift, iosApp/iosApp/tvOS/Components/VividStartupView.swift
Pages use the saved theme backdrop. Mobile detail surfaces use artwork-colour treatment only for Graphite.
Startup handoff and profile focus
iosApp/iosApp/ContentView.swift, iosApp/iosApp/Screens/Profiles/*, iosApp/iosApp/tvOS/Profiles/TVSavedAccountViews.swift, iosApp/iosApp/tvOS/Screens/Components/TVProfileTile.swift, docs/app-design.md, docs/apple-tv-focus.md
The startup handoff uses separate logo and destination fades. Profile selection adds delayed initial focus and keeps controls disabled during the handoff.

Home rows and artwork handling

Layer / File(s) Summary
Shared Home row limit
iosApp/iosApp/Screens/Home/HomeViewModel.swift, iosApp/iosApp/Screens/Settings/InterfaceCustomizationView.swift, iosApp/iosApp/tvOS/Screens/Settings/TVGeneralSettingsView.swift, docs/apple-tv-focus.md
Home preferences and editors enforce a six-row limit across iOS and tvOS, with a reserved Spotlight slot.
Home payload and artwork handling
iosApp/iosApp/Components/EpisodeThumbCard.swift, iosApp/iosApp/tvOS/Caching/*, iosApp/iosApp/tvOS/Components/TVFocusMarquee.swift, iosApp/iosApp/tvOS/Components/TVHomeDiscoveryFeed.swift, iosApp/iosApp/tvOS/Components/VividCollectionMediaRow.swift, iosApp/iosApp/Screens/Home/SectionRow.swift, docs/apple-tv-focus.md
Apple TV Home changes its detail and playback loading, artwork retention and cache handling, and artwork warming behaviour.

tvOS series episode focus

Layer / File(s) Summary
Hero episode focus handoff
iosApp/iosApp/tvOS/Screens/Detail/TVEpisodeRail.swift, iosApp/iosApp/tvOS/Screens/Detail/TVSeriesDetailView.swift, docs/apple-tv-focus.md
The episode shelf receives the playback episode and waits for its episode card before moving focus to it.

Catalogue metadata and sorting

Layer / File(s) Summary
Production year and release-date sorting
iosApp/iosApp/Networking/EmbyProvider.swift, iosApp/iosApp/Networking/JellyfinProvider.swift, iosApp/iosApp/Screens/Browse/Filtering/CatalogSortKey.swift, docs/cores/emby.md, docs/server-connections.md
Emby requests production years for media lists. Movies and series add Release Date sorting with provider-specific date fields.

tvOS Settings reading pages

Layer / File(s) Summary
Settings reading destinations
iosApp/iosApp/Screens/Settings/AboutSettingsView.swift, iosApp/iosApp/Screens/Settings/OpenSourceAcknowledgementsView.swift, iosApp/iosApp/tvOS/Screens/Settings/TVSettingsComponents.swift, docs/apple-tv-focus.md
Privacy Policy and Open Source Licences now open as Settings navigation destinations and use environment dismissal.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Merge Risk: 🟡 Moderate · up to c0b1b

Fix the episode-focus handoff and the Home row editor before merging: one can navigate to the wrong episode, and the other can prevent choosing a replacement Home row. The two documentation corrections are smaller.

Security Architecture Review

Security architecture risk: 🔵 Low · up to c0b1b

The reviewed account and profile switching paths clear prior Home content before loading the next profile, and the Apple TV change reduces the detail data retained in its Home cache. No introduced security issue was established, though review coverage is incomplete.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The material exposure considered here is profile-specific media metadata on a shared client device. The inspected account and profile transitions clear prior cached responses before the next Home hydration.

Trust Boundaries and Controls

  • observed — Saved-account selection restores the selected account before rebuilding Home. Account restoration clears the global response cache, while profile cleanup removes Home entries; cache preparation and Home fetches also check transition generations.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.93% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 43 functions across 40 files. (4 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarises the main changes: themes, release-date sorting and navigation fixes. It is concise and relevant to the changeset.
Description check ✅ Passed The description is detailed and directly covers the themes, sorting, Home behaviour, Apple TV fixes, Emby captions, testing and documentation changes.
Full details: Docstring Coverage

Explanation

Docstring coverage is 20.93% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 43 functions across 40 files. (4 skipped: 4 unsupported.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@blurbery

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

Please review all changes, particularly Home artwork residency and cache scope, initial profile focus and startup handoff, theme persistence, the series season/episode entry focus, release-date sorting and Emby poster captions.

@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: blurbery/vivid/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: f350b2be-957a-4138-94b5-37f6f0af3206

📥 Commits

Reviewing files that changed from the base of the PR and between 15479aa and c0b1ba0.

📒 Files selected for processing (44)
  • docs/app-design.md
  • docs/apple-tv-focus.md
  • docs/cores/emby.md
  • docs/server-connections.md
  • iosApp/iosApp/Components/EpisodeThumbCard.swift
  • iosApp/iosApp/ContentView.swift
  • iosApp/iosApp/Downloads/DownloadsView.swift
  • iosApp/iosApp/Extensions/ViewExtensions.swift
  • iosApp/iosApp/Networking/EmbyProvider.swift
  • iosApp/iosApp/Networking/JellyfinProvider.swift
  • iosApp/iosApp/Screens/Auth/ServerSetupView.swift
  • iosApp/iosApp/Screens/Browse/Filtering/CatalogSortKey.swift
  • iosApp/iosApp/Screens/Browse/LibrariesTabView.swift
  • iosApp/iosApp/Screens/Detail/ItemDetailView.swift
  • iosApp/iosApp/Screens/Detail/Phone/PhoneDetailHero.swift
  • iosApp/iosApp/Screens/Home/HomeView.swift
  • iosApp/iosApp/Screens/Home/HomeViewModel.swift
  • iosApp/iosApp/Screens/Home/SectionRow.swift
  • iosApp/iosApp/Screens/Profiles/ProfileSelectionView.swift
  • iosApp/iosApp/Screens/Profiles/ProfileTile.swift
  • iosApp/iosApp/Screens/Recommendations/RecommendationsView.swift
  • iosApp/iosApp/Screens/Search/SearchView.swift
  • iosApp/iosApp/Screens/Settings/AboutSettingsView.swift
  • iosApp/iosApp/Screens/Settings/GeneralSettingsView.swift
  • iosApp/iosApp/Screens/Settings/IOSSettingsOverview.swift
  • iosApp/iosApp/Screens/Settings/InterfaceCustomizationView.swift
  • iosApp/iosApp/Screens/Settings/OpenSourceAcknowledgementsView.swift
  • iosApp/iosApp/Screens/Settings/SettingsBackdrop.swift
  • iosApp/iosApp/Screens/Settings/SettingsPageHeader.swift
  • iosApp/iosApp/Theme/VividAppTheme.swift
  • iosApp/iosApp/tvOS/Caching/CachedAsyncImage.swift
  • iosApp/iosApp/tvOS/Caching/TVHomeMetadataCache.swift
  • iosApp/iosApp/tvOS/Components/TVFocusMarquee.swift
  • iosApp/iosApp/tvOS/Components/TVHomeDiscoveryFeed.swift
  • iosApp/iosApp/tvOS/Components/VividCollectionMediaRow.swift
  • iosApp/iosApp/tvOS/Components/VividStartupView.swift
  • iosApp/iosApp/tvOS/Profiles/TVLoginPreparation.swift
  • iosApp/iosApp/tvOS/Profiles/TVSavedAccountViews.swift
  • iosApp/iosApp/tvOS/Screens/Components/TVProfileTile.swift
  • iosApp/iosApp/tvOS/Screens/Detail/TVEpisodeRail.swift
  • iosApp/iosApp/tvOS/Screens/Detail/TVSeriesDetailView.swift
  • iosApp/iosApp/tvOS/Screens/Settings/TVGeneralSettingsView.swift
  • iosApp/iosApp/tvOS/Screens/Settings/TVSettingsComponents.swift
  • iosApp/iosApp/tvOS/Screens/Settings/TVSettingsView.swift

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Comment thread docs/apple-tv-focus.md
Comment thread docs/apple-tv-focus.md Outdated
Comment thread iosApp/iosApp/Screens/Settings/InterfaceCustomizationView.swift
Comment thread iosApp/iosApp/tvOS/Screens/Detail/TVEpisodeRail.swift
Release-Notes:
- Fixed empty Home rows disappearing from the settings editor while still using a row slot, so they can be hidden on iOS and tvOS.

Keep the tested series-entry focus behaviour. Correct the documented tvOS provider refresh intervals and heading spacing.

Implemented these changes with Codex as a tool.
@blurbery

Copy link
Copy Markdown
Owner Author

Reviewed all four findings against the implementation: fixed the empty-row settings issue on both platforms and the two documentation issues; retained the tested episode-focus handler with the call-site rationale in its thread. I am not adding blanket docstrings or generated tests solely to meet the bot coverage suggestion. The relevant behaviour is documented, and the repository guidance keeps UI changes and tests scoped.

The original PR revision passed both iOS tests and the tvOS build. The small follow-up passed Swift compiler parsing and focused source/whitespace checks; CI for ff83cf2 is pending. No new device build has been installed.

@blurbery

Copy link
Copy Markdown
Owner Author

@coderabbitai review changes

@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

@blurbery, I’ll review the latest changes in PR #37, including the fixes you described and the retained episode-focus handler.


🧠 Learnings used
Learnt from: blurbery
Repo: blurbery/vivid PR: 37
File: iosApp/iosApp/tvOS/Screens/Detail/TVEpisodeRail.swift:780-780
Timestamp: 2026-09-27T05:43:09.603Z
Learning: On tvOS, `TVItemDetailView.seriesNextUpEpisode(for:)` selects the Series hero episode from `ItemDetailViewModel.episodes` or `ItemDetailViewModel.episodesBySeason`. `TVSeriesDetailView.continuousPages` supplies those loaded lists to `TVContinuousEpisodeShelf`, and `ItemDetailViewModel` publishes a fetched season page with its episode list. Check this shared data path before reporting that a non-nil hero episode can have an unloaded target page.
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@blurbery
blurbery merged commit c45c740 into main Sep 27, 2026
3 checks passed
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.

1 participant