te2t / streamlit_app.py
Reooiq's picture
Update streamlit_app.py
c1fee0f verified
Raw History Blame Contribute Delete
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()