Commit Graph

79 Commits

Author SHA1 Message Date
57a9f4f236 feat: Do not show all unwacthed episodes only 9+ 2026-02-09 20:09:28 +01:00
eff2e3a0e9 feat: enhance login flow with error handling and user feedback 2026-02-09 19:52:04 +01:00
cc9a82a4cf feat: refactor media retrieval to use combined flows for episodes and continue watching 2026-02-08 17:56:40 +01:00
f932507469 feat: enhance series data handling with reactive flows and content observation 2026-02-07 16:48:56 +01:00
e3b13f2ea7 feat: implement watch progress tracking and home page content refresh on apperance. 2026-02-07 16:13:07 +01:00
7951315048 feat: add unwatched episode count indicators to PosterItems and enhance media item data structure 2026-02-07 00:10:12 +01:00
4c7d6317c8 refactor: code cleanup 2026-02-05 20:14:33 +01:00
6977acc60f feat: enhance media item retrieval to include resume position calculation 2026-02-05 20:13:06 +01:00
3fed91aa27 feat: add playback reporting to Jellyfin server
Report playback start, progress (every 5s), and stop events to enable
session tracking on the Jellyfin dashboard and accurate resume positions.
2026-02-04 22:00:41 +01:00
08373eb878 refactor: extract itemFields list for cleaner API method calls in JellyfinApiClient 2026-02-04 20:07:36 +01:00
4300c8ce84 feat: add MediaProgressBar component and integrate into SeriesComponents for episode progress display 2026-02-04 14:20:34 +01:00
0ebd5c5afe feat: enhance WatchStateIndicator to include started state and update usage in SeriesComponents 2026-02-04 10:18:38 +01:00
d5027047ce feat: add WatchStateIndicator component to display episode watch status in SeriesScreen 2026-02-04 10:02:28 +01:00
88b34c4780 implement latest library content loading and refactor Home screen state
- Implement `loadLatestLibraryContent` in `InMemoryMediaRepository` to fetch and categorize latest media from Jellyfin libraries.
- Update `HomePageViewModel` to use `mapLatest` and `stateIn` for asynchronous, thread-safe loading of "Continue Watching" and "Latest" content.
- Refactor `HomePage` and its UI components (`HomeContent`, `HomeDrawer`, `HomeSections`) to pass data and callbacks as parameters instead of using `hiltViewModel()` internally.
- Enhance `PosterCard` and `ContinueWatchingCard` with explicit click listeners and image request optimization using `Coil`.
- Add `SeasonMedia` type to the `Media` sealed class to support more granular library item tracking.
- Standardize `UUID` usage for media selection callbacks across `LibraryViewModel` and common UI components.
- Improve UI styling by replacing shadows with subtle borders and consistent corner radii on media cards.
2026-02-01 07:56:46 +01:00
b643988ed4 update JellyfinApiClient methods and logging
- Rename `getNextUpEpisode` to `getNextUpEpisodes` and update it to return a list of episodes with expanded request fields.
- Rename `getMediaPlaybackInfo` to `getMediaPlaybackUrl` and update its usages in `MediaRepository`.
- Simplify logging format by removing curly brace placeholders across multiple API call methods.
- Reorder `getContinueWatching` and `getLibraryContent` for better class organization.
- Remove unused `episode` import in `MediaRepository`.
2026-01-31 21:39:42 +01:00
fa76517e12 implement Room local data source and refactor media repository
- Integrate Room database with entities for `Movie`, `Series`, `Season`, `Episode`, and `CastMember`.
- Implement `RoomMediaLocalDataSource` to handle persistent storage and retrieval of media data.
- Refactor `InMemoryMediaRepository` to use the local data source and synchronize with the Jellyfin API.
- Update `HomePageViewModel`, `SeriesViewModel`, and `EpisodeScreenViewModel` to leverage the new repository logic.
- Replace generic `ItemDto` with specific `MovieDto`, `SeriesDto`, and `EpisodeDto` for type-safe navigation.
- Refactor UI models and components in `SeriesScreen`, `EpisodeScreen`, and `HomeSections` to use domain models directly.
- Enhance `JellyfinApiClient` requests to include necessary fields like `CHILD_COUNT` and `PARENT_ID`.
- Update Gradle dependencies to include Room and KSP.
2026-01-31 21:30:12 +01:00
7cde4b357e Remove local database because it is not being used at this moment of the project. 2026-01-30 15:38:03 +01:00
32d0029379 feat: update MediaRepository and related models to support asynchronous data fetching and add CastMember data class 2026-01-30 15:35:01 +01:00
15190a657a feat: add Room database entities and DAOs for Episodes, Seasons, and Series 2026-01-29 18:16:11 +01:00
ceb1c141cf refactor: rename Route objects 2026-01-29 08:50:46 +01:00
d057bdaab0 feature: Create models for MediaRepository and MediaRepository interface. It will be used for abstract generalized MediaManagement. 2026-01-29 08:50:23 +01:00
88e9ca229e refactor: abstract player logic into PlayerManager and MediaRepository
- Introduce `PlayerManager` to encapsulate `Media3` player interactions, state management, and UI updates.
  - Manages playback state (playing, buffering, ended, error), progress, metadata, track selection, and the media queue.
  - Exposes state via `StateFlow` for reactive UI updates.
  - Handles player lifecycle and event listeners.
