How to Update Existing Channel Information in the Free-TV IPTV Playlist
Edit the corresponding Markdown file in the lists/ directory, modify the pipe-separated table row containing the channel data, and run python3 make_playlist.py to regenerate the playlist.m3u8 file.
The Free-TV/IPTV repository generates its streaming playlists from human-readable Markdown files rather than manual XML manipulation. To update existing channel information in the IPTV playlist, you modify the source table entries in the lists/ directory and invoke the Python generator script to rebuild the consolidated output.
Understanding the Playlist Architecture
The repository uses a Markdown-to-M3U8 pipeline where channel data lives in country-specific files under lists/. The script make_playlist.py parses these files, instantiates Channel objects for each valid row, and writes the final playlist.m3u8 file that IPTV clients consume.
Each channel entry follows a pipe-separated table format. The generator only processes rows containing the [>] marker—indicating an active stream—and skips rows marked with [x].
Locating and Editing Channel Entries
File Structure
Country-specific channel lists reside in the lists/ directory (e.g., lists/usa.md, lists/uk.md). Each file contains a Markdown table where every row represents a single channel.
Table Format
The columns follow this structure:
| Column | Content | Required |
|---|---|---|
| 1st | Channel number (optional) | No |
| 2nd | Display name (used for tvg-name) |
Yes |
| 3rd | Link in format [>](URL) |
Yes |
| 4th | Logo as <img height="20" src="URL"/> |
Yes |
| 5th | EPG ID (used for tvg-id) |
No |
Example entry from lists/usa.md:
| 1 | Buzzr Ⓖ | [>](https://buzzrota-ono.amagi.tv/playlist1080.m3u8) | <img height="20" src="https://upload.wikimedia.org/.../Buzzr_logo.svg"/> | Buzzr.us |
Step-by-Step Update Process
Follow these steps to update existing channel information in the IPTV playlist:
-
Locate the source file – Identify the country file in
lists/containing the channel (e.g.,lists/usa.mdfor US channels). -
Find the channel row – Search for the channel name in the table. Each row uses pipe characters (
|) as delimiters. -
Modify the fields – Update the URL inside the
[>](...)parentheses, change the logosrcattribute, or adjust the EPG ID in the final column. -
Preserve the marker – Keep
[>]to include the channel in the playlist. If the stream is broken, change it to[x]to exclude it from generation. -
Regenerate the playlist – Run the generator script:
python3 make_playlist.py -
Verify the output – Check
playlist.m3u8or the per-country files underplaylists/to confirm the changes reflect correctly.
Practical Update Examples
Updating a Stream URL
If a channel moves to a new endpoint, edit the URL within the parentheses:
- | 1 | Buzzr Ⓖ | [>](https://buzzrota-ono.amagi.tv/playlist1080.m3u8) | <img height="20" src="https://upload.wikimedia.org/.../Buzzr_logo.svg"/> | Buzzr.us |
+ | 1 | Buzzr Ⓖ | [>](https://new-buzzr.example.com/playlist.m3u8) | <img height="20" src="https://upload.wikimedia.org/.../Buzzr_logo.svg"/> | Buzzr.us |
After saving, run python3 make_playlist.py to update the playlist.m3u8.
Marking Channels as Invalid
When a stream goes offline, replace [>] with [x]:
- | 2 | Retro TV | [>](https://bcovlive-a.akamaihd.net/...) | <img height="20" src="https://i.imgur.com/PNTYOgg.png" /> | RetroTVEast.us |
+ | 2 | Retro TV | [x]() | <img height="20" src="https://i.imgur.com/PNTYOgg.png" /> | RetroTVEast.us |
The script skips [x] rows during generation, effectively removing them from the output.
Adding EPG Identifiers
To add electronic program guide data, append the EPG ID as the sixth column:
- | 3 | Stadium | [>](https://bcovlive-a.akamaihd.net/...) | <img height="30" src="https://i.imgur.com/6ae9E8d.png"/> |
+ | 3 | Stadium | [>](https://bcovlive-a.akamaihd.net/...) | <img height="30" src="https://i.imgur.com/6ae9E8d.png"/> | StadiumEPG123 |
This populates the tvg-id="StadiumEPG123" attribute in the generated M3U.
How the Generator Processes Changes
The make_playlist.py script implements the transformation logic. When you run the generator:
- Parsing – The
Channelclass__init__method (lines 94-104) splits each Markdown line on|characters and extracts fields. - URL extraction – The script strips parentheses from the link column using
self.url = self.url[self.url.find("(")+1:self.url.rfind(")")]. - M3U generation – The
to_m3u_line()method (lines 15-20) constructs the#EXTINFline withtvg-name,tvg-id, andtvg-countryattributes. - Country codes – The
COUNTRY_CODESdictionary (lines 6-91) maps country names to ISO codes for thetvg-countryattribute. - EPG headers – The script references
epglist.txt(lines 31-35) to include EPG URLs in the M3U header.
The final output combines all active channels into playlist.m3u8 (lines 36-59) while filtering out any entries marked with [x].
Summary
- Source files – Channel data lives in
lists/*.mdas Markdown tables. - Update method – Edit the pipe-separated row in the appropriate country file, preserving the
[>]marker for active streams. - Regeneration – Run
python3 make_playlist.pyto parse changes and rebuildplaylist.m3u8. - Invalid streams – Use
[x]instead of[>]to exclude broken channels without deleting data. - Implementation – The
Channelclass inmake_playlist.pyhandles parsing and M3U line generation viato_m3u_line().
Frequently Asked Questions
What happens if I remove the [>] marker entirely?
If you remove the [>] marker without replacing it with [x], the row will likely fail validation or be skipped. The generator specifically looks for [>] to identify active streams. To disable a channel, use [x] as shown in the examples above.
Can I update multiple channels before running the generator?
Yes. You can edit multiple rows across different lists/*.md files before running python3 make_playlist.py. The script processes all country files in a single execution, so batch updates are efficient and encouraged for maintaining the playlist.
Do I need to restart IPTV clients after updating the playlist?
Most IPTV clients load the M3U8 file at startup or on a refresh interval. Simply updating playlist.m3u8 on disk does not automatically push changes to active clients. You must either restart the client application or trigger a playlist refresh in the client's settings to see the updated channel information.
Where is the EPG data configured in the repository?
The EPG URLs are defined in epglist.txt, which the generator reads to populate the url-tvg attribute in the M3U header (lines 31-35 of make_playlist.py). Individual channel EPG IDs are set in the fifth column of the Markdown table rows, which the Channel class maps to the tvg-id attribute in the output.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →