M3U playlist of Italian TV channels with an XMLTV EPG (electronic program guide) and a web player, at tvit.leicaflorianrobert.dev.
- an M3U playlist with the main Italian free-to-air channels (and a few Romanian ones), playable with VLC or any other IPTV player
- an EPG with the schedule of every channel in the playlist, refreshed daily
- a web player with the channel list and a TV guide
| Group | Channels |
|---|---|
| Rai | Rai 1, Rai 2, Rai 3, Rai 4, Rai 5, Rai Movie, Rai Premium, Rai Gulp, Rai Yoyo, Rai News 24, Rai Storia, Italiana, Rai Sport |
| Mediaset | Rete 4, Canale 5, Italia 1, Italia 2, Mediaset 20, La 5, Iris, Focus, Mediaset Extra, Top Crime, Boing, Cartoonito, Tgcom 24, Cine34, Twenty Seven, Radio 101, Radio 105 |
| La7 | La7, La7d |
| Sky | TV8, Cielo |
| Discovery | Nove, DMAX, Real Time, Warner TV, Giallo, K2, Frisbee |
| Regional | Tele Norba |
| Romanian | Pro TV, Comedy Play, Antena 1, Antena 3, Antena Monden |
The up-to-date list, with the DTT numbers, is the JSON playlist.
Each channel link returns an M3U8 stream. The playlist header (url-tvg) points to the EPG, so most players load
the guide on their own.
| Format | Link |
|---|---|
| M3U | https://tvit.leicaflorianrobert.dev/iptv/list.m3u |
| JSON | https://tvit.leicaflorianrobert.dev/iptv/list.json |
Add ?logoVersion=light to the M3U link to get the light version of the channel logos.
Note
The Rai channels can only be watched from Italy: from abroad their stream answers HTTP 451 (geo_blocked) and
the player shows nothing. Use a VPN located in Italy. All the other channels can be watched from any country.
The schedule of each channel and the details of each program are scraped from SuperGuidaTV every day at 03:00 (Europe/Rome). The guide lists the programs from today on; programs that ended more than two days ago are deleted.
| Format | Link |
|---|---|
| XMLTV | https://tvit.leicaflorianrobert.dev/epg/list.xml |
| JSON | https://tvit.leicaflorianrobert.dev/epg/list.json |
Important
All program times are in UTC. In the XMLTV file they carry an explicit +0000 offset, so players show them in
your local time. If you read the JSON yourself, convert them (Italy is UTC+1, UTC+2 in summer).
Each XMLTV channel id is the channel's tvg-id in the M3U playlist (e.g. rai-1), so players pair every channel
with its guide; the playlist's tvg-name is also listed as a display-name, for players that match by name.
- Browser: open the channel list to watch a channel, or the TV guide to see what's on.
- VLC: Media → Open Network Stream and paste the M3U link. VLC plays the channels but doesn't show the guide.
- TiviMate, IPTV Smarters and similar apps: add a playlist from URL with the M3U link. The guide is picked up from the playlist; if it isn't, add the XMLTV link as the EPG source.
- Kodi: install the PVR IPTV Simple Client add-on and set the M3U link as the playlist and the XMLTV link as the EPG.
- Backend: Laravel 9 on PHP 8.1, MySQL, queued jobs for the scraping
- Frontend: Inertia + Vue 3, built with Vite
- Production: Docker image deployed on Coolify, with separate containers for the app, the scheduler and the queue workers
How channels, streams and scraping fit together is described in CLAUDE.md.
- Docker
- PHP >= 8.1 and Composer on the host, only for the first
composer install(Sail, which runs everything else, is a Composer package) - An internet connection: the seeders read the channel list from superguidatv.it
composer install
cp .env.example .env
./vendor/bin/sail up -d
./vendor/bin/sail artisan key:generate
./vendor/bin/sail artisan migrate
./vendor/bin/sail artisan db:seed
./vendor/bin/sail npm install
./vendor/bin/sail npm run devThe app is then available at http://localhost:8082.
The RaiPlay relinker only answers to Italian IP addresses. When the app runs outside Italy, as production does, set
RAI_RELINKER_PROXY in .env to an Italian HTTP proxy (http://user:password@host:port): only the relinker call goes
through it, the players still fetch the video from the CDN. Leave it empty to call the relinker directly.
# Dispatch the scraping jobs
./vendor/bin/sail artisan job:dispatch ScrapChannelsContent
# Scrape the schedule of each channel
./vendor/bin/sail artisan queue:work --queue scrap-channels
# Scrape the details of each program
./vendor/bin/sail artisan queue:work --queue scrap-program-detailThe daily scheduled scraping only runs when APP_ENV=production. So does the cleanup of programs that ended more than
two days ago (CleanOldPrograms, daily at 02:30).
./vendor/bin/sail test # or `php artisan test` on the hostTests run on an in-memory SQLite database (phpunit.xml), so they need neither Docker nor MySQL.
What changed, and when, is in CHANGELOG.md.
TvIt doesn't host or retransmit any content: the playlist links to the streams the broadcasters publish on their own websites, and the rights to the channels and their programs belong to the broadcasters. The program guide comes from SuperGuidaTV. If you own one of these channels and want it removed, open an issue.
