Commit graph

1515 commits

Author SHA1 Message Date
North-DaCoder
30ec17e50f
Translated using Weblate (German)
Currently translated at 99.8% (600 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-07-07 17:56:27 +00:00
TheMatrixan
422ac89575
Translated using Weblate (Polish)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-07-07 17:56:27 +00:00
arcker95
517b5b0507
Translated using Weblate (Italian)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-07-07 17:56:27 +00:00
SimonHung
db4b4b8489
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-07-07 17:56:27 +00:00
opakholis
63d4e8e80d
Translated using Weblate (Indonesian)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-07-07 17:56:27 +00:00
n8llcaster
eea9a61064
Translated using Weblate (Slovak)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sk/
2026-07-07 17:56:27 +00:00
idezentas
f1a205a465
Translated using Weblate (Turkish)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-07-07 17:56:27 +00:00
Outbreak2096
52e5aa41d2
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-07-07 17:56:27 +00:00
SimonHung
662ef66319
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-07-07 17:56:27 +00:00
ymir
a3de7c330a
Translated using Weblate (French)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-07-07 17:56:27 +00:00
TheMatrixan
dfafed5801
Translated using Weblate (Polish)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-07-07 17:56:27 +00:00
Priit Jõerüüt
d7d283c188
Translated using Weblate (Estonian)
Currently translated at 100.0% (601 of 601 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-07-07 17:56:27 +00:00
TheMatrixan
b887507301
Translated using Weblate (Polish)
Currently translated at 100.0% (597 of 597 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-07-07 17:56:27 +00:00
idezentas
c8cf918116
Translated using Weblate (Turkish)
Currently translated at 100.0% (597 of 597 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-07-07 17:56:27 +00:00
Outbreak2096
b2f1cf1455
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (597 of 597 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-07-07 17:56:27 +00:00
SimonHung
818692a405
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (597 of 597 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-07-07 17:56:27 +00:00
opakholis
4f9abd0edc
Translated using Weblate (Indonesian)
Currently translated at 98.1% (586 of 597 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-07-07 17:56:27 +00:00
Priit Jõerüüt
44d7880468
Translated using Weblate (Estonian)
Currently translated at 100.0% (597 of 597 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-07-07 17:56:26 +00:00
North-DaCoder
e69afe1848
Translated using Weblate (German)
Currently translated at 100.0% (597 of 597 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-07-07 17:56:26 +00:00
Codeberg Translate
94a568ae95
Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/
2026-07-07 17:56:26 +00:00
JorgeLNJunior
56455344ed
Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.7% (559 of 596 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt_BR/
2026-07-07 17:56:26 +00:00
idezentas
ac45a7b64a
Translated using Weblate (Turkish)
Currently translated at 100.0% (596 of 596 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-07-07 17:56:26 +00:00
arcker95
c6bbd0a2de
Translated using Weblate (Italian)
Currently translated at 100.0% (596 of 596 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-07-07 17:56:26 +00:00
Priit Jõerüüt
d0f44513f6
Translated using Weblate (Estonian)
Currently translated at 100.0% (596 of 596 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-07-07 17:56:26 +00:00
idezentas
a33670ef11
Translated using Weblate (Turkish)
Currently translated at 100.0% (594 of 594 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-07-07 17:56:26 +00:00
Outbreak2096
587c289775
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (594 of 594 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-07-07 17:56:26 +00:00
rgabbo
5390332e0f
Translated using Weblate (Italian)
Currently translated at 100.0% (594 of 594 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-07-07 17:56:26 +00:00
arcker95
2c62d36cbe
Translated using Weblate (Italian)
Currently translated at 100.0% (594 of 594 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-07-07 17:56:26 +00:00
SimonHung
54163bc37f
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (594 of 594 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-07-07 17:56:26 +00:00
n8llcaster
c5a0f266d9
Translated using Weblate (Slovak)
Currently translated at 100.0% (594 of 594 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sk/
2026-07-07 17:56:26 +00:00
Priit Jõerüüt
22c00fea1b
Translated using Weblate (Estonian)
Currently translated at 100.0% (594 of 594 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-07-07 17:56:26 +00:00
TheMatrixan
5cef952797
Translated using Weblate (Polish)
Currently translated at 100.0% (589 of 589 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-07-07 17:56:26 +00:00
Damontecres
013755208d
Update Seerr integration version & start blocklist handling logic (#1671)
## Description
Start testing against Seerr `3.3.0` which has been out for over a month.
The only significant change is that the new "blocklisted" status is
added, but it uses the same code as the previous "deleted" status. So
generally, Seerr `3.2.0` will still work.

This starts work on supporting Seerr's blocklist which, unfortunately,
is expected to be enforced on the client side. For now, blocklisted
items still show, but the request button is disabled and shows
"Unavailable" instead.

Finally, some Seerr parent permissions I missed in #1631 are added.

### Related issues
Related to #1626

### Testing
Emulator testing

## Screenshots
N/A

## AI or LLM usage
None
2026-07-07 13:56:22 -04:00
Tal Sarid
f6e00c7820
Add localized duration formatting and related string resources (#1571)
## Description
Instead of using English-only duration format (e.g. `HHh MMm SSs`) in
various places, I've added a format function that is based on several
new localized resources keys.

That includes:
1. Media runtime in Item view
2. Time remaining in Item view
3. End time in Player view
4. Time passed and time remained in Player view

### Related issues
None

### Testing
I installed the app on my Google TV Streamer, switched to my language,
browsed all item views that I could think of to see that the duration
labels are all localized in my language. I didn't commit those strings,
I will do it through the Weblate after it will get merged. I also played
a few items and saw that the labels there are localized as well.

## Screenshots
It looks the same in English as before, currently no other language has
custom resources for it yet.

## AI or LLM usage
Used Claude Sonnet to detect places that I missed that are related to
this localization change. Also it helped me to get access to my format
function from various places in the code.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-07-06 08:43:06 -04:00
Damontecres
1d7ddd713b
Bump & clean up some dependencies (#1660)
## Description
Updates several dependencies and cleans up some naming and duplicates.

There are no user facing changes in this PR

### Dev notes

There is a workaround needed to upgrade to Kotlin 2.4.0 to avoid
https://github.com/google/ksp/issues/2964

There are a few more dependencies, but they require increasing the
target SDK to 37, but I don't want to do that yet. API 37 requires
requesting a [new permission for local network
access](https://developer.android.com/privacy-and-security/local-network-permission).
Since that is a critical requirement for Wholphin/Jellyfin, I need to
spend more time reviewing the dev guide to make sure it's handled
correctly.

### Related issues
Replaces #1593
Replaces #1512
Replaces #1465
Replaces part of #1446

### Testing
Unit tests and quick emulator run

## Screenshots
N/A

## AI or LLM usage
None
2026-07-03 11:36:54 -04:00
renovate[bot]
06d7c85027
Update Github Actions (#1620) 2026-07-01 19:39:05 -04:00
Damontecres
0e62b9582c
Improved lifecycle handling & code clean up (#1653)
## Description
Add some improvements related to life cycle handling whenever the app is
resumed:
- Refreshing the server-side user config 
- Refreshing the home page automatically

Also 401/403 errors accessing recording folders will be skipped since
this typically means the user lost access while the app was running.
Refreshing the server-side user config (above) will also help with this.

Finally, there's some general code clean up in `MainActivity` to move
non-UI related code out of Compose.

### Related issues
Closes #1647

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-07-01 19:18:16 -04:00
Damontecres
ad25a1eb7c
Fix issue templates 2026-06-28 14:18:21 -04:00
calebvetter
1c9081951a
Fix AFTKRT + HSL/TS + EAC3 7.1 playback issues (#1580)
## 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.
2026-06-27 17:42:01 -04:00
Damontecres
00338c5c11
Fix MPV minify crash (#1636)
## Description
Fixes a crash when trying to play content via MPV on release builds.

After #1365, the package name for `MPVLib` changed, so the existing
proguard rule no longer applied. This meant the native code could no
longer find the right class.

### Related issues
Fixes #1633
https://github.com/damontecres/wholphin-extensions/pull/9 fixes this
upstream

### Testing
Tested release builds on emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-27 14:29:46 -04:00
Damontecres
083d4e4fa8
Add experimental settings & video tunneling (#1624)
## Description
This PR introduces the concept of "experimental" settings or features.
These may cause instabilities or may need further testing. They may be
changed or removed any time. Also, the developers won't provide lots of
support for them.

The goal is expose some specialized settings that might only apply to a
small subset of users or test out tweaks to playback.

The first experimental feature is a toggle to enable [video
tunneling](https://developer.android.com/media/media3/exoplayer/track-selection#tunneling).

### Related issues
Related to #1283

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-27 14:29:37 -04:00
Damontecres
21e720c420
Also check Seerr parent permissions (#1631)
## Description
When saving Seerr permissions on the WebUI, if a "parent" permission is
checked, only its bit is flipped and its children's bits are not. So
clients must check if a user has the permission _or_ its parent.

For example, if just "Request 4K" is checked, the flags for "Request 4K
Movies" and "Request 4K TV" will not set explicitly.

### Related issues
Fixes #1630

### Testing
Emulator & unit tests, also manually reviewed API requests/responses on
Seerr's web UI

## Screenshots
N/A

## AI or LLM usage
None
2026-06-27 14:28:57 -04:00
Damontecres
a8ade9171e
Update wholphin-extensions with newer MpvPlayer (#1365)
## Description
Uses the newer version of `wholphin-extensions` which now has the Kotlin
code, so this PR removes the MPV Kotlin code from this repo. Also
updates gradle to use providers.

There are no user facing changes

### Dev notes

`wholphin-mpv` can be provided by:
1. [Fetching pre-built
binaries](https://github.com/damontecres/wholphin-extensions#pre-built-binaries)
(Preferred method for devs)
2. Building `wholphin-extensions` from
[source](https://github.com/damontecres/wholphin-extensions#build-from-source)
3. Using `wholphin-mpv-stub` (the new module added in this PR) which
allows for compiling Wholphin, but will throw exceptions if MPV is used
during runtime

### Related issues
Related to #1172 

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-26 12:50:45 -04:00
Damontecres
f5ce9745ba
Several UI/UX minor changes (#1623)
## Description
Gathering some smaller UI/UX changes:
- Default to the user's preferred subtitle language when
searching/downloading subtitles and if unset, fall back to the UI's
language
- Only show >0s runtime on quick details & don't show negative ends at
- On the OS channel row for recently added, only include movies &
episodes
- Only show movies & episodes to "Recently Added" Android OS channel
- Fix context menu for adding songs & albums to the music queue

### Related issues
Related to #1339 & #1484
Fixes #1617
Fixes
https://github.com/damontecres/Wholphin/issues/1329#issuecomment-4440684328

### Testing
Just on the emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-26 12:43:56 -04:00
Damontecres
e5887dfa15
Better UX for separate SDR vs HDR subtitle styles (#1622)
## Description
This PR moves the separated HDR subtitle style behind a toggle. This
means users must now opt-in to using separated SDR vs HDR subtitle
styles. This is a better UX for users who want to customize the style
but use the same styles for both.

Users who have changed the HDR subtitles previously will have the toggle
enabled automatically. If the user hasn't changed HDR style or their SDR
& HDR styles are the the same, the toggle will be disabled.

Also, fixes a bug where when playback switched between SDR or HDR, the
subtitle styles might not be updated.

### Related issues
Closes #1603

### Testing
Emulator & unit tests for migration

## Screenshots
N/A

## AI or LLM usage
None
2026-06-24 19:26:05 -04:00
Christian Tismer-Sperling
8a684545ac
Respect system 24-hour setting in clock time format (#1619)
## Description
<!-- Describe the changes in detail -->
The clock ignored the device's system 24-hour preference:
getTimeFormatter derived 12/24h purely from the locale. This reads
DateFormat.is24HourFormat and builds the time pattern from it, so the
clock follows the system setting.

### 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 -->

### Testing
<!-- Describe how this change was tested and on what device(s) -->
Tested on the emulator toggling the system 24-hour setting on/off.
assembleDefaultDebug, testDefaultDebugUnitTest and pre-commit (ktlint)
pass.

## Screenshots
<!-- Please include screenshots if the PR alters any UI elements -->

## AI or LLM usage
<!-- If you used any AI or LLM assistance, please list where in the code
and how you tested it -->
The analysis and the fix were done by me with AI assistance (Claude). I
wrote the description myself; the English wording was polished with AI.
I understand the code and can maintain it.
2026-06-24 17:02:53 -04:00
Damontecres
d705a3ea01
Add filtering & sorting for discover grid pages (#1614)
## Description
This PR adds sort & filter options for the discover grid pages.

Sort options:
- Popularity
- Release date
- "Community rating" (TMDB user vote)
- Name

Filter options:
- Genre
- Studio/Network
- "Community rating" (TMDB user vote)
- Parental rating
- Production status (TV only)

Also, two more tabs are added to the discover page for browsing movies
and TV. These are essentially the same as clicking "View more" on the
respective rows on the Discover tab.

### Limitations

This PR hardcodes the region used for studio listing and filtering to
"United States". I'll work on a follow up PR to enable users to specify
this.

The sort & filters are not persisted. I think they should be on the two
new tabs, but not elsewhere, but this will be a follow up PR.

### Related issues
Related to #702 
Implements some of #1511
Rewrites the filter logic in #1610 

### Testing
Emulator, but needs further testing

## Screenshots
<img width="1280" height="720" alt="discover_filters Large"
src="https://github.com/user-attachments/assets/cdefb95c-c4b7-4e06-9bac-b535d372ba03"
/>


## AI or LLM usage
None
2026-06-23 17:24:37 -04:00
Damontecres
552c3b5500
Fix inconsistent playback end behavior issues (#1616)
## Description
The exact behavior of what happens when playback ends based on the
user's settings would change between versions. This PR defines the
behaviors better and includes unit tests to verify future changes won't
break it again.

### Related issues
Fixes #1548
Related to https://github.com/damontecres/Wholphin/pull/1257

### Testing
Emulator & unit tests

## Screenshots
N/A

## AI or LLM usage
None
2026-06-23 17:23:47 -04:00
Damontecres
899e3decc2
Prefer non-forced when subtitle preference is always on (#1618)
## Description
If subtitles preferences are "Always", this PR will prefer non-forced
tracks even if any forced ones are default tracks.

This is in-line with the web UI from my testing and another review of
the code.

### Related issues
Fixes
https://github.com/damontecres/Wholphin/issues/790#issuecomment-4708705576

### Testing
Unit tests

## Screenshots
N/A

## AI or LLM usage
None
2026-06-23 17:23:37 -04:00
Damontecres
7422f15bff
Fix possible crash if remembered tab no longer exists (#1613)
## Description
If remember tabs is enabled and the current remembered index is somehow
removed, the app would crash.

I think the only way a regular user can encounter this is if the server
removes a live TV recording folder that the user has
selected/remembered. All other tabbed pages use a fixed list.

### Related issues
None

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-23 11:11:39 -04:00