Kyle FarnungandNiels van Velzen b4d4837fda Retry playback with fallback on source errors
**Changes**
When Exoplayer is used on the Android app it lets the server decide
which mode to use (direct play, direct stream, or transcode) based on
the device and content. If the content contains formats incompatible
with ExoPlayer (like compressed PGS subtitles), it will fail to load the
source. On the Android TV app it shows a similar source error in this
case, but still plays successfully. Checking the server shows that the
content is being remuxed without the subtitles, resolving the issue.
Similarly, enabling subtitles in the player forces a transcode that
allows the content to play.

This change adds similar fallback behavior, but it attempts to play the
highest quality stream on transient errors (like network flakiness).
This approach is based on
https://github.com/jellyfin/jellyfin-androidtv/pull/3916 and the
follow-up fix https://github.com/jellyfin/jellyfin-androidtv/pull/4999.

The retry workflow:
1. Try again without restrictions: it might have been a transient error
2. Try disabling direct play: maybe the container was an issue
3. Finally try transcoding when nothing else worked

The last error time is captured to reset the retry count after 30
seconds have elapsed. This should hopefully be enough time to avoid
falling back unnecessarily for transient issues. Retries will always
start with unrestricted again to maximize the quality and minimize the
stress on the server. Intentional track changes (audio or subtitle) also
reset the retry budget, since those are user-initiated reloads rather
than errors.

There's a race condition between retries in which the queue could try to
change the source. This is handled via coroutine cancellation. There's
still a small race which could cause the media from the current retry to
load briefly before the source change starts. This should be
self-correcting in practice.

**Issues**
Fixes #1931
2026-06-27 11:23:25 +02:00
2026-06-13 20:23:12 +02:00
2026-06-13 20:23:12 +02:00
2026-06-12 22:07:51 +02:00
2025-05-27 14:54:47 +02:00
2026-05-12 14:43:35 +02:00
2026-05-09 12:49:44 +02:00
2026-05-09 12:49:44 +02:00
2020-07-25 02:05:39 +02:00
2026-05-25 18:50:28 +02:00

Jellyfin for Android

Part of the Jellyfin Project


Logo Banner

GPL 2.0 License Current Release Translation Status
Donate Feature Requests Chat on Matrix Join our Subreddit
Jellyfin on Google Play Jellyfin on Amazon Appstore Jellyfin on F-Droid
Download archive

Jellyfin Mobile is an Android app that connects to Jellyfin instances and integrates with the official web client. We welcome all contributions and pull requests! If you have a larger feature in mind please open an issue so we can discuss the implementation before you start. Even though the client is only a web wrapper there are still lots of improvements and bug fixes that can be accomplished with Android and Kotlin knowledge.

Most of the translations can be found in the web client since it's the base for the Android client as well. Translations for the app can also be improved very easily from our Weblate instance. Look through the following graphic to see if your native language could use some work!

Detailed Translation Status

This client was rewritten from scratch with a fresh git history in July to August 2020, and replaces the old Cordova-based client, which can still be found in the archives.

Build Process

Dependencies

  • Android SDK

Build

  1. Clone or download this repository

    git clone https://github.com/jellyfin/jellyfin-android.git
    cd jellyfin-android
    
  2. Open the project in Android Studio and run it from there or build an APK directly through Gradle:

    ./gradlew assembleDebug
    

Deploy to device/emulator

./gradlew installDebug

You can also replace the "Debug" with "Release" to get an optimized release binary.

Release Flavors

There are two flavors (variants) of the Jellyfin for Android app:

  • The proprietary version comes with Google Chromecast support
  • The libre version comes without Google Chromecast support

The proprietary version is available on Google Play and the Amazon Appstore, while the libre version is available on F-Droid. Additionally, beta releases exist for both flavors, but only the proprietary version is published to a beta track on Google Play. If you'd like to test the beta outside of Google Play, you can simply download it from the GitHub releases.

S
Description
Android Client for Jellyfin
Readme
66 MiB
Languages
Kotlin 71.4%
Java 15.9%
JavaScript 12.7%