Skip to content

Releases: raulshma/jellyplay

Release v0.9.9

Choose a tag to compare

@github-actions github-actions released this 31 Jul 20:19
701edf5

Highlights

  • In-app self-updates — added an in-app update flow that checks GitHub Releases, resolves the correct APK by device flavor (phone/tv) and ABI, streams the download with progress, and shows release notes in a bottom sheet
  • Video player overhaul — introduced a 5-tier refresh-rate/resolution display-mode matcher, cross-episode audio/subtitle track memory with a weighted scorer, A/B repeat, PixelCopy screenshots, press-and-hold subtitle sync, per-item subtitle-delay persistence, and free-form mpv.conf option parsing
  • Subtitle experience — added per-subtitle download status tracking with independent spinners and retry UI, plus per-series subtitle role preferences (forced-narrative, SDH) with tiered matching
  • Track labels & enrichment — centralized track label formatting with role badges (Forced/Default/SDH) and server-side enrichment so all engines (ExoPlayer, mpv, libVLC) produce consistent, de-duplicated labels
  • 9-language localization — added German, Spanish, French, Italian, Portuguese, Japanese, Korean, and Chinese across all feature modules and the core UI, with a settings language picker
  • Library & playlists — added an Add-to-Playlist picker with a pinned "Watch Later" row and playlist creation from the detail screen
  • Home polish — added an ambient backdrop to the home screen and reduced unnecessary recompositions across home and admin
  • Reliability — stripped stale player routes from the back stack on state-loss restore so the app no longer auto-plays a dead item, and suppressed auto-update checks for dismissed versions

Features

  • feat(update): add in-app self-update flow via GitHub Releases2baf320d@raulshma
  • feat(update): suppress auto-check for dismissed update versions019c4c71@raulshma
  • feat(player): add refresh rate/resolution matching, cross-episode track scoring, and player enhancements84c9a6dc@raulshma
  • feat(player): add per-series subtitle role preferences8d45721c@raulshma
  • feat(player): add track label formatting and server enrichment47165200@raulshma
  • feat(subtitle): add per-subtitle download status tracking and retry UI2e97c362@raulshma
  • feat(i18n): add 9-language localization across all modules0ed1dfbc · 9ab34c16@raulshma
  • feat(i18n): extract hardcoded strings into localized resources across all modules0425341c@raulshma
  • feat(details): add Add-to-Playlist picker, Watch Later, and playlist creationea02c1d2@raulshma
  • feat(home): add ambient backdrop to home screen86fcd75b@raulshma
  • feat(navigation): strip stale player routes from back stack on state-loss restore6e6cbbe8@raulshma
  • feat(docs): update README to include new features like refresh rate matching, self-update, and localization25e6ca25@raulshma

Bug Fixes

  • fix: resolve GitHub Releases API and subtitle track matching regressions9b27ed39@raulshma
  • fix(home): improve comments for graphics layer handling in HeroHeader7a9a3db0@raulshma

Performance

  • perf: reduce unnecessary recompositions across home and admin screensbd2a984c@raulshma

Style

  • style(i18n): fix grammar, typos, and phrasing in localized strings74edc5ba@raulshma

Tests

  • test: add comprehensive unit tests across core and feature modulesb4d89ab9@raulshma
  • test(player): add comprehensive unit tests for player feature modulesdf957471@raulshma
  • test(home): add unit tests for home feature and widget components21f20866 · 50684d78@raulshma
  • test(subtitle): update resolution tests to respect override toggled92905fe@raulshma

Contributors

Full Changelog: release/v0.9.8...release/v0.9.9

Release v0.9.8

Choose a tag to compare

@github-actions github-actions released this 29 Jul 08:02
4a66dc9

