| 中文 | English |
⚡️ IPTV live-source automatic update platform — 🤖 fully automated collection, filtering, speed-testing, and generation 🚀. Supports extensive personalized configuration; paste the resulting address into a player to watch.
There are four installation and running methods in total (Workflows, Command Line, GUI, Docker). Choose the one that suits you.
Use GitHub Actions workflows to deploy and manually trigger the update endpoint.
[!IMPORTANT] Because GitHub resources are limited, workflow updates can only be triggered manually. If you need frequent updates or scheduled runs, please deploy using another method.
Open https://github.com/Guovin/iptv-api and click Star to favorite this project (Your Star is my motivation for
continuous updates).

Copy the source code of this repository to your personal account repository.

iptv-api as an example.
Since this project will continue to iterate and optimize, if you want to get the latest updates, you can do the following:
Follow this project, and subsequent update logs will be released as releases, and you will receive email
notifications.

Go back to the homepage of your forked repository, if there are updates, click Sync fork, Update branch to confirm
and update the latest code.

Update branch button, update conflict:This is because some files conflict with the default files of the main repository, click Discard commits to update the
latest code.

[!IMPORTANT] To avoid conflicts when updating the code later, it is recommended to copy files in the
configdirectory and rename them by adding theuser_prefix before modifying.
When you click to confirm creation in step one, you will automatically jump to your personal repository after success. At this time, your personal repository has been created, and you can customize your live source channel menu!


You can copy and refer to the format of the default template for subsequent operations.
config directory.user_demo.txt.$! after the address, such as http://xxx$!. You can also add additional information, such as: http://xxx$!
whitelist.Commit changes... to save.
Like editing templates, modify the runtime configuration.


user_config.ini.user_config.ini, you can only enter the configuration items you
want to modify, no need to copy the entire config.ini. Note that the [Settings] at the top of the configuration
file must be retained, otherwise the custom configuration below will not take effect)Govin public account and reply cdn to get it)Commit changes... to save.

Adjust the configuration as needed, here is the default configuration description: Configuration parameters
[!NOTE]
- For enabling interface information display, since some players (such as
PotPlayer) do not support parsing interface supplementary information, causing playback failure, you can modify the configuration:open_url_info = False( GUI: uncheck display interface information) to disable this feature.- If your network supports IPv6, you can modify the configuration:
ipv6_support = True(GUI: CheckForce assume the current network supports IPv6) to skip the support check.
Subscription sources (config/subscribe.txt)
Since no default subscription addresses are provided, you need to add them yourself; otherwise the update results may
be empty. Both .txt and .m3u URLs are supported as subscriptions, and the program will read channel interface
entries from them sequentially.

Local sources(config/local.txt)
Channel interface data comes from local files. If there are multiple local source files, you can create a local
directory under config to store them; the program will read the channel interface data from them in order. Supports
txt and m3u files.
Logo source (config/logo)
Directory for channel logo images. The program will match corresponding logo images in this directory based on the
channel names in the template. If a remote library logo_url is used, the remote source will be preferred.
EPG Source (config/epg.txt)
The source of program guide information. The program will sequentially fetch the program guide data from the subscription addresses in the file and aggregate the output.
Channel Aliases (config/alias.txt)
A list of aliases for channel names, used to map multiple names to a single name when fetching from the interface, improving the fetch volume and accuracy. Format: TemplateChannelName,Alias1,Alias2,Alias3
Blacklist (config/blacklist.txt)
Interfaces that match the blacklist keywords will be filtered and not collected, such as low-quality interfaces with ads.
Whitelist (config/whitelist.txt)
Interfaces or subscription sources in the whitelist will not participate in speed testing and will be prioritized at the top of the results. Fill in the channel name to directly retain the record in the final result, such as: CCTV-1, interface address, only filling in the interface address will apply to all channels, multiple records are entered on separate lines.
If your template and configuration modifications are correct, you can configure Actions to achieve automatic updates.

