From d463f4a14b08eb4ad6f8dbcd2526fcf49eee2e35 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Jun 2026 14:59:59 +0000 Subject: [PATCH 1/3] Plan daily Arabic playlist delivery --- __pycache__/make_playlist.cpython-312.pyc | Bin 0 -> 8817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 __pycache__/make_playlist.cpython-312.pyc diff --git a/__pycache__/make_playlist.cpython-312.pyc b/__pycache__/make_playlist.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9580138058d9c376542168d4a1786cbb21a419e4 GIT binary patch literal 8817 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 Date: Fri, 19 Jun 2026 15:00:31 +0000 Subject: [PATCH 2/3] Generate Arabic playlist bundle --- .github/workflows/update_playlist.yml | 58 +++++++++++++++++++++++++++ README.md | 16 ++++++++ make_playlist.py | 18 ++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update_playlist.yml b/.github/workflows/update_playlist.yml index 64ff68b..8a5b06c 100644 --- a/.github/workflows/update_playlist.yml +++ b/.github/workflows/update_playlist.yml @@ -3,6 +3,8 @@ name: Update playlist on: push: branches: [ master ] + schedule: + - cron: "0 0 * * *" workflow_dispatch: jobs: @@ -19,3 +21,59 @@ jobs: git add . git diff --staged --quiet || git commit --quiet -m "Update Playlist (GitHub Actions)" git diff --quiet HEAD @{u} || git push -f origin HEAD + - name: Email Arabic playlist links + if: ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && secrets.SMTP_HOST != '' && secrets.SMTP_USERNAME != '' && secrets.SMTP_PASSWORD != '' && secrets.RECIPIENT_EMAIL != '' }} + env: + RECIPIENT_EMAIL: ${{ secrets.RECIPIENT_EMAIL }} + SMTP_FROM: ${{ secrets.SMTP_FROM }} + SMTP_HOST: ${{ secrets.SMTP_HOST }} + SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }} + SMTP_PORT: ${{ secrets.SMTP_PORT }} + SMTP_USERNAME: ${{ secrets.SMTP_USERNAME }} + run: | + python3 - <<'PY' + import os + import smtplib + from email.message import EmailMessage + + repository = os.environ["GITHUB_REPOSITORY"] + branch = os.environ.get("GITHUB_REF_NAME", "master") + raw_base = f"https://raw.githubusercontent.com/{repository}/{branch}/playlists" + links = [ + ("Arabic bundle", f"{raw_base}/playlist_arabic.m3u8"), + ("Arabic news", f"{raw_base}/playlist_zz_news_ar.m3u8"), + ("Arabic documentaries", f"{raw_base}/playlist_zz_documentaries_ar.m3u8"), + ("Egypt", f"{raw_base}/playlist_egypt.m3u8"), + ("Iraq", f"{raw_base}/playlist_iraq.m3u8"), + ("Qatar", f"{raw_base}/playlist_qatar.m3u8"), + ("Saudi Arabia", f"{raw_base}/playlist_saudi_arabia.m3u8"), + ("United Arab Emirates", f"{raw_base}/playlist_united_arab_emirates.m3u8"), + ] + + message = EmailMessage() + message["Subject"] = "Daily Arabic IPTV playlists" + message["From"] = os.environ.get("SMTP_FROM") or os.environ["SMTP_USERNAME"] + message["To"] = os.environ["RECIPIENT_EMAIL"] + message.set_content( + "Latest curated Arabic playlists from this repository:\n\n" + + "\n".join(f"- {name}: {url}" for name, url in links) + ) + + host = os.environ["SMTP_HOST"] + port = int(os.environ.get("SMTP_PORT") or "587") + username = os.environ["SMTP_USERNAME"] + password = os.environ["SMTP_PASSWORD"] + + if port == 465: + smtp = smtplib.SMTP_SSL(host, port) + else: + smtp = smtplib.SMTP(host, port) + + with smtp: + smtp.ehlo() + if port != 465: + smtp.starttls() + smtp.ehlo() + smtp.login(username, password) + smtp.send_message(message) + PY diff --git a/README.md b/README.md index b78970c..29119b4 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,22 @@ Or free on the Internet: To use it point your IPTV player to https://raw.githubusercontent.com/Free-TV/IPTV/master/playlist.m3u8. +Arabic playlists +================ + +The repository also generates a dedicated Arabic bundle under `playlists/playlist_arabic.m3u8`, alongside the existing country and category playlists. + +- Combined Arabic bundle: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_arabic.m3u8 +- Arabic news: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_zz_news_ar.m3u8 +- Arabic documentaries: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_zz_documentaries_ar.m3u8 +- Egypt: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_egypt.m3u8 +- Iraq: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_iraq.m3u8 +- Qatar: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_qatar.m3u8 +- Saudi Arabia: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_saudi_arabia.m3u8 +- United Arab Emirates: https://raw.githubusercontent.com/ibrahimalayah-Glooko/IPTV/master/playlists/playlist_united_arab_emirates.m3u8 + +`.github/workflows/update_playlist.yml` refreshes these playlists every 24 hours. If you want the workflow to email the links daily, add the repository secrets `SMTP_HOST`, `SMTP_PORT`, `SMTP_USERNAME`, `SMTP_PASSWORD`, and `RECIPIENT_EMAIL` (optional: `SMTP_FROM`). + Philosophy ========== diff --git a/make_playlist.py b/make_playlist.py index 143655c..bfec009 100755 --- a/make_playlist.py +++ b/make_playlist.py @@ -90,6 +90,16 @@ COUNTRY_CODES = { "venezuela": "VE", } +ARABIC_PLAYLIST_KEYS = { + "egypt", + "iraq", + "qatar", + "saudi_arabia", + "united_arab_emirates", + "zz_documentaries_ar", + "zz_news_ar", +} + class Channel: def __init__(self, group, md_line, country_code=""): @@ -132,15 +142,19 @@ def main(): 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' + arabic_playlist_path = os.path.join(dir_playlists, "playlist_arabic.m3u8") - with open(os.path.join(base_dir, "playlist.m3u8"), "w", encoding='utf-8') as playlist: + with open(os.path.join(base_dir, "playlist.m3u8"), "w", encoding='utf-8') as playlist, \ + open(arabic_playlist_path, "w", encoding='utf-8') as arabic_playlist: playlist.write(head_playlist) + arabic_playlist.write(head_playlist) for filename in sorted(os.listdir(lists_dir)): if filename == "README.md" or not filename.endswith(".md"): continue markup_path = os.path.join(lists_dir, filename) country_path = os.path.join(dir_playlists, "playlist_" + filename[:-3] + ".m3u8") country_key = filename[:-3] + include_in_arabic_playlist = country_key in ARABIC_PLAYLIST_KEYS group = country_key.replace("_", " ").title() country_code = COUNTRY_CODES.get(country_key, "") print(f"Generating {group}") @@ -156,6 +170,8 @@ def main(): m3u_line = channel.to_m3u_line() print(m3u_line, file=playlist) print(m3u_line, file=playlist_country) + if include_in_arabic_playlist: + print(m3u_line, file=arabic_playlist) if __name__ == "__main__": main() From 129df36b2cd38f2f53111bb9aa7fc1352a22af56 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Jun 2026 15:00:46 +0000 Subject: [PATCH 3/3] Add generated Arabic playlist artifact --- __pycache__/make_playlist.cpython-312.pyc | Bin 8817 -> 0 bytes playlists/playlist_arabic.m3u8 | 175 ++++++++++++++++++++++ 2 files changed, 175 insertions(+) delete mode 100644 __pycache__/make_playlist.cpython-312.pyc create mode 100644 playlists/playlist_arabic.m3u8 diff --git a/__pycache__/make_playlist.cpython-312.pyc b/__pycache__/make_playlist.cpython-312.pyc deleted file mode 100644 index 9580138058d9c376542168d4a1786cbb21a419e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8817 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