# Easy TV Live: a Flutter IPTV player that syncs its own playlist and ships remote config

> Easy TV Live is a Dart and Flutter IPTV player for phones, desktops, and Android TV big screens. Its interesting parts are the twice daily playlist sync from IPTV-ORG, the URL-driven subscription options, and the JSON remote configuration file that reconfigures the app without a release.

**aiyakuaile/easy_tv_live** — Easy TV Live App, a lightweight IPTV player, supports all platforms and Android TV big screens. Welcome to download and experience!  极简TV App，一款轻量级IPTV播放器，支持全平台以及安卓电视大屏欢迎下载体验!

- Repository: https://github.com/aiyakuaile/easy_tv_live
- Stars: 1,154 · Forks: 86
- Language: Dart
- License: NOASSERTION
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/aiyakuaile-easy-tv-live

## The built-in channel list is refreshed twice a day

Most IPTV apps ship a playlist that stops changing the day it is packaged. Easy TV Live takes a different approach for its own list: the bundled sources come from the IPTV-ORG project, and the app syncs them automatically at 7am and 7pm each day. That is a meaningful architectural choice, because the built-in list stays current without the user pasting anything.

The important caveat sits in the same paragraph. The project does not guarantee the accessibility of third party subscription sources, and it recommends that users add their own subscriptions rather than relying entirely on the shipped list. In practice the built-in list is a starting point, and the real configuration work happens with user added sources. The IPTV-ORG repository is credited explicitly as the origin of the included channels, so the licensing story for that portion of the app is delegated to an upstream project that maintains its own terms.

Other playback conveniences are listed alongside the sync. The app can parse both .m3u files and .txt files as sources, merges and groups identical channels automatically, allows switching channels by typing a number, and can use the Bing daily image as the video background. Automatic merging and grouping is the feature with the most day to day impact, since a playlist that lists the same channel under many names otherwise turns the channel list into an unusable duplicate pile.

## Subscription options are encoded in the source URL itself

The unusual design choice in this project is that the settings for a subscription live inside its URL. A single m3u address can carry a custom User-Agent, a display title, and HTTP Basic credentials, all as query parameters or as part of the URL. There is no separate settings form per source for these options.

The User-Agent handling is the fiddliest part. The app parses a hint comment inside the m3u file, a line that starts with `#UA-Hint:` and names the User-Agent value the source expects. If the hint cannot be parsed, the documented fallback is to put the value in the query string instead:

```bash
https://xxxxxxxxxxxxx.m3u?ua=okHttp/Mod-1.0.0
```

And when the source URL already carries other parameters, the value is appended in the same style:

```bash
https://xxxxxxxxxxxxx.m3u?other=123&ua=okHttp/Mod-1.0.0
```

Once the app resolves the User-Agent it shows a toast confirming it, for example `User-Agent=okHttp/Mod-1.0.0`. That confirmation is the feedback loop for a failure that is otherwise invisible, because a source that requires a specific User-Agent typically just returns nothing.

The same parameter trick sets a custom display title so a subscription can be labelled in the app rather than by its raw filename, using the `tl` parameter, either on its own or alongside other parameters.

Basic authentication is expressed the way any URL would carry it, with the credentials inline:

```bash
https://username:password@xxxxxxxxx.m3u
```

Basic auth support arrived in v2.9.1, adding local files as a source in v2.9.5, remote configuration data sources in v2.9.6, and the custom User-Agent in v2.9.7. The custom title option is also documented, and the app supports switching fonts and font sizes, with the font files coming from the companion easy_tv_font project, which users must follow separately to add their own.

## Remote configuration is a JSON file you host yourself

The most interesting mechanism in the project is remote configuration, added in v2.9.6. Instead of releasing a new build when a setting changes, the owner of a deployment can publish a JSON file and point the app at it.

