Commit graph

508 commits

Author SHA1 Message Date
Ray
a44fad890f
Add preset for home page episode thumbnails (#954)
## Description
Adds a preset for "Episode thumbnails" which shows episodes using their
Primary image (ie a thumbnail or screenshot of the episode).

The previous "Thumbnails" preset is renamed "Series Thumbs" because it
uses the episode's Series Thumb image.

Also fixes a bug where toggling "Use series" might not update the home
page preview automatically.

### Related issues
Fixes #940

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-23 09:56:22 -05:00
Ray
a51d9e9c65
Fix clicking genre cards on home page (#953)
## Description
Fixes clicking on a genre card added to the home page

### Related issues
Fixes #952

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-22 20:18:18 -05:00
YogiBear12
e8c9b4e208
SeriesOverview Alignment (#930)
## Description
This PR changes the padding on the SeriesOverview to align it with the
updated layout on the Home, MovieDetails and SeriesDetails pages.

There is also a small change to fix an incorrect spacing on the
SeriesDetails, and start padding added to the ItemRow to bring it into
alignment with other text elements on the page and ensure consistent
spacing from the navdrawer

### Related issues
I believe this is the final PR to close out
[704](https://github.com/damontecres/Wholphin/discussions/704)

### Testing
Tested changes on both the emulator and physical tv

## Screenshots
Home screen showing the ItemRow alignment
<img width="1920" height="1080" alt="home"
src="https://github.com/user-attachments/assets/b338e2b4-2c53-45a1-b532-544263632230"
/>

SeriesOverview
<img width="1920" height="1080" alt="Screenshot_20260221_200450"
src="https://github.com/user-attachments/assets/51710ade-5155-41d9-8b89-0678c71e0c76"
/>


## AI or LLM usage
AI was used to identify the current padding and spacing values
2026-02-22 10:27:05 -05:00
Ray
cc052453a4
Add basic music video support (#948)
## Description
Just enables showing and playing music videos as if they were regular
videos. Basic metadata is shown as well.

Navigation isn't great because a music video library goes by folders
which don't necessary have the best UI choices.

### Related issues
Related to #267 

### Testing
Checked playback on the emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-21 15:30:16 -05:00
Cristiano Chelotti
55b148971e
Fixing Settings sticky header text overlapping with menu items (#928)
## Description
- Adding a background for the Settings stickyHeader. This helps with
visibility and prevents overlap with the menu items when scrolling.
### Related issues
In the Settings screen, the header can overlap the text of the menu
items when scrolling down. This is a minor UI bug only and does not
affect functionality at all, but the fix seemed easy and harmless so I
figured I'd give it a go.

### Testing
Tested manually on TCL model 50S434 running Android TV. Tested manually
using AVD emulation on Television (1080p) and Television (4K) preset
devices. Reproduced the problem on all 3 devices and confirmed that my
fix works across all.

## Screenshots
Before:
<img width="1920" height="1080" alt="before-settings-fix"
src="https://github.com/user-attachments/assets/15f9916d-2583-4dc4-8302-cb1f3a395b1a"
/>
After:
<img width="1920" height="1080" alt="after-settings-fix"
src="https://github.com/user-attachments/assets/3f8781aa-7063-4eb4-bf4a-95ff34b9b1a1"
/>


## AI or LLM usage
None

---------

Co-authored-by: Ray <154766448+damontecres@users.noreply.github.com>
2026-02-20 19:24:35 -05:00
Ray
7939fffd48
Override H264/AVC High 10 Profile Level 5.2 support for some devices (#935)
## Description
Several Fire TV devices natively support H264/AVC High 10 Profile Level
5.2 according to [their
specs](https://developer.amazon.com/docs/device-specs/device-specifications-fire-tv-streaming-media-player.html),
but the `MediaCodecInfo` doesn't return this support.

So this PR adds an override for the known devices that support this
which prevents unnecessary transcoding.

### Related issues
Closes #786

### Testing
Verified on a Fire TV 4k Max 2nd Gen

## Screenshots
N/A

## AI or LLM usage
None
2026-02-20 16:07:22 -05:00
Ray
4f8f69c438
Better Jellyseerr connection error handling (#933)
## Description
Show Jellyseerr connection errors in settings. If an error occurred
trying to login, in setting it will show "Server error" and clicking
gives more error info and option to remove the server.

### Related issues
Fixes #907 

### Testing
Emulator with simulated errors

## Screenshots
N/A

## AI or LLM usage
None
2026-02-20 14:29:58 -05:00
Ray
dfd9acf561
Add metadata to media session (#934)
## Description
Adds some metadata about playing media for consumption in remote control
apps such as Google Home or others.

### Related issues
Partially address #889, doesn't add explicit controls yet, but Google
Home works

### Testing
Nvidia shield + Google Home app

## Screenshots
iOS Google Home app:

![ios_google_home](https://github.com/user-attachments/assets/680ccae5-b66e-404a-a3a1-7c89991d841b)


## AI or LLM usage
None
2026-02-20 14:28:57 -05:00
Ray
65f20e2daf
Fix a few customize home bugs (#929)
## Description
Hopefully this is the last round of bug fixes for customizing the home
page!

Fixes a possible crash when scrolling after adding a row after resetting
to default or loading remote settings that have more rows than the
original settings

Fixes some incorrect titles

### Related issues
Related to #399 & #803

### Testing
Emulator & nvidia shield

## Screenshots
N/A

## AI or LLM usage
None
2026-02-19 21:50:55 -05:00
Ray
219e4b01db
Add a collection or playlist to home page (#915)
## Description
Adds a basic way to add a collection or playlist as a row on the home
page.

There's a simple search dialog to find the collection or playlist.

### Related issues
Related to #399 & #803 

### Testing
Emulator testing

## Screenshots
N/A

## AI or LLM usage
None
2026-02-19 19:18:39 -05:00
Ray
9daf679f7d
Fix some image issues (#926)
## Description
Fixes/improves thumb image handling by falling back to backdrop images
if available. Episodes without a parent thumb/backdrop will fall back to
their primary image.

Also fixes the nav drawer selected item not updating (bug introduced by
#886).

### Related issues
Fixes #642
Fixes #914

### Testing
Emulator in various situations with missing thumbs

## Screenshots
N/A

## AI or LLM usage
None
2026-02-19 19:18:14 -05:00
YogiBear12
f57cba85f2
Title/subtitle style update (#775)
## Description
This PR updates cards that have a title and subtitle, so that they are
visually distinct instead of sharing the same font and style.
Titles use bodyMedium typography with semiBold weight. 
Subtitles use bodySmall typography with normal weight.

This affects:
- PersonCard
- EpisodeCard
- DiscoverItemCard
- GridCard
- SeasonCard

### Related issues
Related to [735](https://github.com/damontecres/Wholphin/issues/735)

### Screenshots
<img width="960" height="540" alt="Screenshot_20260125_190057"
src="https://github.com/user-attachments/assets/4bbf29a3-3df8-482b-944e-454a9b091e44"
/>

### AI/LLM usage
No LLM usage
2026-02-19 17:28:21 -05:00
Cristiano Chelotti
8bfe77e6e4
Fixing seek text label overlap and visibility issues. (#923)
## Description
- Smoothly bumps up the title and subtitle text above the seek progress
label when the seek bar is focused to prevent overlap.
- Adds a semi-transparent black backer to the text label that appears
above the seek progress indicator. Helps with visibility when the image
in the playback matches the color of the text. Note: the backer is black
with Alpha of 0.6 for now because I felt that looked good for contrast
across all themes. However, if you prefer it respect a particular theme
color, I'd be willing to make that change.

### Related issues
In the playback screen, when focusing the seek bar on Android TVs (at
least the ones I was able to test), the seek text above the seek bar
will overlap with the media title. This is a purely cosmetic issue in
the UI, but it seemed worth a fix. See before and after images in in the
Screenshots section below

This problem is briefly mentioned in point number 2 of [#528
](https://github.com/damontecres/Wholphin/issues/528)

### Testing
Tested manually on TCL model 50S434 running Android TV. Tested manually
using AVD emulation on Television (1080p) and Television (4K) preset
devices. Reproduced the problem on all 3 devices and confirmed that my
fix works across all.

## Screenshots
Before:
<img width="2046" height="1184" alt="before"
src="https://github.com/user-attachments/assets/64708e13-3fa4-4248-91e3-e203f8ac1f7d"
/>

After:
<img width="2046" height="1183" alt="after"
src="https://github.com/user-attachments/assets/db9d1767-cf93-4153-b13a-9a18fbc89e0c"
/>

## AI or LLM usage
None

---------

Co-authored-by: Ray <154766448+damontecres@users.noreply.github.com>
2026-02-19 16:18:20 -05:00
Ray
8c2227bf67
Various fixes for home page customization (#902)
## Description
Fixes several issues with home page customization such as
- Displaying wrong episode-specific display options
- Smaller text on cards without images
- Prefer fill scaling for posters, like the old home page

### Related issues
Related to #803 

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-18 13:40:18 -05:00
Ray
dc3c6dc739
Fix some cases when refresh rate switching didn't work/timed out (#901)
## Description
An attempt to fix #769

1. Always fetch the `DisplayManager` when switching refresh rates
2. Use the Activity context instead of Application context

### Related issues
Fixes #769

### Testing
I still haven't reproduced #769 myself, but this change works fine on my
shield + LG C2

## Screenshots
N/A

## AI or LLM usage
None
2026-02-16 09:04:28 -05:00
Ray
0276c5f49b
Fix reordering the nav drawer items not always saving the changes (#898)
## Description
Fixes the nav drawer preference reordering & save logic. Also improves
the UI a bit with animations.

It's also now stored in memory and saved when the dialog is dismissed.

### Related issues
Related to #886

### Testing
Emulator mostly

## Screenshots
N/A

## AI or LLM usage
None
2026-02-14 16:13:45 -05:00
Ray
44eb50910d
Fixes unable to dismiss next up during credits (#899)
## Description
Fixes an issue where the "Next Up" popup continuously pops up when
dismissed if you have "Show next up during credits/outro" enabled.

### Related issues
Fixes #895
Bug introduced by #884

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-14 16:13:38 -05:00
Ray
1e810c1157
Some fixes to customize homes (#893)
## Description
- Update header when editing a row
- Exclude non-empty rows to prevent scroll lock
- Only save settings locally if they are different from the source

### Related issues
Related to #803 

### Testing
Emulator, tested remote & local settings changes

## Screenshots
N/A

## AI or LLM usage
None
2026-02-13 16:30:03 -05:00
Ray
91900af7a9
Improved home page support for Live TV & Recordings (#890)
## Description
Improves home page customization for Live TV & Recordings
- Add row for live tv channels
- Add row for "on now" programs
- Clicking on a TV channel or TV program starts playback
- Better name for "Recently recorded" instead of "Recently added in
Recordings"

Also fixes a back stack issue after adding rows

### Related issues
Follow up from #803 

### Testing
Emulator

## Screenshots
<img width="663" height="190" alt="image"
src="https://github.com/user-attachments/assets/49d41953-42ab-4621-92f1-b7936aab7e97"
/>

## AI or LLM usage
None
2026-02-13 11:41:47 -05:00
Ray
7fcd66f407
Integrate nav drawer settings for default home page (#888)
## Description
Customizing the home page (#803) and nav drawer (#886) were developed
independently, so this PR just cleans up somethings so that those two
changes work together.

This PR restores the default home page when there is no customization to
be the same as before: continue watching/next up row(s) followed by the
order of the nav drawer libraries' recently added rows.

Finally gets rid of `NavDrawerIteRepository` and related functions which
all had weird, hard to follow code.

### Related issues
Related to #803 & #886

### Testing
Emulator testing

## Screenshots
N/A

## AI or LLM usage
None
2026-02-12 21:19:33 -05:00
Ray
17b0eef5c5
Add ability to order navigation drawer items (#886)
## Description
Allows for reordering the items in the navigation drawer

This does not change the home page row order since #803 decouples the
nav drawer and home page rows.

The initial order will be the "Library Order" settings on the web under
Profile->Home. Making any changes locally in Wholphin will set the
order. If any new libraries are added or if Seerr integration is
enabled, these will added to the end of the "pinned" list.

### Related issues
Closes #822
Related to #399 & #803

### Testing
Tested on emulator
- Re-ordering
- Granting/Revoking user permission to a new library

## Screenshots
N/A, nav drawer is the same, just sorted differently

## AI or LLM usage
None
2026-02-12 19:55:12 -05:00
Ray
fcba1c7444
Customize home page (#803)
## Description

This PR adds the ability to customize the home page in-app

### Features
- Add, remove, & reorder rows
- Persist the configuration locally
- Save the configuration to the server, allowing to pull down on other
devices
- Adjust view options for rows such as card height, image type,
preferring series images, or aspect ratio (similar to libraries)
- Pull down the web client's home rows (no plugins are supported yet!)
- Preview of the home page which is usable & updated as changes are made

### Row options

These are row types that can be added in-app via the UI:
- Continue watching
- Next up
- Combined continue waiting & next up
- Recently added in a library
- Recently released in a library
- Genres in a library
- Suggestions for a library (movie & TV show libraries only)
- Favorite movies, tv shows, episodes, etc

Additionally, there are more row types that don't have a UI to add them
(yet):
- Simple query to get items from a parent ID such as a collection or
playlist
- Complex query to get arbitrary items via the `/Items` API endpoint

### Dev notes

Settings are loaded in order:
1. Locally saved
2. Remote saved
3. Fallback to default similar to Wholphin's original home rows

The remote saved settings are stored via the display preferences API.

I know some server admins would prefer to push a default setup to their
clients. This PR does not have that ability, but it does define a
straightforward API for defining the settings. Something like the
potential server plugin work started in #625 could be slimmed down to
expose a URL to be added in the load order.

I'm also investigating integration with popular home page plugins to
allow for further customization, but will take more time.

### Related issues
Closes #399
Closes #361
Closes #282
Related to #340
2026-02-12 19:54:51 -05:00
Ray
3f0dedd71e
Fix error pages overlapping with nav drawer (#887)
## Description
As of #842, if an error occurred on some pages that display a generic
error message, it would be shown under the nav drawer making it
difficult to read.

This PR fixes that by passing the `modifier` into the `ErrorMessage`
composables ensuring it has proper offset & padding. Also, for
consistency, passes it the `LoadingPage`s.

### Related issues
Caused by #842

### Testing
Threw an exception during home page loading to observe the issue and fix
on the emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-12 19:21:16 -05:00
Justin Caveda
11fd780b31
Fix suggestions cache miss handling for missing files (#880)
## Description
Fix a bug where movie suggestions would get stuck loading when the
on-disk cache file doesn't exist.

### Related issues
Fixes #876

### Testing
Ran unit tests locally. 

## Screenshots
N/A

## AI or LLM usage
Used AI to add testing for this scenario to unit test

---------

Co-authored-by: Ray <154766448+damontecres@users.noreply.github.com>
2026-02-12 18:27:59 -05:00
Ray
4161ea418c
Fixes the skip segment button appearance behavior (#884)
## Description
Fixes the segment (intro, credits, etc) skip button appearance behavior

For the button shown on the video: if the button for a given segment is
clicked, dismissed by the back button, or times out after 10 seconds, it
will never appear again even if you rewind the video.

However, the current non-ignored segment will always show a button on
the playback controls though so it's possible to still use it.

### Related issues
Fixes #875

### Testing
Tested a bunch of scenarios on the emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-11 20:06:15 -05:00
voc0der
028553dc91
Add Quick Connect authorization to Settings (#820)
## Description
- Adding `Quick Connect` drawer to the Settings under the Seer
integration, and before Additional options.
- When interacted with, A inline-dialog appears (after internally
resetting itself), with gutter options Cancel / OK, like existing
dialogs, and when that is completed, where it completes the other side
of `Quick Connect`, e.g. login to your phone Jellyfin app by using
Wholphin.
- Failure and success both are indicated to the user and if success, it
closes the window.

### Related issues
Related to #819 
Closes #819

### Testing
Tested on development build from my repo on a Nvidia Shield 2019.
Performed several logout/login, both success and fail to observe dialog
state and function.

## AI or LLM usage
Used Claude Sonnet 4.5 for most of the code, ChatGPT, reviewed it, then
I reviewed it, made a few tweaks.
2026-02-11 20:06:03 -05:00
Ray
83e5a44f37
Fixes glitches when scrolling on the home page (#882)
## Description
Fixes the possible glitch on some devices when scrolling left-right on
rows on the home page

### Related issues
Fixes #367
Fixes #872

### Testing
Emulator & shield 2019

## Screenshots
N/A

## AI or LLM usage
None
2026-02-11 16:07:22 -05:00
Ray
6e676b9474
Fixes overscrolling on recommended tabs (#881)
## Description
If the continue watching row is empty on recommended pages, it would
scroll to the first successfully loaded row even if previous ones are
still pending.

This PR fixes that so the page waits until the right first row is ready.

### Related issues
Fixes #839

### Testing
Emulator & shield 2019

## Screenshots
N/A

## AI or LLM usage
None
2026-02-11 16:05:11 -05:00
Damontecres
f7efbf9f87
Don't show directed by line if director is unknown 2026-02-10 14:59:27 -05:00
Ray
6954d821ed
Fix two UI issues (#856)
## Description
Fixes UI issues:
- Showing unplayed corner text on multi-part movies
- Fix duplicate or missing rating info on discover movie & series pages

### Related issues
N/A

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-09 18:27:10 -05:00
Ray
b06761eaa5
Rewrite SuggestionsCache & limit parallelism (#851)
## Description
A rewrite of the `SuggestionsCache` to simplify it as a read-through
cache. The downside of this is that updated suggestions won't be
reflected in the UI unless the user reloads the page, but I think that's
an okay trade off.

Also adds parallelism limits to fetching suggestions to reduce the
number of simultaneous API calls. And moved the combining logic to use
the `Default` dispatcher to free up an IO one.

Also adds an initial delay to both the suggestions & tv provider
workers, so a cold start of the app isn't starved.

### Related issues
Related to #849

### Testing
Emulator & unit testing

## Screenshots
N/A

## AI or LLM usage
None
2026-02-09 17:39:40 -05:00
Ray
e7da5ca007
Add settings for max days in next up (#850)
## Description
Add a settings to set the maximum amount of time items can appear in
Next Up.

Options range from 7 days to a year, or no limit (current & default
behavior)

### Related issues
Closes #662 

### Testing
Tested on the emulator and verified URLs, added unit tests

## Screenshots
N/A, just a new slider bar setting

## AI or LLM usage
None
2026-02-09 15:36:20 -05:00
Ray
63b37ef3f4
Fix glitchy nav drawer scrolling when opening (#848)
## Description
The nav drawer would always glitch a little when it gained focus due it
to trying to keep the selected page in view. #842 made this even worst.

This PR fixes that issue by hoisting the list scroll state up higher
which ensures it is remembered between recompositions. This change also
eliminates the need for workarounds to try and scroll it
programmatically which is also a tiny performance boost.

### Related issues
Follow up to #842 

### Testing
Emulator & nvidia shield

## Screenshots
N/A

## AI or LLM usage
None
2026-02-08 16:21:38 -05:00
Ray
72e5e6ae86
Add option to send relevant media info to server for bug reports (#840)
## Description
Adds a item in the More menu to send information about the media item to
the server (and app logs).

This includes the "media sources" which is info about the files and
stream/tracks in the files. It also includes device info, the playback
preferences, and the device's transcoding profile. All of this info is
useful for debugging playback issues.

### Related issues
N/A

### Testing
Emulator testing

## Screenshots
N/A

## AI or LLM usage
None
2026-02-08 13:38:09 -05:00
Ray
d5602aa88c
Navigation drawer improvements (#842)
## Description
This updates the navigation drawer with better behavior and UI. It is
also a bit more optimized and is slightly faster.

- When open, content is pushed to the right instead of being covered
- When open, it uses the same background colors from the dynamic
background
- The icons no longer shift as the drawer opens & closes
- The open drawer is not as wide
- Focus highlight on items is less circular, now matching the other
menus in the app
- The animation is a bit faster too

Dev notes:
- This PR copies & modifies `tv-material` code, so there's a customized
`ModalNavigationDrawer` implementation now
- There are fewer `AnimatedVisibility` composables which improves
performance
- Icons are exactly sized
- Content pages generally shouldn't add start/end padding anymore, the
padding is now added by the nav drawer
(b4f1b111edcd7e7ec05edc1100402b2851721fcd) and is consistent across
every page

### Related issues
Closes #699
Closes #384

### Testing
Tested on the emulator, nvidia shield, & google sabrina

## Screenshots
![nav_drawer_closed
Large](https://github.com/user-attachments/assets/9047eb45-6025-4992-8740-3430f0a8f2a9)
![nav_drawer_open_backdrop_dim
Large](https://github.com/user-attachments/assets/880f24a5-8018-469e-805d-18060c641dc5)



## AI or LLM usage
None
2026-02-08 13:03:43 -05:00
Justin Caveda
8e9a6799f5
Fix: suggestions logic/re-implement logic into worker and address performance issues (#834)
## Description
Addresses suggestion logic oversight in recently merged suggestions fix,
and improve performance (especially app homepage startup time)

- Re-implements the logic that sorts/categorizes tailored suggestions
based on the seed items that are queried. This was implemented in the
original PR at first, but I overlooked moving that logic
- Removes `OneTimeWorkRequestBuilder` and replaces with trigger in
`PeriodicWorkRequest` to fire with a 30 seconds delay if cache is empty.

 
### Related issues
Fixes #833

### Testing
Will be testing in:
Android TV emulator in Android Studio
NVIDIA Shield TV Pro 2019

## AI or LLM usage
I will use AI to help with writing the tests/testing services.
2026-02-07 20:38:26 -05:00
Ray
abf5ec8004
Take playback speed into account when calculating the video end time (#843)
## Description
Small change so that the "Ends" time on the playback overlay takes the
current playback speed into account.

### Related issues
Closes #836

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-02-07 13:03:10 -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
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
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
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
Justin Caveda
e7ed173692
Fix(player): add exoplayer fallback for all 4k playback when MPV software decoding is enabled (#761)
## Description
Updates the logic in the Prefer MPV setting to prevent performance
issues when software decoding is selected. When the MPV backend is
configured to use software decoding, the app will now automatically
fallback to ExoPlayer for 4K content. Most Android TV devices cannot
smoothly render 4K video via software decoding, so falling back to
Exoplayer for this content makes sense in most cases when using the
software renderer. This mirrors the existing fallback mechanism used for
HDR content.

### Related issues
N/A

### Screenshots
N/A

### AI/LLM usage
None

---------

Co-authored-by: Ray <154766448+damontecres@users.noreply.github.com>
2026-01-29 17:11:13 -05:00
Ray
abd8235556
Temporarily restore ExoPlayer as the default player (#797)
## Description
Due a few more MPV bugs showing up, this PR reverts the part of #736
that made "Prefer MPV" the default player option.

User can still manually switch to "Prefer MPV" and its full functional
remains. It's just not set to be the default anymore.
2026-01-29 14:27:01 -05:00
Justin Caveda
b3ef60f86d
Feat(ui): Add drop shadow to UI dialogs (#678)
## Description
Adds a subtle drop shadow to dialog containers in Dialogs.kt. Should
make the dialogs pop a bit more instead of looking flat.

### Related issues
Fixes #665

### Screenshots

Before:

<img width="1950" height="1123" alt="before1"
src="https://github.com/user-attachments/assets/b3cba7b2-108c-4afe-94ef-474943a6cccf"
/>


After:
<img width="1952" height="1133" alt="after"
src="https://github.com/user-attachments/assets/ff9aaf50-e122-4e27-bae1-e981f257fd4c"
/>



### AI/LLM usage
None

---------

Co-authored-by: Ray <154766448+damontecres@users.noreply.github.com>
2026-01-29 13:32:00 -05:00