Commit Graph
1778 Commits
Author SHA1 Message Date
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
Tal SaridandGitHub b7b14db731 Add Trickplay view over the seekbar in ExoPlayer (#1951)
* Add Trickplay view over the seekbar

* Fix a crash on protrait mode when the screen is narrow

* Improve style fidelity to the web-player trickplay view

* Resolve github-advanced-security bot comments

* Fix linter issues
2026-06-27 10:29:13 +02:00
MrPlowandWeblate 09ae3ad07f Translated using Weblate (German)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/de/
2026-06-25 15:26:48 +00:00
GargotaireandWeblate b5f5658727 Translated using Weblate (Catalan)
Currently translated at 99.3% (152 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/ca/
2026-06-24 21:26:23 +00:00
hoanghuy309andWeblate 3325dbe2b4 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/vi/
2026-06-24 06:26:22 +00:00
Vasile Cristian-IlieandWeblate 5d94836e6a Translated using Weblate (Romanian)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/ro/
2026-06-23 08:44:37 +00:00
Rui Rodrigues de AndradeandWeblate 16c0d50858 Translated using Weblate (Portuguese (Portugal))
Currently translated at 94.1% (144 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/pt_PT/
2026-06-23 00:26:22 +00:00
Rui Rodrigues de AndradeandWeblate 13df666674 Translated using Weblate (Portuguese (Portugal))
Currently translated at 84.9% (130 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/pt_PT/
2026-06-22 20:55:04 +00:00
RohithandWeblate 87902c99c8 Translated using Weblate (Kannada)
Currently translated at 39.2% (60 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/kn/
2026-06-22 16:26:22 +00:00
serzh-photografandWeblate 5b0da131f3 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/uk/
2026-06-22 16:26:22 +00:00
Thunderstrike116andWeblate dfc0f597ee Translated using Weblate (Greek)
Currently translated at 90.8% (139 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/el/
2026-06-22 10:26:23 +00:00
Szilki077andWeblate cf1e237390 Translated using Weblate (Hungarian)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/hu/
2026-06-22 10:26:22 +00:00
myrad2267andWeblate 41895f8eee Translated using Weblate (French)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/fr/
2026-06-22 00:52:06 +00:00
Ayaz AbdulazimliandWeblate 600c6e3101 Translated using Weblate (Azerbaijani)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/az/
2026-06-21 23:26:25 +00:00
Maxr1998andNiels van Velzen aa2172880a Use DefaultMediaSourceFactory instead of manually picking factories
This fixes external subtitles not working anymore due to the deprecation of SingleSampleMediaSource, and greatly simplifies the QueueManager code.
2026-06-20 17:35:59 +02:00
BasandWeblate b04efbe470 Translated using Weblate (Dutch)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/nl/
2026-06-20 15:35:35 +00:00
Niels van VelzenandNiels van Velzen 0f3230ffe8 Use transaction for queued downloads query 2026-06-20 17:02:10 +02:00
Maxr1998andNiels van Velzen 6be3652bdc Fix external subtitle selection
A recent (?) AndroidX Media3 update caused MergingMediaPeriod to prepend the period ID to the track format's id, breaking the actual track selection. Only matching the substring fixes selecting external subtitles.
2026-06-20 17:01:53 +02:00
Niels van VelzenandNiels van Velzen e637337eff Store user playback position in MediaItem extras to avoid extra API call 2026-06-20 16:25:10 +02:00
Niels van VelzenandNiels van Velzen f0e1c8283a Undo formatting changes in LibraryMediaId 2026-06-20 16:25:10 +02:00
Niels van VelzenandNiels van Velzen a433499176 Fix default download method not showing in settings 2026-06-20 16:24:52 +02:00
Niels van VelzenandNiels van Velzen eb8b08818d Play downloaded audio in external app 2026-06-20 16:24:33 +02:00
2aa318549b Improve audiobook support to Android Auto (#2017)
* Add complete audiobook support to Android Auto

  Extends the existing Android Auto audiobook browsing (added in upstream
  PR #1984) with several missing pieces:

  - Include audiobooks in Favorites and Recently Played sections
  - Include audiobooks in Genre browsing with direct playback action
  - Add Audiobooks group to search results
  - Resume audiobook playback from saved position (playbackPositionTicks)
    rather than always starting from the beginning

* Change the 10000L tick to a private const

* Address PR review feedback: use SDK ticks conversion, encode resume position at browse time, explicit genre action mapping, and audiobooks string resource

* Fetch resume position from item instead of embedding it in the media ID

---------

Co-authored-by: Jordan Rushing <jordanmichaelrushing@users.noreply.github.com>
2026-06-20 09:44:33 +02:00
Matija HercegandGitHub 5459132853 Fix bluetooth media keys for local video playback (#1973) 2026-06-20 07:43:21 +00:00
Translation expertandWeblate 1d7431389f Translated using Weblate (Arabic)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/ar/
2026-06-20 00:26:22 +00:00
LofuuziandWeblate 3edfd417ff Translated using Weblate (Cantonese (Traditional Han script))
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/yue_Hant/
2026-06-19 08:26:22 +00:00
queeupandWeblate 4c4b76e3cc Translated using Weblate (Turkish)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/tr/
2026-06-18 23:26:22 +00:00
KitynandWeblate d116af81f9 Translated using Weblate (Polish)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/pl/
2026-06-18 18:26:22 +00:00
BasandWeblate ae803a206d Translated using Weblate (Dutch)
Currently translated at 100.0% (153 of 153 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/nl/
2026-06-18 18:26:21 +00:00
BasandWeblate e15c153cfb Translated using Weblate (Dutch)
Currently translated at 100.0% (151 of 151 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/nl/
2026-06-18 16:19:30 +00:00
Niels van VelzenandNiels van Velzen 34c176e3f6 Show message when there are no downloads 2026-06-18 18:19:25 +02:00
KitynandWeblate 58630c41a0 Translated using Weblate (Polish)
Currently translated at 100.0% (148 of 148 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/pl/
2026-06-18 14:41:09 +00:00
BasandWeblate 6e246d8a0d Translated using Weblate (Dutch)
Currently translated at 100.0% (148 of 148 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/nl/
2026-06-18 14:41:08 +00:00
Niels van VelzenandNiels van Velzen 57b4aac586 Show download settings dialog on first download 2026-06-18 16:41:03 +02:00
Niels van VelzenandNiels van Velzen f90b3e543b Fix downloads not working when no storage location set 2026-06-18 16:41:03 +02:00
SJJandGitHub 122c1801d8 Add horizontal seek gesture support with overlay feedback (#1895) 2026-06-18 14:43:37 +02:00
Andi ChandlerandWeblate 876e8acf4d Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (146 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/en_GB/
2026-06-18 11:26:23 +00:00
queeupandWeblate 2660aa1969 Translated using Weblate (Turkish)
Currently translated at 100.0% (146 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/tr/
2026-06-17 22:16:44 +00:00
engineer948andWeblate 7308ac2092 Translated using Weblate (Azerbaijani)
Currently translated at 0.6% (1 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/az/
2026-06-17 17:26:22 +00:00
engineer948andWeblate 09e2dd9664 Added translation using Weblate (Azerbaijani) 2026-06-17 14:33:06 +00:00
MaltaviusandWeblate 20b3b81dfe Translated using Weblate (Swedish)
Currently translated at 100.0% (146 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/sv/
2026-06-17 13:26:23 +00:00
RohithandWeblate 98e231285e Translated using Weblate (Kannada)
Currently translated at 39.7% (58 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/kn/
2026-06-15 20:26:22 +00:00
Stecy GravelandWeblate d131a7b228 Translated using Weblate (French)
Currently translated at 94.5% (138 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/fr/
2026-06-14 21:26:21 +00:00
BotBlakeandNiels van Velzen c04f49298b use decode from string directly 2026-06-14 17:45:27 +02:00
Niels van VelzenandNiels van Velzen b5ee1feb0f Fix database migration for existing installs 2026-06-14 17:30:54 +02:00
cf4d754890 Dynamically query device H264 max level for WebView device profile
Instead of hardcoding H264 level "41" in nativeshell.js, query the
actual device max AVC level at runtime via
NativeInterface.getCodecCapabilities(). This lets devices that
support H264 level 4.2, 5.0, etc. direct-play content that was
previously forced to transcode.

The profile list (high/main/baseline/constrained baseline) is left
hardcoded deliberately: Chromium's <video> pipeline in the WebView
does not decode the full set of H264 profiles MediaCodec advertises
(notably 10-bit), so advertising them would risk regressions.

Fixes #1921

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 21:01:59 +02:00
Alvaro EstradaandWeblate c3f3a80581 Translated using Weblate (Spanish (Mexico))
Currently translated at 81.5% (119 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/es_MX/
2026-06-12 04:26:21 +00:00
Niels van VelzenandNiels van Velzen bdf7d91cb7 Add DownloadFileEntity 2026-06-11 09:05:05 +02:00
Niels van VelzenandNiels van Velzen ee8ce1607e Download primary images 2026-06-11 09:05:05 +02:00
GargotaireandWeblate 6cabf08467 Translated using Weblate (Catalan)
Currently translated at 98.6% (144 of 146 strings)

Translation: Jellyfin Android/Jellyfin Android
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/ca/
2026-06-10 19:26:21 +00:00