Since the Actions workflow of the forked repository is disabled by default, you need to manually confirm to enable it,
click the button in the red box to confirm enabling.
After enabling successfully, you can see that there are no workflows running currently, don’t worry, let’s start running
your first update workflow below.
update schedule under the Workflows category.Enable workflow button to confirm the
activation.
Now you can run the update workflow.
Run workflow.master branch, if the template
and configuration you modified are also in the master branch, just choose master here, and click Run workflow
to confirm the run.
Wait a moment, and you will see that your first update workflow is running!
[!NOTE]
The running time depends on the number of channels and pages in your template and other configurations, and also largely depends on the current network conditions. Please be patient. The default template and configuration usually take about 15 minutes.
If you feel that this update is not quite right and you need to modify the template or configuration before running
again, you can click Cancel run to cancel this run.

If everything is normal, after a short wait, you will see that the workflow has been executed successfully (green check
mark).

At this point, you can visit the file link to see if the latest results have been synchronized: https://raw.githubusercontent.com/your-github-username/repository-name/master/output/user_result.txt
Recommended CDN-accelerated URL: {cdn_url}/https://raw.githubusercontent.com/your-github-username/repository-name/master/output/user_result.txt

If you can access this link and it returns the updated interface content, then your live source interface link has been
successfully created! Simply copy and paste this link into software like TVBox in the configuration field to use~
[!NOTE]
If you have modified the template or configuration files and want to execute the update immediately, you can manually trigger (2)Run workflow.
Install Python Please download and install Python from the official website, and select the option to add Python to the system environment variable Path during installation.
Run the update Open the terminal CMD in the project directory and run the following commands in sequence:
Install dependencies:
pip install pipenv
pipenv install --dev
Start the update:
pipenv run dev
Start the service:
pipenv run service
Download the IPTV-API Update Software, open the software, and click Start to perform the update.
Or run the following command in the project directory to open the GUI software:
pipenv run ui

