## Description This is a targeting fix for a very specific bug: on Fire TV 4k Max (AFTKRT), and possibly others but untested, ExoPlayer can't play an HLS/TS stream that has 8-channel (7.1) EAC3 audio. Direct play is not affected (7.1 EAC3 plays fine), and fewer channels work fine (i.e. 5.1 EAC3) even in an HLS/TS wrapper. This bug + device is tracked in KnownDefects. If more models are tested and found to have the same issue, they can be added to the list. Top candidates are probably AFTKA and AFTKM since they are also in the models with HEVC DoVi/HDR10+ playback issues and so probably have similar underlying limitations, but I don't have those devices to test. The fix is to first allow the app to make a playback request to the server and receive the stream info Jellyfin has decided to send. Then it evaluates the settings and stream for the following: - Playback is using ExoPlayer - Device is in the modelsWithEac3HlsPassthroughBug list (currently only AFTKRT) - Stream is not direct play - Stream is HLS with MPEG-TS container - Audio is 8-channel EAC3 We have to use a two-request fix because we don't know what Jellyfin is going to decide for the stream until we receive it. That way normal playable streams aren't getting overwritten by the fix when they shouldn't be. So the only streams that get the two request path applied is the exact fix for this bug. To apply post-playback-info fixes (including this one) a helper file was created PostPlaybackInfoFixes. In the future, if there are more bugs that can only be determined after the decided stream info is received, they can be added here. This keeps things logical and maintainable. ### Related issues The bug was able to be reproduced on multiple items with this exact scenario by simply playing back the item (making sure ExoPlayer is set as the default player in settings). ### Testing Tested on the target device: Amazon Fire TV 4k Max (2nd Gen), model AFTKRT. The following media was tested: - ExoPlayer, multiple titles with HEVC, EAC3 7.1 copied into HLS/TS (all failed, only processing 1-2fps) - Direct play of the same titles (works) - EAC3 5.1, HLS, MPEG-TS (works) - MPV with failing titles (works) The following device and settings were tested and had no effect on the above media results, ruling out external connections and settings: - HDMI to an LG TV, both connected to a soundbar via ARC, and disconnected using internal speakers - HDMI to a Dell computer monitor - Fire TV Settings > Display & Sound > Audio > Surround Sound > all 4 settings tested (Best Available, PCM, Dolby Digital Plus, Dolby Digital) ## AI or LLM usage Codex was used to debug the issue, create the initial change, and do iterative testing on the device to narrow the scope. The code was then carefully reviewed and I made structural decisions so everything fits well within the project's established conventions, removing bloat, added comments and kept it targeted, clear and maintainable. |
||
|---|---|---|
| .github | ||
| app | ||
| gradle | ||
| wholphin-mpv-stub | ||
| .editorconfig | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| build.gradle.kts | ||
| CONTRIBUTING.md | ||
| DEVELOPMENT.md | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| README.md | ||
| renovate.json | ||
| settings.gradle.kts | ||
Wholphin - an OSS Android TV client for Jellyfin
"Never half-phin two jellies. Always wholphin one jelly."
Wholphin is an open-source Android TV client for Jellyfin. It aims to provide a different app UI that's inspired by Plex for users interested in migrating to Jellyfin.
This is not a fork of the official client. Wholphin's user interface and controls have been written completely from scratch. Wholphin supports playing media using either ExoPlayer or MPV.
Features
User interface
- Customize the home page to see the content you are interested in
- Use poster or thumb images, show/hide titles, add/remove/re-order different types of rows!
- Option to combine the Continue Watching & Next Up into a single row
- Pin collections, playlists, favorites, genres, and studios
- Remove series from next up
- A navigation drawer for quick access to libraries, favorites, search, and settings from almost anywhere in the app
- Integration with Seerr to discover new movies and TV shows
- Note: only available when installed from GitHub or the Play store
- Customize library display
- Option to show Movie/TV Show titles
- Choose image types & size
- Choose from grid or list layouts
- Play theme music, if available
- Customize subtitle style for plain text subtitles with separate HDR settings
- Search & download subtitles (requires compatible server plugin such as OpenSubtitles)
- Multiple app color themes
- Protect user profile switches with PIN code or require server login
- Change the user interface language per user
- In-app & Android OS screensaver support
Playback
- Different media playback engines:
- ExoPlayer w/ optional extra audio, SSA/ASS, & AV1 software decoding
- MPV for direct playing anything with great SSA/ASS subtitle support
- Plex inspired playback controls:
- Using D-Pad left/right for seeking during playback
- Quickly access video chapters & queue during playback
- Optionally skip back a few seconds when resuming playback
- Live TV & DVR support
- Music & music video support
- Cinema mode/pre-roll intro support (requires compatible server plugin such as Intros)
- Auto play next episodes with pass out protection
- Option for automatic refresh rate & resolution switching on supported displays
- Trickplay (video preview) support
- Subtly show playback position along the bottom of the screen while seeking w/ D-Pad
Roadmap
Installation
Using Google Play or Amazon appstore are the fastest way to install. But you can follow these instructions to install without needing an app store
Downloader Code: 8668671
- Enable side-loading "unknown" apps
- https://androidtvnews.com/unknown-sources-chromecast-google-tv/
- https://www.xda-developers.com/how-to-sideload-apps-android-tv/
- https://developer.android.com/distribute/marketing-tools/alternative-distribution#unknown-sources
- https://www.aftvnews.com/how-to-enable-apps-from-unknown-sources-on-an-amazon-fire-tv-or-fire-tv-stick/
- Install the APK on your Android TV device with one of these options:
- Install a browser program such as Downloader, use it to get the latest apk with short code
8668671or URL: http://aftv.news/8668671 - Download the latest APK release from the releases page or http://aftv.news/8668671
- Put the APK on an SD Card/USB stick/network share and use a file manager app from the Google Play Store / Amazon AppStore (e.g.
FX File Explorer). Android's preinstalled file manager probably will not work! - Use
Send files to TVfrom the Google Play Store on your phone & TV - (Expert) Use ADB to install the APK from your computer (guide)
- Put the APK on an SD Card/USB stick/network share and use a file manager app from the Google Play Store / Amazon AppStore (e.g.
- Install a browser program such as Downloader, use it to get the latest apk with short code
Upgrading the app
After the initial install above, the app will automatically check for updates. The updates can be installed in settings.
The first time you attempt an update, the OS should guide you through enabling the required additional permissions for the app to install updates.
Note: if installed via an app store, the app store will handle updates.
Compatibility
Requires Android 6+ (or Fire TV OS 6+) and Jellyfin server 10.10.x or 10.11.x (tested on primarily 10.11).
The app is tested on a variety of Android TV/Fire TV OS devices, but if you encounter issues, please file an issue!
Seerr integration is tested with v3.2.0. Older versions may not work.
Contributions
Issues and pull requests are always welcome! Please check before submitting that your issue or pull request is not a duplicate.
If you plan to contribute, please read the contributing guide!
You can help translate Wholphin!
Acknowledgements
- Thanks to the Jellyfin team for creating and maintaining such a great open-source media server
- Thanks to the official Jellyfin Android TV client developers, some code for creating the device direct play profile is adapted from there
- Thanks to the Jellyfin Kotlin SDK developers for making it easier to interact with the Jellyfin server API
- Thanks to numerous other libraries that make app development even possible