Download streamlit_app.py from Reooiq/te2t: direct link, hf CLI and curl.
- Browser
- Download file 6.79 kB
-
https://huggingface.co/spaces/Reooiq/te2t/resolve/main/streamlit_app.py
- Command line
-
hf download hf://spaces/Reooiq/te2t/streamlit_app.py
-
curl -L -o streamlit_app.py https://huggingface.co/spaces/Reooiq/te2t/resolve/main/streamlit_app.py
6.79 kB
| 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""" | |
| <div style="text-align: center; margin-bottom: 20px;"> | |
| <h1 style="color: #00d2ff; font-size: 34px; font-weight: 900; direction: rtl;">مُسجل ومحسن بثوث تيك توك التلقائي 🚀</h1> | |
| <p style="font-size: 16px; color: #aaa; direction: rtl;">العنوان الحالي المعتمد تلقائياً: <b>{get_live_title()}</b></p> | |
| </div> | |
| """ | |
| ) | |
| 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() | |