Commit graph

919 commits

Author SHA1 Message Date
Ray
f2570d4ab0
Add support for music (#1059)
## Description
Adds support for music playback

### Features
- Adds a "Now Playing" page which is accessible from the nav drawer
while music is playing
- Manage the playback queue, add/remove/re-order songs
- Supports synced & non-synced lyrics
- Scroll through lyrics
- Click on line for synced lyrics to seek to that position

### User interface
- Customize what's shown on the "Now Playing" page
- Show album cover art, backdrops, and lyrics
- Show a basic bar visualizer
- Search for albums, artists, & songs
- Links between albums, artists, playlists, & music videos when metadata
is available
- Throughout the app, see which song is playing and which ones are in
the queue

Note: lyrics are synced by line. `10.11` added support for syncing by
word, but Wholphin still supports `10.10`

### Related issues
Closes #2 
Closes #267 

### Testing
Emulator & shield testing

## Screenshots
<details><summary>Click to see screenshots</summary>
<p>

### Album grid
![music_album_grid
Large](https://github.com/user-attachments/assets/4573ad32-0cd7-49db-94db-de37ceb6f641)

### Artist page
![music_artist
Large](https://github.com/user-attachments/assets/fdf3b7b9-5c40-434d-867d-7d56e0b3430e)

### Album details
![music_album_details
Large](https://github.com/user-attachments/assets/494d1a76-9581-4a07-a8ee-5c0957f542e0)

### Album is playing/queued
![music_album_queued
Large](https://github.com/user-attachments/assets/55c72cd2-10a9-411d-8bae-b232150db506)

### Now playing page
![now_playing
Large](https://github.com/user-attachments/assets/b773b1bc-71fd-4789-8509-cebfc0d0ffe5)

### Now playing queue
![now_playing_queue
Large](https://github.com/user-attachments/assets/db244462-e33d-452a-93dc-dd2123a4862d)

</p>
</details> 

## AI or LLM usage
None

## Try it out

See instructions at
https://github.com/damontecres/Wholphin/releases/tag/develop-music
2026-03-24 13:42:18 -04:00
Ray
8a37d63d09
Better playback overlay appearance animations (#1130)
## Description
Updates the playback overlay so that individual component animate in
more deliberately.

For example, the logo & clock slide in from the top instead of the
middle of the screen. And the trick play preview now expands and shrinks
vertically.

### Related issues
I thought there was an issue about this, but I can't find it

### Testing
Emulator, nvidia shield

## Screenshots
N/A

## AI or LLM usage
None
2026-03-23 18:04:11 -04:00
Ray
920733075b
Better error handling for errors on home page rows (#1128)
## Description
Adds better error handling when loading home page rows. For example,
this fixes loading errors if a playlist row is configured, but the
playlist is deleted.

Also fixes an issue from #1116 where changing users doesn't go the home
page.

### Related issues
Related to #1124

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-03-21 19:17:43 -04:00
Ray
dac0b7208c
Refresh seasons on series details page (#1123)
## Description
Simply fetches the tv show's seasons when returning the details page.
This ensures the unwatched counts are updated.

### Related issues
Mentioned as a bug in
https://github.com/damontecres/Wholphin/issues/767#issuecomment-4071852502

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-03-20 12:07:28 -04:00
Ray
f9ff04c5b7
Fix issues when the system kills the app during playback (#1116)
## Description
This fixes some issues restoring the app state after it is killed by the
system, such as to free up memory while the screensaver is showing.

### Dev notes

Reproduce:
1. Start playing media from beginning
2. Pause at 10 minute mark
3. Wait for screensaver to start
4. Press a button
5. Media starts from beginning

Note: It may take a few iterations of 2-4 before the OS destroys the
app.

If the app is killed during playback, ideally Wholphin restores state to
_previous_ page, not playback since restoring playback is complex.
Before this PR, the back stack was maintained by Compose's
`rememberSerializable` and would be restored _after_ the
`PlaybackLifecycleObserver` cleans up the playback destination.

This meant that the app would be restored, from scratch, to the playback
page. The `PlaybackViewModel` would be initialized from scratch as it
was originally called, ie play from beginning.

The fix is to save and restore the back stack outside of Compose.

### Related issues
Fixes #767

### Testing
Emulator & nvidia shield

## Screenshots
N/A

## AI or LLM usage
None
2026-03-18 18:09:13 -04:00
Ray
9057dceef6
Various fixes to screensaver, subtitle order, & playlist modifications (#1104)
## Description
Several small tweaks:

- Always put screensaver logo on left instead of random
- Disable playback speed option if audio is being passed through
- When opening playback settings such as speed or scale, focus on the
current value instead of top of the list; doesn't apply to subtitles so
it's easy to toggle them off
- If the user has a preferred subtitle language, show tracks in that
language first/top
- Add toast message after creating or adding to a playlist

### Related issues
Playback speed audio pass through: #164 

### Testing
Emulator & shield

## Screenshots
N/A

## AI or LLM usage
None
2026-03-15 19:31:18 -04:00
Ray
23e5225c19
Debug installs should use same when updating (#1103)
## Description
Fixes debug install updates from trying to install the release APK and
use debug ones instead.

### Related issues
Fixes #1098

### Testing
Unit tests

## Screenshots
N/A

## AI or LLM usage
None
2026-03-14 18:35:32 -04:00
Ray
627b89f1db
Updates to Seerr image fetching (#1086)
## Description
This PR makes changes to how images are fetched for discover/Seerr
items.

If the discovered item is available on the Jellyfin server, the images
will be fetched from the Jellyfin server.

Then if the Seerr server has image caching enabled, the images will be
fetched from the Seerr server. Otherwise, images are fetched from TMDB .
TMDB was the previous behavior for all images.

### Dev notes

This PR also updates the Seerr server URLs stored in the database, so
it's not backwards compatible.

### Related issues
Fixes #1079

### Testing
Emulator against Jellyseer 2.7.3 & Seerr 3.0.1

## Screenshots
N/A

## AI or LLM usage
None
2026-03-14 16:47:08 -04:00
Ray
8bc3384094
Simplify series overview page refresh (#1092)
## Description
This PR simplifies refreshing the episode data when returning to the
series overview page and reduces the number of queries.

Also fixes a race condition when refreshing a single item in the an
`ApiRequestPager`.

### Related issues
Related to #767

### Testing
Emulator, but will need more testing during actual usage

## Screenshots
N/A

## AI or LLM usage
None
2026-03-12 21:16:56 -04:00
Ray
62965c1b22
Fix slideshow images not resizing properly (#1089)
## Description
During a slideshow of images, the viewpoint would resize to largest
image resolution and images with smaller dimensions would be scaled down
and centered with black bars.

This might be a Coil bug, but I'm not 100% sure yet. This PR works
around the issue by scaling all images to the display resolution instead
of using `Size.ORIGINAL`.

However, we want `Size.ORIGINAL` while zooming so it doesn't pixelate if
the original image's resolution is larger than the display's.

### Related issues
Fixes
https://github.com/damontecres/Wholphin/issues/835#issuecomment-4035005433

### Testing
Emulator with 1920x1080 & 800x1600 images

## Screenshots
N/A

## AI or LLM usage
None
2026-03-12 14:39:26 -04:00
Jannik Mahr
cca818fabb
Improve display of "DTS:HD" and "DTS:HD MA" audio tracks (#1064)
<!-- 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
The formatter for audio codecs did only match the profile of high
definition DTS streams against "DTS:HD" or "DTS:X". At least for DTS:HD
there are also cases where the profile contains "DTS-HD" with "-"
instead of ":".

Made the matcher more generic by allowing both "-"" or ":"" and also
checking if the profile contains "MA" for Master Audio tracks.

This will now correctly display the following high definition DTS types
in the UI:
- DTS:HD
- DTS:HD MA
- DTS:X

**Note:** This is my first public pull request ever, let me know if I
did it wrong :)

### Related issues
Relates to (but does not fix):
https://github.com/damontecres/Wholphin/issues/1057

### Testing
Tested on a Fire TV Cube Gen 3 with multiple files containing DTS HD
audio tracks.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-03-10 23:44:44 -04:00
Ray
0dca02b919
Fix race condition when updating preferences (#1078)
## Description
Fixes a race condition saving preferences. It would be triggered if you
have "Remember selected tabs" enabled and either: 1) changed settings
while on a library grid page or 2) changed settings on a page navigated
_from_ a library grid page and then returned to the grid

### Related issues
I think this will fix #1075

### Testing
Emulator following the steps above

## Screenshots
N/A

## AI or LLM usage
None
2026-03-10 18:10:14 -04:00
Ray
7bb47bf329
Photo/slideshow fixes & Seerr server removal fix (#1076)
## Description
A few fixes

- Better crossfade for photo slideshow
- Fix "Go to" in context menu for photos
- Fix certain home video/photo libraries not working for photos
- Fix removing seerr server in some cases

### Related issues
Closes #835
Fixes #1069
Addresses
https://github.com/damontecres/Wholphin/issues/634#issuecomment-4018580518

### Testing
Emulator mostly

## Screenshots
N/A

## AI or LLM usage
None
2026-03-10 14:16:19 -04:00
Ray
afc47f254b
Request individual seasons from Jellyseerr (#1060)
## Description
Adds a dialog to select individual seasons for a TV show when requesting
it via Discover/Jellyseerr

If a request is already pending, it can be updated. If there's more than
7 seasons, a second submit button is added at the bottom of the dialog
for easier access.

Also, adds a button from Jellyfin series details to its Discover
equivalent and added a request button for partially available series to
request more seasons.

### Related issues
Closes #961

### Testing
Emulator & Jellyseerr 2.7.3

## Screenshots
![discover_seasons
Large](https://github.com/user-attachments/assets/c7781bf4-7c1b-4e4e-a0b8-a572111a8497)

## AI or LLM usage
None
2026-03-10 11:54:00 -04:00
Ray
256bb3f988
Fix crash after last screensaver image in list (#1055)
## Description
Fix a screensaver crash after the last item

Also adds some extra error checking

### Related issues
Fixes #1053

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-03-06 18:16:35 -05:00
Damontecres
73cf54b844
Fixes to strings 2026-03-06 16:18:50 -05:00
idezentas
4cfb471e5d
Translated using Weblate (Turkish)
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-03-06 21:16:21 +00:00
Outbreak2096
b3be20f6da
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-03-06 21:16:21 +00:00
North-DaCoder
dd0f253524
Translated using Weblate (German)
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-03-06 21:16:21 +00:00
RafaelSoaresP
95e0725d8d
Translated using Weblate (Portuguese (Brazil))
Currently translated at 76.8% (386 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt_BR/
2026-03-06 21:16:21 +00:00
n8llcaster
d0f7908648
Translated using Weblate (Slovak)
Currently translated at 44.6% (224 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sk/
2026-03-06 21:16:21 +00:00
EmadAljohani
062a3e99a4
Translated using Weblate (Arabic)
Currently translated at 23.9% (120 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/ar/
2026-03-06 21:16:21 +00:00
arcker95
b4c35ce41b
Translated using Weblate (Italian)
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-03-06 21:16:21 +00:00
isbit
0c19708774
Translated using Weblate (Swedish)
Currently translated at 54.5% (274 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2026-03-06 21:16:21 +00:00
North-DaCoder
b6cef6a4b1
Translated using Weblate (German)
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-03-06 21:16:21 +00:00
zyplex
0d326b49e7
Translated using Weblate (German)
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-03-06 21:16:21 +00:00
idezentas
d69b6d6bb4
Translated using Weblate (Turkish)
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-03-06 21:16:21 +00:00
Outbreak2096
b0236cbd3b
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-03-06 21:16:21 +00:00
SimonHung
3009536670
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-03-06 21:16:21 +00:00
danpergal84
000bd10622
Translated using Weblate (Spanish)
Currently translated at 100.0% (502 of 502 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-03-06 21:16:21 +00:00
idezentas
4ee8a5b4fc
Translated using Weblate (Turkish)
Currently translated at 100.0% (501 of 501 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-03-06 21:16:21 +00:00
Outbreak2096
61369ffac8
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (501 of 501 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-03-06 21:16:20 +00:00
danpergal84
d4cb9a6c92
Translated using Weblate (Spanish)
Currently translated at 100.0% (501 of 501 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-03-06 21:16:20 +00:00
ymir
d051b0d402
Translated using Weblate (French)
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-03-06 21:16:20 +00:00
opakholis
01ac0dec4c
Translated using Weblate (Indonesian)
Currently translated at 98.3% (491 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-03-06 21:16:20 +00:00
American_Jesus
3284a40084
Translated using Weblate (Portuguese)
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-03-06 21:16:20 +00:00
zyplex
49667bc053
Translated using Weblate (German)
Currently translated at 79.1% (395 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-03-06 21:16:20 +00:00
American_Jesus
46c7993836
Translated using Weblate (Portuguese)
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-03-06 21:16:20 +00:00
EmadAljohani
9daa6c9337
Added translation using Weblate (Arabic) 2026-03-06 21:16:20 +00:00
idezentas
321ef8965a
Translated using Weblate (Turkish)
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-03-06 21:16:20 +00:00
arcker95
ea4e4ad140
Translated using Weblate (Italian)
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-03-06 21:16:20 +00:00
danpergal84
b2aea426ef
Translated using Weblate (Spanish)
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-03-06 21:16:20 +00:00
Outbreak2096
fd53206aee
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-03-06 21:16:20 +00:00
SimonHung
7432df3eb1
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (499 of 499 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-03-06 21:16:20 +00:00
idezentas
9aaee3033e
Translated using Weblate (Turkish)
Currently translated at 100.0% (487 of 487 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-03-06 21:16:20 +00:00
Outbreak2096
c5316343b9
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (487 of 487 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-03-06 21:16:20 +00:00
arcker95
034f91ba3a
Translated using Weblate (Italian)
Currently translated at 100.0% (487 of 487 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-03-06 21:16:20 +00:00
SimonHung
a1d651ae21
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 97.1% (473 of 487 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-03-06 21:16:20 +00:00
American_Jesus
898191e44a
Translated using Weblate (Portuguese)
Currently translated at 93.6% (456 of 487 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-03-06 21:16:20 +00:00
danpergal84
691ae4a1a4
Translated using Weblate (Spanish)
Currently translated at 100.0% (487 of 487 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-03-06 21:16:20 +00:00