Highlights

  • Live TV overhaul — dedicated live TV player with delivery-method selection, error recovery options with expandable details, and Direct Stream support for HTSP/HLS tuners
  • Audio effects pipeline — full audio pipeline reconfiguration with Android audio effects support, shared audio lifecycle, and audio preferences reducer
  • Settings factory reset — new factory reset screen with per-category reset and coverage guard
  • Subtitle improvements — text vs image codec distinction for side-loading, subtitle style override respect, and stream-index-based track resolution
  • Player engine architecture — extracted BasePlayerEngine, MediaSessionController, SettingsProjector, SleepTimerController, and PlayerCastController for cleaner separation of concerns
  • Download system refactoring — centralized download orchestration with DownloadEnqueuer, DownloadFailurePolicy, DownloadStorageLayout, and unified audio helpers

Features

  • feat(player): add audio pipeline reconfiguration and Android audio effects support008ffb14
  • feat(livetv): offer delivery-method options on playback error176204f7
  • feat(livetv): show delivery-method badge and keep option selectionb50cba1c
  • feat(home): route live TV channels to dedicated player and extend play callback533a8874
  • feat(playback): add live stream delivery options and shared audio lifecyclee9bcd871
  • feat(subtitle): distinguish text and image subtitle codecs for side-loading454017fd
  • feat(settings): add factory reset screen with per-category reset and coverage guardbb894679

Bug Fixes

  • fix(livetv): respect user's "Override Subtitle Styles" toggle in subtitle style application075beb65
  • fix(livetv): keep error dialog visible after terminal playback error825ce30b
  • fix(livetv): stop error dialog flash and show expandable details020fea54
  • fix(livetv): make Direct Stream actually work for HTSP/HLS tuners7099da08
  • fix(player): resolve subtitle tracks by stream index and fix font provider initfb89180d
  • fix(player): prevent MPV teardown race conditions and fix subtitle configa26d2f32

Refactors

  • refactor(widget): extract shared dimension and error classification helpersf6700f77
  • refactor: improve live player error handling and settings code2fbc5a5f
  • refactor(player): simplify MediaSessionController and SettingsProjector APIsf2b0e9e2
  • refactor(player): extract MediaSessionController and fix live mute reset2ca280aa
  • refactor(ui): dedup player controls portrait/landscape branches5b9cb8cd
  • refactor(ui): extract TvOrTouchSlider to replace duplicated slider logic667510ae
  • refactor(video): extract settings projection from VideoPlayerViewModel2064cb74
  • refactor(video): extract cast and sleep timer workflows from VideoPlayerViewModel28ea7412
  • refactor(player): extract common engine boilerplate into BasePlayerEngine19170056
  • refactor(data): annotate context parameter with ApplicationContext qualifier7e05089e
  • refactor(data): extract pure audio reducer and download policy modules0be8c4e7
  • refactor(core): centralize download orchestration, unify audio fx helpers, and consolidate settings pickers141ed33e
  • refactor(core): centralize download orchestration and unify pickers4e725e34
  • refactor: consolidate audio effects, downloads, and selection stateb90cdab0

Tests

  • test(player): add comprehensive player engine and subtitle style tests02e84b76

Contributors

Full Changelog: release/v0.9.7...release/v0.9.8

Release v0.9.7

Choose a tag to compare

@github-actions github-actions released this 25 Jul 04:59
2584454

Highlights

  • Library filters & player preferences — added played-status and minimum-rating filters to browsing/search, plus volume-remember-on-mute, auto-skip intro/outro, and a subtitle style preview in settings
  • Player navigation & PiP reliability — replaced rewind/forward seek buttons with previous/next episode navigation and fixed Picture-in-Picture to register media controls on entry (including auto-entry via home button)
  • Deep module extraction — broke monolithic classes into testable modules (DownloadPauseReason, PlayedStateSync, SmartPlayResolver, TtlCacheGate, ExoPlaybackErrorMapper) with comprehensive test coverage
  • Settings restructure — extracted picker dialogs, adaptive sheet components, and converted dialog enums to sealed classes for exhaustive when expressions
  • Shared UI components — introduced ExpandableText, ConfirmDialog, SubtitleStylePreview, and JellyPlayScreenScaffold to consolidate scattered inline implementations
  • Simpler offline UX — removed the OfflineBanner composable; the offline indicator no longer shows when the server is unreachable

