## Description
Fixes the home page reloading from scratch when the app is resumed
This happened because the `userDto` is updated on app resume and since
it has a last accessed timestamp, it would always different and trigger
a reload.
### Related issues
Bug introduced by #1981
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
There is a race condition when switching users between
`HomeViewModel.init` and `HomeSetttingsService.loadCurrentSettings`.
This happens more often if the new user doesn't have a customized home
page. The result is that the previous user's home page settings are used
for the initial load of the home page.
This PR fixes this by collecting the flows for current user & home
settings, waiting until both are valid and refer to the same user, then
fetch the data.
### Related issues
Fixes#1976
Maybe related (and fixes) #1980, but need to investigate more
### Testing
Emulator. It's easy to reproduce by adding a manual `delay(2.seconds)`
at the start of `HomeSetttingsService.loadCurrentSettings`.
## Screenshots
N/A
## AI or LLM usage
None
## Description
Makes the `itemId` parameter optional allowing just passing
`serverId`/`userId` to switch the user and load the app at the home page
for that user.
Dev note: I added a new assert function `assertIs` which asserts that an
object `is` of a type. It also has a contract so the compiler will
smart-cast usages after the `assertIs`. Checking a result type is a very
common pattern in the unit tests, so this assert will simplify a lot of
current & future tests.
### Related issues
Closes https://github.com/damontecres/Wholphin/discussions/1824
### Testing
Emulator and added unit tests for `parseIntent`
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes some devices activating the OS screensaver during playback when
the in-app dim was enabled.
I was not able to reproduce this on Shield 2017/2019, but could easily
on a Fire TV Stick. #1834 added the dim feature and, when enabled, would
not pass the keep screen on flag to the OS during playback. It seems
maybe regular Android TV's screensaver also listened to active media
session to prevent starting but maybe Fire TV OS doesn't. I'm not 100%
sure. This PR changes the logic slightly so that the keep screen on flag
is always set during playback.
### Related issues
Fixes#1894
Related to dim feature from
https://github.com/damontecres/Wholphin/pull/1834
### Testing
Emulator, shield 2019, & fire tv stick 4k
## Screenshots
N/A
## AI or LLM usage
None
<!-- By submitting this pull request, you acknowledge that you have read
the [contributing
guide](https://github.com/damontecres/Wholphin/blob/main/CONTRIBUTING.md,
including the AI/LLM policy, and [developer's
guide](https://github.com/damontecres/Wholphin/blob/main/DEVELOPMENT.md)
-->
## Description
Person pages that get a filmography from Seerr had three problems, all
in the same place.
The release date was taken from `firstAirDate` alone — the field TMDB
fills for series — so
movie cards showed no year at all. The library person page capped the
row at 25 cast + 25 crew while
`DiscoverPersonPage` had no cap, because each screen carried its own
copy of the same logic.
And `cast + crew` left the row in no order a viewer can read, with a
title appearing twice when
a person is both cast and crew on it.
This PR:
* maps credit dates as `releaseDate ?: firstAirDate` — the expression
the search result mapping
already uses;
* moves the credits logic into a single `SeerrService.personCredits()`
used by both screens, so
they cannot drift apart again;
* drops the 25 + 25 cap, de-duplicates by TMDB id and sorts by release
date descending, with
undated entries last.
Rows on movie and series pages are untouched: only the
`BaseItemKind.PERSON` branch of
`similar()` changed.
Two things worth your opinion:
* Without the cap, the row for a person with a long filmography is long
— 135 cards for Cameron
Diaz, for example. If you would rather keep a cap, the row could keep
the newest 25 and gain a
`ViewMoreCard` opening the full grid — `Destination.DiscoveredItem` with
a `PERSON` item
already routes to `DiscoverPersonPage`. I am happy to add that in a
second commit.
* The sort is fixed to release date descending. It now lives in one
function, so a different key
or a user-facing choice would be cheap to add later.
### Related issues
Fixes#1873
### Testing
CI in my fork ran the repository's own PR workflow on this branch:
`pre-commit` (ktlint) and
`assembleDefaultDebug` with `testDefaultDebugUnitTest` are both green.
I then installed a debug build of the same code on an NVIDIA Shield TV
Pro 2019 (Android 11),
against Jellyfin 10.11.11 with Jellyseerr, and opened Cameron Diaz from
the cast row of
*Charlie's Angels* before and after the change:
* movie cards show a year now; before, the only two cards in the row
with a year were the two
TV entries;
* the row is ordered by release date descending, movies and series
interleaved, instead of the
API order of all cast followed by all crew;
* the row is no longer cut at 25 + 25 — it now runs back to her 1952
credit, and the entries
TMDB has no date for sit at the very end of the row.
Not tested on any other device; nothing in the change is device
specific.
## Screenshots
Person page of Cameron Diaz, reached from the cast row of *Charlie's
Angels*. The library rows
above the Discover row are the same in every shot and are useful as a
reference: they always had
their years.
Before, start of the Discover row — no year under any card:
<img width="1920" height="1080" alt="pr1873-1-before-start"
src="https://github.com/user-attachments/assets/585d0670-ae39-4214-9004-0c92262991da"
/>
Before, end of the Discover row — the row stops here, and the only two
years in it belong to the
two TV entries:
<img width="1920" height="1080" alt="pr1873-2-before-end"
src="https://github.com/user-attachments/assets/85c58575-2ad0-4369-a103-60f04c8d2350"
/>
After, start of the row — years on the movie cards, ordered by date
descending:
<img width="1920" height="1080" alt="pr1873-3-after-start"
src="https://github.com/user-attachments/assets/804745c5-e1a6-4fe4-93bd-dc6c97a7a876"
/>
After, end of the row — the list now reaches 1952, with the undated
entries last:
<img width="1920" height="1080" alt="pr1873-4-after-end"
src="https://github.com/user-attachments/assets/2c32389c-ec0b-4df5-b9d1-f564ef10d8b3"
/>
## AI or LLM usage
The code was written with Claude Opus 5 (Claude Code): the two mapping
lines, the extracted
`personCredits()` function and the two call sites. I reviewed every line
and can explain it.
This description was written by me in Russian and translated into
English with the same
assistant.
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Damontecres <damontecres@gmail.com>
## Description
Consolidates sending reports/logs to the server into
`ServerReportService` (renamed from `MediaReportService`)
Also ensures a consistent header is used including the build flavor.
### Related issues
N/A
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
This PR fixes how cards are displayed initially when creating the
default home page or loading it from the web config:
- Ensure view options are selected based on the library type (this is
how it's done already when manually adding a row)
- Support more home row types such as photos and music
### Related issues
Fixes https://github.com/damontecres/Wholphin/issues/1838
### Testing
Emulator, resetting to default and loading from web config
## Screenshots
N/A, music cards will be square instead of poster sized
## AI or LLM usage
None
## Description
This PR adds many more data types as tabs to the favorites page.
Additionally, only tabs for the types the user has favorites for will
appear. For example, if you have no favorited music videos, that tab
will not show.
Added types:
- Collections
- TV Channels
- Music albums
- Music artists
- Music videos
- Songs
- Home videos
- Photos
- Photo albums
Dev note: The tabs are implemented using keys instead of indexes which
could be useful for the series overview season tabs. Plus it maybe even
be adapted for the episode list to eliminate the terrible index search
logic. A major difference is that the possible favorites tabs are
known/static list where seasons/episodes are queried & paginated.
### Related issues
Closes#1041Closes#1844
### Testing
Manually on emulator, plus unit tests
## Screenshots
N/A
## AI or LLM usage
None
## Description
This PR adds several more data types to search. It also adds a setting
(per use profile) to choose which types to include/exclude when
searching. The combined results now uses the same types instead of a
separate list.
A user can only search for types that they have access to. For example,
they need Live TV access for TV channels/programs or need access to a
movies-type library to search movies.
Added types to search:
- Photos & Photo albums
- Playlists
- People
- TV channels
- Live TV programs
Clicking a TV channel will play it. Clicking a TV program shows the
program dialog allowing for recording or watching live if it's currently
airing.
On the main search page you can also toggle whether to search Seerr or
not. This does not apply to the discover search tab.
Dev note: Some minor refactoring to move setting up/canceling live tv
recordings into a new service so it can be shared between with the live
tv & search pages. Also search related files are moved into the same
package now.
### Related issues
Closes#409Closes#646Closes#1668Closes#1750
### Testing
Emulator using users with different permissions and library access
## Screenshots
<img width="475" height="584" alt="image"
src="https://github.com/user-attachments/assets/ebcff697-07ba-4ddd-8c26-57f147cfa02a"
/>
## AI or LLM usage
None
## Description
When parsing intents, not every path for authentication was checked, so
launching via the "Next Up" OS channel wouldn't check for a profile PIN.
This PR fixes that.
Additionally, the "Next Up" OS channel launch wasn't checking the
correct parameter to ensure the back stack was written properly.
### Related issues
Fixes#1883
### Testing
I manually test on the emulator with these test cases:
- No profile PIN, cold start
- No profile PIN, hot start
- Profile PIN, cold start
- Profile PIN, hot start
- No profile PIN, launch via "Next Up" channel
- No profile PIN, launch via intent
- Profile PIN, launch via "Next Up" channel
- Profile PIN, launch via intent
Also added unit tests for intent-based and regular launching which
covers those cases and more.
## Screenshots
N/A
## AI or LLM usage
None
## Description
Another PR to gather small bug fixes:
- Fix aspect ratio for episodes on person page
- Use the song's artist instead of the album's artist on album page
- Fix how the dim percentage is applied to the OS screensaver dim
percentage (#1834)
### Related issues
Fixes#1851Fixes#1863
### Testing
<!-- Describe how this change was tested and on what device(s) -->
## 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 -->
## Description
There were two problems with the experimental "Use AC3 for surround
sound audio" setting (#947):
1. Defaulted to true
2. Access wasn't guarded by enabling experimental settings
This caused unintentional audio transcoding
### Related issues
Fixes#1878
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Slight optimization to remove "child count" for grid pages. Adds back
"primary image aspect ratio" for several queries where its necessary.
Also updates extras cards to use the "primary image aspect ratio"
instead of a hard coded value.
Dev note: some light refactoring is also in this PR including renaming
the item fields lists to better reflect the intended usage in code
### Related issues
Fixes#1843
### Testing
Emulator, I tested many pages and views, but probably need to do "real
world" testing to see if I missed anything
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds a new sceensaver setting to add dimming. A larger value is darker
This works with or without the in-app screensaver. If dimming is
enabled, the screen be will be dimmed after inactivity. If both dimming
and the in-app screensaver are enabled, the screensaver will show dimmed
after inactivity.
### Related issues
Closes#1179
### Testing
Emulator
## Screenshots
N/A, it's just darker
## AI or LLM usage
None
## Description
The audio player passed handleAudioFocus = false when setting its audio
attributes, so ExoPlayer never requested audio focus. Music kept playing
and mixed with other audio when a call arrived, another app started
playback, or voice search took focus.
### Related issues
Fixes https://github.com/damontecres/Wholphin/issues/1841
### Testing
1. Play a music track
2. Open YouTube and play a video
## AI or LLM usage
Cursor and Claude Code
## Description
Fixes several issues on the discover pages:
- Fixes sorting by release date for tv shows
- Fixes automatic go-to for movie & tv show grid
- Fixes tv show discover page's go-to using a movie detail page
- Updates the alignment & padding for the headers on different discover
pages to match the reset of the app
- Use media's logo image if available and the setting is enabled
### Related issues
N/A
### Testing
Emulator mostly
## Screenshots
N/A, headers and logos are unchanged, just moved slightly to match
regular content
## AI or LLM usage
None
## Description
Fix some bugs on discover pages:
- UI fixes for available seasons
- Fix toggle not updating when removing a season from a pending request
- Don't request images if the path is null
- Better error handling when fetching ratings
### Related issues
Follow up to #1816
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes several small bugs and does some minor refactoring:
- Use "Recently Added in XYZ" instead of "Recently recorded" for
recorded tv libraries
- Improve home page query performance by using fewer fields in the query
- When an error occurs connecting to discovered servers, show the error
instead of only logging
- Fix headers sometimes appearing briefly on some pages when navigating
back
- Catch exceptions in socket connections
- Use a larger buffer when downloading updates
- Split up ADB logging for media info
### Related issues
Related to
https://github.com/damontecres/Wholphin/issues/1517#issuecomment-5184316086
Maybe the larger download buffer will help with
https://github.com/damontecres/Wholphin/issues/1696
Will help show the error in #1801
Prevents the crash in #1786
### Testing
Emulator & nvidia shield
## Screenshots
N/A
## AI or LLM usage
None
## Description
Ensure that a playlist or collection's items are random sorted on the
home page, if applicable.
Previously, the request did sort by random then by sort name resulting
in only sorting by sort name.
However, there are still issues with random sorting in general, see
#1819
### Related issues
Technically fixes#1806
Further bugs in #1819
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
By default, Wholphin plays music with hardware audio offloading enabled.
This delegates audio decoding to the device's hardware DSP, making
playback stability highly dependent on the manufacturer's system audio
implementation. On certain hardware (such as my TCL TVs, e.g., the
Chinese Model Q9L Pro), this implementation causes music playback to
hang indefinitely at 0 seconds.
### Related issues
#1372
### Testing
Tested on a TCL TV (Q9L Pro):
- Some musics playback hangs at 0s with offloading enabled.
- Disabling audio offloading fixes the issues for all medias.
## Screenshots
<!-- Please include screenshots if the PR alters any UI elements -->
<img width="4284" height="5712" alt="IMG_9486"
src="https://github.com/user-attachments/assets/ddf95e68-6ebd-42f9-9565-568de4fbfc42"
/>
## AI or LLM usage
Developed in pair with Gemini and human-reviewed, tested.
---------
Co-authored-by: Damontecres <damontecres@gmail.com>
## Description
Adds an optional boolean parameter `shuffle` that is read for the
playback intent. When true, it will cause the resulting media to be
shuffled if applicable.
Something can be shuffled if the `itemId` is a grouping on media such as
a playlist, series, season, or even library.
### Related issues
Depends on #1756
### Testing
Emulator with the documented command
## Screenshots
N/A
## AI or LLM usage
None
## Description
When testing the new deep link feature from this PR
[#1688](https://github.com/damontecres/Wholphin/pull/1688)
I noticed that the back button would close the app. As in, all routes
are cleared and only the playback is in the nav stack.
I figured a more desirable behavior would be to create a nav stack,
always starting with the home screen, then also inserting the media
item's details page, if available.
To achieve this, I made the return Target.destinations a list of
destinations, and updated the other two uses in IntentService.
Open to implementation tweaks, or scrap it if this isn't how it should
work, haha.
### Testing
Tested deep links, which produced the following nav stacks:
- Movie view
- Home → Movie details
- Movie playback (with and without position)
- Home → Movie details → Playback
- Series view
- Home → Series details
- Season view
- Home → Season details
- Episode view
- Home → Episode details
- Episode playback (with and without position)
- Home → Episode details → Playback
- Trailer/extras playback (no details page available)
- Home → Playback
- TV channel view
- Home → Playback
- TV channel playback
- Home → Playback
## AI or LLM usage
AI was used to generate the initial code, debug and test, then manual
refactoring and cleanup was done.
---------
Co-authored-by: Damontecres <damontecres@gmail.com>
## Description
Another collection of small individual fixes that don't warrant a full
PR:
- Better error handling for series and collection detail pages
- Better error handling on Discover search tab
- Fix issues when changing view options on card grid without reloading
the page
- Better error handling when changing the refresh rate or resolution
- Fix some nav drawer items disappearing briefly when restarting the app
- Fix that the discover search row would not clear when the query is
cleared
And some UI tweaks:
- Use consistent padding for the different customize home page sections
- Convert the "Continue watching click behavior" setting from a toggle
to choice dialog (the options & behaviors have not changed)
### Related issues
I think the error handling when changing the refresh rate might help
with #1737
### Testing
Emulator mostly
## Screenshots
N/A, UI changes are minor
## AI or LLM usage
None
## Description
The bug report was caused by a race condition where the image URL was
built before the grid was fully laid out causing a `fillWidth=0` and the
`remember` would not reset after the `fillWidth` was updated to the
actual value. So this PR fixes the `remember`.
Furthermore, some extra guards are added to only pass the `fillWidth` &
`fillHeight` params if greater than 0.
Finally, the `EpisodeCard` code is deleted because it's height & width
logic was overly complicated and `BannerCardWithTitle` provides better
functionality anyway.
### Related issues
Should fix#1751
Maybe #1156 is also fixed by this
### Testing
Emulator, but I haven't been able to reproduce the race condition, but
the fix makes sense given the bug report
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds parsing for intents to search, view, or play media based on the
action and parameters. This allows for remotely opening Wholphin and
starting playback.
This is considered experimental, so the syntax or behaviors may change!
See the `Intents.md` file in this PR for syntax and examples.
### Related issues
Replaces https://github.com/damontecres/Wholphin/pull/738
Closes https://github.com/damontecres/Wholphin/discussions/1095
### Testing
Emulator with the test commands in the docs
## Screenshots
N/A
## AI or LLM usage
None
## Description
Previously not every plural translation had full coverage and some did
not have the fallback "other" quantity translation. So for some
languages this would cause an error when trying to display the string
depending on the quantity. This PR ensures every plural translation has
the "other" fallback.
Note: the "other" fallback is copied from an existing translation so I'm
sure some will not be grammatically correct!
Dev note: I used a python script to parse and fix the entries, so it
also rewrote some of the unrelated `CDATA` entries.
### Related issues
Fixes#1676
### Testing
On the emulator, I reproduced the error in the issue with the Danish
translation, verified it was fixed after the patch was applied
## Screenshots
N/A
## AI or LLM usage
None
## Description
Gathering several small bug fixes:
- Clear the backdrop when manually reloading the home page
- Convert the "# years old" string resource to plural
- Fix a spelling error in the source English strings
- Ensure #1680 is respected when searching for subtitles to download
- Slightly adjust padding for the header in collection details to match
other headers
### Related issues
Fixes string issues reported in
https://github.com/damontecres/Wholphin/issues/1705#issuecomment-4982909931
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes querying for resume item (continue watching) for Jellyfin 12 so
that whole series are not included. The patch is also compatible with
Jellyfin 10.11.
### Related issues
Fixes#1689
I couldn't find an issue in Jellyfin that mentions this behavior change,
so I'm guessing it was a side effect. But since the old query did ask to
include Series, I don't think it's a bug in the server.
### Testing
Manual API queries & emulator on both Jellyfin 11 & 12-rc2 servers
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes & improves the "Add to playlist" dialog:
- Added searching by name
- Playlists are sorted by recently updated
- No longer filters by media type
- Filters based on user's permission for the playlists
The behavior is now consistent with the web UI's list except for the
sort
### Related issues
Should fix#1124
### Testing
Emulator testing
## Screenshots
N/A
## AI or LLM usage
None
## Description
#1614 added filtering by a TV production status. I pulled the enum
values from a comment in Seerr's code which spelled it as `Cancelled`,
but the actual API uses `Canceled`. This PR corrects the spelling.
Also, since this value isn't actually used yet, I've removed it from
`TvDetails` for now.
### Related issues
Fixes#1703
### Testing
Emulator, filter by production status as canceled and open any result
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds settings under the "User profile settings" section which allows for
specifying preferred languages for audio and subtitles and the preferred
subtitle mode.
By default (matching existing Wholphin behavior), the preferred
languages and subtitle mode are derived from the user's profile settings
provided by the server which can be set on the WebUI:
User->Settings->Playback or Subtitles. However, this isn't well
understood and Wholphin doesn't display these values anywhere, so many
users were confused.
The preferred languages and subtitle mode can now be configured from
within Wholphin. Setting these will **not** update the server. The
settings are **only** used locally.
### Related issues
Related to #319Closes#790
### Testing
Emulator manually changing some settings, added additional unit tests to
ensure the overrides are respected when choosing tracks
## Screenshots
### Settings page
<img width="1280" height="720" alt="settings_01 Large"
src="https://github.com/user-attachments/assets/28cc2f6b-3a60-42a4-b268-48695086d566"
/>
### Clicking into "More user profile settings"
<img width="1280" height="720" alt="settings_02 Large"
src="https://github.com/user-attachments/assets/6c3be3aa-c177-4d44-8060-b76d15fb10d7"
/>
### Language choice dialog
Can filter languages by typing in the search box at the top
<img width="1280" height="720" alt="settings_03 Large"
src="https://github.com/user-attachments/assets/c014d0ba-8d5b-4201-a6ee-4876b478148c"
/>
## AI or LLM usage
None
## Description
Adds an experimental setting to prefer transcoding audio with more than
2 channels to AC3. Stereo audio does not transcode.
This is basically a workaround for HDMI ARC (not eARC) or optical audio
devices because instead of 2 uncompressed PCM channels, 6 AC3 channels
(ie 5.1) is possible.
An downside of enabling this is that embedded subtitles be burned in
causing a video transcode as well.
### Related issues
Fixes#255
Incorporates some code from #1410
### Testing
Just on the emulator so far to observe if the settings trigger the
transcode or not
## Screenshots
N/A
## AI or LLM usage
None
---------
Co-authored-by: darkflame91 <darkflame91@gmail.com>
## 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
## 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
## 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
## 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 & #1484Fixes#1617
Fixes
https://github.com/damontecres/Wholphin/issues/1329#issuecomment-4440684328
### Testing
Just on the emulator
## Screenshots
N/A
## AI or LLM usage
None
## 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
## 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
## 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
## Description
Adds option to select the quality profile and/or root folder when
requesting from Seerr.
The user needs "Advanced Requests" permission to use this feature. If
not, the options won't show.
### Related issues
Closes#863
Related to #702
### Testing
Emulator w/ different user permissions and different request
configurations
## Screenshots
<img width="1280" height="720" alt="request_movie Large"
src="https://github.com/user-attachments/assets/2665dcbb-e6c3-4d26-857c-b465edff6a02"
/>
## AI or LLM usage
None
## Description
This PR contains only tests, there are no user facing changes.
Adds tests for playback covering:
- Playing next, previous, or within the queue
- Media segments (intro/credit)
- Playing intros before media
Adds basic unit tests for track selection. This uses a new "test track"
builder which can model various files and build them as represented
(differently) by the server, ExoPlayer, and MPV. In future, this will
allow for testing of more complex files.
Also add unit tests for services covering things like:
- Fetching extras
- Deleting media
- Server/user management & auth
### Related issues
Will help with testing/verifying some issues like #1475, #1548
### Testing
Ran the unit tests!
## Screenshots
N/A
## AI or LLM usage
None
## Description
Switches all usages of `kotlinx.coroutines.Dispatchers` to
`WholphinDispatchers`.
`WholphinDispatchers` provides an easier and more reliable mechanism to
use a test dispatcher in unit tests. For regular app usage,
`WholphinDispatchers` just delegates to `Dispatchers`.
There are no user facing changes
### Related issues
None
### Testing
Basic emulator testing & unit tests
## Screenshots
N/A
## AI or LLM usage
None
## Description
Ensures that all string & plural resource keys are unique. This should
help make sure all of the strings are shown in weblate's translation.
### Related issues
Related to #1551
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds options to the context menu to play or shuffle items in a series,
season, collection, or playlist. So you can long click a TV show and
play it directly.
Playing a TV show will play the next up episode (same as the play button
on the series detail page).
Playing a season, collection, or playlist will start from the beginning.
Also, removes the green play arrows and uses the same neutral color as
other icons.
### Related issues
Closes#1451Closes#1507
### Testing
Emulator from library pages & series detail pages
## Screenshots
N/A
## AI or LLM usage
None
## Description
- Ensures all parent ratings are shown in the filter drop down
- Fixes focus loss after filtering library and there are no results
### Related issues
Fixes#1535 (along w/ #1529)
Fixes#1534
### Testing
Emulator w/ a UK movie library
## Screenshots
N/A
## AI or LLM usage
None
## Description
Moves storing the remembered tabs from app preferences to the app
database. This means deleting the user will remove the remembered tabs
and the app preferences file is smaller and faster to load.
The remembered tabs are migrated automatically when the app is updated.
There are no significant user facing changes in this PR.
### Related issues
N/A
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Updates the parental rating filter so it only shows the relevant options
instead of all of them. This is now the same behavior as the web UI.
Additionally, the filter options are cached for a short time so the UI
doesn't need to load them every time the menu is opened.
Dev note: Refactors `FilterUtils` into a service which allows for the
caching
### Related issues
Closes#410
### Testing
Emulator with movie & tv show libraries
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes bugs:
- Follow up to #1487 since the 404 exception can be ignored in some
cases
- Fixes a only-on-main-thread exception when clearing the secure flag in
some cases
### Related issues
Related to #1469
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes an issue where the wrong nav drawer item would be highlighted in
the "More" section
Previously, displaying the discover nav item was partially handled in
the view model state and partially within the UI code which caused this
bug. This PR moves it all into the view model state.
### Related issues
N/A
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None