Open-source project
LaQuay/TDTChannels avatar
LaQuay/TDTChannels

TDTChannels publishes M3U and EPG lists for free-to-air broadcasters

Listado de Canales de TV (TDT) en abierto, 100% legal, 100% gratuito // Spanish TV Channels, 100% legal, 100% free

1,683 stars491 forksPythonApache-2.0

At a glance

What is it?
TDTChannels is a Python project that collects the official stream URLs of free-to-air television and radio broadcasters, mostly in Spain, and republishes them as M3U, M3U8, JSON and Enigma2 playlists with EPG guides. It suits anyone who wants a lawful IPTV playlist for open broadcasts, and it is a data project whose value is its daily upkeep.
Who is it for?
Adopt TDTChannels if you want a maintained playlist of free-to-air broadcasters you can point a player at, and you are in a region the project covers. Do not expect it to be a streaming platform, since the project stores no streams and only publishes links the broadcasters provide themselves, and it carries no premium or pay-TV content.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The project publishes links, not streams, and that is the legal position

TDTChannels is a list of TV channels, and radio, that are broadcast in the open over the internet, with a focus on Spain and on major international channels. The repository description makes the claim twice, in Spanish and in English, that it is 100% legal and 100% free.

The legal section explains the reasoning, and it is more specific than a general disclaimer. The project says that no stream is stored, only links that the broadcaster itself provides through its own website or public service. It adds that no public or private signal will ever be emitted, transmitted or broadcast from its servers, and that the broadcast, retransmission, distribution and content rights are the exclusive property and responsibility of the television and radio operators distributing them.

On takedowns, the position is stated in plain terms. No link directly infringes copyright because no copy is made at the site that provides the link, so it is not a valid reason to send a DMCA notice to GitHub. To remove content from the web you need to contact the web host that actually hosts the content, not GitHub and not the contributors to the repository. A contact address is provided for questions, suggestions or complaints, and the README notes that if you own the rights to a channel and want it removed, you should contact them.

That is a coherent position, and it is worth understanding the shape of it. The project is an index of publicly advertised stream endpoints, in the same way that a directory of free-to-air broadcaster websites is. The risk that remains is the ordinary one for any aggregator, which is that a broadcaster's terms change, and the README's process for adding a new channel asks contributors to include the original source of the broadcast.

The README's licence section describes MIT terms, and spells out the one condition: anyone may use the repository as they see fit, the only requirement being that it must be possible to see that the information being used comes from this repository, and in the case of software the attribution must be explicitly visible in it.

Seven playlist formats, because players disagree on what they accept

The playlists table in the README is the most useful part of the documentation, because it maps formats to the problems they solve.

There are three groupings, TV, Radio, and TV plus Radio combined, and within each one several output formats. For TV you get a browser link to the TELEVISION.md page, a JSON file, M3U8, M3U, an M3U8 with MPD, and an Enigma2 userbouquet. Radio has the same set minus the MPD variant. The combined list has the playlist formats and the Enigma2 bouquet but no JSON and no browser page.

The format descriptions are where the practical guidance is. The browser link is for viewing in a browser. The JSON is for other data-reading programs, and the README names the TDTChannels Android and iOS apps as the consumers. M3U8 and M3U are the general purpose ones: a listing to drop into whatever player you want, and the README says to use the M3U if the M3U8 does not work for you. The M3U8 plus MPD variant is marked as in testing, and it includes the same channels as the M3U8 plus the ones that broadcast in MPD format. The Enigma2 format is for the Enigma2 Linux receiver.

That M3U8 versus M3U instruction is the kind of practical detail that saves an afternoon, since the two are close enough that people assume the newer one always works, and the failure is usually a player that does not accept the HLS variant.

The MPD addition is worth noting as a direction of travel. MPD is the manifest format for DASH streaming, so the project is tracking the broadcast standards rather than settling for the one that is easiest to list, and the browser and JSON outputs for the EPG follow the same pattern of serving the same data in whatever shape the consumer needs.

The EPG is integrated into the generated files automatically

The electronic programme guide is delivered as its own set of files and, at the same time, integrated automatically into the generated playlists.

The README's opening says the EPG programming guide is available and integrated automatically into the generated files. The guide itself comes in three shapes for TV and three for radio: a browser link to play.tdtchannels.com for television and for radio, a JSON file, and an XML.GZ file. The JSON guide is described as the format for other data-reading programs, the same role the playlist JSON plays.

There is one practical note about the EPG that applies to every player. If it does not load automatically, you have to include the path in your player. That is not a limitation of the project but a fact about how EPG works in most set-top and IPTV software, where the guide is a separate URL that has to be configured rather than discovered.

The site also has a catalogue page that is worth more attention than it looks. The README links to a page where you can see the status of the lists and check what broadcasts are in each one. For a project whose output is a set of links to third-party servers, a per-list status view is the equivalent of a health dashboard, and it is where a user would find out that one channel's stream has moved.