Features

  • feat: add library filters, player preferences, and UI componentse7da793d@raulshma — played-status/rating filters, volume-remember/mute, auto-skip intro/outro, subtitle preview, high-contrast/OLED theme precedence, scheduled theme, accessibility, sleep timer duration input, editor validation
  • feat(player): replace seek controls with episode navigation; fix PiP media controlsf5449c02@raulshma — prev/next episode buttons, fetchAdjacentEpisodes, PiP remote-action registration on entry
  • feat(ui): remove offline banner component and refreshServerHealth595b42f4@raulshma

Refactors

  • refactor: extract deep modules and centralize engine/download contractsfc8bc99@raulshmaDownloadPauseReason/DownloadStates, PlayedStateSync, SmartPlayResolver/TmdbIdResolver, TtlCacheGate, ExoPlaybackErrorMapper/AspectRatioDetector; fixed NavigationState tab restoration
  • refactor(player): extract PipController and remove PlayerPlaybackModel abstractioncb0c03c@raulshma — deleted GetHomeSectionsUseCase/GetMediaDetailUseCase for direct repository calls, added invalidateUserDataCaches
  • refactor(settings): convert dialog enums to sealed classesb9af293@raulshma — exhaustive when, inlined DownloadWorker.workName()
  • refactor(settings): extract picker dialogs and adaptive sheet components6ae2e6f@raulshma
  • refactor(ui): extract ExpandableText component and dedupe subtitle color mapping0a0b546@raulshmasubtitleColorToCompose public, defaults videoAutoplayNext/videoRememberBrightness to true

Chore

Contributors

Full Changelog: release/v0.9.6...release/v0.9.7

Release v0.9.6

Choose a tag to compare

@github-actions github-actions released this 23 Jul 19:57
91434e1

Highlights

  • Offline download reliability & self-healing — introduced cold-start reconciliation that resets truncated or missing completed downloads to PENDING, automatic network-reconnect resume for interrupted downloads, user-vs-network pause-reason tracking, and a bounded auto-retry budget that dead-letters persistently failing items
  • Multi-select offline deletion — replaced the simple delete confirmation with a full bottom sheet supporting selection of individual episodes, whole seasons, or entire series, with live freed-storage estimation
  • Player gesture customization — added a preference to render brightness/volume gesture indicators on the opposite side (default) or the same side as the gesture
  • Download flow polish — episodes are now pre-fetched when opening the series download sheet, with simplified selection state and optimized episode flow across the offline detail/series screens
  • Tooling — bumped the Android Gradle Plugin to 9.3.1 and migrated the Room database to v38 (pause reason + retry-count columns)

Features

  • feat(downloads): add multi-select delete sheet for offline series34a2e5d6@raulshma
  • feat(downloads): pre-fetch episodes when opening series download sheet7e04667e@raulshma
  • feat(player): add gesture indicator side preference286549dd@raulshma
  • feat(downloads): add auto-retry budget and pause reason tracking2d276902@raulshma

Fixes

  • fix(downloads): add download reconciliation and reconnect auto-resumea805ce68@raulshma
    • Cold-start reconciliation self-heals the offline library by resetting truncated or missing completed downloads back to PENDING
    • A network-reconnect listener resumes PAUSED/FAILED downloads once validated connectivity returns, so they no longer stay stuck after a network drop
    • The download worker now probes content length on resume to catch truncated transcoded streams before marking them COMPLETED

Refactors

  • refactor(selection): simplify SeriesDownloadSelection initialization and state managementa2bad3b6@raulshma
  • refactor(downloads): optimize episode flow handling in OfflineDetailViewModel and OfflineSeriesViewModel70f3d8fb@raulshma

Internal

  • Bumped Android Gradle Plugin 9.3.09.3.1 (7e04667e)
  • Room schema migrated v37 → v38, adding pausedReason (USER/NETWORK) and retryCount columns to the downloads table (2d276902)
  • Added test coverage: SeriesDownloadSelectionTest, DownloadRecoveryInitializerTest, DownloadReconnectListenerTest, DownloadRepositoryImplResumeTest, and updated MigrationTest

Contributors

Full Changelog: release/v0.9.5...release/v0.9.6

Release v0.9.5

Choose a tag to compare

