moved to py-tgcalls
new video player structure
This commit is contained in:
parent
6b61059538
commit
b5bd36d9d0
@ -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}`")
|
||||
|
Loading…
Reference in New Issue
Block a user