import os import time import subprocess import threading import requests from datetime import datetime, timedelta from flask import Flask, jsonify # ========================================== # الإعدادات الأساسية # ========================================== STREAM_KEY = os.environ.get("STREAM_KEY") STREAM_URL = "rtmp://a.rtmp.youtube.com/live2/" BG_IMAGE = "https://images.unsplash.com/photo-1555400038-63f5ba517a47?q=80&w=1920&auto=format&fit=crop" TICK_SOUND_FILE = "time.mp3" app = Flask(__name__) def get_current_status(): try: res = requests.get("http://api.aladhan.com/v1/timingsByCity?city=Mecca&country=SA&method=4", timeout=5) data = res.json()['data'] hijri_date = data['date']['hijri'] date_str = hijri_date['date'] h_day = int(hijri_date['day']) h_month = int(hijri_date['month']['number']) h_year = int(hijri_date['year']) status = "" target_date_gregorian = None msg = "" if h_month == 9: status = "ramadan_live" msg = "جاء رمضان.. مبارك عليكم الشهر" elif h_month == 10 and h_day <= 3: status = "eid_live" msg = "عيد مبارك - كل عام وأنتم بخير" else: status = "counting" target_h_year = h_year if h_month < 9 else h_year + 1 conv_res = requests.get(f"http://api.aladhan.com/v1/hToG?date=01-09-{target_h_year}", timeout=5) g_data = conv_res.json()['data']['gregorian'] target_date_gregorian = datetime.strptime(g_data['date'], "%d-%m-%Y") return {"status": status, "msg": msg, "hijri_str": date_str, "target_date": target_date_gregorian} except: return {"status": "counting", "msg": "", "hijri_str": "1447-09-01", "target_date": datetime(2026, 2, 18, 0, 0, 0)} @app.route('/time_data') def time_data(): current_state = get_current_status() if current_state['status'] in ['ramadan_live', 'eid_live']: return jsonify({"status": "finished", "msg": current_state['msg'], "hijri": current_state['hijri_str']}) diff = current_state['target_date'] - datetime.now() if diff.total_seconds() <= 0: return jsonify({"status": "loading", "hijri": current_state['hijri_str']}) days = diff.days hours, rem = divmod(diff.seconds, 3600) minutes, seconds = divmod(rem, 60) return jsonify({"status": "counting", "days": f"{days:02}", "hours": f"{hours:02}", "minutes": f"{minutes:02}", "seconds": f"{seconds:02}", "hijri": current_state['hijri_str']}) @app.route('/') def home(): html_content = """ بث مباشر | رمضان
--/--/----
الوقت المتبقي على شهر رمضان
00
أيام
:
00
ساعة
:
00
دقيقة
:
00
ثانية
...
""" return html_content def start_stream(): if not STREAM_KEY: return while True: current_state = get_current_status() if current_state['status'] == 'ramadan_live': display_text, box_color, title_text, font_size = "Ramadan Mubarak", "0xD4AF37", "RAMADAN KAREEM", "65" elif current_state['status'] == 'eid_live': display_text, box_color, title_text, font_size = "Eid Mubarak", "0x9C27B0", "EID AL-FITR", "90" else: target_ts = int(current_state['target_date'].timestamp()) if current_state['target_date'] else int(time.time()) display_text = f" %{{pts\\:localtime\\:{target_ts}\\:%d}} : %{{pts\\:localtime\\:{target_ts}\\:%H}} : %{{pts\\:localtime\\:{target_ts}\\:%M}} : %{{pts\\:localtime\\:{target_ts}\\:%S}} " box_color, title_text, font_size = "0x4CAF50", "RAMADAN COUNTDOWN", "90" ffmpeg_cmd = [ 'ffmpeg', '-re', '-stream_loop', '-1', '-i', TICK_SOUND_FILE, '-loop', '1', '-i', BG_IMAGE, '-map', '1:v', '-map', '0:a', '-vf', ( "scale=1280:720,setsar=1," "drawbox=y=ih/2-80:color=black@0.6:width=iw:height=200:t=fill," "drawtext=text='17-08-1447':x=50:y=50:fontsize=30:fontcolor=white:box=1:boxcolor=0x4CAF50@0.8," "drawtext=text='RAMADAN COUNTDOWN':x=(w-text_w)/2:y=230:fontsize=40:fontcolor=white," "drawtext=text=' %{pts\\:localtime\\:1771372800\\:%d} \\: %{pts\\:localtime\\:1771372800\\:%H} \\: %{pts\\:localtime\\:1771372800\\:%M} \\: %{pts\\:localtime\\:1771372800\\:%S} ':x=(w-text_w)/2:y=(h-text_h)/2+50:fontsize=90:fontcolor=white:box=1:boxcolor=0x4CAF50@1:boxborderw=25" ), '-vcodec', 'libx264', '-preset', 'veryfast', '-b:v', '3000k', '-maxrate', '3000k', '-bufsize', '6000k', '-pix_fmt', 'yuv420p', '-g', '60', '-c:a', 'aac', '-b:a', '128k', '-f', 'flv', f"{STREAM_URL}{STREAM_KEY}" ] try: subprocess.run(ffmpeg_cmd, check=True) except: time.sleep(5) if __name__ == "__main__": threading.Thread(target=lambda: app.run(host='0.0.0.0', port=7860, debug=False, use_reloader=False), daemon=True).start() start_stream()