@github-actions github-actions released this 22 Jul 23:16
c595c49

Highlights

  • Offline mode polish — server-bound navigation (Library, Live TV) hidden when offline, playback outbox drain awaited before reconnect fetches, and dedicated image cache clearing
  • MPV performance overhaul — zero-copy MediaCodec reordered to fix GPU stutter, new mpv error mapping, bilinear scaler default, and fast profile applied globally
  • Downloads bulk management — long-press multi-select with bulk pause, resume, cancel, and delete; offline season mark-as-watched/unwatched controls
  • Player UX refinements — hardware keyboard shortcuts, confirm haptics on seek/play/skip, brightness persistence across app switches, buffering spinner gated on intended playback, and subtitle hold-lock preventing offline track reset
  • Notification actions — "Mark as seen" and "Open" buttons directly from new-media notifications
  • Settings backup versioning — schema-versioned export envelope with security-sensitive field opt-in on import
  • Library alphabet rail — tap-to-jump letter rail for large libraries

Features

  • feat(offline): hide server-bound destinations when offline78dc315@raulshma
  • feat(downloads): add multi-select bulk actions to downloads screenc93f5d1@raulshma
  • feat(downloads): add offline season mark controls and shared backdrop UI components65b4e7d@raulshma
  • feat: improve playback sync, player UX, and database reliabilityaf342bc@raulshma

Bug Fixes

  • fix(home): wait for playback outbox drain before fetching sections on reconnect1ea9340@raulshma
  • fix(player): prevent subtitle track reset on offline playbacke4d19e8@raulshma

Performance

  • perf(engine): reduce GPU load and stuttering in MPV playback420ec33 / c030637@raulshma
  • Optimized widget image loader with LruCache, batch preload deadline, and URL cap to prevent launcher ANR
  • Gated sync-draining rotation animation to reduce idle recomposition

Refactors

  • refactor(home): remove unused imports and icon for section customizationc2c2147@raulshma
  • Extracted shared BackdropLayer, BackdropScrollState, and ChipRow components for offline detail/series screens
  • Extracted ImageCache.DIR constant across modules for consistent cache management
  • Added SettingsBackup versioned envelope for export/import with legacy format fallback

Contributors

Full Changelog: release/v0.9.4...release/v0.9.5

Release v0.9.4

Choose a tag to compare

@github-actions github-actions released this 22 Jul 03:34
20658b3

Highlights

  • Offline playback sync — introduced a playback outbox and a PlaybackSyncWorker that queue progress and played/unplayed events while offline (or on API failure) and drain them on reconnect using latest-wins reconciliation, so watched state stays consistent across the server, downloads, and the UI without needing a connection.
  • Played-state consistency — cascaded mark played/unplayed into the offline hierarchy, normalized offline watched state at the 95%-of-runtime threshold, and fixed stale watched badges that flipped back during post-mutation episode refetch and playback-stop cache reads.
  • Sync visibility on home — added a pending-sync status icon with a live badge and a Sync Details sheet showing per-entry media metadata, ages, and a manual Sync Now action.
  • Season-level watched actions — added mark played / unplayed for an entire season with optimistic state updates and smart-play target recomputation.
  • Structured player errors — replaced bare Flow<String> error channels with a typed EngineError across all engines, so the UI can distinguish retryable from fatal failures and offer engine-switch/retry affordances.
  • Metered connection awareness — surfaced metered-network status in the playback UI to explain silent bitrate caps.
  • Player hardening & polish — guarded LoudnessEnhancer against crashes, fixed select-all across lazy-loaded seasons, removed a kotlin-reflect dependency, and strengthened subtitle download cancellation, trickplay metadata guards, and live-engine fallback paths.

Features

  • feat(data): add offline playback progress sync with outbox and background worker4afd74d47@raulshma
  • feat(offline): add played-state events to playback outboxddb9bcdb9@raulshma
  • feat(offline): cascade played state to offline store and surface sync queue14c8dc501@raulshma
  • feat(home): add sync details sheet and pending sync status icon5da379dd8@raulshma
  • feat(player): replace string error flows with structured EngineErrore512d4388@raulshma
  • feat(player): surface metered connection status in playback UI3d46fa5c4@raulshma
  • feat(details): add season-level mark played and unplayed actions2898610ef@raulshma

