mirror of https://github.com/Free-TV/IPTV
Generate Arabic playlist bundle
parent
d463f4a14b
commit
b97e2083ce
|
|
@ -3,6 +3,8 @@ name: Update playlist
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
@ -19,3 +21,59 @@ jobs:
|
||||||
git add .
|
git add .
|
||||||
git diff --staged --quiet || git commit --quiet -m "Update Playlist (GitHub Actions)"
|
git diff --staged --quiet || git commit --quiet -m "Update Playlist (GitHub Actions)"
|
||||||
git diff --quiet HEAD @{u} || git push -f origin HEAD
|
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
|
||||||
|
|
|
||||||
16
README.md
16
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.
|
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
|
Philosophy
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,16 @@ COUNTRY_CODES = {
|
||||||
"venezuela": "VE",
|
"venezuela": "VE",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ARABIC_PLAYLIST_KEYS = {
|
||||||
|
"egypt",
|
||||||
|
"iraq",
|
||||||
|
"qatar",
|
||||||
|
"saudi_arabia",
|
||||||
|
"united_arab_emirates",
|
||||||
|
"zz_documentaries_ar",
|
||||||
|
"zz_news_ar",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Channel:
|
class Channel:
|
||||||
def __init__(self, group, md_line, country_code=""):
|
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()]
|
epg_urls = [line.strip() for line in epg_file if line.strip()]
|
||||||
processed_epg_list = ", ".join(epg_urls)
|
processed_epg_list = ", ".join(epg_urls)
|
||||||
head_playlist = f'#EXTM3U x-tvg-url="{processed_epg_list}"\n'
|
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)
|
playlist.write(head_playlist)
|
||||||
|
arabic_playlist.write(head_playlist)
|
||||||
for filename in sorted(os.listdir(lists_dir)):
|
for filename in sorted(os.listdir(lists_dir)):
|
||||||
if filename == "README.md" or not filename.endswith(".md"):
|
if filename == "README.md" or not filename.endswith(".md"):
|
||||||
continue
|
continue
|
||||||
markup_path = os.path.join(lists_dir, filename)
|
markup_path = os.path.join(lists_dir, filename)
|
||||||
country_path = os.path.join(dir_playlists, "playlist_" + filename[:-3] + ".m3u8")
|
country_path = os.path.join(dir_playlists, "playlist_" + filename[:-3] + ".m3u8")
|
||||||
country_key = filename[:-3]
|
country_key = filename[:-3]
|
||||||
|
include_in_arabic_playlist = country_key in ARABIC_PLAYLIST_KEYS
|
||||||
group = country_key.replace("_", " ").title()
|
group = country_key.replace("_", " ").title()
|
||||||
country_code = COUNTRY_CODES.get(country_key, "")
|
country_code = COUNTRY_CODES.get(country_key, "")
|
||||||
print(f"Generating {group}")
|
print(f"Generating {group}")
|
||||||
|
|
@ -156,6 +170,8 @@ def main():
|
||||||
m3u_line = channel.to_m3u_line()
|
m3u_line = channel.to_m3u_line()
|
||||||
print(m3u_line, file=playlist)
|
print(m3u_line, file=playlist)
|
||||||
print(m3u_line, file=playlist_country)
|
print(m3u_line, file=playlist_country)
|
||||||
|
if include_in_arabic_playlist:
|
||||||
|
print(m3u_line, file=arabic_playlist)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue