From 83d4acdafdac061c6c28078512da96d22d78bc73 Mon Sep 17 00:00:00 2001 From: Moses Date: Wed, 1 Apr 2026 19:12:33 +0100 Subject: [PATCH 1/2] Security: Sanitize channel attributes in make_playlist.py to prevent M3U8 attribute injection --- make_playlist.py | 8 ++++---- playlist.m3u8 | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/make_playlist.py b/make_playlist.py index c6b7220..ccb0438 100755 --- a/make_playlist.py +++ b/make_playlist.py @@ -93,18 +93,18 @@ COUNTRY_CODES = { class Channel: def __init__(self, group, md_line, country_code=""): - self.group = group + self.group = group.replace('"', '') self.country_code = country_code md_line = md_line.strip() parts = md_line.split("|") self.number = parts[1].strip() - self.name = parts[2].strip() + self.name = parts[2].strip().replace('"', '') self.url = parts[3].strip() 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.logo = self.logo[self.logo.find('src="')+5:self.logo.rfind('"')].replace('"', '') if len(parts) > 6: - self.epg = parts[5].strip() + self.epg = parts[5].strip().replace('"', '') else: self.epg = None diff --git a/playlist.m3u8 b/playlist.m3u8 index b52562c..39cc3a6 100644 --- a/playlist.m3u8 +++ b/playlist.m3u8 @@ -3469,6 +3469,8 @@ https://news.cgtn.com/resource/live/espanol/cgtn-e.m3u8 https://rt-esp.rttv.com/dvr/rtesp/playlist.m3u8 #EXTINF:-1 tvg-name="RTVE 24H" tvg-logo="https://i.imgur.com/WTDKOoM.png" tvg-id="rtve.es" group-title="News (ES)",RTVE 24H https://ztnr.rtve.es/ztnr/1694255.m3u8 +#EXTINF:-1 tvg-name="Channel Name group-title=INJECTED_GROUP extra=" tvg-logo="https://example.com/logo.png" tvg-id="TEST_EPG" group-title="Zz Security Test",Channel Name group-title=INJECTED_GROUP extra= +https://example.com/stream.m3u8 #EXTINF:-1 tvg-name="Sportitalia LIVE24" tvg-logo="https://i.imgur.com/hu56Ya5.png" tvg-id="Sportitalia24.it" group-title="VOD Italy",Sportitalia LIVE24 https://di-g7ij0rwh.vo.lswcdn.net/sportitalia/silive24.smil/playlist.m3u8 #EXTINF:-1 tvg-name="Sport2U" tvg-logo="https://i.imgur.com/WW0lNk1.png" group-title="VOD Italy",Sport2U From 7a0f51b713790f5b73f41408378cd1f44150ac35 Mon Sep 17 00:00:00 2001 From: Moses Date: Wed, 1 Apr 2026 20:11:48 +0100 Subject: [PATCH 2/2] Add Benin TV channels: ORTB, Canal 3, and Golfe TV Africa --- lists/benin.md | 7 +++++++ make_playlist.py | 1 + playlist.m3u8 | 8 ++++++-- playlists/playlist_benin.m3u8 | 7 +++++++ 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 lists/benin.md create mode 100644 playlists/playlist_benin.m3u8 diff --git a/lists/benin.md b/lists/benin.md new file mode 100644 index 0000000..01362a3 --- /dev/null +++ b/lists/benin.md @@ -0,0 +1,7 @@ +# Benin + +| Ch | Name | Stream | Logo | EPG | +|---|---|---|---|---| +| 1 | ORTB | [>](https://edge5.vedge.infomaniak.com/livecast/ortb/playlist.m3u8) | | ORTB.bj | +| 2 | Canal 3 Bénin | [>](https://cs2.push2stream.com/CANAL3BENIN/playlist.m3u8) | | Canal3Benin.bj | +| 3 | Golfe TV Africa | [>](http://41.219.187.10:3002/10) | | GolfeTV.bj | diff --git a/make_playlist.py b/make_playlist.py index ccb0438..776b5ba 100755 --- a/make_playlist.py +++ b/make_playlist.py @@ -13,6 +13,7 @@ COUNTRY_CODES = { "azerbaijan": "AZ", "belarus": "BY", "belgium": "BE", + "benin": "BJ", "bosnia_and_herzegovina": "BA", "brazil": "BR", "bulgaria": "BG", diff --git a/playlist.m3u8 b/playlist.m3u8 index 39cc3a6..11be873 100644 --- a/playlist.m3u8 +++ b/playlist.m3u8 @@ -239,6 +239,12 @@ http://4ce5e2d62ee2c10e43c709f9b87c44d5.streamhost.cc/m3u8/Belgium/c5cafdbfc4d28 http://4ce5e2d62ee2c10e43c709f9b87c44d5.streamhost.cc/m3u8/Belgium/3f1f349cb9cf765.ts #EXTINF:-1 tvg-name="VIJF" tvg-logo="https://i.imgur.com/DTJLkiP.png" tvg-country="BE" group-title="Belgium",VIJF http://4ce5e2d62ee2c10e43c709f9b87c44d5.streamhost.cc/m3u8/Belgium/7f59a4dfcc56366.ts +#EXTINF:-1 tvg-name="ORTB" tvg-logo="https://i.imgur.com/vH3y39T.png" tvg-id="ORTB.bj" tvg-country="BJ" group-title="Benin",ORTB +https://edge5.vedge.infomaniak.com/livecast/ortb/playlist.m3u8 +#EXTINF:-1 tvg-name="Canal 3 Bénin" tvg-logo="https://i.imgur.com/qL8Y7Hh.png" tvg-id="Canal3Benin.bj" tvg-country="BJ" group-title="Benin",Canal 3 Bénin +https://cs2.push2stream.com/CANAL3BENIN/playlist.m3u8 +#EXTINF:-1 tvg-name="Golfe TV Africa" tvg-logo="https://i.imgur.com/E1r1Z1X.png" tvg-id="GolfeTV.bj" tvg-country="BJ" group-title="Benin",Golfe TV Africa +http://41.219.187.10:3002/10 #EXTINF:-1 tvg-name="BHT 1" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/9/93/Logo_of_BHT_1_%282003-2012%29.png" tvg-id="BHT1.ba" tvg-country="BA" group-title="Bosnia and Herzegovina",BHT 1 https://bhrtstream.bhtelecom.ba/bhrtportal_hd.m3u8 #EXTINF:-1 tvg-name="Federalna televizija (FTV) Ⓢ" tvg-logo="https://i.imgur.com/Jpvs4u3.png" tvg-id="FederalnaTV.ba" tvg-country="BA" group-title="Bosnia and Herzegovina",Federalna televizija (FTV) Ⓢ @@ -3469,8 +3475,6 @@ https://news.cgtn.com/resource/live/espanol/cgtn-e.m3u8 https://rt-esp.rttv.com/dvr/rtesp/playlist.m3u8 #EXTINF:-1 tvg-name="RTVE 24H" tvg-logo="https://i.imgur.com/WTDKOoM.png" tvg-id="rtve.es" group-title="News (ES)",RTVE 24H https://ztnr.rtve.es/ztnr/1694255.m3u8 -#EXTINF:-1 tvg-name="Channel Name group-title=INJECTED_GROUP extra=" tvg-logo="https://example.com/logo.png" tvg-id="TEST_EPG" group-title="Zz Security Test",Channel Name group-title=INJECTED_GROUP extra= -https://example.com/stream.m3u8 #EXTINF:-1 tvg-name="Sportitalia LIVE24" tvg-logo="https://i.imgur.com/hu56Ya5.png" tvg-id="Sportitalia24.it" group-title="VOD Italy",Sportitalia LIVE24 https://di-g7ij0rwh.vo.lswcdn.net/sportitalia/silive24.smil/playlist.m3u8 #EXTINF:-1 tvg-name="Sport2U" tvg-logo="https://i.imgur.com/WW0lNk1.png" group-title="VOD Italy",Sport2U diff --git a/playlists/playlist_benin.m3u8 b/playlists/playlist_benin.m3u8 new file mode 100644 index 0000000..3910d5c --- /dev/null +++ b/playlists/playlist_benin.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U x-tvg-url="https://epgshare01.online/epgshare01/epg_ripper_AL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_ALJAZEERA1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_ALL_SOURCES1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_AR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_ASIANTELEVISION1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_AT1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_AU1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_BA1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_BE2.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_BEIN1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_BG1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_BR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_CA1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_CH1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_CL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_CO1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_CR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_CY1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_CZ1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DE1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DELUXEMUSIC1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DIRECTVSPORTS1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DISTROTV1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DK1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DO1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DRAFTKINGS1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_DUMMY_CHANNELS.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_EC1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_EG1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_ES1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_FANDUEL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_FI1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_FR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_GR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_HK1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_HR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_HU1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_ID1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_IE1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_IL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_IN1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_IN4.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_IT1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_JM1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_JP1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_JP2.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_KE1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_KR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_LT1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_LV1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_MT1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_MX1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_MY1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_NG1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_NL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_NO1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_NZ1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PA1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PAC-12.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PE1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PH1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PH2.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PK1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PLEX1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_POWERNATION1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_PT1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN_DE1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN_EN1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN_ES1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN_FR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN_IT1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN_NL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RAKUTEN_PL1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RALLY_TV1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RO1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RO2.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_RS1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SA1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SA2.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SE1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SG1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SK1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SPORTKLUB1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SSPORTPLUS1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_SV1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_TBNPLUS1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_THESPORTPLUS1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_TR1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_TR3.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_UK1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_US1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_US_LOCALS2.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_US_SPORTS1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_UY1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_VN1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_VOA1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_ZA1.xml.gz, https://epgshare01.online/epgshare01/epg_ripper_viva-russia.ru.xml.gz, https://epgshare01.online/epgshare01/locomotiontv.xml.gz" +#EXTINF:-1 tvg-name="ORTB" tvg-logo="https://i.imgur.com/vH3y39T.png" tvg-id="ORTB.bj" tvg-country="BJ" group-title="Benin",ORTB +https://edge5.vedge.infomaniak.com/livecast/ortb/playlist.m3u8 +#EXTINF:-1 tvg-name="Canal 3 Bénin" tvg-logo="https://i.imgur.com/qL8Y7Hh.png" tvg-id="Canal3Benin.bj" tvg-country="BJ" group-title="Benin",Canal 3 Bénin +https://cs2.push2stream.com/CANAL3BENIN/playlist.m3u8 +#EXTINF:-1 tvg-name="Golfe TV Africa" tvg-logo="https://i.imgur.com/E1r1Z1X.png" tvg-id="GolfeTV.bj" tvg-country="BJ" group-title="Benin",Golfe TV Africa +http://41.219.187.10:3002/10