Skip to content

[tvOS] Media Player#1902

Open
JPKribs wants to merge 139 commits intojellyfin:mainfrom
JPKribs:tvOSPlayer
Open

[tvOS] Media Player#1902
JPKribs wants to merge 139 commits intojellyfin:mainfrom
JPKribs:tvOSPlayer

Conversation

@JPKribs
Copy link
Copy Markdown
Member

@JPKribs JPKribs commented Jan 16, 2026

Summary

Resolves: #818

Creates a tvOS version of the iOS Player UI. Attempts to mirror iOS as closely as possible but there are some limitations with UIKit Controllers and focus. iOS we are able to switch between the tabs using gestures and buttons but tvOS we need to account for buttons, swipes, and focus so my implementation of this is a bit different.

Video

Simulator.Screen.Recording.-.Apple.TV.-.2026-03-14.at.03.19.15.mov

Tasks & Goals

Below are the components I wanted to ensure where included/resolves as part of this. At this time, I believe we account for all of the features for this player. Next steps are polish and localization.

  • Navigable by a Remote
  • All Playback Buttons Work
  • Remote Commands to Bring Up Overlay
  • Remote Commands to Skip Forward/Backwards
  • Seeking / Scrubbing (Completed prior to me working on this)
  • tvOS Toast
  • Override Remote Buttons
  • Pass-through Non-Overridden Remote Buttons
  • Create tvOS GestureView (Primarily Swipe Up & Swipe Down to Open Supplements)
  • Key Frames or Scrubbing Images
  • Supplements Under Slider
  • Supplements Should Open from Swipe OR Button not just Swipe
  • tvOS Versions of the Supplement Menus
  • Allow Supplement Menu Switching from the Tab Headers
  • Figure out why the Media Session doesn't Close with Player
  • Force the Manager to Close if the Player Closes in a Non-Standard Fashion
  • Remove Remote Dead Zones
  • Cleanup / Remove Redundant Code
  • Scroll to Episode in Supplement
  • Focus Active Episode in Supplement
  • Figure Out Performance / Lag on Real Hardware (Touch Pad Related)
  • Animations Breaking on Supplement Appearance
  • Fix FocusGuide Lockout When Item Changes
  • Localization

Updated: 2026-03-11

@JPKribs JPKribs added playback This item is related to content playback tvOS Impacts tvOS labels Jan 16, 2026
@JPKribs
Copy link
Copy Markdown
Member Author

JPKribs commented Jan 16, 2026

@LePips right now, this is just a lift and fix from iOS. I intend on cleaning this up more for tvOS. Wanted to make a PR to make sure I wasn't conflicting with anything that you were doing. Also, just a confirmation that using iOS as the "base" was fine/expected from your end.

Edit: Okay, restarted. I realized what you had there was actually the bones for the new player so I'm using that as the base!

@JPKribs JPKribs reopened this Jan 17, 2026
@matthewpi
Copy link
Copy Markdown

For now, this PR is only related to the Swiftfin Player. If you would be able to assist in testing that and making sure everything that works, that would be a great help! If you could provide some screenshots with some examples of what you're seeing related to UI improvements, that would definitely be appreciated as well!

Apologies for my delayed response. I was waiting for my MBP to arrive so I can more easily screenshot and test the features on real hardware instead of needing to run back and fourth to my office.

I compiled the latest changes and the original points for improvement with the player UI have been addressed. The seekbar no longer grows horizontally past everything else and there is no longer a opaque overlay when the player controls are visible.


I did however notice a bit of strange behaviour on the top-level player control buttons (the two left most buttons above the seekbar) where when you click on them and trigger their actions, focus immediately moves back to the seekbar, the submenu button (ellipsis icon) does not do this. This may be intentional but it feels awkward to use as no other applications behave this way.

Specifically the "aspect fill" and "autoplay" buttons do this.


There is also a "jitter" when going to the episodes list while you are on a later episode within a season. It seems that the episode list renders first then selects whatever episode you are on after it has been displayed.

Episodes.Jitter.mov

Other than that all the functionality works well without any issues.

@JPKribs
Copy link
Copy Markdown
Member Author

JPKribs commented Mar 13, 2026

I did however notice a bit of strange behaviour on the top-level player control buttons (the two left most buttons above the seekbar) where when you click on them and trigger their actions, focus immediately moves back to the seekbar, the submenu button (ellipsis icon) does not do this. This may be intentional but it feels awkward to use as no other applications behave this way.

Specifically the "aspect fill" and "autoplay" buttons do this.

This isn't intentional but I understand where this comes from. Those buttons are redrawn when selected so I'll need to think about how to preserve focus.

There is also a "jitter" when going to the episodes list while you are on a later episode within a season. It seems that the episode list renders first then selects whatever episode you are on after it has been displayed.

That occurs when first appears to scroll to the active episode. Since it's in it's on container it's been treated as first appearing every time. That's another item I'll need to look at!

@JPKribs
Copy link
Copy Markdown
Member Author

JPKribs commented Mar 13, 2026

I did however notice a bit of strange behaviour on the top-level player control buttons (the two left most buttons above the seekbar) where when you click on them and trigger their actions, focus immediately moves back to the seekbar, the submenu button (ellipsis icon) does not do this. This may be intentional but it feels awkward to use as no other applications behave this way.

Specifically the "aspect fill" and "autoplay" buttons do this.

This isn't intentional but I understand where this comes from. Those buttons are redrawn when selected so I'll need to think about how to preserve focus.

There is also a "jitter" when going to the episodes list while you are on a later episode within a season. It seems that the episode list renders first then selects whatever episode you are on after it has been displayed.

That occurs when first appears to scroll to the active episode. Since it's in it's on container it's been treated as first appearing every time. That's another item I'll need to look at!

Both of these should be resolved now! If you run into anything further please let me know.

Edit, the jitter part is back. If I don't wipe that it caches forever so it gets weird when you go into the next season.

@matthewpi
Copy link
Copy Markdown

Tested everything again and all the issues were resolved.

Didn't test for the episodes jitter but did test that it works.

From a functionality and UI point of view, this is ready to merge.

@JPKribs
Copy link
Copy Markdown
Member Author

JPKribs commented Mar 23, 2026

Tested everything again and all the issues were resolved.

Didn't test for the episodes jitter but did test that it works.

From a functionality and UI point of view, this is ready to merge.

Perfect, thank you for your assistance in testing! It's a great help to have a second set of eyes

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

Labels

enhancement New feature or request playback This item is related to content playback tvOS Impacts tvOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[tvOS] Swiftfin Media Player

9 participants