moved to py-tgcalls

new video player structure
This commit is contained in:
levina 2021-09-09 10:00:36 +07:00 committed by GitHub
parent 6b61059538
commit b5bd36d9d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,97 +1,112 @@
import os
import re
import pafy
import time
import asyncio
import ffmpeg
from asyncio import sleep
import subprocess
from pytgcalls import idle
from pytgcalls import PyTgCalls
from pytgcalls import StreamType
from pytgcalls.types.input_stream import AudioParameters
from pytgcalls.types.input_stream import InputAudioStream
from pytgcalls.types.input_stream import InputVideoStream
from pytgcalls.types.input_stream import VideoParameters
from pyrogram import Client, filters
from pyrogram.types import Message
from pytgcalls import GroupCallFactory
from youtube_dl import YoutubeDL
from config import API_ID, API_HASH, SESSION_NAME, BOT_USERNAME
from helpers.decorators import authorized_users_only
from helpers.filters import command
ydl_opts = {
"geo-bypass": True,
"nocheckcertificate": True,
}
ydl = YoutubeDL(ydl_opts)
app = Client(SESSION_NAME, API_ID, API_HASH)
call_py = PyTgCalls(app)
FFMPEG_PROCESSES = {}
STREAM = {8}
VIDEO_CALL = {}
app = Client(
SESSION_NAME,
api_id=API_ID,
api_hash=API_HASH,
)
group_call_factory = GroupCallFactory(app, GroupCallFactory.MTPROTO_CLIENT_TYPE.PYROGRAM)
def raw_converter(dl, song, video):
subprocess.Popen(
['ffmpeg', '-i', dl, '-f', 's16le', '-ac', '1', '-ar', '48000', song, '-y', '-f', 'rawvideo', '-r', '20', '-pix_fmt', 'yuv420p', '-vf', 'scale=1280:720', video, '-y'],
stdin=None,
stdout=None,
stderr=None,
cwd=None,
)
@Client.on_message(command(["vstream", f"vstream@{BOT_USERNAME}"]) & filters.group & ~filters.edited)
@authorized_users_only
async def stream(client, m: Message):
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 video url to start video streaming")
await m.reply("💡 reply to video or provide youtube/live video url to start video streaming")
else:
video = m.text.split(None, 1)[1]
youtube_regex = (
r'(https?://)?(www\.)?'
'(youtube|youtu|youtube-nocookie)\.(com|be)/'
'(watch\?v=|embed/|v/|.+\?v=)?([^&=%\?]{11})')
youtube_regex_match = re.match(youtube_regex, video)
if youtube_regex_match:
try:
yt = pafy.new(video)
best = yt.getbest()
video_url = best.url
except Exception as e:
await m.reply(f"🚫 **error** - `{e}`")
return
msg = await m.reply("🔁 **starting video streaming...**")
chat_id = m.chat.id
await asyncio.sleep(1)
try:
group_call = group_call_factory.get_group_call()
await group_call.join(chat_id)
await group_call.start_video(video_url, repeat=False)
VIDEO_CALL[chat_id] = group_call
await msg.edit((f"💡 **started [video streaming]({video_url}) !\n\n» join to video chat on the top to watch streaming."), disable_web_page_preview=True)
except Exception as e:
await msg.edit(f"**Error** -- `{e}`")
else:
msg = await m.reply("🔁 **starting video streaming...**")
chat_id = m.chat.id
await asyncio.sleep(1)
try:
group_call = group_call_factory.get_group_call()
await group_call.join(chat_id)
await group_call.start_video(video, repeat=False)
VIDEO_CALL[chat_id] = group_call
await msg.edit((f"💡 **started [video streaming]({video}) !\n\n» join to video chat on the top to watch streaming."), disable_web_page_preview=True)
except Exception as e:
await msg.edit(f"**🚫 error** - `{e}`")
livelink = m.text.split(None, 1)[1]
chat_id = m.chat.id
process = raw_converter(livelink, f'audio{chat_id}.raw', f'video{chat_id}.raw')
FFMPEG_PROCESSES[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=1280,
height=720,
frame_rate=20,
),
),
stream_type=StreamType().local_stream,
)
await msg.edit("💡 **video streaming started!**\n\n» **join to video chat on the top to watch the video.**")
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 = m.chat.id
await asyncio.sleep(2)
await msg.edit("🔁 **preparing...**")
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:
group_call = group_call_factory.get_group_call()
await group_call.join(chat_id)
await group_call.start_video(video)
VIDEO_CALL[chat_id] = group_call
await msg.edit("💡 **video streaming started!**\n\n» **join to video chat to watch the video.**")
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 started!**\n\n» **join to video chat on the top to watch the video.**")
except Exception as e:
await msg.edit(f"**🚫 error** - `{e}`")
await msg.edit(f"🚫 **error** | `{e}`")
await idle()
else:
await m.reply("💭 please reply to video or video file to stream")
@ -101,7 +116,14 @@ async def stream(client, m: Message):
async def stopvideo(client, m: Message):
chat_id = m.chat.id
try:
await VIDEO_CALL[chat_id].stop()
await m.reply("✅ **streaming has ended successfully !**")
process = FFMPEG_PROCESSES.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("✅ **disconnected from vc !**")
except Exception as e:
await m.reply(f"🚫 **error** - `{e}`")
await m.reply(f"🚫 **error** | `{e}`")