Fixes

  • fix(cache): remove post-mutation refetch and invalidate caches on playback stop71ecfbb03@raulshma
  • fix(details): preserve optimistic played-state badges during post-mutation episode refetch1072e3273@raulshma
  • fix(offline): respect manual offline mode in sync readiness and clear resume positionsaa2f8cd8e@raulshma
  • fix(offline): preserve played-state flips when clearing playback telemetryae9c9e05e@raulshma
  • fix(model): normalize watched state for offline media at 95% threshold698bdb12c@raulshma
  • fix: add LoudnessEnhancer error handling, fix select-all, avoid kotlin-reflect2467b1df6@raulshma

Misc

  • docs: remove implementation-phase markers from code comments49d7b15f1@raulshma

Contributors

Full Changelog: release/v0.9.3...release/v0.9.4

Release v0.9.3

Choose a tag to compare

@github-actions github-actions released this 20 Jul 08:10
1959175

Highlights

  • Home section customization — long-press any home section title to open an inline config sheet for toggling visibility and reordering sections directly from the home screen
  • Un-hide media items — Next Up and Continue Watching rows now support showing previously hidden items back via the detail options menu
  • Detail screen architecture — unified UiState, routed snackbar messages through SharedFlow, moved Seerr fetch into the ViewModel, and deduplicated audio/video branching logic
  • Card GPU performance — replaced per-card drop shadows with lightweight 1px borders to reduce GPU compositing overhead across home sections
  • DataStore decomposition — extracted ServerIdentityStore, PinRateLimiter, WidgetDataStore, and AppearanceSettingsStore (deleted) from the monolithic UserPreferencesStore
  • Download centralization — introduced DownloadIntake as the single seam for offline media artifacts (images, trickplay, subtitles, segments)

Features

  • feat(home): add inline section-config sheet via long-presse601c4c2@raulshma
  • feat(details): allow un-hiding items from Next Up and Continue Watching00cd8d7c@raulshma

Bug Fixes

  • fix(details): tighten flow keys and move Seerr fetch into the VMc4813f15@raulshma
  • fix(MediaStreamPicker): update icon and text colors to use onPrimary theme color809c8db5@raulshma

Performance

  • perf(ui): replace card drop shadows with borders to cut GPU overheadfb95b422@raulshma

Refactors

  • refactor(details): unify UiState, route snackbar events through SharedFlowd8a38a31@raulshma
  • refactor(details): drop redundant remember keys and local alias block582e3731@raulshma
  • refactor(details): dedupe isAudio, hoist video click, expand wildcard importsb6367128@raulshma
  • refactor(home): extract section ordering and query into use casesc2020a3b@raulshma
  • refactor(home): remove unused imports and long-click icon from HomeSectionTitle54d918b0@raulshma
  • refactor(datastore): extract focused stores from UserPreferencesStore1c5cf055@raulshma
  • refactor(download): centralize downloads via new intake seama9dc143b@raulshma

Contributors

Full Changelog: release/v0.9.2...release/v0.9.3

Release v0.9.2

Choose a tag to compare

@github-actions github-actions released this 19 Jul 19:14
7083d49

Now I have a thorough analysis. Let me generate the release notes:


Highlights

  • Dedicated live TV player — extracted a fully standalone live TV player module with ExoPlayer HLS engine, channel zapping, EPG integration, and DVR support, replacing the VOD live codepath
  • Offline media enhancements — episodes are now linked to their parent series for clean bulk deletion, and poster/backdrop images are downloaded locally for offline rendering
  • TV (D-pad) focus overhaul — comprehensive focus handling, safe bottom sheets, and TvFocusableColumn across 45+ screens for reliable remote/keyboard navigation
  • UI component consolidation — extracted shared player chrome, sheets, shapes (ShapeCache), and error/loading states to core/ui for consistency across all screens
  • Performance optimizations@Stable/@Immutable annotations, single-flight request deduplication, series-scoped TTL caching, and off-main-thread work across media detail loading and settings
  • Build modernization — centralized Compose compiler config and stability settings into root build.gradle.kts, eliminating per-module duplication