The tooling around the data is broader than the repository itself suggests. There is a web page, an online player at play.tdtchannels.com, an Android application covering phones, tablets, Android TV and Fire TV, an iOS application for iPhone, iPad, Mac and Apple TV, and other platforms listed for Windows, macOS, Enigma2 and VLC. The project is not only a list of links, it is a small distribution with apps on both mobile platforms.

Python scripts generate the lists, and contributors are asked to bring the source

The repository layout is small, and its shape tells you what the work actually is. The top level holds README.md, TELEVISION.md and RADIO.md, which are the browser-viewable channel pages, an info_television.md, an AUTHORS.md, a MENTIONS.md with the media outlets that have covered the project, a CONTRIBUTING.md, an AGENTS.md, a LICENSE, a scripts/ directory, an img/ directory for images, and a.github/ directory.

The scripts/ directory is where the generation happens, and the primary language of the repository is Python. There is no application server, no database and no web framework in the repository. The site's own infrastructure is elsewhere, and this repository is the generator and the source of truth for the data.

That is a sensible division. The hard part of this project is not serving a playlist, it is keeping the list correct: a channel changes its stream URL, a broadcaster moves from one platform to another, a new channel appears, a regional variant is added. Each of those is a small edit with a large blast radius if it is wrong, and doing it by hand across three groupings and six formats would not scale.

The contribution process reflects that. If you find a bug, or a channel that does not work, you can open an issue. If you know how to fix it, you can make a pull request, and the README asks you to include the original source of the broadcast. New channel requests go through a form on the site rather than a pull request, which keeps the intake of new entries in one place with the information the maintainers need.

The AGENTS.md at the root is the working guide for automated coding assistants, and the AUTHORS.md and MENTIONS.md files are the project's record of who built it and who wrote about it. The project wiki holds the fuller documentation, and there is a site guide for frequently asked questions.

No releases, a daily update habit, and a licence question in the README

The repository has no GitHub releases, which fits a project whose output is continuously regenerated files rather than versioned artefacts. The last push was on 2026-10-18, and the repository is not archived. The daily nature of the work is the reason there is no release train: a channel's URL that is wrong today is wrong now, not in the next version.

The licence is worth a second look, because there is a discrepancy worth knowing about. The project records the licence as Apache-2.0, and the LICENSE file in the repository is the authoritative text. But the README's own licence section refers to the MIT licence, describing the attribution condition it imposes. In practice the two are compatible in the way that matters here, since both permit reuse with attribution, but the README is describing the terms in MIT language while the repository carries an Apache-2.0 file, and a downstream project that redistributes the data should read the LICENSE file rather than the README paragraph.

The legal section has one more clause that is easy to overlook and is about the project rather than the content. Under the life of the site heading, the terms of the legal notice reserve the right to unilaterally suspend temporarily or definitively the provision of services over the internet, including suspending or ending the service entirely, without needing to give prior notice. In other words, the site can go away.

That is the operational risk to plan for. The playlists are a convenience index over links whose availability the project does not control, and the project itself reserves the right to stop. The reasonable response is not to treat the site as a permanent dependency, but to keep the list format in mind and be prepared to point your player at a different set of links, which is what the direct links to the individual playlist files make possible.

Editorial conclusion

Adopt TDTChannels if you want a maintained playlist of free-to-air broadcasters you can point a player at, and you are in a region the project covers. Do not expect it to be a streaming platform, since the project stores no streams and only publishes links the broadcasters provide themselves, and it carries no premium or pay-TV content. Before you use it, read the legal section, which explains the position on links and takedowns, and check the generated list status page, because the README points to a catalogue entry per list showing which broadcasts currently work.

Frequently asked questions

What is TDTChannels and what does it provide?

It is a list of television and radio channels broadcast in the open over the internet, focused on Spain and on major international channels, published as M3U, M3U8, JSON and Enigma2 playlists for TV, radio or both, with EPG guides in JSON and XML.GZ alongside them.

Does TDTChannels host any streams itself?

No. The legal section states that no stream is stored, only links that the broadcaster itself provides through its own website or public service, and that no public or private signal will ever be emitted or transmitted from its servers. The broadcast rights remain with the operators.

Which playlist format should I use?

M3U8 or M3U for a generic IPTV player, with the README advising you to use the M3U if the M3U8 does not work. The JSON is for data-reading programs such as the Android and iOS apps, the Enigma2 format is for the Enigma2 Linux receiver, and the M3U8 plus MPD variant is still in testing and adds the channels that broadcast in MPD format.

How do I report a channel that no longer works?

Open an issue for a bug, or make a pull request if you know how to fix it, and include the original source of the broadcast. New channel requests go through the form linked from the README rather than a pull request.

Can I redistribute the TDTChannels lists?

The README describes the MIT terms, under which anyone may use the repository as they see fit provided it is clear the information comes from this repository, with the attribution visible in the software. The repository itself carries an Apache-2.0 LICENSE file, so read that file if you plan to redistribute the data.

Official sources

  1. Issues
  2. LaQuay/TDTChannels on GitHub
  3. License: Apache-2.0
  4. Project website
  5. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/laquay-tdtchannels.svg)](https://hysenlabs.com/projects/laquay-tdtchannels)

Was this useful?