From 4012f4a5ce4718c607b0559a98e90d24b434f4f9 Mon Sep 17 00:00:00 2001 From: levina <82658782+levina-lab@users.noreply.github.com> Date: Mon, 13 Sep 2021 15:16:02 +0700 Subject: [PATCH] improved added channel stream support --- bot/videoplayer.py | 117 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/bot/videoplayer.py b/bot/videoplayer.py index e628421..51a9cab 100644 --- a/bot/videoplayer.py +++ b/bot/videoplayer.py @@ -35,7 +35,7 @@ def raw_converter(dl, song, video): ) async def leave_call(chat_id: int): - process = FFMPEG_PROCESSES.get(chat_id) + process = FFMPEG_PROCESS.get(chat_id) if process: try: process.send_signal(SIGINT) @@ -80,7 +80,7 @@ async def startvideo(client, m: Message): replied = m.reply_to_message if not replied: if len(m.command) < 2: - await m.reply("💡 reply to video or provide youtube/live video url to start video streaming") + await m.reply("💡 **reply to video or provide youtube/live video url to start video streaming**") else: livelink = m.text.split(None, 1)[1] chat_id = m.chat.id @@ -199,3 +199,116 @@ async def stopvideo(client, m: Message): async def handler(client: PyTgCalls, update: Update): chat_id = update.chat.id await call_py.leave_group_call(chat_id) + + +@Client.on_message(command(["cplay", f"cplay@{Veez.BOT_USERNAME}"]) & filters.group & ~filters.edited) +@authorized_users_only +async def chstream(client, m: Message): + replied = m.reply_to_message + if not replied: + if len(m.command) < 2: + await m.reply("💡 **reply to video or provide youtube/live video url to start video streaming**") + else: + livelink = m.text.split(None, 1)[1] + chat_id = CHANNEL + try: + livelink = await asyncio.wait_for( + app.loop.run_in_executor( + None, + lambda : youtube(livelink) + ), + timeout=None + ) + except asyncio.TimeoutError: + await m.reply("TimeoutError: process is taking unexpected time") + return + if not livelink: + await m.reply("failed to get video data") + return + process = raw_converter(livelink, f'audio{chat_id}.raw', f'video{chat_id}.raw') + FFMPEG_PROCESS[chat_id] = process + msg = await m.reply("🔁 **starting video streaming...**") + await asyncio.sleep(10) + try: + audio_file = f'audio{chat_id}.raw' + video_file = f'video{chat_id}.raw' + while not os.path.exists(audio_file) or \ + not os.path.exists(video_file): + await asyncio.sleep(2) + await call_py.join_group_call( + chat_id, + InputAudioStream( + audio_file, + AudioParameters( + bitrate=48000, + ), + ), + InputVideoStream( + video_file, + VideoParameters( + width=854, + height=480, + frame_rate=20, + ), + ), + stream_type=StreamType().local_stream, + ) + await msg.edit("💡 **video streaming channel started !**") + await idle() + except Exception as e: + await msg.edit(f"🚫 **error** - `{e}`") + + elif replied.video or replied.document: + msg = await m.reply("📥 **downloading video...**") + video = await client.download_media(m.reply_to_message) + chat_id = CHANNEL + await msg.edit("🔁 **preparing video...**") + os.system(f"ffmpeg -i '{video}' -f s16le -ac 1 -ar 48000 'audio{chat_id}.raw' -y -f rawvideo -r 20 -pix_fmt yuv420p -vf scale=640:360 'video{chat_id}.raw' -y") + try: + audio_file = f'audio{chat_id}.raw' + video_file = f'video{chat_id}.raw' + while not os.path.exists(audio_file) or \ + not os.path.exists(video_file): + await asyncio.sleep(2) + await call_py.join_group_call( + chat_id, + InputAudioStream( + audio_file, + AudioParameters( + bitrate=48000, + ), + ), + InputVideoStream( + video_file, + VideoParameters( + width=640, + height=360, + frame_rate=20, + ), + ), + stream_type=StreamType().local_stream, + ) + await msg.edit("💡 **video streaming channel started !**") + except Exception as e: + await msg.edit(f"🚫 **error** - `{e}`") + await idle() + else: + await m.reply("💭 **please reply to video or video file to stream**") + + +@Client.on_message(command(["cstop", f"cstop@{Veez.BOT_USERNAME}"]) & filters.group & ~filters.edited) +@authorized_users_only +async def chstopvideo(client, m: Message): + chat_id = CHANNEL + try: + process = FFMPEG_PROCESS.get(chat_id) + if process: + try: + process.send_signal(SIGINT) + await asyncio.sleep(3) + except Exception as e: + print(e) + await call_py.leave_group_call(chat_id) + await m.reply("✅ **video streaming channel ended**") + except Exception as e: + await m.reply(f"🚫 **error** - `{e}`")