Features

  • Dedicated live TV player — new :feature:player:live module with LivePlayerScreen, LiveTvPlayerViewModel, ExoLiveEngine, channel zap toast, live badge, seek bar, and channel list sheet 03853b2fc@raulshma
  • Offline image persistence — download poster and backdrop images to local disk at download time so offline screens render real artwork instead of blurHash placeholders 4b593aa8e@raulshma
  • Episode sort persistence — episode sort order (newest/oldest first) now persists across navigation via DataStore instead of resetting per screen 963acaf4e@raulshma
  • TV focus handling and safe sheets — added TvFocusableColumn, TvSafeSheet, DpadSlider, focus indicators, and focus restorers across 45+ screens for reliable D-pad navigation 949945c64@raulshma

Fixes

  • Offline-to-online spinner stuck on failure — wrapped fetchAndUpdateSections() in try/finally so isGoingOnline always resets, preventing permanent spinner 3a3e1d31e@raulshma
  • Deferred season selection in download sheet — tapping a season checkbox before episodes load now queues the selection and applies it once episodes arrive; sheet height capped at 560dp e427400a7@raulshma
  • Orphaned episode downloads — episode downloads now store seriesId/seasonId and DAO joins recover legacy rows, so deleting a series also cleans up its episode files 50919c2c4@raulshma
  • Offline-to-online toggle feedback — added isGoingOnline state with spinner indicators on the "Go online" button, FAB menu, and empty-state actions 698072289@raulshma
  • Stuck Seerr request button — fixed optimistic status update keying on null tmdbId when mediaInfo was absent; added fallback synthesis of SeerrMediaInfo 6f9b11fbb@raulshma

Refactors

  • Extract shared UI components to core — moved PlayerModalBottomSheet, PlayerIconButton, PlayerMotion, PlayerScrims to core/ui/player; centralized corner shapes behind ShapeCache; added shared ErrorScreen and ScreenLoadingState 48c247a27@raulshma
  • Drop VLC video output control — removed manual --vout option and VlcVideoOutputPicker dialog; auto-managed by libVLC 696e113fe@raulshma
  • Remove VOD live codepath — stripped isLive field from PlayerSessionState, VideoPlayerUiState, MediaContentState, and all associated guards across ExoPlayer and playback reporting 03853b2fc@raulshma

Performance

  • @Stable/@immutable annotations — marked CastManager, AudioPlaybackManager, VideoMiniPlayerState, MediaPreviewController as @Stable and added compose-stability.conf for navigation/library types to cut recompositions a6453bb76@raulshma
  • Media detail loading optimization — single-flight deduplication via in-flight Deferred, series-scoped TTL caches, collapsed episode fan-out into one getAllEpisodes call, and deferred scroll visuals to draw phase 6aa60aa9b@raulshma
  • Off-main-thread work — moved cache-size refresh, pin hashing, credential reads, and settings data lookups to Dispatchers.IO 6aa60aa9b@raulshma

Build

  • Centralized Compose compiler config — moved metricsDestination/reportsDestination and stability config to root build.gradle.kts, removing duplication from ~25 per-module build files 51bf75fd4@raulshma

New Module

  • :feature:player:live — dedicated live TV player with 15 source files, navigation, and test coverage (17 tests)

Contributors

Full Changelog: release/v0.9.1...release/v0.9.2

Release v0.9.1

Choose a tag to compare

@github-actions github-actions released this 16 Jul 03:12
1d3f40b

Highlights

  • Admin User Edit — major overhaul of the user detail management screen with tabbed editing (Profile, Access, Parental, Account), auxiliary data loading, policy diffing, access schedules, and tag editing
  • LiveTV Channel Detail — new channel detail screen with live timeline, backdrop, and real-time program information
  • Per-Library Home Section Overrides — customizable home section layout per library with a new settings screen
  • Admin Access Control — server-validated admin access with loading states, access denied screen, and enhanced error messaging
  • Network & Build improvements — consolidated WebSocket client with keep-alive, Gradle 9.4+ parallel sync support

