Commit graph

1953 commits

Author SHA1 Message Date
Damontecres
2bb662fd60
Release v1.1.0 2026-11-03 17:55:49 -05:00
Damontecres
1fdc7f7d84
Translations 2026-11-03 (#2169)
Update translations as of 2026-11-03

A big thank you to all of the contributors!
2026-11-03 16:45:35 -05:00
Damontecres
a3bd0137b3
Fix style 2026-11-03 16:35:02 -05:00
Damontecres
1d880c9562
Release v1.1.0 2026-11-03 15:28:48 -05:00
Damontecres
d711760dbe
Minor bug fix (#2167)
## Description
- Fixes typo that could prevent restoring a page with artists or album
artists
- Clarified some javadocs

### Related issues
N/A

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-11-03 14:52:56 -05:00
coulterj
06c1d622bb
Fix HDHomeRun Live TV direct playback by including the live stream ID (#2163)
## Description

I was having trouble playing HDHomeRun channels through Jellyfin in
Wholphin. They started quickly in the official Jellyfin app, but
Wholphin would sometimes spin or fall back when switching channels.

This change includes the live stream ID returned by Jellyfin when
building the Direct Play URL. It also adds a regression test.

### Related issues

Related to #2014 and possibly #1903. My testing was with an HDHomeRun; I
haven’t verified the TVHeadend setups in those reports.

### Testing

Tested on a Google TV Streamer with multiple local channels, FAST
channels, and movie playback. The tested content used Direct Play, and
the HDHomeRun tuners were released after stopping.

All 18 playback tests and the formatting check passed after the
requested test cleanup.

## Screenshots

No UI changes.

## AI or LLM usage

I used OpenAI Codex to help investigate the issue, implement the change
in PlaybackViewModel.kt, add the regression test in
PlaybackViewModelTests.kt, and run validation. Codex also helped draft
this description.
2026-11-03 11:18:41 -05:00
TheMatrixan
e53e8b7c67
Translated using Weblate (Polish)
Currently translated at 100.0% (696 of 696 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-11-03 07:27:18 +00:00
ymir
c5a07f1ab8
Translated using Weblate (French)
Currently translated at 100.0% (696 of 696 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-11-03 07:27:16 +00:00
Priit Jõerüüt
b04cba4d6e
Translated using Weblate (Estonian)
Currently translated at 100.0% (696 of 696 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-11-03 07:27:16 +00:00
idezentas
3a8fa272f4
Translated using Weblate (Turkish)
Currently translated at 100.0% (696 of 696 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-11-02 06:27:17 +00:00
American_Jesus
5dd30ea93f
Translated using Weblate (Portuguese)
Currently translated at 99.8% (695 of 696 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-11-02 06:27:16 +00:00
North-DaCoder
66ca418261
Translated using Weblate (German)
Currently translated at 100.0% (696 of 696 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-11-02 06:27:15 +00:00
SimonHung
4b2c64dcb5
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.1% (689 of 695 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-10-31 19:35:01 +00:00
Priit Jõerüüt
7fbee0dff7
Translated using Weblate (Estonian)
Currently translated at 100.0% (695 of 695 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-10-31 19:35:01 +00:00
idezentas
509f566514
Translated using Weblate (Turkish)
Currently translated at 100.0% (693 of 693 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-10-31 19:35:01 +00:00
arcker95
45392b0563
Translated using Weblate (Italian)
Currently translated at 100.0% (693 of 693 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-10-31 19:35:01 +00:00
North-DaCoder
1208699b6e
Translated using Weblate (German)
Currently translated at 99.5% (690 of 693 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-10-31 19:35:01 +00:00
Greeg0ry
78c18b09aa
Translated using Weblate (Russian)
Currently translated at 100.0% (693 of 693 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/ru/
2026-10-31 19:35:01 +00:00
Priit Jõerüüt
3a6d75618e
Translated using Weblate (Estonian)
Currently translated at 100.0% (693 of 693 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-10-31 19:35:01 +00:00
PreAcc
0cbcfd9269
Translated using Weblate (Hungarian)
Currently translated at 82.9% (573 of 691 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/hu/
2026-10-31 19:35:01 +00:00
TheMatrixan
53de7073d4
Translated using Weblate (Polish)
Currently translated at 100.0% (691 of 691 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-10-31 19:35:01 +00:00
SimonHung
b918055b34
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.4% (687 of 691 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-10-31 19:35:01 +00:00
ymir
6d37c36c1c
Translated using Weblate (French)
Currently translated at 100.0% (691 of 691 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-10-31 19:35:01 +00:00
Priit Jõerüüt
03c6c78903
Translated using Weblate (Estonian)
Currently translated at 100.0% (691 of 691 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-10-31 19:35:01 +00:00
Prahlis
b25aa56277
Translated using Weblate (Swedish)
Currently translated at 91.0% (629 of 691 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2026-10-31 19:35:01 +00:00
harupong
43a4e6d296
Added translation using Weblate (Japanese) 2026-10-31 19:35:01 +00:00
tal_sarid
ecbf1e68df
Translated using Weblate (Hebrew)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-10-31 19:35:01 +00:00
danpergal84
6ba2d8ced5
Translated using Weblate (Spanish)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-10-31 19:35:01 +00:00
PreAcc
02261f3993
Translated using Weblate (Hungarian)
Currently translated at 72.9% (489 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/hu/
2026-10-31 19:35:01 +00:00
filippvl
546c00ba1a
Translated using Weblate (Serbian)
Currently translated at 20.4% (137 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sr/
2026-10-31 19:35:01 +00:00
opakholis
a272cea6a0
Translated using Weblate (Indonesian)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-10-31 19:35:01 +00:00
TheMatrixan
a4abd56274
Translated using Weblate (Polish)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-10-31 19:35:01 +00:00
ymir
545ef636ff
Translated using Weblate (French)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-10-31 19:35:01 +00:00
n8llcaster
b4c5697755
Translated using Weblate (Slovak)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sk/
2026-10-31 19:35:01 +00:00
Priit Jõerüüt
f4178ce803
Translated using Weblate (Estonian)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-10-31 19:35:00 +00:00
North-DaCoder
3fe6054813
Translated using Weblate (German)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-10-31 19:35:00 +00:00
idezentas
e9c8f8483d
Translated using Weblate (Turkish)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-10-31 19:35:00 +00:00
arcker95
ffc4d2fd5e
Translated using Weblate (Italian)
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-10-31 19:35:00 +00:00
SimonHung
d03538c8bb
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (670 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-10-31 19:35:00 +00:00
Priit Jõerüüt
6b3a0872b1
Translated using Weblate (Estonian)
Currently translated at 99.8% (669 of 670 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-10-31 19:35:00 +00:00
Damontecres
38bd690c85
Update dependencies (#2157)
Updates dependencies to max versions still supporting API level 23

#2152 will allow for further updates
2026-10-31 15:34:57 -04:00
Ali Alaei
46bf78aac4
Allow play/pause from untrusted media controllers (#2145)
## Description
- From media3 1.11, controllers that aren't trusted get read-only player
commands by default.
- Google Home sends its commands through
com.google.android.apps.mediashell (Google's Cast service on the TV),
which isn't trusted, so play/pause from it was dropped.
- Logcat showed: MediaSessionLegacyStub: Calling play() omitted due to
COMMAND_PLAY_PAUSE not being available
- The change: a MediaSession.Callback (TrustAllControllersCallback in
PlayerFactory.kt) that gives every controller all player commands again.
It uses onConnectAsync and AcceptedResultBuilder(session, controller),
so untrusted controllers keep the restricted session commands.
- It's applied to the video session (createMediaSession) and the music
session (MusicService).
- It probably started with the media3 1.11 bump in #1814.

### Related issues
<!-- If this is a new feature or a change, there must be a discussion in
an issue first, reference the issue here -->
<!-- If fixing a bug, reference the bug issue here, or describe the bug,
including steps to reproduce -->
- Fixes #2087 

### Testing
- JMGO N1S 4K, Google TV, Android 14, ExoPlayer.
- Before the fix: play/pause from Google Home did nothing, and logcat
showed the "omitted" warning.
- After the fix: pause and play from Google Home work. Logcat shows each
command reaching handleSetPlayWhenReady, and the warning is gone.
- The TV remote still works.
- I didn't test music playback; leave that out or test it first.

## Screenshots
- None; no UI changes.

## AI or LLM usage
- Claude Code read the logcat output, found the media3 1.11
untrusted-controller change, and wrote TrustAllControllersCallback plus
the two setCallback(...) calls.
2026-10-31 15:24:07 -04:00
Clint Bird
d2713ff2f5
Can Select Artist or Album Artist to be displayed on Music > Artists Page (#2127)
## Description
The Music / Artists view currently appears to use the artist metadata
from individual tracks. While at a track level this makes perfect sense,
it can result in a very noisy and fragmented artists view.

For example, an album by Eminem might contain tracks with artists such
as:
- Eminem
- Eminem feat. 50 Cent
- Eminem ft. Rihanna
- Eminem & Dr. Dre

Each of these seem to appear as a separate artist entry (even though
they are all tracks from the same album by Eminem)

This becomes particularly noticeable in large music libraries, where
featured artists, collaborations, remixes, and slightly different artist
metadata ends up resulting in a large number of sparsely populated or
duplicate / strange looking artist entries.

This PR adds an option / toggle to determine which metadata field is
used to populate the artists view. This option sits neatly within the
current artist view settings e.g. Music > Artists > View options >
Artist source
- Artist (current behavior)
- Album Artist (use the album artist metadata instead)

That Artist setting stays as the default choice (so nobody sees a change
unless they pick it) but now gives the option to filter down only to
Album Artists if desired - this choice is saved per library and applies
immediately.

### Related issues
Closes #1868

### Testing
I've tested it extensively on an Amazon Fire TV Cube Gen 2 (using the
firetv debug variant) the following manual tests were performed:
- The list changes when you pick Album artist and importantly the
selection survives a full app restart
- It was tested on a large library and can confirm only the Album
Artists remained (e.g. only one Eminem entry remained)

Automated checks were run (testFiretvDebugUnitTest & pre-commit) As well
as two new tests being added to the CollectionFolderViewModelTest.kt:
- For letter counting its checking via the album artist endpoint (and
not the standard one) when the source is set as ALBUM_ARTIST
- When the source is changed via the saveViewOptions its triggering a
load from the album artist endpoint

## Screenshots
Please see the screenshots below showing the UI impact / modification:
<img width="4624" height="3472" alt="1"
src="https://github.com/user-attachments/assets/6b53575e-ad15-4f66-b9c0-074657128a1d"
/>
<img width="4624" height="3472" alt="2"
src="https://github.com/user-attachments/assets/528c5766-44d8-43d3-8519-778f5aab7441"
/>
<img width="4624" height="3472" alt="3"
src="https://github.com/user-attachments/assets/5de2fb6d-173d-4ac3-ad1b-e08f27f4dafd"
/>

## AI or LLM usage
The code was written / supported with Claude - the approach (e.g. design
/ storing the choice in ViewOptions) endpoint research etc was done by
myself - I reviewed the approaches / refactoring and than deployed a
debug.apk to my local device to confirm everything was working as
expected.

I've reviewed each line and can explain it / the thinking to approaches
/ logic etc and am comfortable submitting the PR.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-10-31 14:21:41 -04:00
hawkinslabdev
c45c662a96
Request audio focus for video playback so background music pauses (#2151)
## Description
The video player passes false to setAudioAttributes (since #1258 I
think), as ExoPlayer never requests audio focus. This will pass `true`.

### Related issues
#447, #1258.

### Testing
Not tested on a device.

### Screenshots
Not applicable

### AI or LLM usage
None.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-10-31 13:56:06 -04:00
Damontecres
5f2f9a8106
Fixes to v1.0.9 (#2072)
## Description
As usual, a PR to fix various smaller bugs in the latest release.

- Fixes not showing the Videos tab on favorites page
- Fixes the Random button not working for photos
- Long nav drawer item names use a marquee scroll if needed
- Fixes a crash when clicking "View More" on a studios rows on the home
page

### Related issues
Fixes #2070
Fixes #2069
Fixes #2135

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-10-28 15:17:24 -04:00
Damontecres
811eaed87e
Change max bitrate during playback (#2097)
## Description
Adds an option to the change the max bitrate during playback. It
defaults to the global setting and can be changed in the settings (gear
icon) on the playback controls.

It is applied for the entire playback session. So if you start an
episode and change it, will be used for each next up episode. If you
back out of playback and start again, it will reset back to the global
default.

### Related issues
Closes #1382

### Testing
Testing on the emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-10-28 15:17:02 -04:00
SergeiAK
2f7804fd5e
Convert Dolby Vision profile 7 to 8.1 on devices without a profile 7 decoder (#2017)
## Description

**On Amlogic boxes (S905X4 and similar) Dolby Vision Profile 7 does not
play as Dolby Vision.**
The server transcodes it, or, with "Direct play Dolby Vision Profile 7"
switched on by hand, the
decoder answers `NoSupport` and fallback ends in HDR10. Devices with a
native Profile 7 decoder,
such as the Shield, are not affected and nothing changes for them.

This PR converts Profile 7 to 8.1 on the fly. It has two halves and one
decision.

The preference `convertDolbyVisionProfile7` is proto field 6 in the
experimental settings, off by
default. In `WholphinRenderersFactory` the filter comes first in the
list, followed by the HDR10+
masking from #1876.

**What this PR does not do.** The enhancement layer is dropped; that is
the price of the
conversion, which is why devices with a native Profile 7 decoder are
left alone.
`BlockAdditional` (an enhancement layer outside the stream) is not read
— like the rest of
Wholphin today — so such a file stays HDR10, as it is now.

### Related issues

Closes #244

Builds on #1876 (the `BitstreamFilter` list). Related to #1540. @fanni42
asked for exactly this on
an S905X4 in #1876.

### Testing

**Hardware** — a debug build of this branch, Homatics box (Amlogic
S905X4, Android 14) + LG BX,
Jellyfin 12.1.0, a Profile 7 FEL remux with the enhancement layer in
band, played from the start
for 39 seconds. Only the new preference was switched on; manual "Direct
play Dolby Vision
Profile 7" was **off**:

* `DolbyVisionProfile7FilterTest` (14) — a fake rewriter on a direct
buffer: offset ≠ 0,
position/limit untouched, every "bytes stay as they were" branch,
three-byte start codes,
  `UnsatisfiedLinkError` tried once;
* `DolbyVisionProfile7ExtractorsFactoryTest` (5, mockk) — only the video
track is rewritten;
* `DolbyVisionProfile7ConversionTest` (6) — codec strings, DRM, `dvh1`.

CI in my fork ran on this branch plus a debug signing commit:
`pre-commit`,
`testDefaultDebugUnitTest` and `assembleDefaultDebug` are all green. The
hardware measurement
above is that build.

## Screenshots

The only UI change is one toggle in the experimental settings.

## AI or LLM usage

The code was written with Claude (Claude Code): the filter, the
extractor wrapper, the condition
and the tests. I reviewed every line and can explain it. It was tested
with the unit tests and
the hardware measurement above. This description was written by me in
Russian and translated
into English with the same assistant.

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Damontecres <damontecres@gmail.com>
2026-10-28 15:16:42 -04:00
Damontecres
6d029086e9
Add detected HDR info to debug page (#2140)
## Description
Adds information to the debug page about detected HDR format for both
the device and the display.

I also wanted to try out the new `Grid` layout composable! It's much
better than the `SimpleTable`/`TableRow` composables I wrote previously.

### Related issues
There's a few issues/PR for improvements to HDR/DV support, so this will
help with debugging

### Testing
Emulator & nvidia shield on HDR TV

## Screenshots
N/A, just tables of info

## AI or LLM usage
None
2026-10-27 18:47:02 -04:00
Damontecres
cecfdaeba9
Fix unit tests after merge 2026-10-26 16:45:42 -04:00
Damontecres
f66746cf47
Auto-configure Discover from Wholphin server plugin (#2134)
## Description
https://github.com/damontecres/jellyfin-plugin-wholphin/pull/3 added a
new endpoint for Seerr configuration in Wholphin server plugin.

This PR adds support for reading that configuration and either
pre-filling the URL or automatically logging in.

Some code was copied from #1418 (thanks @matschi95!), but that PR worked
by inserting a DB record for the plugin provided server. Since the local
DB was preferred, this meant plugin config changes wouldn't be reflected
in the client. This PR instead attempts the connection and only updates
the in-memory connection state, so user switching and app restarts will
re-fetch from the plugin.

If the server plugin is not installed or no Seerr server is configured,
nothing in Wholphin changes.

### Related issues
#598 

This PR replaces #1418


### Testing
Emulator with different scenarios

## Screenshots
N/A

## AI or LLM usage
None
2026-10-26 14:18:56 -04:00