Commit graph

811 commits

Author SHA1 Message Date
Damontecres
c844395acd
Move home page specific settings 2026-02-05 14:33:54 -05:00
Damontecres
682b81d936
Add global reset to default 2026-02-05 13:20:34 -05:00
Damontecres
1828e94fae
Option to show title below cards 2026-02-05 12:57:34 -05:00
Damontecres
99b15f20c0
Add option to quickly change to thumb images 2026-02-05 12:32:04 -05:00
Damontecres
70ad1ecdbf
Refresh watching rows first 2026-02-05 12:15:29 -05:00
Damontecres
3f4ec24569
Fix tests 2026-02-04 22:31:17 -05:00
Damontecres
a8352e7c0d
Match style to regular preferences 2026-02-04 21:52:47 -05:00
Damontecres
b31c0044fc
Add option for suggestions row for supported library types 2026-02-04 21:16:24 -05:00
Damontecres
2d77249099
Merge branch 'main' into develop/customize-home 2026-02-04 20:54:37 -05:00
Justin Caveda
aeaecc0f59
Fix suggestions mixing content from different libraries and update recommendation logic (#644)
## Description
This PR aims to fix #638 where the "Suggestions" row was mixing up
content from different libraries that shared the same library type. For
example you were in the Anime library, you'd see regular TV shows
showing up, as the TV Shows and Anime libraries would both be "Show"
libraries.

As @damontecres mentioned in the issue discussion, the
`/Items/Suggestions` endpoint Wholphin is using just returns random
items from the same library type, with no special logic or
recommendation algorithm.

I also looked at how the official WebUI handles this. It basically just
mixes "Resume," "Next Up," and "Latest Items" together. That felt a bit
redundant since we usually have dedicated rows for those things anyway;
I wanted to try something that helps discover new content.

I replaced the broken endpoint with a few custom `GetItemsRequest`
calls. These work correctly with the `ParentId` filter, so we only get
results from the library we are actually looking at. Additionally, I
added in some logic that takes into account what the user has been
watching to tailor the suggestions a little bit.

The new logic uses a 40/30/30 mix (this can of course be tweaked as
needed)

- Tailored (40%): Grabs your recently watched items from this library,
checks their genres, and returns items from the same genre.

- Random (30%): Random unwatched stuff from this library.

- New (30%): Recently added items.

This is implemented using only `GetItemsRequest` API calls using
filters, rather than any specialized endpoints like the
`/Items/Suggestions` endpoint. This means the feature should be
predictable and stable. If Jellyfin ever adds an actual recommendation
algorithm and endpoint to call it, I imagine we would want to switch to
that in the future though.

I also added some failsafe logic to make sure there will be diversity in
the "recently watched" items that get pulled, in case a user might have
recently binged a TV show. We wouldn't want every single recommendation
to be based off of that one show.

To fix this, I changed the query to fetch the last 20 history items
instead of just the top 3. Then, we filter that list client-side to find
unique Series IDs. If the user watched 10 episodes of One Piece in a
row, the logic collapses them into a single "One Piece" entry and moves
on to the next distinct show they watched. This guarantees we get
variety in the source material for recommendations.

This is a work in progress right now, mainly due to performance. For my
server it takes about 10-15 seconds to load the Suggestions row when I
tested. This is unacceptable in my opinion, especially if we ever intend
to add a Suggestions row like this to the home page like Plex does. I
have some ideas on how to improve performance, but I'm open to
suggestions.

### Related issues
Resolves #638 

### Screenshots

Before:

<img width="1953" height="1162" alt="suggestions1"
src="https://github.com/user-attachments/assets/6e301c67-1a46-46b5-8184-3adb9e52b330"
/>


After:

<img width="1937" height="1108" alt="suggestions3"
src="https://github.com/user-attachments/assets/b9563865-4055-40b6-b452-f94c26c8b6e9"
/>


### AI/LLM usage
I used Claude Code to help write the Kotlin Coroutines so the API calls
run at the same time. I also used it to write the tests in
`TestSuggestionsLogic.kt`.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-02-04 20:50:29 -05:00
Ray
d9d5ab02e8
Add support for viewing photos in photo albums (#703)
## Description
Add support for viewing photos in photo albums

### Features
- Browse and view albums & photos
- View an album as a slideshow
- Show overlay with photo details and controls
- Rotate, zoom, & pan photos
- Apply basic filters to photos or albums such as contrast, saturation,
red/green/blue, etc
- Setting to include video clips during slideshows

### Controls
- D-Pad left or right: scroll between photos in album
- Hold D-Pad up or down: zoom in or out of the current photo
- D-Pad left/right/up/down, while zoomed: pan around photo
- Back, while zoomed: revert the zoom
- Otherwise: show photo overlay

### Related issues
Closes #458
Closes #634

### Screenshots
#### Overlay
![photo_overlay
Large](https://github.com/user-attachments/assets/b44ed876-d8bd-4f75-aa1e-4106c2edb2f7)

#### Applying filters
![photo_filters
Large](https://github.com/user-attachments/assets/1379978a-b27c-47ac-80af-f7bb6a2177df)
2026-02-04 20:04:46 -05:00
Ray
ee440698b0
Set a different style for HDR subtitles & adjust image subtitles opacity (#827)
## Description
Can now configure a different subtitle style for HDR playback.

There is also a new setting to change the opacity/dim image based
subtitles. This is primarily for HDR to dim very bright PGS subtitles,
but the setting is available for SDR too.

Please remember that the styles only apply to unstyled text formats like
SRT.

I haven't been able to consistently get the preview to switch the
display into HDR mode, so the preview is not 100% accurate.

### Related issues
Closes #583

### Testing
Shield pro 2019 w/ LG C2

## AI or LLM usage
None
2026-02-04 18:22:11 -05:00
Damontecres
034cf5d599
Merge branch 'main' into develop/customize-home 2026-02-04 13:55:58 -05:00
YogiBear12
b0b8ae3639
Align typography and placement between Home, MovieDetails and SeriesDetails (#751)
## Description
This PR addresses some quick changes to align the styling and placement
of elements on the Home, Movie details and Series details pages, using
Home as the reference point for the typography.

### Related issues
Ongoing discussion
[here](https://github.com/damontecres/Wholphin/discussions/704)

### Screenshots
Movie Details
<img width="1920" height="1080" alt="Screenshot_20260123_223116"
src="https://github.com/user-attachments/assets/ffd6a5c0-0ed1-4634-8c57-147f7783950f"
/>


Series Details
<img width="1920" height="1080" alt="Screenshot_20260123_223207"
src="https://github.com/user-attachments/assets/59c6be44-fcf4-4e28-8ad2-add304bd7650"
/>



### AI/LLM usage
LLM was only used to identify the current styling applied to the pages.
All code changes were made and reviewed manually
2026-02-03 17:55:05 -05:00
Ray
733213d6a2
Simplify how display mode is changed (#823)
## Description
Simplifies the refresh rate/display mode change code by removing the
live data go between.

Also, instead of a `CountDownLatch` that blocks the thread, use a
`Deferred` to suspend the coroutine instead.

### Related issues
Might help with #769

### Testing
Tested on nvidia shield
2026-02-03 15:30:24 -05:00
Ray
045b689994
Add ability to sort and filter items in a playlist (#818)
## Description
Add ability to sort and filter items in a playlist. There's a new button
for each added to the playlist details page. Starting playback will run
in the order selected.

The sort and filter are persisted locally per playlist, so returning to
the playlist will remember the previous settings.

Note: playlist playback is still limited to 100 items (#42)

### Related issues
Closes #285

### Testing
Emulator & nvidia shield

## Screenshots
![playlist_sort_filter
Large](https://github.com/user-attachments/assets/9880021b-a1c3-4d8d-ace2-83737f3f772a)

## AI or LLM usage
None
2026-02-03 15:11:37 -05:00
Ray
ae5035703f
Merge pull request #817 from damontecres/fix/805
Always use space for home page header
2026-02-02 12:25:16 -05:00
Damontecres
e6ff173b41
Adopt jellyfin's AI/LLM policy 2026-02-02 10:34:30 -05:00
Damontecres
9a86e854e9
Better support for using thumbnails 2026-02-01 17:33:46 -05:00
Damontecres
f786ec647e
Fix tests 2026-01-30 18:07:09 -05:00
Damontecres
7345b04061
Fix crash 2026-01-30 17:52:41 -05:00
Ray
7aa4ccc447
Update README
Removed versioning details and simplified media player options.
2026-01-30 17:28:41 -05:00
Damontecres
510ca416f3
Release v0.4.1 2026-01-30 17:10:44 -05:00
Damontecres
8c33738e31
Merge branch 'main' into fea/customize-home 2026-01-30 17:04:57 -05:00
Ray
ea414929db
Merge pull request #801 from damontecres/translations-2026-01-30
Translations 2026-01-30
2026-01-30 17:03:31 -05:00
voc0der
1bffa413a2
Fix Seerr Local/Jellyfin authentication and request permissions (#734)
## Description
When using LOCAL or JELLYFIN authentication methods to connect to Seerr,
the login flow was not properly establishing session cookies and user
permissions. The login would 'succeed' and you were led to thinking it
worked, but then...

This caused:
- Request functionality to be greyed out even though the user should
have access
- Users to appear to have no permissions after login (permissions=0)

## Solution
This PR fixes the authentication flow by:

**Fetching full user config after login**: For LOCAL and JELLYFIN
auth methods, the login endpoints (`authLocalPost()` and
`authJellyfinPost()`) establish the session cookie but return incomplete
user data. This PR now calls `authMeGet()` immediately after login to
fetch the fully-populated user configuration including proper
permissions.

## Tests
- Have working apk on my dev fork.
- Ran logins as Local + API. Cannot test Jellyfin due to environment,
but codewise, it looks correct.

## Related issues
Related to https://github.com/damontecres/Wholphin/issues/747


---------

Co-authored-by: Ray <154766448+damontecres@users.noreply.github.com>
2026-01-30 16:16:39 -05:00
Ray
3ada35c731
Fix error reporting & crash during Jellyseerr login (#802)
## Description
Makes sure the invalid credentials error is propagated up instead of
displaying "No URL" as the error message.

Makes sure `OkHttp` is initialized since the startup initialization
provider is disabled. This fixes a possible crash if `OkHttp` needs to
access its assets.

Also, shows the URL when removing the Jellyseerr server.
2026-01-30 16:15:35 -05:00
Ckau
853c224b61
Translated using Weblate (Russian)
Currently translated at 85.6% (310 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/ru/
2026-01-30 16:34:17 +00:00
Sathen
cb9eab2aa5
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (362 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/uk/
2026-01-30 16:34:17 +00:00
ymir
f64c9d2e73
Translated using Weblate (French)
Currently translated at 100.0% (362 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-01-30 16:34:17 +00:00
American_Jesus
1ac6c9366b
Translated using Weblate (Portuguese)
Currently translated at 100.0% (362 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-01-30 16:34:17 +00:00
Sk4hnt42
2f19003dd9
Translated using Weblate (German)
Currently translated at 88.9% (322 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-01-30 16:34:17 +00:00
Lorixx
aae7a64cc4
Translated using Weblate (German)
Currently translated at 88.9% (322 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-01-30 16:34:17 +00:00
viretius
d260791e62
Translated using Weblate (German)
Currently translated at 88.9% (322 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-01-30 16:34:17 +00:00
Priit Jõerüüt
1d11eab48d
Translated using Weblate (Estonian)
Currently translated at 100.0% (362 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-01-30 16:34:17 +00:00
Fjuro
e632c76ff2
Translated using Weblate (Czech)
Currently translated at 100.0% (362 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/cs/
2026-01-30 16:34:17 +00:00
arcker95
8bf3c48a12
Translated using Weblate (Italian)
Currently translated at 100.0% (362 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-01-30 16:34:17 +00:00
Outbreak2096
c714afeb3b
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (362 of 362 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-01-30 16:34:17 +00:00
veisen
82744322e9
Translated using Weblate (Czech)
Currently translated at 100.0% (361 of 361 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/cs/
2026-01-30 16:34:17 +00:00
Sathen
b083bea4bd
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (361 of 361 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/uk/
2026-01-30 16:34:17 +00:00
veisen
1d5afa7809
Translated using Weblate (Czech)
Currently translated at 100.0% (361 of 361 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/cs/
2026-01-30 16:34:17 +00:00
viretius
b189720be5
Translated using Weblate (German)
Currently translated at 85.3% (308 of 361 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-01-30 16:34:17 +00:00
Sathen
d2826d21f7
Added translation using Weblate (Ukrainian) 2026-01-30 16:34:17 +00:00
SimonHung
a99b54bc49
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (361 of 361 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-01-30 16:34:17 +00:00
arcker95
ff7e9517e9
Translated using Weblate (Italian)
Currently translated at 100.0% (361 of 361 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-01-30 16:34:16 +00:00
opakholis
a48acd5d1c
Translated using Weblate (Indonesian)
Currently translated at 100.0% (361 of 361 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-01-30 16:34:16 +00:00
Ray
003fe8348c
Improve series overview loading speed (#800)
## Description
Improves loading speed for the series overview page (one with list of
episodes). This is mostly accomplished by querying for the cast/crew in
the episodes on demand instead of during the initial query.

Also stops using the date as a replacement for the episode index. Using
this caused an extra unnecessary (long) query.

Going from home to the 109th of a 230 episode season is ~2x faster with
this change on my test server.


### Related issues
Closes #599
2026-01-30 11:34:12 -05:00
Damontecres
bec833b0e8
Move code into coroutines 2026-01-30 10:30:39 -05:00
Damontecres
8437ddb51d
Load from web client 2026-01-29 19:49:01 -05:00
Damontecres
d3448771c8
More consistent titles 2026-01-29 19:35:42 -05:00