A wack ton of changes to the little things
Media
- Added tone mapping support (Jellyfin doesn't really natively support HDR).
- Only works when not transcoding video.
- Improved next episode suggestion.
- Support libraries with sub-folders.
- Improve permissions for connecting to Jellyfin libraries.
- Reset playback if the amount watched is less than 10% or greater than 90% watched.
UI
- Media posters now correctly center their images.
- Episodes with a non 16:9 aspect ratio thumbnails now have improved thumbnails.
- Added server name to footer.
- Display system info when Stingray fails to load.
- Do not show Jellyfin server name or version when not filled out.
- Remove references to collections.
- Play buttons now dynamically show context menus based on media state.
| Single Version of Media | Multiple Versions of Media | |
|---|---|---|
| Watched None |
|
|
| Watched Some |
|
|
Performance
- Improved performance on the home screen.
Errors
- Introduced "Recursive Errors" creating a stack trace of error chains.
MediaModelandSlimMediaare now much less likely to cause library loading failures.- Improved error display with new summary and detailed stack trace views.
| New Error Summary | New Stack Trace Error |
|---|---|
|
|
Bug Fixes
- Play button is now much more likely to select the right episode.
Cleanups & DX
- Abstracted the idea of Jellyfin ticks into
TimeScale. getUpNext(for season: any TVSeasonProtocol)has been moved into a dedicated extension forany TVSeasonProtocolarrays and renamed toupNext()- The
MediaTypeenum now holdsany TVSeasonProtocol TVSeasonProtocol.idis no longer the ID provided by the server.- Use the
TVSeasonProtocol's name instead of season number, and delete the season number field. - System info is now its own view.
- New protocol:
Displayablewhich ensures a data structure has anid,imageBlurHashes, andimageTags. - Rename the TopShelf's advanced network protocol to TopShelfNetworkProtocol for clarity.
- Button functionality has been moved into the
MediaCardto remove duplicate code. - Introduced
decodeFieldSafely<T: Decodable>(_ type: T.Type, forKey key: Key, default defaultValue: T, errBucket: inout [RError], errLabel: String)to safely decode JSON fields, and add errors to an "error bucket".- The error bucket is an array of errors that can be checked at a later date. This allows for JSON to decode as best it can, continuing even if there are missing/incorrect fields along the way.
- Document pretty much every model.







