Joy TV is an open-source Flutter IPTV app built for both Android TV and mobile. It combines large live TV playlists, fast remote-friendly navigation, and a fullscreen playback experience with playlist parsing, caching, and automated source generation.
- Live TV playback with
better_player_plus - Android TV and D-pad friendly navigation
- Mobile and TV layouts in one codebase
- Combined playlist generation through GitHub Actions
- Support for common IPTV metadata and custom playlist directives
- Local playlist cache and remote source sync
- TMDB-backed movie and series discovery screens
Joy TV now handles more real-world IPTV playlist metadata instead of only basic #EXTINF entries.
Supported tags currently include:
#EXTM3U#EXTINF#EXTVLCOPT#KODIPROP#EXT-X-APP#EXT-X-APTV-TYPE#EXT-X-SUB-URL
The app parser preserves supported directive lines, runtime headers, Kodi-style properties, and APTV metadata. The playlist generator workflow also preserves and re-emits supported directives into the combined playlist.
lib/screensUI screens for home, playback, filtering, and discoverylib/widgetsreusable TV and mobile interface componentslib/servicesplaylist parsing, caching, merging, and stream serviceslib/modelsapp data models including IPTV channels and sourcesassetsbundled playlists, source definitions, and imagesscriptslocal tools for playlist fetching and generation.github/workflowsautomation for scheduled playlist regeneration
- Flutter stable SDK
- Dart SDK matching the Flutter version
- Android Studio or VS Code
- An Android TV device, emulator, or mobile device for testing
git clone https://github.com/yourusername/joy_tv.git
cd joy_tv
flutter pub get
flutter runJoy TV ships with a source list in assets/playlists.json and a generated combined playlist in assets/default_playlist.m3u8.
To regenerate the combined playlist locally:
python3 scripts/combine_playlists.pyYou can also use:
bash scripts/run_combine.shThe GitHub workflow in playlist-generator.yml runs the same generation process on a schedule and prints a directive summary for the generated output.
- Parser logic lives in
m3u_parser.dart - Parser tests live in
m3u_parser_test.dart - Playlist generation logic lives in
combine_playlists.py
This project is licensed under the MIT License.