- Create `MediaRepository` to fetch media items and upcoming episodes from the Jellyfin API.
  - Abstracts away the logic for retrieving media sources, playback URLs, and constructing `MediaItem` objects.
  - Includes a method to get the next episodes for auto-play, avoiding duplicates already in the queue.
- Implement `TrackMapper` to convert Media3 `Tracks` into a `TrackSelectionState` model for the UI.
- Refactor `PlayerViewModel` to delegate all player and data-fetching logic to `PlayerManager` and `MediaRepository`.
  - The ViewModel now observes state flows from the manager and orchestrates UI actions (e.g., auto-hiding controls).
  - Simplifies the ViewModel by removing direct player listener implementation, progress loops, and track parsing.
  - Improves error handling for invalid media IDs and data loading issues.
2026-01-28 21:08:33 +01:00
eae843312c feat: implement auto-play next episode and up-next queue
- Implement `getNextEpisodes` in `JellyfinApiClient` to fetch a list of upcoming episodes for a given series.
- In `PlayerViewModel`, automatically load the next few episodes into the media queue when a new item starts playing.
- Attach `MediaMetadata` (e.g., title) to `MediaItem` objects to ensure the correct title is displayed for queued items.
- Trigger loading of the next episodes in the `onMediaItemTransition` player callback.
- Refactor video playback and queueing methods (`playVideo`, `addVideoUri`) to accept and utilize `MediaMetadata`.
2026-01-28 20:24:50 +01:00
abf66c75e1 refactor: move HorizontalSeekGestureHelper to helper package 2026-01-28 17:43:23 +01:00
aeec3784be refactor(player): replace side sliders with centered adjustment indicators
- Replace the horizontal `PlayerSideSliders` with a new vertical `PlayerAdjustmentIndicator` for brightness and volume, displaying it in the center of the screen.
- Create `PlayerAdjustmentIndicator.kt`, a new composable that shows an icon, a vertical progress bar, and a percentage value within a semi-transparent black background.
- Update `PlayerScreen` to use the new centered indicator instead of the old side-aligned sliders when brightness or volume is adjusted via gestures.
- Pass a `modifier` to `ValueChangeTimedVisibility` to correctly position the new indicators.
- Change the background color of the "Seek to" toast message from a theme surface color to semi-transparent black for better consistency.
2026-01-27 20:23:18 +01:00
d24eff19cc refactor: improve player gesture feedback with timed visibility components
- Replace `LaunchedEffect` and manual state handling for showing/hiding player overlays (brightness, volume, seek feedback) with new reusable timed visibility composables.
- Introduce `ValueChangeTimedVisibility` to automatically show brightness and volume sliders for a short duration when their values change.
- Implement `EmptyValueTimedVisibility` to display the horizontal seek amount indicator and hide it after a delay.
- Remove redundant state variables (`brightnessOverlayVisible`, `volumeOverlayVisible`, `showFeedbackPreview`) and related logic from `PlayerScreen`.
- Clean up `PlayerGesturesLayer` by removing the `setFeedBackPreview` callback, simplifying its responsibility.
- Remove the auto-hide `LaunchedEffect` from `PlayerSideSliders` as this is now handled externally.
2026-01-27 19:16:23 +01:00
b97867d9f1 feature: add ValueChangeTimedVisibility composable for dynamic content display 2026-01-27 19:16:01 +01:00
380ae9d056 feature: add TimedVisibility composable for delayed content display 2026-01-27 18:46:34 +01:00
3d7b6bcf13 refactor: rename player gesture handlers for clarity
- Rename `PlayerGesturesLayer` parameters to be more descriptive of the gesture type (e.g., `onDoubleTapLeft`, `onDoubleTapCenter`, `onDoubleTapRight`).
- Update the `PlayerScreen` to use the new, more specific gesture handler names.
2026-01-27 18:18:09 +01:00
8cd97fc928 refactor: rename player gesture handlers for clarity
- Rename `PlayerGesturesLayer` parameters to be more descriptive of the gesture type (e.g., `onDoubleTapLeft`, `onDoubleTapCenter`, `onDoubleTapRight`).
- Update the `PlayerScreen` to use the new, more specific gesture handler names.
2026-01-26 20:32:41 +01:00
f2158820ac feature: add resume/pause functionality to PlayerGesturesLayer and update seek duration 2026-01-26 20:27:58 +01:00
616aa302ad feature: add resume/pause functionality to PlayerGesturesLayer and update seek duration 2026-01-26 20:01:32 +01:00
a2d73e1a54 refactor: enhance PlayerSeekBar with custom progress indicator and improved layout 2026-01-26 19:45:29 +01:00
6604c727bf refactor: update seek functionality in PlayerControlsOverlay for improved user experience 2026-01-26 19:17:26 +01:00
985c0028c9 refactor: replace Column with Box in PlayerControlsOverlay for improved layout management 2026-01-26 19:15:29 +01:00
71812f076f feature: add season and episode numbers to every episode occurence 2026-01-26 17:39:44 +01:00
3dc9ec7524 feature: add content progress and autoscroll to next up media to SeriesComponents 2026-01-26 16:58:38 +01:00
f835d9ea26 implement advanced custom video player UI and logic
- Replace basic `AndroidView` player with a comprehensive `PlayerScreen` including custom controls, gestures, and state management.
- Implement `PlayerViewModel` logic for playback state, track selection (audio, subtitles, quality), progress updates, and auto-hiding controls.
- Add `PlayerUiState` and related models to track buffering, playback speed, tracks, and media queue.
- Create several reusable player components:
    - `PlayerControlsOverlay`: Top/center/bottom bars for navigation, playback actions, and time info.
    - `PlayerGesturesLayer`: Support for double-tap to seek and vertical drags for brightness/volume.
    - `PlayerSeekBar`: Custom seek bar with buffer visualization and chapter/ad markers.
    - `PlayerSettingsSheet`: Bottom sheet for adjusting playback speed and selecting media tracks.
    - `PlayerQueuePanel`: Slide-out panel to view and navigate the current playlist.
    - `PlayerSideSliders`: Visual overlays for brightness and volume adjustments.
