How Free-TV/IPTV Handles Missing or Zero Channel Numbers: A Complete Guide

Channels with missing or zero channel numbers are emitted without the tvg-chno attribute in the generated M3U playlist, ensuring invalid placeholder values never appear in the final output.

The Free-TV/IPTV repository generates M3U playlists from markdown tables containing channel metadata. Understanding how the playlist generator handles edge cases like missing or zero channel numbers is crucial for maintaining clean, standards-compliant IPTV playlists that work correctly across different media players.

Channel Number Parsing Logic in make_playlist.py

In make_playlist.py, the Channel class parses each row of the country-specific markdown files during initialization. The constructor extracts the channel number from the second column and applies conditional logic to handle empty or zero values.

self.number = parts[1].strip()
...
self.chno = self.number if self.number and self.number != "0" else None

This implementation treats both empty strings and the string "0" as invalid channel numbers. When either condition is met, self.chno becomes None, which signals the M3U renderer to skip the attribute entirely.

Conditional Attribute Rendering in M3U Generation

When constructing the final M3U playlist entries, the generator checks the truthiness of self.chno before adding the tvg-chno attribute. As implemented in lines 15-17 of make_playlist.py:

chno = f' tvg-chno="{self.chno}"' if self.chno else ""

If self.chno is None (indicating a missing or zero value), the chno variable becomes an empty string, and the resulting #EXTINF line contains no channel number metadata.

Real-World Examples from the Source Code

Italy Channel with Zero Value

In lists/italy.md at line 400, the channel "Zerouno Tv Music" explicitly uses 0 as its channel number:

| 0   | Zerouno Tv Music | [>](https://5f22d76e220e1.streamlock.net/zerounotvmusic/zerounotvmusic/playlist.m3u8) | <img height="20" src="https://i.imgur.com/r74lqW8.png"/> |

Generated M3U Output

The resulting M3U entry contains no tvg-chno attribute:

#EXTINF:-1 tvg-name="Zerouno Tv Music" tvg-logo="https://i.imgur.com/r74lqW8.png" group-title="Italy",Zerouno Tv Music
https://5f22d76e220e1.streamlock.net/zerounotvmusic/zerounotvmusic/playlist.m3u8

Notice the absence of tvg-chno="0" or any channel number indicator. The generator treats the zero value as equivalent to a blank field.

Processing Outcomes Comparison

The handling differs based on the input value in the markdown table:

  • Valid number (e.g., 5): The output includes tvg-chno="5" in the #EXTINF line
  • Missing number (empty | |): The tvg-chno attribute is completely omitted
  • Zero value (| 0 |): Same as missing—the tvg-chno attribute is omitted to avoid advertising an invalid channel number

Why This Matters for Playlist Standards

IPTV players and media servers interpret the tvg-chno attribute as the official channel position in an electronic program guide (EPG). By filtering out zero values and empty fields, the Free-TV/IPTV generator prevents:

  • Placeholder pollution: Zero values often indicate temporary or streaming channels without traditional broadcast numbers
  • Player confusion: Some clients sort channels by this number, and invalid entries could disrupt the expected ordering
  • Standards violations: The M3U specification implies that present attributes should contain meaningful data

Summary

  • In make_playlist.py, the Channel class sets self.chno to None when the markdown column is empty or contains "0"
  • During M3U generation, the tvg-chno attribute is only rendered if self.chno is truthy
  • Zero values are explicitly treated as invalid and result in the same output as missing values
  • The final playlist contains clean #EXTINF lines without placeholder channel numbers, ensuring compatibility across IPTV clients

Frequently Asked Questions

What happens if a channel number is left blank in the markdown?

When the second column of a markdown table row is empty or contains only whitespace, parts[1].strip() returns an empty string. According to the logic in make_playlist.py lines 95-108, this evaluates as falsy, causing self.chno to be set to None. Consequently, the generated M3U line excludes the tvg-chno attribute entirely.

Why does the generator treat zero as equivalent to missing?

The code explicitly checks self.number != "0" and treats zero as invalid. This design decision prevents placeholder values from being advertised as legitimate channel numbers in the final playlist. Many IPTV sources use 0 to indicate streaming channels or temporary broadcasts that lack traditional EPG assignments, so omitting the attribute maintains data integrity.

How does this affect IPTV player compatibility?

Most modern IPTV players handle missing tvg-chno attributes gracefully by either auto-numbering channels or ignoring the field. By omitting the attribute rather than including tvg-chno="0" or tvg-chno="", the playlist avoids potential parsing errors in strict parsers that might reject empty or zero-value attributes.

Can I force a zero channel number to appear in the output?

No, according to the current implementation in the Free-TV/IPTV repository, there is no configuration option to force zero values into the output. The make_playlist.py script hardcodes the exclusion logic (if self.number and self.number != "0"), meaning zero values will always result in the attribute being omitted from the final M3U playlist.

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:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →