This commit is contained in:
levina 2021-10-09 22:26:40 +07:00 committed by GitHub
parent dd5954115d
commit fba91f67c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,329 +0,0 @@
# Copyright (C) 2021 By VeezMusicProject
import os
import asyncio
import subprocess
from pytgcalls import idle
from pytgcalls.pytgcalls import PyTgCalls
from pytgcalls import StreamType
from pytgcalls.types import Update
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from pyrogram import Client, filters
from pyrogram.types import Message
from config import Veez
from helpers.decorators import authorized_users_only
from helpers.filters import command
from helpers.loggings import LOG
from youtube_dl import YoutubeDL
from youtube_dl.utils import ExtractorError
from pytgcalls.types.input_stream import (
VideoParameters,
AudioParameters,
InputAudioStream,
InputVideoStream
)
SIGINT: int = 2
app = Client(Veez.SESSION_NAME, Veez.API_ID, Veez.API_HASH)
call_py = PyTgCalls(app)
FFMPEG_PROCESS = {}
def convert_seconds(seconds: int) -> str:
seconds = seconds % (24 * 3600)
seconds %= 3600
minutes = seconds // 60
seconds %= 60
return "%02d:%02d" % (minutes, seconds)
def raw_converter(dl, song, video):
return subprocess.Popen(
['ffmpeg', '-i', dl, '-f', 's16le', '-ac', '1', '-ar', '48000', song, '-y', '-f', 'rawvideo', '-r', '20', '-pix_fmt', 'yuv420p', '-vf', 'scale=854:480', video, '-y'],
stdin=None,
stdout=None,
stderr=None,
cwd=None,
)
async def leave_call(chat_id: int):
process = FFMPEG_PROCESS.get(chat_id)
if process:
try:
process.send_signal(SIGINT)
await asyncio.sleep(3)
except Exception as e:
print(e)
pass
try:
await call_py.leave_group_call(chat_id)
except Exception as e:
print(f"🚫 error - {e}")
def youtube(url: str):
try:
params = {"format": "best[height=?480]/best", "noplaylist": True}
yt = YoutubeDL(params)
info = yt.extract_info(url, download=False)
return info['url'], info['title'], info['duration']
except ExtractorError:
return None, None
except Exception:
return None, None
@Client.on_message(command(["vplay", f"vplay@{Veez.BOT_USERNAME}"]) & filters.group & ~filters.edited)
@authorized_users_only
async def startvideo(client, m: Message):
keyboard = InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
text="✨ ɢʀᴏᴜᴘ",
url=f"https://t.me/{Veez.GROUP_NAME}"),
InlineKeyboardButton(
text="🌻 ᴄʜᴀɴɴᴇʟ",
url=f"https://t.me/{Veez.CHANNEL_NAME}")
]
]
)
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 = m.chat.id
try:
livelink, title, duration = 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 m.reply_photo(
photo="https://telegra.ph/file/0faaa780ae861fb780814.png",
reply_markup=keyboard,
caption=f"💡 **video streaming started !**\n\n🏷 **Name:** {title}\n⏱ **Duration:** `{convert_seconds(duration)}` m\n\n» **join to video chat on the top to watch the video.**")
return await msg.delete()
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 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 m.reply_photo(
photo="https://telegra.ph/file/bca4f149e798092846230.png",
reply_markup=keyboard,
caption=f"💡 **video streaming started !**\n\n» **join to video chat on the top to watch the video.**")
return await msg.delete()
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(["vstop", f"vstop@{Veez.BOT_USERNAME}"]) & filters.group & ~filters.edited)
@authorized_users_only
async def stopvideo(client, m: Message):
chat_id = m.chat.id
try:
process = FFMPEG_PROCESS.get(chat_id)
if process:
try:
process.send_signal(SIGINT)
await asyncio.sleep(3)
except Exception as e:
print(e)
pass
await call_py.leave_group_call(chat_id)
await m.reply("✅ **successfully left vc !**")
except Exception as e:
await m.reply(f"🚫 **error** | `{e}`")
@call_py.on_stream_end()
async def handler(client: PyTgCalls, update: Update):
LOG.info(f"called ended stream")
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 = Veez.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 = Veez.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 = Veez.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)
pass
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}`")