- Update `PlayerActivity` to support immersive mode and use a dark theme for playback.
- Enable `trackSelector` in `VideoPlayerModule` to facilitate manual track switching.
2026-01-25 18:43:43 +01:00
9c8614df6d refactor: remove unnecessary background overlay from HomeSections 2026-01-25 13:43:11 +01:00
f81e8f61fe Refactor: Make ContinueWatchingCard's progress bar floating. 2026-01-25 13:33:52 +01:00
9b2f4dfce5 update Home screen item play button UI
- Replace `Button` with `IconButton` for the media play action in `HomeSections.kt`.
- Style the play button with a circular background, custom sizing, and theme-specific colors.
- Adjust layout positioning and padding for the play icon within the item card.
2026-01-25 13:30:02 +01:00
e360517562 refactor UI components and improve home/library screen logic
- Rename `MediaGhostIconButton` to `GhostIconButton` and move it to the common components package.
- Implement `PurefinIconButton` as a new reusable UI component.
- Refactor `PosterItem` to include `imageUrl`, shifting image URL generation to the ViewModel.
- Update `HomePageViewModel` and `LibraryViewModel` to use `stateIn` for the server URL and handle image URL generation.
- Decouple `PosterCard` from `HomePageViewModel` by passing click lambdas as parameters.
- Add `LibraryTopBar` and navigation support (back button, item selection) to the `LibraryScreen`.
- Enhance `PurefinAsyncImage` to handle empty string models by treating them as null to trigger placeholders.
- Update `HomeTopBar` styling and replace the custom refresh button with `PurefinIconButton`.
2026-01-25 13:17:45 +01:00
3d17b7e614 implement season selection logic and update SeriesScreen UI
- Update `SeasonTabs` to handle selection state and provide an `onSelect` callback.
- Implement `selectedSeason` state in `SeriesScreen` using `remember` and `mutableStateOf`.
- Refactor `SeriesScreen` to display episodes based on the currently selected season.
- Adjust spacing and remove redundant styling from `EpisodeCarousel` items.
- Clean up unused imports and commented-out code in `SeriesComponents.kt`.
2026-01-24 14:57:06 +01:00
d102d80c09 implement reusable MediaSynopsis component
- Create `MediaSynopsis` as a common UI component with support for expandable text, custom styling, and overflow detection.
- Refactor `EpisodeComponents`, `MovieComponents`, and `SeriesScreen` to use the new `MediaSynopsis` component.
- Standardize the synopsis layout across different media detail screens.
2026-01-24 14:10:53 +01:00
bc6938fe93 update MediaHero heights and refactor SeriesHero
- Increase `MediaHero` height from 200dp to 300dp in `EpisodeScreen` and `MovieScreen`.
- Replace `SeriesHero` with `MediaHero` in `SeriesScreen` and increase height to 350dp.
- Remove redundant `SeriesHero` component from `SeriesComponents.kt`.
- Update `SeriesViewModel` to use `ImageType.PRIMARY` for the hero image URL.
- Remove comments from `MediaHero.kt`.
2026-01-24 13:47:36 +01:00
dac4ee42dc refactor UI styling and image handling
- Remove custom color token classes (`EpisodeColors`, `MovieColors`, `SeriesColors`, `HomeColors`) in favor of standard `MaterialTheme.colorScheme`.
- Introduce `PurefinAsyncImage` component to provide consistent theme-synced placeholders for asynchronous images.
- Refactor various UI components (`MediaGhostIconButton`, `MediaMetaChip`, `MediaCastRow`, `PosterCard`) to use `MaterialTheme` directly instead of custom color objects.
- Simplify `MediaDetailColors` mapping logic by removing redundant conversion functions.
- Update `PurefinTheme` to disable dynamic color by default.
- Force light mode in `PlayerActivity` temporarily.
- Replace standard Coil `AsyncImage` with `PurefinAsyncImage` across the application.
2026-01-24 13:40:39 +01:00
48a773fded refactor media play button and integrate into detail screens
- Replace `MediaFloatingPlayButton` with a new `MediaPlayButton` component in `EpisodeScreen` and `MovieScreen`.
- Move play action logic from screens into `EpisodeComponents` and `MovieComponents`.
- Update `MovieComponents` layout to include the play button and improve vertical spacing and dividers.
- Refactor `MediaPlayButton` to support text labels and custom styling, moving it to a standalone file.
- Remove unused `MediaFloatingPlayButton` and old `MediaPlayButton` implementation from `MediaDetailComponents.kt`.
2026-01-22 22:15:57 +01:00
8c29f681c5 refactor: Replace MediaActionButtons with individual MediaActionButton components in Episode, Movie, and Series screens 2026-01-22 19:59:40 +01:00
ee43178622 refactor: Move MediaPlaybackSettings to a separate component and update usage in Episode and Movie screens 2026-01-22 19:59:38 +01:00
ce45139f74 refactor media screens to use Scaffold and standard layout components
- Replace `BoxWithConstraints` with `Scaffold` in `MovieScreen`, `EpisodeScreen`, and `SeriesScreen`.
- Move `MovieTopBar`, `EpisodeTopBar`, and `SeriesTopBar` into the `topBar` slot of `Scaffold`.
- Implement `statusBarsPadding` and standard padding in top bar components.
- Decouple top bar components from ViewModels by passing an `onBack` callback.
- Simplify hero image heights and remove complex offsets and conditional wide-screen layouts.
- Use `floatingActionButton` slot for the play button in movie and episode screens.
- Standardize background handling using `MaterialTheme.colorScheme.background`.
2026-01-21 22:43:50 +01:00