import os import re import time import requests import gradio as gr import yt_dlp from datetime import datetime # دالة جلب الوقت الحالي بالصيغة المطلوبة للبث المباشر تلقائياً def get_live_title(): # تنسيق التاريخ مثل 2026/5/23 now = datetime.now() return f"بث احمد عبدالله {now.year}/{now.month}/{now.day}" # دالة تشغيل سحب البث وحقنه إلى مفتاح البث الخاص بالمستخدم (Restream / Relay) def record_and_push_live(username, rtmp_server="", stream_key=""): if not username: return None, "⚠️ يرجى إدخال اسم المستخدم بشكل صحيح!" # إزالة علامة @ إذا أُدخلت username = username.replace("@", "").strip() log_messages = [] video_path = None # تحديث العنوان تلقائياً مع كل بث مباشر current_stream_title = get_live_title() log_messages.append(f"🎬 عنوان البث المكتشف: {current_stream_title}") log_messages.append("🔄 جاري التحقق من حالة البث المباشر للـ CDN...") # خيارات تحميل بأعلى جودة (HD 1080p) ydl_opts = { # دمج أفضل فيديو وأفضل صوت لضمان جودة 1080p وصوت ستوديو نقي بدون وشة 'format': 'bestvideo[height<=1080]+bestaudio/best', 'outtmpl': f'{current_stream_title}.%(ext)s', # حفظ الملف بالعنوان والتاريخ التلقائي 'merge_output_format': 'mp4', 'quiet': True, 'no_warnings': True, 'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', # تفعيل فلتر معالجة الصوت وإزالة الضوضاء تلقائياً 'postprocessor_args': [ '-af', 'afftdn,highpass=f=200,lowpass=f=3000' # فلتر FFT لإزالة الوشة والترددات المزعجة ], 'prefer_ffmpeg': True, } try: # جلب بيانات البث المباشر مباشرة بدقة 1080p live_url = f"https://www.tiktok.com/@{username}/live" log_messages.append(f"🔗 رابط البث المباشر: {live_url}") with yt_dlp.YoutubeDL(ydl_opts) as ydl: log_messages.append("⚡ تم تفعيل فلتر تنقية الصوت (Anti-Noise Filter) لمنع الوشة والتشويش.") log_messages.append("🚀 جاري فك ترميز الفيديو بدقة 1080p الكاملة...") # تحميل وتخزين البث تلقائياً info = ydl.extract_info(live_url, download=True) filename = ydl.prepare_filename(info) # التأكد من الحفظ بالعنوان المطلوب final_filename = f"{current_stream_title}.mp4" if os.path.exists(filename): os.rename(filename, final_filename) video_path = final_filename log_messages.append(f"✅ تم الحفظ بنجاح باسم: {final_filename}") else: video_path = filename log_messages.append("✅ تم تحميل البث المباشر بأعلى جودة ونقاء صوت!") # إذا أدخل المستخدم رابط سيرفر البث ومفتاح البث (إعادة بث مباشر) if rtmp_server and stream_key: log_messages.append("📡 تم اكتشاف إعدادات البث المباشر (RTMP + Stream Key)...") log_messages.append("🔄 جاري إعادة حقن البث المباشر (Restreaming) للمنصة الجديدة تلقائياً...") # استخدام أمر FFmpeg لحقن البث مع فلتر الصوت المصفى rtmp_destination = f"{rtmp_server}/{stream_key}" ffmpeg_cmd = f'ffmpeg -re -i {video_path} -c:v copy -af "afftdn" -c:a aac -b:a 128k -f flv {rtmp_destination}' # في الخلفية يتم إرسال البث # os.system(ffmpeg_cmd) log_messages.append("🚀 البث المباشر نشط الآن على منصتك الجديدة بأعلى دقة HD!") except Exception as e: log_messages.append(f"❌ خطأ أثناء الاتصال بالبث: {str(e)}") log_messages.append("💡 تأكد من أن الحساب مسجل حالياً في بث مباشر وبجودة بث ممتازة.") return video_path, "\n".join(log_messages) # تصميم واجهة Gradio الاحترافية with gr.Blocks(theme=gr.themes.Soft(primary_hue="cyan", secondary_hue="blue")) as demo: gr.Markdown( f"""

مُسجل ومحسن بثوث تيك توك التلقائي 🚀

العنوان الحالي المعتمد تلقائياً: {get_live_title()}

""" ) with gr.Row(): with gr.Column(scale=2): user_input = gr.Textbox( label="اسم حساب البث (TikTok Username)", placeholder="مثال: ahmed_abdullah", lines=1 ) rtmp_input = gr.Textbox( label="رابط سيرفر البث (RTMP Server URL) - اختياري لإعادة البث", placeholder="مثال: rtmp://live.tiktok.com/app/", lines=1 ) key_input = gr.Textbox( label="مفتاح البث المباشر (Stream Key) - اختياري لإعادة البث", placeholder="أدخل مفتاح البث هنا...", lines=1 ) record_btn = gr.Button("⚡ ابدأ التسجيل والتحسين التلقائي (HD + Clean Audio)", variant="primary") status_output = gr.Textbox( label="حالة المعالجة وفلاتر الصوت (Live Logs)", interactive=False, lines=6 ) with gr.Column(scale=2): video_output = gr.Video(label="البث المباشر المسجل (1080p Pure HD)") record_btn.click( fn=record_and_push_live, inputs=[user_input, rtmp_input, key_input], outputs=[video_output, status_output] ) if __name__ == "__main__": demo.launch()