import streamlit as st import asyncio import os import time import subprocess import threading from datetime import datetime from TikTokLive import TikTokLiveClient # ══════════════════════════════════════════════════════════════════════════════ # ⚙️ الإعدادات الثابتة (تعدل مرة واحدة فقط) # ══════════════════════════════════════════════════════════════════════════════ TIKTOK_USERNAME = "@ah_md107" # الحساب المراد رصده YOUTUBE_STREAM_KEY = "qf5b-15f0-fks9-kwvb-d1q5" # مفتاح بث يوتيوب POLL_INTERVAL = 60 # فحص كل دقيقة YT_RTMP_URL = f"rtmp://a.rtmp.youtube.com/live2/{YOUTUBE_STREAM_KEY}" # ══════════════════════════════════════════════════════════════════════════════ # 🚀 محرك العمل في الخلفية (Background Engine) # ══════════════════════════════════════════════════════════════════════════════ def run_monitor(): """هذه الدالة هي التي تظل تعمل حتى لو أغلقت الصفحة""" print("✅ بدأ محرك المراقبة التلقائي 24/7...") while True: try: # فحص حالة البث client = TikTokLiveClient(unique_id=TIKTOK_USERNAME) is_live = asyncio.run(client.is_live()) if is_live: print(f"[{datetime.now().strftime('%H:%M')}] 🔴 البث بدأ! جاري النقل إلى يوتيوب...") # أمر النقل المباشر - محسّن للصوت cmd = ( f"streamlink https://www.tiktok.com/{TIKTOK_USERNAME}/live best --hls-live-edge 3 --stdout | " f"ffmpeg -thread_queue_size 8192 -i pipe:0 " f"-c:v copy " f"-c:a aac -ar 48000 -b:a 192k -ac 2 " f"-af 'highpass=f=200,lowpass=f=3000,aresample=async=1' " f"-buffer_size 1024k " f"-fflags +genpts+igndts " f"-max_interleave_delta 0 " f"-f flv {YT_RTMP_URL}" ) process = subprocess.Popen(cmd, shell=True) process.wait() # سينتظر هنا حتى ينتهي البث فعلياً print("⏹️ انتهى البث، العودة لوضع المراقبة...") else: #print(f"🔍 فحص: {TIKTOK_USERNAME} غير متصل حالياً.") pass except Exception as e: print(f"⚠️ تنبيه: {e}") time.sleep(POLL_INTERVAL) # تشغيل الخيط الخلفي فور تشغيل التطبيق (مرة واحدة فقط) if "background_started" not in st.session_state: # البحث عن أي خيط يعمل مسبقاً لمنع التكرار for thread in threading.enumerate(): if thread.name == "TikTokMonitorThread": st.session_state.background_started = True break else: # إذا لم يكن هناك خيط، نبدأ واحد جديد monitor_thread = threading.Thread(target=run_monitor, name="TikTokMonitorThread", daemon=True) monitor_thread.start() st.session_state.background_started = True # ══════════════════════════════════════════════════════════════════════════════ # 🎨 واجهة المستخدم (للمتابعة فقط) # ══════════════════════════════════════════════════════════════════════════════ st.set_page_config(page_title="AutoStreamer 24/7", page_icon="🔴") # تنسيق الشكل st.markdown(""" """, unsafe_allow_html=True) st.title("🔴 نظام البث التلقائي المستمر") st.markdown(f"""
يتم مراقبة الحساب: {TIKTOK_USERNAME}
النظام يعمل في خلفية السيرفر الآن