Commit graph

988 commits

Author SHA1 Message Date
Damontecres
559abe2458
Add setting to force transcoding above a max resolution (#1955)
## Description
Adds a new setting to pick a maximum resolution (by height). Any
playback that has a larger resolution will be transcoded down to the
maximum resolution.

Playback equal or less than the maximum resolution will not be affected
and will direct play if otherwise able. This setting is also independent
of the maximum bitrate (ie if max resolution is 4K and max bitrate is
2mbps, playing 4K will transcode).

This setting is pretty much equivalent to the Web UI setting "Maximum
Allowed Video Transcoding Resolution" with "Limit maximum supported
video resolution" enabled.

Note: this setting does not affect which version is chosen by default

### Related issues
Closes #756
Closes #1594

### Testing
Manual emulator testing

## Screenshots
N/A

## AI or LLM usage
None
2026-10-03 18:41:18 -04:00
Damontecres
b0d270380d
Better home page header for Seasons (#2016)
## Description
Updates the home page header & card text when a Season type is shown,
such as in recently added for a TV Show library.

The title or logo for the series is shown with the season name as the
title. The "quick details" has the year of the season. The card shows
the unplayed count of episodes.

### Related issues
Closes #1958

### Testing
Emulator over a few days to see different seasons

## Screenshots
<img width="313" height="153" alt="image"
src="https://github.com/user-attachments/assets/c41e9edd-9f2a-4f62-b76d-e452e83dd8bf"
/>

## AI or LLM usage
None
2026-09-30 17:35:29 -04:00
Jycreyn
a577ae9f1a
Add option to prefer Dolby Vision over HDR10+ on hybrid videos (#1876)
## Description

Adds a "Prefer Dolby Vision over HDR10+" switch (off by default) under
Experimental settings. That screen only shows up once "Experimental
settings" is enabled under Advanced, and until then the switch is read
as off: it goes through `experimentalPreferences.get {}`, so nothing is
wrapped and the playback path is untouched.

Most current 4K web releases carry both Dolby Vision (profile 8.1) RPUs
and HDR10+ dynamic metadata in the same HEVC stream. Some MediaTek based
devices (Philips and TCL TVs, some Fire TV models) latch onto the HDR10+
metadata on those files and never engage Dolby Vision, even though a
Dolby Vision decoder is selected.

I isolated this on my Philips 55OLED810 by playing the same episode
three ways, direct play in all three cases:

| | Stream | TV shows |
|---|---|---|
| A | MKV with DV 8.1 + HDR10+ | HDR10+ |
| B | Same MKV with the HDR10+ metadata removed using
[hdr10plus_tool](https://github.com/quietvoid/hdr10plus_tool), DV
untouched | Dolby Vision |
| C | Same stream remuxed to MP4, both kinds of metadata present |
HDR10+ |

The container doesn't matter and the Dolby Vision signaling is picked up
correctly. The only thing the app can do is keep the HDR10+ metadata
away from the decoder.

When the switch is on, and only when a Dolby Vision decoder was actually
selected, the HDR10+ SEI messages (SMPTE ST 2094-40, recognized by their
ITU-T T.35 header `B5 003C 0001`) are masked in each access unit before
it is queued to MediaCodec. The SEI payload type byte is overwritten
with an unused value (254), so the decoder skips the message. That is
one byte rewritten in place per message: the masking filter returns the
size it was given, so the access unit is queued exactly as long as it
came out of the extractor, which is what makes it safe with both the
synchronous and asynchronous MediaCodec adapters. media3 does the same
thing for HAGC metadata in `HevcSeiUtil`; this filter only targets ST
2094-40, so other T.35 SEI such as CEA-708 captions are not affected.
The filter was written from the H.265 spec, no Kodi or media3 code was
copied.

The hook is generic rather than HDR10+ specific, as asked in the thread.
`BitstreamFilteringCodecAdapterFactory` wraps the codec adapter with a
`List<BitstreamFilter>`, and a filter is `(ByteBuffer, offset, size) ->
Int` where the returned `Int` is the new size of the access unit: the
adapter queues the size the chain reports, and hands each filter the
size the previous one reported. A filter which only overwrites bytes
returns the size unchanged, which is what the HDR10+ masking does; a
filter which drops NAL units compacts what it keeps and reports the
shorter size. A reported size which is negative or larger than the one
the filter was given is ignored rather than queued. That is what lets
the Dolby Vision profile 7 to 8.1 conversion of #244 arrive later as one
more filter instead of a second copy of the adapter plumbing.

When the switch is off, the playback path is unchanged. On a device
without a Dolby Vision decoder (or a display without DV support) the
wrapper is never installed, so HDR10+ only devices keep their metadata.
Encrypted samples, codec config buffers and empty buffers are passed
through untouched.

Kodi has an equivalent option for the same reason: xbmc/xbmc@032cbfeb
and xbmc/xbmc@e2c54e7f.

### Related issues

Implements what was requested in #1855. The filter list is what #244
(Dolby Vision profile 7 direct play) needs, so that conversion can be
added as another filter. #1895 implemented the same masking
independently and was closed in favour of this PR; the device profile
part of it was not carried over, see the note under Testing. Upstream:
androidx/media#1895, where the maintainers say the bug is in the device
codecs and that they don't plan a workaround in ExoPlayer itself.

## AI or LLM usage

The implementation (bitstream filter, MediaCodecAdapter wiring, unit
tests) were written with AI assistance (Claude). I reviewed the changes
and validated the behavior myself on a real MediaTek TV (Philips
55OLED810), with the setting on and off, on hybrid and DV-only content.

---------

Co-authored-by: Jycreyn <github.2ilp7@passmail.com>
2026-09-29 12:41:40 -04:00
Damontecres
190c6be41a
Run pre-commit 2026-09-12 18:43:14 -04:00
Prahlis
af6a3b9916
Translated using Weblate (Swedish)
Currently translated at 92.2% (608 of 659 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2026-09-12 22:39:03 +00:00
TheMatrixan
a60433dbbf
Translated using Weblate (Polish)
Currently translated at 99.6% (657 of 659 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-09-12 22:39:03 +00:00
arcker95
f181770870
Translated using Weblate (Italian)
Currently translated at 100.0% (659 of 659 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-09-12 22:39:03 +00:00
SimonHung
923f0b7ea3
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (659 of 659 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-09-12 22:39:03 +00:00
TheMatrixan
391a38e777
Translated using Weblate (Polish)
Currently translated at 98.6% (648 of 657 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-09-12 22:39:03 +00:00
SimonHung
cd0128e1db
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (657 of 657 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-09-12 22:39:03 +00:00
Priit Jõerüüt
0db4d45dbc
Translated using Weblate (Estonian)
Currently translated at 100.0% (657 of 657 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-09-12 22:39:02 +00:00
Prahlis
584c3566d6
Translated using Weblate (Swedish)
Currently translated at 90.7% (595 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2026-09-12 22:39:02 +00:00
American_Jesus
f79c0bdfe7
Translated using Weblate (Portuguese)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-09-12 22:39:02 +00:00
MrGegaz
bad47eb638
Translated using Weblate (Croatian)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/hr/
2026-09-12 22:39:02 +00:00
Andi Chandler
8a570b89fb
Translated using Weblate (English (United Kingdom))
Currently translated at 8.6% (57 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/en_GB/
2026-09-12 22:39:02 +00:00
opakholis
7bd1e993d0
Translated using Weblate (Indonesian)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-09-12 22:39:02 +00:00
n8llcaster
c0f6293ea7
Translated using Weblate (Slovak)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sk/
2026-09-12 22:39:02 +00:00
Prahlis
6647cf338c
Translated using Weblate (Swedish)
Currently translated at 90.3% (593 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2026-09-12 22:39:02 +00:00
marinosGR
3598e3010b
Translated using Weblate (Greek)
Currently translated at 51.0% (335 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/el/
2026-09-12 22:39:02 +00:00
Priit Jõerüüt
60a0d633bd
Translated using Weblate (Estonian)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-09-12 22:39:02 +00:00
danpergal84
5ee6b31018
Translated using Weblate (Spanish)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-09-12 22:39:02 +00:00
idezentas
1e86616d2a
Translated using Weblate (Turkish)
Currently translated at 99.8% (655 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-09-12 22:39:02 +00:00
tal_sarid
7b39854621
Translated using Weblate (Hebrew)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-09-12 22:39:02 +00:00
lednurb
8e050a0830
Translated using Weblate (Dutch)
Currently translated at 91.6% (601 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/nl/
2026-09-12 22:39:02 +00:00
SimonHung
114df65de3
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-09-12 22:39:02 +00:00
North-DaCoder
d6b1d77c28
Translated using Weblate (German)
Currently translated at 100.0% (656 of 656 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-09-12 22:39:02 +00:00
lednurb
6e12b0c776
Translated using Weblate (Dutch)
Currently translated at 92.6% (601 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/nl/
2026-09-12 22:39:02 +00:00
Bone NI
026f8c7592
Added translation using Weblate (Lao) 2026-09-12 22:39:02 +00:00
alexkahler
2ade8173ff
Translated using Weblate (Danish)
Currently translated at 99.8% (648 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/da/
2026-09-12 22:39:02 +00:00
Andi Chandler
8c2cbcb7b2
Translated using Weblate (English (United Kingdom))
Currently translated at 7.8% (51 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/en_GB/
2026-09-12 22:39:02 +00:00
American_Jesus
de6cf7fb59
Translated using Weblate (Portuguese)
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-09-12 22:39:02 +00:00
TheMatrixan
c8d202c3fa
Translated using Weblate (Polish)
Currently translated at 99.6% (647 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-09-12 22:39:02 +00:00
brdaustra
7f587b9f50
Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.3% (645 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/nb_NO/
2026-09-12 22:39:01 +00:00
Prahlis
cf83266e4a
Translated using Weblate (Swedish)
Currently translated at 90.4% (587 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2026-09-12 22:39:01 +00:00
n8llcaster
0398f3f689
Translated using Weblate (Slovak)
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sk/
2026-09-12 22:39:01 +00:00
tal_sarid
cbebc9e63c
Translated using Weblate (Hebrew)
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-09-12 22:39:01 +00:00
arcker95
e73d0961ab
Translated using Weblate (Italian)
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-09-12 22:39:01 +00:00
Outbreak2096
5a9e5c406f
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-09-12 22:39:01 +00:00
SimonHung
c0401914a7
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-09-12 22:39:01 +00:00
Priit Jõerüüt
0b275a2daa
Translated using Weblate (Estonian)
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-09-12 22:39:01 +00:00
danpergal84
8931bf5d7a
Translated using Weblate (Spanish)
Currently translated at 100.0% (649 of 649 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-09-12 22:39:01 +00:00
Priit Jõerüüt
4f4e13723c
Translated using Weblate (Estonian)
Currently translated at 100.0% (647 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-09-12 22:39:01 +00:00
tal_sarid
db7cfaee9b
Translated using Weblate (Hebrew)
Currently translated at 100.0% (647 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-09-12 22:39:01 +00:00
arcker95
048a5f35b6
Translated using Weblate (Italian)
Currently translated at 100.0% (647 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-09-12 22:39:01 +00:00
Prahlis
9602b4f3f0
Translated using Weblate (Swedish)
Currently translated at 90.5% (586 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2026-09-12 22:39:01 +00:00
olliveiraanderson
d6eb23d29f
Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.1% (622 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt_BR/
2026-09-12 22:39:01 +00:00
true-seeker
f3239c7b15
Translated using Weblate (Russian)
Currently translated at 65.0% (421 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/ru/
2026-09-12 22:39:01 +00:00
jatag41526
f7c391ad54
Translated using Weblate (Russian)
Currently translated at 65.0% (421 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/ru/
2026-09-12 22:39:01 +00:00
SergeiAK
02163ba47c
Translated using Weblate (Russian)
Currently translated at 65.0% (421 of 647 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/ru/
2026-09-12 22:39:01 +00:00
Damontecres
616565f671
Fixes to v1.0.7 (#1953)
## Description
Collection of minor bug fixes for `v1.0.7`

- Fixes a possible race condition crash when navigating to the search
page
- Uses friendlier error message when login fails due to parental
restrictions (based on
[`jellyfin-web`](https://github.com/jellyfin/jellyfin-web/blob/v10.11.11/src/controllers/session/login/index.js#L38-L41))
- Don't re-sort search results by name, just by relevance scoring
- Consume the key event when dim is active (ie if the screen is dimmed,
pressing a key will un-dim and not perform another action)

### Related issues
Fixes #1922 
Fixes #1951
Related to #1848 (search sorting)

### Testing
Emulator & nvidia shield

## Screenshots
N/A

## AI or LLM usage
None
2026-09-11 15:40:11 -04:00