Compare commits

...

9 Commits

Author SHA1 Message Date
Wu Tingfeng 44a0871388
Merge f362385fcc into 6ec6fb7c0f 2026-04-09 03:33:27 +00:00
PlaylistBot 6ec6fb7c0f Update Playlist (GitHub Actions) 2026-04-09 03:28:19 +00:00
foratedio 9269fbb122
Update playlist_brazil.m3u8 (#1013) 2026-04-09 05:28:11 +02:00
PlaylistBot 5280f362ca Update Playlist (GitHub Actions) 2026-04-09 03:27:40 +00:00
Miguel Lozano 50ee8e8861
Add RTP Africa and RTP Internacional (#1016)
Thank you for yout work.
2026-04-09 05:27:31 +02:00
PlaylistBot 02c84cb055 Update Playlist (GitHub Actions) 2026-04-09 03:21:33 +00:00
Giacinto Lo Meo ea332da787
Add tvg-chno support using channel number from markdown lists (#1018)
* Add channel number to M3U line formatting

Add tvg-chno support using channel number from markdown lists

- Extract channel number from md lists
- Add tvg-chno attribute to M3U output
- Skip invalid values (e.g. 0)

Improves channel ordering in IPTV clients like Jellyfin

* Update make_playlist.py

Add tvg-chno support using channel number from markdown lists

- Extract channel number from md lists
- Add tvg-chno attribute to M3U output
- Skip invalid values (e.g. 0)

Improves channel ordering in IPTV clients like Jellyfin

* Delete playlists/playlist_italy.m3u8

delete italy playlist for updating with channel number

* Italy playlist updated with channel number
2026-04-09 05:21:25 +02:00
Baleshevich Srdjan 4462172b34
Updated the Bosnia & Herzegovina, Serbia & Montenegro playlist and list (#878)
* Updated the Bosnia and Herzegovina playlist and list

Replaced non-working links of two TV stations for links that work. The source of those links is found on the web sites of those TV stations respectively.

* Update Playlist (GitHub Actions)

* Updated the Bosnia & Herzegovina, Serbia & Montenegro playlist and list

Updated the link of one TV stations in Bosnia and Herzegovina, and remarked a non-HD channel on that list.
Updated all the links of TV stations from Montenegro, marked some of the links with GeoIP blocking (help needed from good, hones & heroic person from Montenegro on this one).
Added TV 3 channels to Serbia's list, and updated 2 links on that list as well.

* Update Playlist (GitHub Actions)

* Update Playlist (GitHub Actions)

---------

Co-authored-by: PlaylistBot <playlistbot@users.noreply.github.com>
2026-04-09 05:15:33 +02:00
Wu Tingfeng f362385fcc
Create LICENSE 2024-01-31 00:04:45 +08:00
90 changed files with 2784 additions and 2735 deletions

24
LICENSE 100644
View File

@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org>

View File

@ -4,11 +4,11 @@
|:---:|:--------------:|:-----:|:----:|:------:|
| 1 | BHT 1 | [>](https://bhrtstream.bhtelecom.ba/bhrtportal_hd.m3u8) | <img height="20" src="https://upload.wikimedia.org/wikipedia/commons/9/93/Logo_of_BHT_1_%282003-2012%29.png" /> | BHT1.ba |
| 2 | Federalna televizija (FTV) Ⓢ | [>](http://94.250.2.6:7374/play/a02s/index.m3u8) | <img height="20" src="https://i.imgur.com/Jpvs4u3.png" /> | FederalnaTV.ba |
| 3 | Televizija Republike Srpske (RTRS) | [>](https://parh.rtrs.tv/tv/live/playlist.m3u8) | <img height="20" src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/RTRS_Logo.svg/640px-RTRS_Logo.svg.png" /> | RTRSTV.ba |
| 3 | Televizija Republike Srpske (RTRS) | [>](https://parh.rtrs.tv/tv/live/playlist.m3u8) | <img height="20" src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/RTRS_Logo.svg/640px-RTRS_Logo.svg.png" /> | RTRSTV.ba |
| 3 | RTRS PLUS Ⓢ | [>](https://pluslive.rtrs.tv/plus/plus/playlist.m3u8) | <img height="20" src="https://i.imgur.com/k06WvYl.png"/> | RTRSplus.ba |
| 4 | N1 Bosna i Hercegovina | [>](https://best-str.umn.cdn.united.cloud/stream?channel=n1bos&p=n1Sh4redSecre7iNf0&sp=n1info&stream=sp1400&u=n1info) | <img height="20" src="https://i.imgur.com/72oMSWz.png"/> | N1BosniaHerzegovina.ba |
| 5 | RTV HB Ⓢ | [>](https://prd-hometv-live-open.spectar.tv/ERO_1_083/playlist.m3u8) | <img height="20" src="https://upload.wikimedia.org/wikipedia/en/6/60/Logo_of_TV_Herceg-Bosne.png"/> | RTVHB.ba |
| 6 | RTV BN | [>](https://rtvbn.tv:8080/live/index.m3u8) | <img height="20" src="https://i.imgur.com/DUBvfWb.png"/> | BNTV.ba |
| 6 | RTV BN | [>](https://stream.rtvbn.tv:8080/live/index.m3u8) | <img height="20" src="https://i.imgur.com/DUBvfWb.png"/> | BNTV.ba |
| 7 | RTV Glas Drine | [>](http://glasdrine.cutuk.net:8081/433ssdsw/GlasDrineSD/playlist.m3u8) | <img height="20" src="https://i.imgur.com/9NgxOdb.png"/> | RTVGlasDrine.ba |
| 8 | Sevdah Ⓢ | [>](https://restreamer2.tnt.ba/hls/stream.m3u8) | <img height="20" src="https://i.imgur.com/V6W3yEp.png"/> | SevdahTV.ba |
| 9 | TNT Kids | [>](https://restreamer1.tnt.ba/hls/tntkids.m3u8) | <img height="20" src="https://i.imgur.com/irTDbpn.png"/> | TNTKidsTV.ba |

View File

@ -2,7 +2,7 @@
| # | Channel | Link | Logo | EPG id |
|:---:|:--------------:|:-----:|:----:|:------:|
| 1 | TVCG 1 | [>](http://cdn3.bcdn.rs:1935/cg1/smil:cg1.smil/playlist.m3u8) | <img height="20" src="https://i.imgur.com/QORHrXu.png"/> | TVCG1.me |
| 2 | TVCG 2 | [>](http://cdn3.bcdn.rs:1935/cg2/smil:cg2.smil/playlist.m3u8) | <img height="20" src="https://i.imgur.com/WECmUKH.png"/> | TVCG2.me |
| 3 | TVCG 3 | [>](https://parlament.rtcg.me:1936/pr/smil:parlament.smil/playlist.m3u8) | <img height="20" src="https://i.imgur.com/XC7zVog.png"/> | Parlamentarnikanal.me |
| 99 | TVCG MNE | [>](http://cdn3.bcdn.rs:1935/cgsat/smil:cgsat.smil/playlist.m3u8) | <img height="20" src="https://i.imgur.com/pf8VEwf.png"/> | TVCGMNE.me |
| 1 | TVCG 1 Ⓖ | [>](https://rtcg-live-open-geo.morescreens.com/RTCG_1_001/playlist.m3u8) | <img height="20" src="https://i.imgur.com/QORHrXu.png"/> | TVCG1.me |
| 2 | TVCG 2 Ⓖ | [>](https://rtcg-live-open-geo.morescreens.com/RTCG_1_002/playlist.m3u8) | <img height="20" src="https://i.imgur.com/WECmUKH.png"/> | TVCG2.me |
| 3 | TVCG 3 Ⓖ | [>](https://rtcg-live-open-geo.morescreens.com/RTCG_1_003/playlist.m3u8) | <img height="20" src="https://i.imgur.com/XC7zVog.png"/> | TVCG3.me |
| 99 | TVCG MNE | [>](https://rtcg-live-open.morescreens.com/RTCG_1_004/playlist.m3u8) | <img height="20" src="https://i.imgur.com/pf8VEwf.png"/> | TVCGMNE.me |

View File

@ -10,7 +10,9 @@
| 5 | RTP Madeira Ⓢ | [>](https://streaming-live.rtp.pt/liverepeater/smil:rtpmadeira.smil/playlist.m3u8) | <img height="20" src="https://upload.wikimedia.org/wikipedia/en/a/ac/RTP_Madeira_2016.png"/> | RTPMadeira.pt |
| 6 | RTP3 | [>](https://streaming-live.rtp.pt/livetvhlsDVR/rtpnHDdvr.smil/playlist.m3u8?DVR=) | <img height="20" src="https://upload.wikimedia.org/wikipedia/commons/b/b9/Rtp3.png"/> | RTP3.pt |
| 7 | RTP Memória | [x]() | <img height="20" src="https://upload.wikimedia.org/wikipedia/commons/7/79/RtpMemoria_positivo_horiz_RGB.png"/> | RTPMemoria.pt |
| 8 | RTP África | [>](https://streaming-live.rtp.pt/liverepeater/smil:rtpafrica.smil/playlist.m3u8) | <img height="20" src="https://i.imgur.com/ISFNy17.png"/> | RTPAfrica.pt |
| 9 | RTP Mundo | [>](https://streaming-live.rtp.pt/liverepeater/smil:rtpi.smil/playlist.m3u8) | <img height="20" src="https://i.imgur.com/mJ3gyqx.png"/> | RTPInternacional.pt |
| 1 | Porto Canal Ⓢ | [>](https://streamer-a01.videos.sapo.pt/live/portocanal/playlist.m3u8) | <img height="20" src="https://i.imgur.com/wsyvP2H.png"/> | PortoCanal.pt |
| 2 | ADtv Ⓢ | [>](https://playout172.livextend.cloud/liveiframe/_definst_/ngrp:liveartvabr_abr/playlist.m3u8) | <img height="20" src="https://i.imgur.com/FvlcU3z.png"/> |
| 3 | CNN Portugal | [>](https://sktv-forwarders.7m.pl/get.php?x=CNN_Portugal) | <img height="20" src="https://i.imgur.com/NYH39xs.png"/> | CNNPortugal.pt |
| 2 | ADtv Ⓢ | [>](https://playout172.livextend.cloud/liveiframe/_definst_/ngrp:liveartvabr_abr/playlist.m3u8) | <img height="20" src="https://i.imgur.com/FvlcU3z.png"/> | |
| 3 | CNN Portugal | [>](https://sktv-forwarders.7m.pl/get.php?x=CNN_Portugal) | <img height="20" src="https://i.imgur.com/NYH39xs.png"/> | CNNPortugal.pt |
| 4 | Euronews em Português Ⓨ| [>](https://www.youtube.com/euronewspt/live) | <img height="20" src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Euronews_2022.svg/640px-Euronews_2022.svg.png"/> | EuronewsPortuguese.fr |

View File

@ -5,12 +5,15 @@
| 1 | RTS 1 | [>](https://webtvstream.bhtelecom.ba/rts1.m3u8) | <img height="20" src="https://i.imgur.com/S1pKHSR.png"/> | RTS1.rs |
| 2 | RTS 2 | [>](https://webtvstream.bhtelecom.ba/rts2.m3u8) | <img height="20" src="https://i.imgur.com/jltAf5h.png"/> | RTS2.rs |
| 3 | RTS 3 | [x]() | <img height="20" src="https://i.imgur.com/gxuGB4J.png"/> | RTS3.rs |
| 4 | Red TV | [>](https://edge8.pink.rs/redtv/chunklist_w1213385221.m3u8) | <img height="20" src="https://i.imgur.com/cpN7NrL.png"/> | RedTV.rs |
| 5 | Kurir TV | [>](https://static.am.mediaoutcast.com/storage/nQJnjJkO/nQJnjJkO/stream/O68x4o8g/720p/720p.m3u8) | <img height="20" src="https://i.imgur.com/HBPnUD5.png"/> | KurirTV.rs |
| 6 | Informer TV | [>](https://edge-rs-03.maksnet.tv/informertv-secure/web/playlist.m3u8) | <img height="20" src="https://i.imgur.com/9wdEHRf.png"/> | InformerTV.rs |
| 0 | RTS Svet | [x]() | <img height="20" src="https://upload.wikimedia.org/wikipedia/commons/8/8a/Rts-svet.png"/> | RTSSvet.rs |
| 0 | Euronews Serbia | [>](https://d1ei8ofhgfmkac.cloudfront.net/app-19518-1306/ngrp:QoZfNjsg_all/playlist.m3u8) | <img height="20" src="https://i.imgur.com/b24QKcq.png"/> | EuroNewsSerbia.rs |
| 0 | Euronews Serbia | [x](https://d1ei8ofhgfmkac.cloudfront.net/app-19518-1306/ngrp:QoZfNjsg_all/playlist.m3u8) | <img height="20" src="https://i.imgur.com/b24QKcq.png"/> | EuroNewsSerbia.rs |
<h3>Vojvodina</h3>
| # | Channel | Link | Logo | EPG id |
|:---:|:--------------:|:-----:|:----:|:------:|
| 1 | RTV 1 | [>](rtsp://212.200.255.151/rtv1) | <img height="20" src="https://i.imgur.com/CG44YT3.png"/> | RTV1.rs |
| 2 | RTV 2 | [>](rtsp://212.200.255.151/rtv2) | <img height="20" src="https://i.imgur.com/skpr66t.png"/> | RTV2.rs |
| 1 | RTV 1 | [>](rtmp://212.200.230.50:1935/RTV/rtv1) | <img height="20" src="https://i.imgur.com/CG44YT3.png"/> | RTV1.rs |
| 2 | RTV 2 | [>](rtmp://212.200.230.50:1935/RTV/rtv2) | <img height="20" src="https://i.imgur.com/skpr66t.png"/> | RTV2.rs |

View File

@ -103,6 +103,9 @@ class Channel:
self.url = self.url[self.url.find("(")+1:self.url.rfind(")")]
self.logo = parts[4].strip()
self.logo = self.logo[self.logo.find('src="')+5:self.logo.rfind('"')]
self.chno = self.number if self.number and self.number != "0" else None
if len(parts) > 6:
self.epg = parts[5].strip()
else:
@ -110,10 +113,11 @@ class Channel:
def to_m3u_line(self):
country = f' tvg-country="{self.country_code}"' if self.country_code else ""
chno = f' tvg-chno="{self.chno}"' if self.chno else ""
if self.epg is None:
return (f'#EXTINF:-1 tvg-name="{self.name}" tvg-logo="{self.logo}"{country} group-title="{self.group}",{self.name}\n{self.url}')
return (f'#EXTINF:-1 tvg-name="{self.name}" tvg-logo="{self.logo}"{chno}{country} group-title="{self.group}",{self.name}\n{self.url}')
else:
return (f'#EXTINF:-1 tvg-name="{self.name}" tvg-logo="{self.logo}" tvg-id="{self.epg}"{country} group-title="{self.group}",{self.name}\n{self.url}')
return (f'#EXTINF:-1 tvg-name="{self.name}" tvg-logo="{self.logo}" tvg-id="{self.epg}"{chno}{country} group-title="{self.group}",{self.name}\n{self.url}')
def main():

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long