{"id":50243557,"url":"https://github.com/raulshma/jellyplay","last_synced_at":"2026-07-05T15:00:21.483Z","repository":{"id":355385704,"uuid":"1227884704","full_name":"raulshma/jellyplay","owner":"raulshma","description":"Modern native open-source Jellyfin client for Android \u0026 Android TV. Features Material 3 UI, multi-engine playback (ExoPlayer, mpv, VLC), advanced music player with synced lyrics, offline downloads, SyncPlay watch parties, IPTV, and Jellyseerr/Overseerr/Seerr request management. Self-hosted \u0026 privacy-focused.","archived":false,"fork":false,"pushed_at":"2026-06-28T21:04:18.000Z","size":17131,"stargazers_count":13,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T22:18:18.068Z","etag":null,"topics":["android","android-tv","exoplayer","fire-tv","homelab","iptv","jellyfin","jellyfin-client","jellyseerr","jetpack-compose","kotlin","media-player","mpv","music-player","open-source","overseerr","seerr","self-hosted","video-player","vlc"],"latest_commit_sha":null,"homepage":"https://raulshma.github.io/jellyplay/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raulshma.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-03T09:44:49.000Z","updated_at":"2026-06-28T20:29:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/raulshma/jellyplay","commit_stats":null,"previous_names":["raulshma/jellyplay"],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/raulshma/jellyplay","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raulshma%2Fjellyplay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raulshma%2Fjellyplay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raulshma%2Fjellyplay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raulshma%2Fjellyplay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raulshma","download_url":"https://codeload.github.com/raulshma/jellyplay/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raulshma%2Fjellyplay/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35158308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-tv","exoplayer","fire-tv","homelab","iptv","jellyfin","jellyfin-client","jellyseerr","jetpack-compose","kotlin","media-player","mpv","music-player","open-source","overseerr","seerr","self-hosted","video-player","vlc"],"created_at":"2026-05-26T22:06:26.351Z","updated_at":"2026-07-05T15:00:21.362Z","avatar_url":"https://github.com/raulshma.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# JellyPlay\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"media-resources/app_logo.svg\" width=\"150\" alt=\"JellyPlay app logo\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg alt=\"API 28+\" src=\"https://img.shields.io/badge/Api%2028%2B-50f270?logo=android\u0026logoColor=black\u0026style=for-the-badge\" /\u003e\n\t\u003cimg alt=\"Kotlin\" src=\"https://img.shields.io/badge/Kotlin-7F52FF?logo=kotlin\u0026logoColor=white\u0026style=for-the-badge\" /\u003e\n\t\u003cimg alt=\"Jetpack Compose\" src=\"https://img.shields.io/badge/Jetpack%20Compose-4285F4?logo=jetpackcompose\u0026logoColor=white\u0026style=for-the-badge\" /\u003e\n\t\u003cimg alt=\"Material 3\" src=\"https://custom-icon-badges.demolab.com/badge/material%20you-lightblue?style=for-the-badge\u0026logoColor=333\u0026logo=material-you\" /\u003e\n\t\u003cimg alt=\"Media3\" src=\"https://img.shields.io/badge/Media3-FF6F00?style=for-the-badge\u0026logo=android\u0026logoColor=white\" /\u003e\n\t\u003cimg alt=\"License GPL-3.0\" src=\"https://img.shields.io/github/license/raulshma/jellyplay?style=for-the-badge\u0026color=blue\" /\u003e\n\t\u003cimg alt=\"Status - Beta\" src=\"https://img.shields.io/badge/Status-Beta-orange?style=for-the-badge\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003csub\u003eNative Jellyfin client for Android, Android TV \u0026 Fire TV \u0026nbsp;\u0026middot;\u0026nbsp; Material 3 Expressive \u0026nbsp;\u0026middot;\u0026nbsp; ExoPlayer, libmpv \u0026 LibVLC \u0026nbsp;\u0026middot;\u0026nbsp; Self-hosted, no tracking\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n### Modern, Open-Source Jellyfin Client for Android \u0026 Android TV\n\n**JellyPlay** is a high-performance, feature-rich, and open-source **Jellyfin client app for Android** devices. Built entirely from the ground up using **Kotlin** and **Jetpack Compose** (Material 3/Expressive), JellyPlay delivers a premium, smooth, and native media streaming experience. Designed with an adaptive responsive interface, it adapts flawlessly to **Android mobile phones, tablets, foldables, and Android TV**.\n\nWhether you want to stream movies, play music with synchronized lyrics, manage your server via an integrated **Admin Dashboard**, edit library metadata on the go, request content via **Jellyseerr/Overseerr** (with full request management), download media for **offline playback**, catch up with a weekly **Newsletter digest**, join real-time **SyncPlay watch parties**, track your viewing habits with a **Watch Progress Heatmap**, or get notified when new content arrives — JellyPlay has you covered with built-in multi-engine support (**ExoPlayer, libmpv, LibVLC**), **remote control** from the server, **4 home screen widgets**, and a guided **Onboarding Wizard** for personalized setup.\n\n[Key Features](#features) • [Why JellyPlay?](#why-jellyplay) • [Comparison](#jellyplay-vs-other-jellyfin-clients) • [Tech Stack](#tech-stack) • [Requirements](#requirements) • [Building \u0026 Flavors](#building) • [Permissions](#permissions) • [Project Structure](#project-structure) • [Docs](./docs) • [Website](https://raulshma.github.io/jellyplay/)\n\n\u003c/div\u003e\n\n\u003ctable align=\"center\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse; border-spacing: 0;\"\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/home.webp\" width=\"180\" alt=\"Home screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/library.webp\" width=\"180\" alt=\"Library screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/search.webp\" width=\"180\" alt=\"Search screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/settings.webp\" width=\"180\" alt=\"Settings screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/audio_home.webp\" width=\"180\" alt=\"Audio home screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/audio_player.webp\" width=\"180\" alt=\"Audio player screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/media_detail.webp\" width=\"180\" alt=\"Media detail screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\t\u003ctd align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/media_detail_2.webp\" width=\"180\" alt=\"Secondary media detail screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd colspan=\"4\" align=\"center\" style=\"padding: 1px;\"\u003e\u003cimg src=\"media-resources/screenshots/video_player.webp\" width=\"760\" alt=\"Landscape video player screen\" style=\"display: block;\" /\u003e\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n\u003e [!NOTE]\n\u003e **JellyPlay is currently in Active Beta.** 🧪\n\u003e The application is under active development. While the core features (such as playback, multi-server support, and offline downloads) are functional and stable, you may encounter occasional visual bugs or edge-case issues. We highly appreciate any bug reports, feedback, and contributions!\n\n## Why JellyPlay?\n\nJellyPlay is built for people who self-host a [Jellyfin](https://jellyfin.org/)\nmedia server and want a **truly native**, **beautiful**, and **capable** client\non every screen — phone, tablet, foldable, Android TV, and Amazon Fire TV.\n\n- **Native, not a web wrapper.** Written from scratch in **Kotlin** and\n  [Jetpack Compose](https://developer.android.com/jetpack/compose), with\n  [Compose for TV](https://developer.android.com/tv/compose) on the big\n  screen. No Cordova, no embedded browser, no compromises.\n- **Three video engines.** Pick **[ExoPlayer / Media3](https://developer.android.com/media/media3)**,\n  **[libmpv](https://github.com/mpv-player/mpv)**, or **[LibVLC](https://www.videolan.org/vlc/)**\n  per device — each has its own strengths for codec support, post-processing,\n  and ASS/SSA subtitle rendering.\n- **One app, every form factor.** Adaptive layouts across phones, tablets,\n  foldables, and Android TV with a dedicated Leanback launcher. Edge-to-edge\n  immersive mode, predictive back gesture, and Material 3 dynamic theming\n  from your artwork.\n- **Self-hosted first.** No accounts, no telemetry, no cloud dependency.\n  Multi-server, multi-user support with Quick Connect and token-based auth.\n  **Offline downloads** with HTTP Range resumption for travel.\n- **Beyond streaming.** **SyncPlay** watch parties, **Jellyseerr / Overseerr**\n  requests, a full **metadata editor**, an in-app **server admin dashboard**,\n  synchronized lyrics via LRCLIB, 10-band equalizer with night mode, and a\n  weekly **newsletter digest** of your library activity.\n\n\u003e If you're looking for a Kodi alternative, a Plex alternative, or a\n\u003e self-hosted media player for Android \u0026 Android TV — give JellyPlay a try.\n\n## Features\n\n### Platform \u0026 UI\n\n- Multi-server Jellyfin support with auto-discovery\n- Token-based and Quick Connect authentication\n- Multi-user support with per-server user switching\n- Material 3 UI with dynamic theming from artwork\n- Expressive animations and spring-based motion specifications\n- Shared element transitions between screens\n- Performance Mode (disables animations for low-end devices)\n- Predictive back gesture support\n- Edge-to-edge immersive layouts\n- Adaptive layouts for phone, tablet, foldable, and TV\n- Android TV support with D-pad navigation and Leanback launcher\n- Android TV screensaver (Daydream) with configurable slideshow and Ken Burns effect\n- PIN lock and biometric authentication (fingerprint/face) with auto-lock timer\n- Kids Mode with content filtering\n- **4 theme variants**: Standard (Material 3 dynamic), Synthwave (neon/retro), Soothing (GitHub-dark-inspired), and Monochrome (black-and-white)\n- 8 accent color swatches (Dynamic, Brand, Sapphire Blue, Emerald Green, Amethyst Purple, Rose Pink, Coral Orange, Amber Gold, Crimson Red)\n- 3 contrast levels (Default, Medium, High) with full light/dark variants\n- OLED mode for AMOLED displays\n- **Home screen widgets** with configurable sources:\n  - **Now Playing** — album art, transport controls (play/pause, next/prev, rewind/forward), and a 7-zone seek bar\n  - **Continue Watching** — list of in-progress media items\n  - **Library Recommendations** — poster grid with selectable source (Similar to Recent, Latest, Favorites, Surprise Me)\n  - **Seerr Recommendations** — poster grid with selectable source (Trending, Popular Movies/TV, Upcoming Movies/TV)\n- Quick settings tile launcher\n- App shortcuts:\n  - **Static**: Continue Watching, Search, Play Music, Downloads\n  - **Dynamic**: Continue Listening — auto-updates with the currently playing track and album art\n- BlurHash image placeholders for smooth loading\n- Localization ready (English; additional translations in progress)\n- Deep link support via `jellyplay://` and `https://raulshma.github.io/jellyplay/` URI schemes\n- **Settings search** — find any setting instantly by name\n- **New media notifications** — real-time per-library notifications when new content is added, with quiet hours, seen-media tracking, grouped notifications, and notification actions\n- **Accessibility** — blue light filter with strength control, reduce motion toggle, haptic feedback intensity, and font scaling\n\n### Search\n\n- Global Jellyfin search across movies, shows, music, albums, and more\n- Filters for genre, year, and media type\n- Voice search support\n- Search history persisted per-user with per-item deletion, bulk clear, and hide option\n\n### Video Player\n\n- **Three built-in engines**: ExoPlayer (Media3), libmpv, and LibVLC\n- Video filter controls: Adjust brightness, contrast, saturation, and sharpness in-player (libmpv \u0026 LibVLC)\n- Enhanced Video Stats Overlay presenting real-time stream bitrate, frame rate, and dropped frames\n- External player launching (MX Player, VLC, etc.)\n- Direct play, direct stream, and transcoding support with quality/transcoding picker\n- Resume playback and progress reporting\n- Audio and subtitle track selection with language matching and reset functionality\n- Playback speed control (0.25x–4x) with current speed display and estimated end time\n- **Hold speed** — press and hold to temporarily increase playback speed\n- Gesture controls for seek, brightness, and volume\n- Chapter and episode navigation\n- HDR badge indicator\n- Picture-in-Picture support\n- Mini player overlay\n- Trickplay thumbnail seeking (Jellyfin trickplay sprite sheets) with offline caching support\n- Frame rate matching for display refresh rate sync\n- Adaptive bitrate streaming\n- Intro skip and next episode auto-play with segment auto-skip (intro/outro/recap)\n- Chromecast support via Google Cast SDK\n- Media session integration for lock screen and notifications\n- Sleep timer with configurable duration\n- Aspect ratio selection\n- Hardware/software decoder selection\n- Audio delay adjustment (ms)\n- Screen orientation toggle\n- Player lock screen overlay to prevent accidental touches\n- **Companion Dashboard** — view lyrics alongside video playback\n- Tap-to-translate subtitle feature\n\n### Subtitle System\n\n- External subtitle loading and download\n- ASS/SSA and VTT subtitle format parsing with enhanced cue handling\n- Subtitle styling (font size, color, background, edge type, position) with persistence\n- Subtitle delay offset control\n- Preferred subtitle language selection\n- Community rating indicator for search results and subtitle download sheet\n\n### Audio Player\n\n- Music browsing for artists, albums, tracks, genres, and playlists\n- Queue management with drag-to-reorder\n- Shuffle and repeat modes\n- Playback speed control\n- Waveform-style seek bar\n- Real-time FFT audio visualizer\n- Synced and unsynced lyrics via LRCLIB API\n- 10-band equalizer with presets\n- Night Mode (loudness enhancement with configurable strength)\n- Dialogue Boost (vocal frequency equalization with configurable strength)\n- Audio normalization (ReplayGain) and channel mix modes\n- Virtualizer (3D audio) and Reverb effect presets\n- Gapless playback and crossfade between tracks\n- Ambient Mode with animated color blobs derived from album art\n- Sleep timer with configurable duration\n\n### Music Discovery\n\n- Smart playlists with criteria-based filtering (genre, artist, year, rating, play count, tags)\n- Mood playlists with 10 presets (Happy Vibes, Chill Out, Energetic, Deep Focus, Workout, Melancholy, Romantic, Party Time, Sleep, Late Night Drive)\n- Recently played, frequent artists, and recommended albums\n\n### Library \u0026 Browsing\n\n- Home sections: Continue Watching, Next Up, Recently Added, Latest, Favorites, and Surprise Me shuffle\n- Library browsing with pagination and folder filtering\n- Media detail pages with cast, crew, metadata, and related items\n- Person detail pages with filmography browsing\n- Collection/box set browsing\n\n### Photo Albums \u0026 Viewer\n\n- Photo album browsing from Jellyfin libraries\n- Full-screen photo viewer with zoom and pan\n- Swipe navigation between photos\n- EXIF metadata display\n\n### Seerr Integration\n\n- Jellyseerr and Overseerr connection support\n- Discover trending, popular, and upcoming content\n- Request content via Radarr/Sonarr directly from the app\n- **Full request management screen** with:\n  - Filter by request status (Pending, Approved, Declined, Processing, etc.)\n  - Filter by media type (All, Movies, TV)\n  - Sort by Recent or Modified, with ascending/descending toggle\n  - \"My Requests Only\" filter for admins\n  - Paginated request list with prev/next navigation\n- **Admin actions**: Approve, Decline, Retry, Delete requests (with confirmation timer)\n- **Remove from Radarr/Sonarr** action for processed requests\n- **Request Detail Bottom Sheet** — full metadata: poster, title, status badge, overview, request ID, TMDB ID, requester, date, quality profile, root folder, seasons, and download status\n- Per-request TMDB metadata enrichment (title, poster, year, overview)\n- Seerr detail pages for unavailable media\n- Region configuration for streaming and discover content\n\n### Onboarding Wizard\n\n- 10-step first-run setup wizard shown after initial authentication\n- Appearance: Theme, dynamic theming, OLED mode, contrast level, home hero toggle\n- Performance: Performance mode toggle for low-end devices\n- Home Layout: Home mode (Video/Music), navigation bar labels, enabled home sections\n- Video Player: Preferred engine, streaming quality, seek duration, gestures, orientation, autoplay\n- Audio Player: Default speed, gapless playback, crossfade, normalization\n- Subtitles: Subtitle style customization (font, size, color, background)\n- Security: PIN lock, biometric lock, auto-lock timer\n- Seerr: Server URL, API key, feature toggles, regions\n- Re-accessible anytime from Settings\n\n### Newsletter\n\n- Weekly server digest showing library activity from the past 7 days\n- Curated sections: Recently Added, Continue Watching, Next Up, Fresh Picks, Activity Digest, Library Stats\n- Prominent banner on Home screen when new newsletter content is available\n- Full grid view for each section with navigation to details\n- Pull-to-refresh and configurable delivery schedule\n- Accessible from Home screen and Settings\n\n### Remote Control\n\n- WebSocket-based remote control from Jellyfin server\n- Receive Play, Pause, Seek, and general commands remotely\n- Media browser service integration for third-party controller apps\n- Active player management and remote playback reporting\n\n### Metadata \u0026 Media Editor\n\n- Directly accessible from the media detail screen for authorized/admin users\n- Comprehensive metadata editing (title, original title, tagline, overview, premiere/release dates, sorting titles, and custom ratings)\n- Rich artwork manager: Upload, update, or remove Primary, Backdrop, Banner, Logo, Art, Disc, and Thumb images\n- Subtitle editor: View embedded subtitle tracks, upload external subtitle files, and delete unwanted external tracks\n\n### Admin Dashboard\n\n- Accessible directly via settings menu for server administrators\n- Real-time system health monitor showing server status, CPU/Memory load, OS details, and server controls (restart/shutdown)\n- Active User Sessions: View all active devices connected to the server, view session details, and end sessions remotely\n- Library stats row: Direct overview of item counts across movies, series, episodes, albums, songs, and books\n- Scheduled Tasks manager: Monitor, trigger, and cancel scheduled tasks on the Jellyfin server in real-time\n- Server Logs viewer: Browse, view, and download active server logs with severity indicators and recent activity timelines\n- Running tasks card tracking background operations with live progress updates\n- User Statistics: Per-user playback history and statistics with charts\n- Stale Media Scanner: Detect unwatched/stale media with background scan worker\n- Watched Media Cleanup: Bulk cleanup of watched media with audit history log\n\n### Plugin Management\n\n- View installed server plugins with version and status info\n- Enable/disable plugins remotely\n- Plugin configuration viewer\n\n### SyncPlay (Watch Parties)\n\n- Create and join synchronized watch groups\n- Real-time playback sync with speed-to-sync and skip-to-sync correction\n- Server time synchronization for precise coordination\n- In-player group chat\n- Group settings for repeat and shuffle modes\n\n### Live TV \u0026 DVR\n\n- Live TV channel browsing with current program info\n- Electronic Program Guide (EPG) with program timeline\n- DVR recording management\n\n### Deep Links\n\n- Custom URI scheme: `jellyplay://media/{id}`, `jellyplay://newsletter/{section}`, `jellyplay://seerr/{tmdbId}/{type}`\n- HTTPS scheme: `https://raulshma.github.io/jellyplay/media/{id}`, `https://raulshma.github.io/jellyplay/newsletter/{section}`\n- Widgets, notifications, and shortcuts all use deep links for navigation\n\n### Insights \u0026 Activity\n\n- **Watch Progress Heatmap** — GitHub-style year-in-review calendar of watch activity\n- Filter by media type (All, Movies, Shows)\n- Navigate years (current year back 4 years)\n- Streak tracking: current streak, longest streak, and total active days\n- Tap any day to view session details (media titles, thumbnails, watch time)\n- Share heatmap as a PNG image\n- Requires Jellyfin Playback Reporting plugin (banner shown if not detected)\n\n### New Media Notifications\n\n- Real-time per-library notifications when new content is added to Jellyfin\n- Configurable check interval (minimum 15 minutes via WorkManager)\n- Quiet hours support — suppress notifications during configured hours\n- Per-library notification channels with custom names\n- Grouped notifications with InboxStyle summaries\n- Global summary notification when multiple libraries have new items\n- Seen-media tracking to avoid duplicate notifications (30-day pruning)\n- Notification actions: Open detail (via deep link), Mark as seen\n\n### Downloads \u0026 Offline\n\n- Video downloads via WorkManager with progress tracking\n- Series downloads with episode selection\n- Pause, resume, and retry support with HTTP Range resumption\n- Offline playback for completed downloads\n- Offline Library browser organized by series\n- Offline Series view for downloaded episode browsing\n- Foreground notification with speed and ETA\n\n### Settings\n\nOver 230 configurable options across 26 sections:\n\n- Player: engine selection, decoder mode, audio passthrough, orientation, seek duration, gesture toggles, autoplay, controls timeout, preload buffer\n- Audio: default speed, gapless playback, crossfade, night mode, dialogue boost, equalizer, audio normalization, channel mix, virtualizer, reverb\n- Subtitles: language, style, trickplay, intro/outro skip (manual and auto), tap-to-translate\n- SyncPlay: progress reporting, auto-join, sync correction parameters\n- Downloads: connections preference, max cache size (with unlimited/0 option support)\n- Storage: offline media management, cache size, download location\n- Visual: dynamic theming, theme variant (Standard/Synthwave/Soothing/Monochrome), accent color, contrast level, OLED mode, streaming quality, performance mode\n- Security: PIN lock, biometric lock, auto-lock timer\n- Kids: mode toggle, max content rating\n- Screensaver: interval, Ken Burns effect, transition style, image categories, title overlay\n- Newsletter: enable/disable, delivery day, notification badge\n- Notifications: new media notifications, quiet hours, per-library channels\n- Live TV/DVR: channel sources, EPG refresh, recording defaults\n- Widget: per-widget source configuration, refresh interval\n- Accessibility: color blind modes, blue light filter, reduce motion, haptic intensity, font scaling\n- Experimental: feature flags for in-development capabilities\n- Seerr: server URL, API key, feature toggles, regions\n- Onboarding: re-run setup wizard anytime\n- Settings search: find any setting instantly by name\n\n---\n\n## Tech Stack\n\n| Category         | Technologies                                                      |\n| ---------------- | ----------------------------------------------------------------- |\n| Language         | Kotlin 2.3, Java 17                                               |\n| UI               | Jetpack Compose (BOM 2026.05), Material 3, Material 3 Expressive |\n| TV               | Android TV Material, Leanback                                     |\n| Navigation       | Navigation 3                                                      |\n| DI               | Hilt (Dagger 2.59)                                                |\n| Storage          | Room, DataStore Preferences, AndroidX Security-Crypto             |\n| Background       | WorkManager, Coroutines, StateFlow                                 |\n| Video Players    | Media3/ExoPlayer, libmpv, LibVLC                                   |\n| Audio Effects    | Android Equalizer, LoudnessEnhancer, Virtualizer, Reverb          |\n| Media Session    | Media3 Session, Media3 Cast                                        |\n| Casting          | Google Play Services Cast, DLNA/UPnP                               |\n| Networking       | OkHttp 5, Jellyfin SDK 1.8, kotlinx.serialization                 |\n| Images           | Coil 3 (with BlurHash), Palette (color extraction)                |\n| Typography       | Google Fonts (Compose integration)                                |\n| Pagination       | Paging 3                                                           |\n| Text Recognition | ML Kit                                                             |\n| Biometrics       | AndroidX Biometric                                                 |\n| Error Tracking   | Sentry                                                             |\n| Testing          | JUnit 4, MockK, Espresso, Compose UI Test, Robolectric, UIAutomator, OkHttp MockWebServer, Room Testing |\n| Code Quality     | Kover (coverage), R8 Full Mode, KSP2                               |\n| Performance      | Baseline Profiles (Macro Benchmark)                                |\n\n---\n\n## Requirements\n\n- Android 9.0 (API 28) or later\n- JDK 17\n- Android Studio with Android SDK (compileSdk 37)\n- A Jellyfin server for authentication and playback\n\n---\n\n## Building\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePrerequisites\u003c/strong\u003e\u003c/summary\u003e\n\n- Android Studio or Gradle CLI\n- JDK 17\n\u003c/details\u003e\n\n### Build Commands\n\n```bash\n# Debug builds (phone and TV)\n./gradlew assemblePhoneDebug\n./gradlew assembleTvDebug\n\n# Release builds\n./gradlew assemblePhoneRelease\n./gradlew assembleTvRelease\n```\n\nThe project uses product flavors — `phone` (standard mobile) and `tv` (Android TV with Leanback launcher). ABI splits produce `arm64-v8a`, `x86_64`, and universal APKs.\n\n---\n\n## CI/CD\n\nA GitHub Actions workflow (`.github/workflows/release.yml`) automates release builds:\n\n- Triggered on push to `v[0-9]+*` or `release/**` branches\n- Auto-calculates version from branch name with git tag-based patch incrementing\n- Builds signed release APKs for both phone and TV flavors\n- Publishes APKs to GitHub Releases with auto-generated release notes\n\n---\n\n## Permissions\n\n| Permission                          | Purpose                                       |\n| ----------------------------------- | --------------------------------------------- |\n| `INTERNET`                          | Jellyfin API access and media playback        |\n| `ACCESS_NETWORK_STATE`              | Network connectivity monitoring               |\n| `ACCESS_WIFI_STATE`                 | WiFi state for server discovery and streaming |\n| `CHANGE_WIFI_MULTICAST_STATE`       | Jellyfin server auto-discovery                |\n| `FOREGROUND_SERVICE`                | Foreground service for playback and downloads |\n| `FOREGROUND_SERVICE_MEDIA_PLAYBACK` | Media playback foreground service type        |\n| `FOREGROUND_SERVICE_DATA_SYNC`      | Download worker foreground service type       |\n| `POST_NOTIFICATIONS`                | Playback, download, and widget notifications  |\n| `USE_BIOMETRIC`                     | Biometric authentication (fingerprint/face)   |\n\n---\n\n## Project Structure\n\n```\napp/                     Main Android application module (deep links, widgets, Cast, PiP, shortcuts)\ncore/model/              Shared data models (55+ model files)\ncore/designsystem/       Shared theming (4 variants), colors, shapes, typography, motion\ncore/network/            Jellyfin API clients (12), Seerr client, LRCLIB API, server discovery\ncore/database/           Room database (16 DAOs), migration schemas\ncore/datastore/          DataStore preferences (~231 settings), encrypted credentials\ncore/data/               Repositories, playback managers, audio effects, SyncPlay, Cast, downloads\ncore/ui/                 Shared UI components, adaptive layouts, TV focus, animations, navigation\ncore/notification/       New media notification system (worker, scheduler, dispatcher, channels)\ncore/testing/            Shared test utilities\nfeature/auth/            Server selection and authentication\nfeature/onboarding/      First-run setup wizard (10-step preferences)\nfeature/home/            Home screen, Kids home, newsletter banner, and discover sections\nfeature/library/         Library browsing and media collections\nfeature/search/          Search experience with history\nfeature/details/         Media detail, person detail, collection detail, Seerr detail\nfeature/player/video/    Video playback UI, multi-engine support, SyncPlay integration\nfeature/player/audio/    Audio playback UI, lyrics, equalizer, ambient mode\nfeature/downloads/       Download management, offline library, and offline playback\nfeature/settings/        Settings, server/user management, Seerr configuration, settings search\nfeature/music/           Music browsing, smart/mood playlists, artist/album details\nfeature/livetv/          Live TV channels, EPG guide, and DVR\nfeature/syncplay/        SyncPlay group management and watch party UI\nfeature/editor/          Metadata, artwork, and subtitle editor for media items\nfeature/admin/           Admin dashboard for server status, active devices, logs, tasks, user stats\nfeature/newsletter/      Weekly server digest with library activity, curated picks, and stats\nfeature/insights/        Watch progress heatmap with streak tracking and share-as-image\nfeature/requests/        Jellyseerr/Overseerr request management with filter/sort/admin actions\nfeature/shortcuts/       App shortcuts (static + dynamic, e.g. Continue Listening)\nbaselineprofile/         Baseline profile generator for startup optimization\nwebsite/                 Landing page (GitHub Pages)\ndocs/                    Documentation guides\n```\n\n---\n\n## Documentation\n\nLooking for setup, integration, or troubleshooting guides?\n\n- 📘 [Setup guide](./docs/setup.md) — install JellyPlay on any device\n- 🎬 [Android TV \u0026 Fire TV setup](./docs/android-tv-setup.md) — sideload \u0026 install on the big screen\n- 📡 [Jellyseerr/Seerr/Overseerr integration](./docs/jellyseerr-integration.md) — request movies \u0026 shows from inside the app\n- 👯 [SyncPlay watch parties](./docs/syncplay-guide.md) — synchronized group playback\n- ⬇️ [Offline downloads](./docs/offline-downloads.md) — download media for travel\n- 🎵 [Music player \u0026 synced lyrics](./docs/lyrics-music-player.md) — get the most out of your library\n- 🎬 [Player engines comparison](./docs/player-engines.md) — ExoPlayer vs libmpv vs LibVLC\n---\n\n## See Also\n\nOther open-source projects in the Jellyfin ecosystem:\n\n- [jellyfin/jellyfin](https://github.com/jellyfin/jellyfin) — the free software media system\n- [jellyfin/jellyfin-android](https://github.com/jellyfin/jellyfin-android) — the official Android client (web wrapper)\n- [jellyfin/jellyfin-androidtv](https://github.com/jellyfin/jellyfin-androidtv) — the official Android TV client\n- [jarnedemeulemeester/findroid](https://github.com/jarnedemeulemeester/findroid) — third-party native Android client\n- [damontecres/Wholphin](https://github.com/damontecres/Wholphin) — OSS Android TV client\n- [MakD/AFinity](https://github.com/MakD/AFinity) — modern Compose + LibMPV client\n- [streamyfin/streamyfin](https://github.com/streamyfin/streamyfin) — cross-platform Expo client\n- [fallensword/awesome-jellyfin](https://github.com/awesome-jellyfin/awesome-jellyfin) — curated list of Jellyfin plugins, themes \u0026 clients\n\n---\n\n## At a Glance\n\n| Metric | Value |\n| --- | --- |\n| Gradle modules | 30 (app + 9 core + 19 feature + 1 baseline profile) |\n| Feature modules | 19 |\n| Configurable settings | ~231 |\n| Data models | 55+ |\n| API clients | 12 |\n| Room DAOs | 16 |\n| Supported languages | 9 (en, de, es, fr, it, pt, ja, ko, zh) |\n| External integrations | Jellyfin, Jellyseerr/Overseerr, LRCLIB, TMDB, Google Cast, Sentry |\n| Min SDK | 28 (Android 9.0) |\n| Target/Compile SDK | 37 |\n| Current version | v0.7.11 (Active Beta) |\n\n---\n\n## Contributing\n\nWe welcome contributions of all sizes — bug reports, feature requests, code,\ntranslations, and documentation.\n\n## License\n\nThis project is licensed under the **GNU General Public License v3.0** — see\nthe [`LICENSE`](LICENSE) file for details.\n\nBy contributing to JellyPlay, you agree that your contributions will be\nlicensed under the same GPL-3.0 license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraulshma%2Fjellyplay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraulshma%2Fjellyplay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraulshma%2Fjellyplay/lists"}