Features

  • feat: Admin User Edit - Enhance User Detail Management with Auxiliary Data and New UI Components24af02ba@raulshma
  • feat(livetv): implement channel detail screen with live timelinec62b613d@raulshma
  • (feat): Per-Library Home Section Overrides5f37b47a@raulshma
  • feat(admin): implement admin access control with server validation and loading states12b31783@raulshma
  • feat: enhance access control handling and error messaging across admin and detail features1705c8ad@raulshma
  • feat: add HomeSectionsResult with failure tracking and thumb view mode81c02259@raulshma
  • feat(gradle): enable parallel sync for Gradle 9.4+21d8f188@raulshma

Refactors

  • Refactor user edit sections for improved organization and readability9fec1368@raulshma
  • refactor(network): move websocket client and consolidate keep-alivee9e53ba2@raulshma
  • refactor(ServerHeroHeader): simplify background styling by removing gradientb9898ffb@raulshma

Contributors

Full Changelog: release/v0.9.0...release/v0.9.1

Release v0.9.0

Choose a tag to compare

@github-actions github-actions released this 15 Jul 05:38
50e8930

Highlights

  • Subtitle styling studio — added a standalone subtitle style tester with cross-engine live preview (mpv / libVLC / ExoPlayer), plus richer styling and rendering for full-screen layouts
  • Settings architecture — decomposed the monolithic SettingsViewModel into focused per-screen view models backed by per-domain preference slices for finer-grained recomposition and a single PreferencesEditor write seam
  • Navigation consolidation — migrated the home drawer destinations into the Settings hub and added a dedicated Integrations screen for third-party services (Seerr, Radarr/Sonarr)
  • Search everywhere — home search overlay now surfaces matching settings entries alongside media results (toggle under Appearance)
  • Animation & accessibility — introduced a centralized nav transition policy with reduced-motion helpers, press/focus scale interactions, and animateItem placement specs
  • Rendering & reliability — fixed pull-to-refresh, full-resolution image, and mpv video quality (gpu-next + lanczos), and closed a paging IndexOutOfBoundsException crash on list shrink
  • Home performance — cut per-card allocations, coalesced Seerr state flows, and replaced whole-library sorts with a bounded top-N heap

Features

  • feat(subtitle): add subtitle style tester with cross-engine preview149c76ed@raulshma
  • feat(subtitle): enhance subtitle styling and rendering for full-screen layouts15f4a53b@raulshma
  • feat(integrations): add dedicated hub screen for third-party servicesd0f88a2f@raulshma
  • feat(settings): migrate home drawer navigation into settings hub8c1031cd@raulshma
  • feat(search): surface settings results in the home search overlayfb620449@raulshma
  • feat(animation): add nav transition policy and reduced-motion helpers7c8b0cb2@raulshma

Fixes

  • fix(paging): use bounds-checked item keys to avoid crash on shrinkd0840507@raulshma
  • fix: correct pull-to-refresh, image, and video rendering issues96ff4089@raulshma
  • fix(ui): reposition floating action buttons to avoid nav bar overlap65a064c6@raulshma
  • fix(subtitle-tester): extract assets to files and loop preview5d49f9ea@raulshma
  • fix(subtitle-tester): drop tight buffer that crashed ExoPlayer loadd821604d@raulshma
  • fix(JellyPlayScreenScaffold): improve back button icon color handling and background transparency12e092b9@raulshma

Refactors

  • refactor(settings): split SettingsViewModel into per-screen view modelsdd6f65b1@raulshma
  • Refactor user preferences handling and introduce preference slices8ed52f56@raulshma
  • refactor(subtitle): extract shared style controls and drop duplicate formc11f26ba@raulshma
  • refactor(ui): extract media card badges into reusable composables00dc826f@raulshma

Performance

  • perf(home): cut per-card allocations and redundant recomputation8d60bd80@raulshma

Tests

  • test(preference): add unit tests for per-screen preference slices and their updatesef0f7567@raulshma

Contributors

Full Changelog: release/v0.8.5...release/v0.9.0