From 8a67a85d1a1d4aace09ccefba93189a9885ff43d Mon Sep 17 00:00:00 2001 From: KAMI Date: Sun, 8 Mar 2026 07:40:47 +0100 Subject: [PATCH] Improve make_playlist.py code quality and fix bugs (#989) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve make_playlist.py code quality and fix bugs - Fix group name bug: replace underscores with spaces before title() so filenames like north_korea.md produce "North Korea" not "North_Korea" - Fix resource leaks: use context managers for all file handles including EPG list and per-country playlist files - Remove os.chdir() global side effect: use absolute paths derived from the script location instead - Avoid calling to_m3u_line() twice per channel by caching the result - Fix redundant trailing colon in filename[:-3:] slice - Consistent use of write() for headers instead of mixing print/write - Strip blank lines from EPG URL list when reading * Skip commit and push when playlist has no changes Prevents the workflow from failing with exit code 1 when the generated playlist is identical to the previous run and there is nothing to commit. * Use current branch instead of hardcoded master for push Replace hardcoded origin/master reference with @{u} (upstream of current branch) for the diff check, and use HEAD for the push target so the workflow works correctly on any branch. --------- Co-authored-by: Kálmán „KAMI” Szalai --- .github/workflows/update_playlist.yml | 4 +-- make_playlist.py | 44 +++++++++++++++------------ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/.github/workflows/update_playlist.yml b/.github/workflows/update_playlist.yml index 0ede514..64ff68b 100644 --- a/.github/workflows/update_playlist.yml +++ b/.github/workflows/update_playlist.yml @@ -17,5 +17,5 @@ jobs: git config user.email "playlistbot@users.noreply.github.com" || true python3 ./make_playlist.py git add . - git commit --quiet -m "Update Playlist (GitHub Actions)" - git push -f origin master + git diff --staged --quiet || git commit --quiet -m "Update Playlist (GitHub Actions)" + git diff --quiet HEAD @{u} || git push -f origin HEAD diff --git a/make_playlist.py b/make_playlist.py index cc70c76..5e01080 100755 --- a/make_playlist.py +++ b/make_playlist.py @@ -3,7 +3,6 @@ import os import re -EPG_LIST = open('epglist.txt',"r") # for a clean code class Channel: def __init__(self, group, md_line): @@ -29,32 +28,39 @@ class Channel: def main(): - dir_playlists = 'playlists' - if not (os.path.isdir(dir_playlists)): + base_dir = os.path.dirname(os.path.abspath(__file__)) + lists_dir = os.path.join(base_dir, "lists") + dir_playlists = os.path.join(base_dir, "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(".")): + + with open(os.path.join(base_dir, "epglist.txt"), encoding='utf-8') as epg_file: + epg_urls = [line.strip() for line in epg_file if line.strip()] + processed_epg_list = ", ".join(epg_urls) + head_playlist = f'#EXTM3U x-tvg-url="{processed_epg_list}"\n' + + with open(os.path.join(base_dir, "playlist.m3u8"), "w", encoding='utf-8') as playlist: + playlist.write(head_playlist) + for filename in sorted(os.listdir(lists_dir)): 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}") + markup_path = os.path.join(lists_dir, filename) + country_path = os.path.join(dir_playlists, "playlist_" + filename[:-3] + ".m3u8") + group = filename[:-3].replace("_", " ").title() + print(f"Generating {group}") + with open(markup_path, encoding='utf-8') as markup_file, \ + open(country_path, "w", encoding='utf-8') as playlist_country: + playlist_country.write(head_playlist) for line in markup_file: if "

" in line.lower() and "

" in line.lower(): group = re.sub('<[^<>]+>', '', line.strip()) - if not "[>]" in line: + 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() + m3u_line = channel.to_m3u_line() + print(m3u_line, file=playlist) + print(m3u_line, file=playlist_country) if __name__ == "__main__": main()