File size: 4,992 Bytes
69b885f 4cb4020 6f15580 ba8996d 6f15580 09d1e4c ba8996d 5595d22 ba8996d 22d9057 5595d22 ba8996d 5595d22 ba8996d 5595d22 ba8996d 5595d22 ba8996d 5595d22 ba8996d 5595d22 ba8996d 5595d22 ba8996d 10f6ba8 ba8996d 0d3ebe0 ba8996d 10f6ba8 ba8996d 5595d22 ba8996d 5595d22 ba8996d 5595d22 ba8996d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | import streamlit as st
import asyncio
import subprocess
import threading
import time
from datetime import datetime
from TikTokLive import TikTokLiveClient
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# โ๏ธ ุงูุฅุนุฏุงุฏุงุช
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
BROADCASTERS = [
{
"tiktok": "@dharialshammarii0",
"stream_key": "p0ep-37wz-q3yg-7twf-3acb",
},
# ุฃุถู ุงูู
ุฒูุฏ ุจููุณ ุงูุชูุณูู
]
YT_RTMP_BASE = "rtmp://a.rtmp.youtube.com/live2/"
POLL_INTERVAL = 60 # ุซุงููุฉ ุจูู ูู ูุญุต
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐ ุฏูุงู ุงูุจุซ ุงูุฌุฏูุฏุฉ (ุจุฏูู streamlink)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
def stream_broadcaster(tiktok_username, stream_key):
"""
ุชุณุชุฎุฏู
yt-dlp ูุงุณุชุฎุฑุงุฌ ุงูุจุซุ ูุชู
ุฑูุฑู ุฅูู ffmpeg ูููุณุฎ ุงูู
ุจุงุดุฑ ุฅูู ููุชููุจ.
"""
# ุฑุงุจุท ููุงุฉ TikTok
url = f"https://www.tiktok.com/{tiktok_username}/live"
# ุฃู
ุฑ yt-dlp: ุงุณุชุฎุฑุงุฌ ุฃูุถู ุฌูุฏุฉ ูุฅุฎุฑุงุฌูุง ุฅูู stdout
yt_dlp_cmd = f'yt-dlp -f best -o - "{url}"'
# ุฃู
ุฑ ffmpeg: ุงุณุชูุจุงู ุงูุฏูู ู
ู stdin ููุณุฎู ู
ุจุงุดุฑุฉ ูู RTMP
ffmpeg_cmd = (
f"ffmpeg -hide_banner -loglevel error "
f"-re -i pipe:0 "
f"-c:v copy -c:a copy "
f"-f flv {YT_RTMP_BASE}{stream_key}"
)
# ุฏู
ุฌ ุงูุฃู
ุฑูู ูู ุณุทุฑ ูุงุญุฏ
full_cmd = f"{yt_dlp_cmd} | {ffmpeg_cmd}"
print(f"๐ด ุจุฏุก ุจุซ {tiktok_username} ุนุจุฑ yt-dlp...")
try:
proc = subprocess.Popen(full_cmd, shell=True)
proc.wait()
print(f"โน๏ธ ุงูุชูู ุจุซ {tiktok_username}")
except Exception as e:
print(f"โ ุฎุทุฃ ุฃุซูุงุก ุจุซ {tiktok_username}: {e}")
def monitor_and_stream():
"""ุงูู
ุฑุงูุจุฉ ุงูู
ุณุชู
ุฑุฉ ูุชุดุบูู ุงูุจุซ ุนูุฏ ุงูุญุงุฌุฉ"""
active_threads = {}
while True:
for broadcaster in BROADCASTERS:
tiktok = broadcaster["tiktok"]
key = broadcaster["stream_key"]
try:
client = TikTokLiveClient(unique_id=tiktok)
is_live = asyncio.run(client.is_live())
except Exception as e:
print(f"โ ๏ธ ุชุนุฐุฑ ูุญุต {tiktok}: {e}")
continue
if is_live and tiktok not in active_threads:
t = threading.Thread(
target=stream_broadcaster,
args=(tiktok, key),
daemon=True,
)
t.start()
active_threads[tiktok] = t
elif not is_live and tiktok in active_threads:
del active_threads[tiktok]
time.sleep(POLL_INTERVAL)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐ฌ ุจุฏุก ุงูู
ุฑุงูุจุฉ ูู ุงูุฎูููุฉ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
if "monitor_started" not in st.session_state:
monitor_thread = threading.Thread(
target=monitor_and_stream,
name="TikTokMonitor",
daemon=True,
)
monitor_thread.start()
st.session_state.monitor_started = True
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ๐จ ูุงุฌูุฉ ุงูู
ุณุชุฎุฏู
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
st.set_page_config(page_title="TikTok 2 YouTube", page_icon="๐ด")
st.title("๐ด ูุธุงู
ุงูุจุซ ุงูุชููุงุฆู (ุงูุญู ุงูููุงุฆู)")
st.markdown("### ุงูุญุณุงุจุงุช ุงูู
ุฑุงูุจุฉ:")
for b in BROADCASTERS:
st.write(f"- {b['tiktok']}")
st.success("ุงููุธุงู
ูุนู
ู ูู ุงูุฎูููุฉ. ูู
ููู ุฅุบูุงู ุงูุตูุญุฉ.")
st.caption(f"ุขุฎุฑ ุชุญุฏูุซ: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") |