Releases: raulshma/jellyplay
Releases · raulshma/jellyplay
Release list
Release v0.9.9
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.confoption 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 Releases—2baf320d— @raulshmafeat(update): suppress auto-check for dismissed update versions—019c4c71— @raulshmafeat(player): add refresh rate/resolution matching, cross-episode track scoring, and player enhancements—84c9a6dc— @raulshmafeat(player): add per-series subtitle role preferences—8d45721c— @raulshmafeat(player): add track label formatting and server enrichment—47165200— @raulshmafeat(subtitle): add per-subtitle download status tracking and retry UI—2e97c362— @raulshmafeat(i18n): add 9-language localization across all modules—0ed1dfbc·9ab34c16— @raulshmafeat(i18n): extract hardcoded strings into localized resources across all modules—0425341c— @raulshmafeat(details): add Add-to-Playlist picker, Watch Later, and playlist creation—ea02c1d2— @raulshmafeat(home): add ambient backdrop to home screen—86fcd75b— @raulshmafeat(navigation): strip stale player routes from back stack on state-loss restore—6e6cbbe8— @raulshmafeat(docs): update README to include new features like refresh rate matching, self-update, and localization—25e6ca25— @raulshma
Bug Fixes
fix: resolve GitHub Releases API and subtitle track matching regressions—9b27ed39— @raulshmafix(home): improve comments for graphics layer handling in HeroHeader—7a9a3db0— @raulshma
Performance
Style
Tests
test: add comprehensive unit tests across core and feature modules—b4d89ab9— @raulshmatest(player): add comprehensive unit tests for player feature modules—df957471— @raulshmatest(home): add unit tests for home feature and widget components—21f20866·50684d78— @raulshmatest(subtitle): update resolution tests to respect override toggle—d92905fe— @raulshma
Contributors
- @raulshma — 22 commits
Full Changelog: release/v0.9.8...release/v0.9.9
Release v0.9.8
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, andPlayerCastControllerfor 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 support—008ffb14feat(livetv): offer delivery-method options on playback error—176204f7feat(livetv): show delivery-method badge and keep option selection—b50cba1cfeat(home): route live TV channels to dedicated player and extend play callback—533a8874feat(playback): add live stream delivery options and shared audio lifecycle—e9bcd871feat(subtitle): distinguish text and image subtitle codecs for side-loading—454017fdfeat(settings): add factory reset screen with per-category reset and coverage guard—bb894679
Bug Fixes
fix(livetv): respect user's "Override Subtitle Styles" toggle in subtitle style application—075beb65fix(livetv): keep error dialog visible after terminal playback error—825ce30bfix(livetv): stop error dialog flash and show expandable details—020fea54fix(livetv): make Direct Stream actually work for HTSP/HLS tuners—7099da08fix(player): resolve subtitle tracks by stream index and fix font provider init—fb89180dfix(player): prevent MPV teardown race conditions and fix subtitle config—a26d2f32
Refactors
refactor(widget): extract shared dimension and error classification helpers—f6700f77refactor: improve live player error handling and settings code—2fbc5a5frefactor(player): simplify MediaSessionController and SettingsProjector APIs—f2b0e9e2refactor(player): extract MediaSessionController and fix live mute reset—2ca280aarefactor(ui): dedup player controls portrait/landscape branches—5b9cb8cdrefactor(ui): extract TvOrTouchSlider to replace duplicated slider logic—667510aerefactor(video): extract settings projection from VideoPlayerViewModel—2064cb74refactor(video): extract cast and sleep timer workflows from VideoPlayerViewModel—28ea7412refactor(player): extract common engine boilerplate into BasePlayerEngine—19170056refactor(data): annotate context parameter with ApplicationContext qualifier—7e05089erefactor(data): extract pure audio reducer and download policy modules—0be8c4e7refactor(core): centralize download orchestration, unify audio fx helpers, and consolidate settings pickers—141ed33erefactor(core): centralize download orchestration and unify pickers—4e725e34refactor: consolidate audio effects, downloads, and selection state—b90cdab0
Tests
test(player): add comprehensive player engine and subtitle style tests—02e84b76
Contributors
- @raulshma — 28 commits
Full Changelog: release/v0.9.7...release/v0.9.8
Release v0.9.7
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
whenexpressions - Shared UI components — introduced
ExpandableText,ConfirmDialog,SubtitleStylePreview, andJellyPlayScreenScaffoldto consolidate scattered inline implementations - Simpler offline UX — removed the
OfflineBannercomposable; the offline indicator no longer shows when the server is unreachable
Features
feat: add library filters, player preferences, and UI components—e7da793d— @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 validationfeat(player): replace seek controls with episode navigation; fix PiP media controls—f5449c02— @raulshma — prev/next episode buttons,fetchAdjacentEpisodes, PiP remote-action registration on entryfeat(ui): remove offline banner component and refreshServerHealth—595b42f4— @raulshma
Refactors
refactor: extract deep modules and centralize engine/download contracts—fc8bc99— @raulshma —DownloadPauseReason/DownloadStates,PlayedStateSync,SmartPlayResolver/TmdbIdResolver,TtlCacheGate,ExoPlaybackErrorMapper/AspectRatioDetector; fixedNavigationStatetab restorationrefactor(player): extract PipController and remove PlayerPlaybackModel abstraction—cb0c03c— @raulshma — deletedGetHomeSectionsUseCase/GetMediaDetailUseCasefor direct repository calls, addedinvalidateUserDataCachesrefactor(settings): convert dialog enums to sealed classes—b9af293— @raulshma — exhaustivewhen, inlinedDownloadWorker.workName()refactor(settings): extract picker dialogs and adaptive sheet components—6ae2e6f— @raulshmarefactor(ui): extract ExpandableText component and dedupe subtitle color mapping—0a0b546— @raulshma —subtitleColorToComposepublic, defaultsvideoAutoplayNext/videoRememberBrightnessto true
Chore
Contributors
- @raulshma — 9 commits
Full Changelog: release/v0.9.6...release/v0.9.7
Release v0.9.6
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 series—34a2e5d6— @raulshmafeat(downloads): pre-fetch episodes when opening series download sheet—7e04667e— @raulshmafeat(player): add gesture indicator side preference—286549dd— @raulshmafeat(downloads): add auto-retry budget and pause reason tracking—2d276902— @raulshma
Fixes
fix(downloads): add download reconciliation and reconnect auto-resume—a805ce68— @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/FAILEDdownloads 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
- Cold-start reconciliation self-heals the offline library by resetting truncated or missing completed downloads back to
Refactors
refactor(selection): simplify SeriesDownloadSelection initialization and state management—a2bad3b6— @raulshmarefactor(downloads): optimize episode flow handling in OfflineDetailViewModel and OfflineSeriesViewModel—70f3d8fb— @raulshma
Internal
- Bumped Android Gradle Plugin
9.3.0→9.3.1(7e04667e) - Room schema migrated v37 → v38, adding
pausedReason(USER/NETWORK) andretryCountcolumns to the downloads table (2d276902) - Added test coverage:
SeriesDownloadSelectionTest,DownloadRecoveryInitializerTest,DownloadReconnectListenerTest,DownloadRepositoryImplResumeTest, and updatedMigrationTest
Contributors
- @raulshma — 7 commits
Full Changelog: release/v0.9.5...release/v0.9.6
Release v0.9.5
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
fastprofile 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 offline—78dc315— @raulshmafeat(downloads): add multi-select bulk actions to downloads screen—c93f5d1— @raulshmafeat(downloads): add offline season mark controls and shared backdrop UI components—65b4e7d— @raulshmafeat: improve playback sync, player UX, and database reliability—af342bc— @raulshma
Bug Fixes
fix(home): wait for playback outbox drain before fetching sections on reconnect—1ea9340— @raulshmafix(player): prevent subtitle track reset on offline playback—e4d19e8— @raulshma
Performance
perf(engine): reduce GPU load and stuttering in MPV playback—420ec33/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 customization—c2c2147— @raulshma- Extracted shared
BackdropLayer,BackdropScrollState, andChipRowcomponents for offline detail/series screens - Extracted
ImageCache.DIRconstant across modules for consistent cache management - Added
SettingsBackupversioned envelope for export/import with legacy format fallback
Contributors
- @raulshma — 10 commits
Full Changelog: release/v0.9.4...release/v0.9.5
Release v0.9.4
Highlights
- Offline playback sync — introduced a playback outbox and a
PlaybackSyncWorkerthat 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 typedEngineErroracross 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
LoudnessEnhanceragainst crashes, fixed select-all across lazy-loaded seasons, removed akotlin-reflectdependency, 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 worker—4afd74d47— @raulshmafeat(offline): add played-state events to playback outbox—ddb9bcdb9— @raulshmafeat(offline): cascade played state to offline store and surface sync queue—14c8dc501— @raulshmafeat(home): add sync details sheet and pending sync status icon—5da379dd8— @raulshmafeat(player): replace string error flows with structured EngineError—e512d4388— @raulshmafeat(player): surface metered connection status in playback UI—3d46fa5c4— @raulshmafeat(details): add season-level mark played and unplayed actions—2898610ef— @raulshma
Fixes
fix(cache): remove post-mutation refetch and invalidate caches on playback stop—71ecfbb03— @raulshmafix(details): preserve optimistic played-state badges during post-mutation episode refetch—1072e3273— @raulshmafix(offline): respect manual offline mode in sync readiness and clear resume positions—aa2f8cd8e— @raulshmafix(offline): preserve played-state flips when clearing playback telemetry—ae9c9e05e— @raulshmafix(model): normalize watched state for offline media at 95% threshold—698bdb12c— @raulshmafix: add LoudnessEnhancer error handling, fix select-all, avoid kotlin-reflect—2467b1df6— @raulshma
Misc
Contributors
- @raulshma — 14 commits
Full Changelog: release/v0.9.3...release/v0.9.4
Release v0.9.3
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, andAppearanceSettingsStore(deleted) from the monolithicUserPreferencesStore - Download centralization — introduced
DownloadIntakeas the single seam for offline media artifacts (images, trickplay, subtitles, segments)
Features
feat(home): add inline section-config sheet via long-press—e601c4c2— @raulshmafeat(details): allow un-hiding items from Next Up and Continue Watching—00cd8d7c— @raulshma
Bug Fixes
fix(details): tighten flow keys and move Seerr fetch into the VM—c4813f15— @raulshmafix(MediaStreamPicker): update icon and text colors to use onPrimary theme color—809c8db5— @raulshma
Performance
Refactors
refactor(details): unify UiState, route snackbar events through SharedFlow—d8a38a31— @raulshmarefactor(details): drop redundant remember keys and local alias block—582e3731— @raulshmarefactor(details): dedupe isAudio, hoist video click, expand wildcard imports—b6367128— @raulshmarefactor(home): extract section ordering and query into use cases—c2020a3b— @raulshmarefactor(home): remove unused imports and long-click icon from HomeSectionTitle—54d918b0— @raulshmarefactor(datastore): extract focused stores from UserPreferencesStore—1c5cf055— @raulshmarefactor(download): centralize downloads via new intake seam—a9dc143b— @raulshma
Contributors
- @raulshma — 12 commits
Full Changelog: release/v0.9.2...release/v0.9.3
Release v0.9.2
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
TvFocusableColumnacross 45+ screens for reliable remote/keyboard navigation - UI component consolidation — extracted shared player chrome, sheets, shapes (
ShapeCache), and error/loading states tocore/uifor consistency across all screens - Performance optimizations —
@Stable/@Immutableannotations, 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:livemodule withLivePlayerScreen,LiveTvPlayerViewModel,ExoLiveEngine, channel zap toast, live badge, seek bar, and channel list sheet03853b2fc— @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 navigation949945c64— @raulshma
Fixes
- Offline-to-online spinner stuck on failure — wrapped
fetchAndUpdateSections()intry/finallysoisGoingOnlinealways resets, preventing permanent spinner3a3e1d31e— @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/seasonIdand DAO joins recover legacy rows, so deleting a series also cleans up its episode files50919c2c4— @raulshma - Offline-to-online toggle feedback — added
isGoingOnlinestate with spinner indicators on the "Go online" button, FAB menu, and empty-state actions698072289— @raulshma - Stuck Seerr request button — fixed optimistic status update keying on null
tmdbIdwhenmediaInfowas absent; added fallback synthesis ofSeerrMediaInfo6f9b11fbb— @raulshma
Refactors
- Extract shared UI components to core — moved
PlayerModalBottomSheet,PlayerIconButton,PlayerMotion,PlayerScrimstocore/ui/player; centralized corner shapes behindShapeCache; added sharedErrorScreenandScreenLoadingState48c247a27— @raulshma - Drop VLC video output control — removed manual
--voutoption andVlcVideoOutputPickerdialog; auto-managed by libVLC696e113fe— @raulshma - Remove VOD live codepath — stripped
isLivefield fromPlayerSessionState,VideoPlayerUiState,MediaContentState, and all associated guards across ExoPlayer and playback reporting03853b2fc— @raulshma
Performance
- @Stable/@immutable annotations — marked
CastManager,AudioPlaybackManager,VideoMiniPlayerState,MediaPreviewControlleras@Stableand addedcompose-stability.conffor navigation/library types to cut recompositionsa6453bb76— @raulshma - Media detail loading optimization — single-flight deduplication via in-flight
Deferred, series-scoped TTL caches, collapsed episode fan-out into onegetAllEpisodescall, and deferred scroll visuals to draw phase6aa60aa9b— @raulshma - Off-main-thread work — moved cache-size refresh, pin hashing, credential reads, and settings data lookups to
Dispatchers.IO6aa60aa9b— @raulshma
Build
- Centralized Compose compiler config — moved
metricsDestination/reportsDestinationand stability config to rootbuild.gradle.kts, removing duplication from ~25 per-module build files51bf75fd4— @raulshma
New Module
:feature:player:live— dedicated live TV player with 15 source files, navigation, and test coverage (17 tests)
Contributors
- @raulshma — 14 commits
Full Changelog: release/v0.9.1...release/v0.9.2
Release v0.9.1
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 Components—24af02ba— @raulshmafeat(livetv): implement channel detail screen with live timeline—c62b613d— @raulshma(feat): Per-Library Home Section Overrides—5f37b47a— @raulshmafeat(admin): implement admin access control with server validation and loading states—12b31783— @raulshmafeat: enhance access control handling and error messaging across admin and detail features—1705c8ad— @raulshmafeat: add HomeSectionsResult with failure tracking and thumb view mode—81c02259— @raulshmafeat(gradle): enable parallel sync for Gradle 9.4+—21d8f188— @raulshma
Refactors
Refactor user edit sections for improved organization and readability—9fec1368— @raulshmarefactor(network): move websocket client and consolidate keep-alive—e9e53ba2— @raulshmarefactor(ServerHeroHeader): simplify background styling by removing gradient—b9898ffb— @raulshma
Contributors
- @raulshma — 10 commits
Full Changelog: release/v0.9.0...release/v0.9.1
Release v0.9.0
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
SettingsViewModelinto focused per-screen view models backed by per-domain preference slices for finer-grained recomposition and a singlePreferencesEditorwrite 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
animateItemplacement specs - Rendering & reliability — fixed pull-to-refresh, full-resolution image, and mpv video quality (gpu-next + lanczos), and closed a paging
IndexOutOfBoundsExceptioncrash 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 preview—149c76ed— @raulshmafeat(subtitle): enhance subtitle styling and rendering for full-screen layouts—15f4a53b— @raulshmafeat(integrations): add dedicated hub screen for third-party services—d0f88a2f— @raulshmafeat(settings): migrate home drawer navigation into settings hub—8c1031cd— @raulshmafeat(search): surface settings results in the home search overlay—fb620449— @raulshmafeat(animation): add nav transition policy and reduced-motion helpers—7c8b0cb2— @raulshma
Fixes
fix(paging): use bounds-checked item keys to avoid crash on shrink—d0840507— @raulshmafix: correct pull-to-refresh, image, and video rendering issues—96ff4089— @raulshmafix(ui): reposition floating action buttons to avoid nav bar overlap—65a064c6— @raulshmafix(subtitle-tester): extract assets to files and loop preview—5d49f9ea— @raulshmafix(subtitle-tester): drop tight buffer that crashed ExoPlayer load—d821604d— @raulshmafix(JellyPlayScreenScaffold): improve back button icon color handling and background transparency—12e092b9— @raulshma
Refactors
refactor(settings): split SettingsViewModel into per-screen view models—dd6f65b1— @raulshmaRefactor user preferences handling and introduce preference slices—8ed52f56— @raulshmarefactor(subtitle): extract shared style controls and drop duplicate form—c11f26ba— @raulshmarefactor(ui): extract media card badges into reusable composables—00dc826f— @raulshma
Performance
Tests
test(preference): add unit tests for per-screen preference slices and their updates—ef0f7567— @raulshma
Contributors
- @raulshma — 19 commits
Full Changelog: release/v0.8.5...release/v0.9.0