The documented flow is a four step manual process. You configure the fields on the project's remote configuration options page, then press the download data button to download the data or the copy Json button to copy it. You create a repository on GitHub or Gitee, upload the JSON there, and take the Raw link of the uploaded file. Before adding that link in the app, the instruction is to open it in a browser first to confirm it returns the JSON data. Finally you add the link under the remote configuration entry in the app's settings page, and on TV the configuration can be pushed by scanning a code, while on other platforms you paste the link and press the apply remote configuration button.

One detail decides whether a configuration actually takes effect. Editing the JSON by hand does not work on its own, because the `dtaId` field in the JSON must change for the app to overwrite its settings. When the JSON was generated by the project's remote configuration options page, the program modifies `dtaId` automatically, so the manual editing trap mostly applies to hand written files.

What is not documented is any authentication, signature, or rollback story for these remote files. The document says to verify the link in a browser, but it does not describe how a compromised host or an accidentally published file would be reverted, and there is no mention of pinning a previous configuration.

## A Flutter codebase with one runner per platform

The repository layout shows a Flutter project rather than a native one: pubspec.yaml and pubspec.lock at the root, a lib/ directory, and separate android/, ios/, linux/, macos/, and windows/ runner directories, with the primary language recorded as Dart. Assets live in assets/, there is a test/ directory, and analysis_options.yaml and devtools_options.yaml hold the lint and debugger configuration. The repository also carries versions.json, update_temp.py, and a temp file at the root, which suggests the release version and update payload are generated by a script rather than edited by hand for every build.

Breaking platform requirements are the sharpest operational fact in the documentation. Starting with v3.0, the Android platform supports only Android 7.0 and above, iOS supports only iOS 15.6 and above, and macOS supports only macOS 11.0 and above, a consequence of the development framework the project is limited by. Anything on an older system is told to install v2.9.9, and other platforms are left to the user to try. To keep the two lines distinguishable, v3.0 ships a new product logo and is designed to coexist with the old version rather than overwrite it.

The newest tagged release in the repository is 2.9.9, dated 2025-09-23, and the last push was on 2026-10-09. The v3.0 line therefore exists in the documentation and the working tree while the tag history still shows the 2.9.x series, and picking a build means deciding between the new minimum system versions and the older 2.9.9 fallback.

The licence is recorded as Other, a custom licence GitHub cannot classify, with the terms in a LICENSE file at the repository root. The file contents are not reproduced in the documentation, so the redistribution and modification terms have to be read directly rather than inferred from a SPDX identifier.

## Getting a build and adding your first subscription

There is no build-from-source recipe in the documentation and no package manager install line, so the practical path is to download a prepared build for the target platform. Which build you can use is decided by the operating system, not by preference. The v3.0 line needs Android 7.0, iOS 15.6, or macOS 11.0 and above; anything older is pointed to the v2.9.9 build, and other platforms are left to the user to attempt. On iOS the download is an ipa that the user must sign before installing, using one of the third party signing tools named in the documentation.

The first real use is adding a source. Start from the source list, either with the channels the app ships or with a subscription you control. The URL you paste is where the interesting options live, and a source that needs a specific User-Agent takes it in the query string:

```bash
https://xxxxxxxxxxxxx.m3u?ua=okHttp/Mod-1.0.0
```

A source behind HTTP Basic credentials inlines them in the same address, and a subscription can be given a readable name with the `tl` parameter so it is not identified only by its raw URL. A source that already carries other query parameters takes the extra values in the same style.

After the source is added, the app parses the .m3u or .txt content, merges duplicate channels, groups them, and lets you move between channels with the arrow keys or by typing a channel number.

## The TV remote mapping and the phone interface differ sharply

On an Android TV big screen the entire interaction model is five buttons, and the mapping is documented explicitly. The up key and the down key both switch channels. The left key enters settings. The right key enters line switching, which is how a channel with several streams is handled. The OK key confirms an action and shows the channel list. That is a complete navigation scheme for a device with no touch screen, and it explains why the app treats the TV build as a first class target rather than a scaled up phone layout.