Download the docker-compose.yml or create one by copying the content (internal parameters can be changed as needed), then run the following command in the path where the file is located:
docker compose up -d
docker pull guovern/iptv-api:latest
🚀 Proxy acceleration (use this command if pulling fails, but it may download an older version):
docker pull docker.1ms.run/guovern/iptv-api:latest
docker run -d -p 80:8080 guovern/iptv-api
Environment variables:
| Variable | Description | Default |
|---|---|---|
| PUBLIC_DOMAIN | Public domain or IP address, determines external access and the Host used in push stream results | 127.0.0.1 |
| PUBLIC_PORT | Public port, set to the mapped port, determines external access address and the port used in push stream results | 80 |
| NGINX_HTTP_PORT | Nginx HTTP service port, needs to be mapped for external access | 8080 |
If you need to modify environment variables, add the following parameters after the above run command:
# Modify public domain
-e PUBLIC_DOMAIN=your.domain.com
# Modify public port
-e PUBLIC_PORT=80
In addition to the environment variables listed above, you can also override the configuration items in the configuration file via environment variables.
Mounts: used to synchronize files between the host and the container. You can edit templates, configs, and access generated result files directly on the host. Append the following options to the run command above:
# Mount config directory
-v /iptv-api/config:/iptv-api/config
# Mount output directory
-v /iptv-api/output:/iptv-api/output
| Endpoint | Description |
|---|---|
| / | Default endpoint |
| /m3u | m3u format endpoint |
| /txt | txt format endpoint |
| /ipv4 | ipv4 default endpoint |
| /ipv6 | ipv6 default endpoint |
| /ipv4/txt | ipv4 txt endpoint |
| /ipv6/txt | ipv6 txt endpoint |
| /ipv4/m3u | ipv4 m3u endpoint |
| /ipv6/m3u | ipv6 m3u endpoint |
| /content | Endpoint content |
| /log/result | Log of valid results |
| /log/speed-test | Log of all interfaces involved in speed testing |
| /log/statistic | Log of statistics results |
| /log/nomatch | Log of unmatched channels |
RTMP Streaming:
[!NOTE]
- If deploying on a server, be sure to set the
PUBLIC_DOMAINenvironment variable to the server’s domain name or IP address and thePUBLIC_PORTenvironment variable to the public port; otherwise the streaming addresses will not be accessible.- When streaming is enabled, obtained interfaces (e.g., subscription sources) will be streamed by default.
- To stream local video sources, create an
hlsfolder under theconfigdirectory and place video files named after the channel; the program will automatically stream them to the corresponding channels.
| Streaming Endpoint | Description |
|---|---|
| /hls | hls streaming endpoint |
| /hls/txt | hls txt streaming endpoint |
| /hls/m3u | hls m3u streaming endpoint |
| /hls/ipv4 | hls ipv4 default streaming endpoint |
| /hls/ipv6 | hls ipv6 default streaming endpoint |
| /hls/ipv4/txt | hls ipv4 txt streaming endpoint |
| /hls/ipv4/m3u | hls ipv4 m3u streaming endpoint |
| /hls/ipv6/txt | hls ipv6 txt streaming endpoint |
| /hls/ipv6/m3u | hls ipv6 m3u streaming endpoint |
| /stat | Streaming status statistics endpoint |
Docker enables streaming with minimal configuration and placing local video files in the right folder. Below are two common streaming scenarios: subscription (online) sources and local video files.
1) Preparations before start (example: Docker Compose)
docker-compose.yml and confirm the following environment variables before starting:
PUBLIC_DOMAIN: public domain or public IP used in stream Host headers.PUBLIC_PORT: public port mapped on the host (affects final access addresses).NGINX_HTTP_PORT: container internal HTTP port (normally keep default).config directory is mounted into the container (default /iptv-api/config) so you can edit templates,
add local videos, and place subscription files on the host.Example (excerpt from compose for reference):
services:
iptv-api:
image: guovern/iptv-api:latest
container_name: iptv-api
restart: unless-stopped
ports:
- "80:8080" # host_port:container_http_port
volumes:
- /iptv-api/config:/iptv-api/config # Change to host configuration folder path:container configuration folder path
- /iptv-api/output:/iptv-api/output
environment:
PUBLIC_SCHEME: "http"
PUBLIC_DOMAIN: "192.168.1.95" # Change to your server domain or IP address. Here it uses my LAN IP as an example.
PUBLIC_PORT: "80" # Change to public port
NGINX_HTTP_PORT: "8080" # Default HTTP service port inside the container
CDN_URL: ""
HTTP_PROXY: ""
2) Subscription source streaming (online sources)
config/subscribe.txt. On startup the program will read the subscriptions and
publish streams for the channels found./hls/txt, /hls/m3u (and their ipv4/ipv6 variants)3) Local video streaming (server video files)
hls folder under the mounted config directory (for example /iptv-api/config/hls on the host).海洋.mp4). The program will
automatically stream the corresponding file for that channel.Example layout:
iptv-api/
├── config
│ └── hls
│ └── 海洋.mp4
config/demo.txt (or your template) as usual; the program will map the local file to the channel
and stream it.Example template fragment:
📺Main channels,#genre#
CCTV-1
📡Satellite,#genre#
Guangdong Satellite
🚀Local video,#genre#
海洋
4) Start and verify
docker compose up -d
/hls/txt to see current stream addresses and descriptions./hls/m3u to load the playlist into a player or /hls/txt for a plain list.5) Monitoring and logs
/stat endpoint to see current streaming counts, traffic, and basic statistics.6) Common tips and tuning
PUBLIC_PORT is open to the outside (firewall, cloud security groups, etc.).
RTMP/HTTP ports must be accessible externally.PUBLIC_DOMAIN to your domain and PUBLIC_SCHEME to
https. Manage TLS/HTTPS via an external reverse proxy or your hosting setup.rtmp_max_streams to limit concurrent
streams and avoid overloading the server.rtmp_idle_timeout controls how long a stream stays active with no viewers (in seconds); tune it per your
needs.7) Useful RTMP-related configuration options
# RTMP channel idle stop timeout (seconds)
rtmp_idle_timeout = 300
# Maximum concurrent RTMP streams to avoid excessive server load
rtmp_max_streams = 10
Above is a compact guide to using streaming. Adjust configuration and verify using /hls/* and /stat endpoints to
confirm streaming availability and status.