#!/usr/bin/python3 import os import re EPG_LIST = open('epglist.txt',"r") # for a clean code class Channel: def __init__(self, group, md_line): self.group = group md_line = md_line.strip() parts = md_line.split("|") self.number = parts[1].strip() self.name = parts[2].strip() 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('"')] if len(parts) > 6: self.epg = parts[5].strip() else: self.epg = None def to_m3u_line(self): if self.epg is None: return (f'#EXTINF:-1 tvg-name="{self.name}" tvg-logo="{self.logo}" 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}" group-title="{self.group}",{self.name}\n{self.url}') def main(): dir_playlists = 'playlists' if not (os.path.isdir(dir_playlists)): os.mkdir(dir_playlists) with open("playlist.m3u8", "w", encoding='utf-8') as playlist: processed_epg_list = ", ".join(EPG_LIST).replace('\n', '') head_playlist = f'#EXTM3U x-tvg-url="{processed_epg_list}"' print(f'#EXTM3U x-tvg-url="{processed_epg_list}"', file=playlist) os.chdir("lists") for filename in sorted(os.listdir(".")): if filename == "README.md" or not filename.endswith(".md"): continue with open(filename, encoding='utf-8') as markup_file: file_country = os.path.join("..", dir_playlists, "playlist_" + filename[:-3:] + ".m3u8") playlist_country = open(file_country, "w", encoding='utf-8') playlist_country.write(head_playlist + "\n") group = filename.replace(".md", "").title() print(f"Generating {group}") for line in markup_file: if "

" in line.lower() and "

" in line.lower(): group = re.sub('<[^<>]+>', '', line.strip()) if not "[>]" in line: continue channel = Channel(group, line) print(channel.to_m3u_line(), file=playlist) print(channel.to_m3u_line(), file=playlist_country) playlist_country.close() if __name__ == "__main__": main()