The non TV build uses a conventional touch interface, documented with a separate screenshot. The two builds share the same source and feature set, including the TV-only code push flow for remote configuration.

Some platform notes are worth knowing before installation. On iOS the app supports 12.0 and above according to the font section, but the downloadable ipa must be signed by the user before it can be installed, with third party signing tools named in the documentation as the options. If a live source uses an IPv6 address, the documentation asks the user to confirm the network can reach IPv6 addresses at all, and points to a v6t.ipip.net test address. That is a network precondition rather than an app defect, but it is the most common way a stream that works on a phone fails on a set top box, where the network path is often different.

## How this differs from playing the same playlist in a desktop player

The clearest way to judge this project is against the approach most people take first: saving an m3u file and opening it in a general purpose media player or VLC on a desktop. That path gets a playlist on screen quickly, but channel syncing, automatic duplicate merging, remote config and TV remote navigation are features of a dedicated app rather than of a playlist format.

Easy TV Live inverts the effort model. Getting the app configured takes longer than pasting a URL into a desktop player, because you may be hosting a JSON file, dealing with a User-Agent hint, or scanning a code on the TV. In exchange, the deployed configuration is steerable by whoever hosts the JSON, and the app handles the television input and duplicate channel cleanup on its own.

For a family member or a relative whose television is the target, that inversion is exactly right. The person who set it up keeps control, and the person watching only ever presses up, down, left, right, and OK. For a solo viewer with a desktop who just wants to watch one stream, the extra machinery is overhead, and the project's own recommendation to add your own subscription sources is the point where a lightweight player stops being lighter.

The sponsorship section, which asks for donations through a WeChat scan, is also a signal about what this is. It is a personal project maintained around a real device need, not a product with a support contract behind it.

## Conclusion

Easy TV Live is a good fit for someone who wants an IPTV player they can steer with a URL and a config file rather than a fixed build, especially on an Android TV box where remote navigation is the primary interaction. It is a poor fit if you need a signed iOS build, guaranteed stream availability, or a documented rollback path. Check three things first: whether your network reaches IPv6 endpoints if your playlist uses them, whether the source you add answers with a User-Agent hint the app can parse, and whether the custom licence in the LICENSE file permits how you intend to redistribute the app.

## FAQ

### How do I add a subscription source to Easy TV Live?

Add the m3u address in the app, either as a remote URL or as a local file, which has been supported since v2.9.5. The app parses .m3u and .txt files, and options such as a custom User-Agent or display title are added as query parameters on the URL itself.

### Why is a channel not playing in Easy TV Live?

One documented cause is a source that requires a specific User-Agent, which the app takes from a `#UA-Hint:` comment in the m3u file or from a `ua=` query parameter, and confirms with a toast. Another is an IPv6 stream on a network that cannot reach IPv6 addresses, which the documentation asks you to check with a test address before blaming the app.

### What does remote configuration in Easy TV Live do and how do I set it up?

It lets a hosted JSON file change the app's settings without a new release, and was added in v2.9.6. You generate the JSON on the project's remote configuration options page, host it on GitHub or Gitee, take the Raw link, confirm it in a browser, then paste it under the remote configuration entry in settings and press the apply remote configuration button. Hand edited JSON only takes effect if you also change the `dtaId` field.

### Which system versions does Easy TV Live support?

From v3.0 the project requires Android 7.0 or above, iOS 15.6 or above, and macOS 11.0 or above, because of the limits of the development framework it uses. On older systems the documentation points to v2.9.9, and v3.0 can sit alongside the old version thanks to its new logo.

## Sources

- [aiyakuaile/easy_tv_live on GitHub](https://github.com/aiyakuaile/easy_tv_live)
- [Issues](https://github.com/aiyakuaile/easy_tv_live/issues)
- [README](https://github.com/aiyakuaile/easy_tv_live/blob/main/README.md)
- [Releases](https://github.com/aiyakuaile/easy_tv_live/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/aiyakuaile-easy-tv-live
