Fixes#110
Switches loading the EPG/TV Guide data to lazy loading. The app will
load all of the channels, but only keep ~100 channels worth of data in
memory. As the user scrolls up and down, new channel program data will
be fetched as needed.
Eventually this technique can be applied to supporting more than 48
hours of data.
The logic for determine which program to focus on is also simplified and
more of it is delegated to composition.
Credit to @joshjryan for #131 hinting to use a different API endpoint to
avoid 414 errors.
Closes#97
Adds an option to force an item to play by transcoding. This can be
useful in the few cases where the device reports that it supports direct
play for a file, but it really doesn't.
Also rearranges the "More" dialog list to move picking audio & subtitle
track near the top.
Closes#148Closes#83
Remember the chosen sort order & direction per user profile on device.
Also adds a few more sort options.
This is only saved on the device and not saved/loaded from the server.
Closes#133Fixes#142
Theme songs will play for both TV shows and movies, if available. Also,
if there are multiple theme songs, one will be picked randomly instead
of always playing the first.
Additionally, the music now waits to start until the UI has loaded.
Fixes#144
The error was occurring when querying for server information. The
endpoint used returns information about previous installations and seems
some may be missing a field marked as required in the API. This causes
the deserialization error.
Since the query is just to get the server's name for the UI, we can use
the public server info endpoint instead and also wrap it in a try-catch
since it's not absolutely required.
Additionally, this PR adds exceptions for cases when necessary
information is not available (user id, access token, etc).
Adds an option to the show the next up during the end credits (outro)
instead of at the very end of the video.
The next up pushes up from the bottom and the video scales down to fit
above.
Still a WIP though
### Sample screenshot
<img width="1280" height="771" alt="next_up_credits Large"
src="https://github.com/user-attachments/assets/9a03d0ec-325d-4efe-a28e-51270ddaaa89"
/>
If the user has picked a specific audio track, then downloads a new
external subtitle, the audio track index must be adjusted (add 1) to
account for the shift in track indices.
This is because external subtitles are always indexed first.
Closes#95
Adds a setting (defaults to enabled) to automatically go to a page when
the navigation drawer item is focused after a brief delay.
Basically, if you open the left nav drawer, and scroll down to "Movies"
after a brief delay (600ms), the app will switch to the Movies page
without having to click.
It can be disabled in advanced settings.
When clicking the overview for an item, the dialog now shows details
about each file/media source including video, audio, & subtitle
information.
It only shows the full file path if the user is an administrator.
An error would occur when switching audio or subtitle tracks during
playback, but would be ignored. This meant the tracks can't be changed.
#111 was too aggressive on switching dispatchers. The player can only be
accessed on `Main`, so this PR fixes that.
Fixes#113
- Ensures all audio and subtitle options are shown during playback
- Fix home rows not being at top when going back
- Show error message when background home page refresh fails
Also shows more details for login failures and adds a link to the debug
page (with log info) after multiple login failure attempts. Hopefully
this can help diagnose #112 and #18
Related to #103
Adds ffmpeg decoder module to support a few extra audio formats such as
AC3, EAC3, DTS, & TrueHD.
This increases the apk size by about 5.4mb (release 17.4mb->22.8mb), but
definitely worth it for the added support.
Fetch the theme song info on the IO thread
This would throw an exception on some devices, but it would be caught
without affecting the app, other than just not playing theme music.
Simplifies the process for finding the right season id & episode id
after clicking on an episode. This can also improve loading time for
seasons that have a large number of episodes (hundreds).
Also fixes handling for "unknown" seasons which don't have an
index/season number.
Fixes#99
While not an actual error, it does look like a transitive dependency of
the Jellyfin Kotlin SDK may log using slf4j, so it would be good to
include an slf4j implementation just in case.
Related to #64
If an error occurred while querying for a season's episodes, the app
would crash instead of display the error message.
This PR fixes the app crash, but not the underlying query issue. It also
changes the error page to show a button for sending logs to the server
immediately.
This is a workaround for jellyfin/jellyfin-web#7267 to ensure the client
logs are not valid JSON and can be rendered on the `10.11.x` web UI.
Related to #82
Remembers the page position & focused item on both Movie & Series detail
pages
Only loads similar movies & series once so that if you click on one and
go back, it doesn't refresh the entire list
Remember the tab on the Favorite page (if remember tabs is enabled in
settings)
Closes#74
Adds an option to download subtitles from a remote source. This uses the
Jellyfin server's API, so you need to install a plugin on your server
that provides subtitle searching such as the [official OpenSubtitles
plugin](https://github.com/jellyfin/jellyfin-plugin-opensubtitles).
Initially it will search for subtitles in the device's current language,
but you can search for a different language if needed.
Update the search page results to indicate whether 1) the search is in
progress, 2) there are no results, or 3) the actual results. This makes
it clear when there's actually no results versus the search is just
running slowly.
Also search for collections as well
* Revert transparent cards from #61
* Don't show queue during playback if playing the final item
* Fix nav drawer collection page from showing everything recursively
* Immediately hide the skip intro button when pressed
When the home page loaded, it would only try to focus on the "Resume"
row even if there were no items in that row (so it doesn't appear). This
resulted in the focus defaulting instead to the nav drawer.
This PR fixes focus so it always starts with the first item in the first
row of the home page.