video-stream/program/video.py
2021-11-02 15:52:40 +07:00

418 lines
18 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Copyright (C) 2021 By Veez Music-Project
# Commit Start Date 20/10/2021
# Finished On 28/10/2021
import re
import asyncio
from pyrogram import Client
from driver.veez import call_py, user
from program import BOT_ID, USERBOT_ID
from driver.queues import QUEUE, add_to_queue
from driver.filters import command, other_filters
from config import BOT_USERNAME, GROUP_SUPPORT, IMG_1, IMG_2, UPDATES_CHANNEL, ASSISTANT_NAME
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message
from pyrogram.errors import UserAlreadyParticipant, UserNotParticipant
from pytgcalls import StreamType
from pytgcalls.types.input_stream import AudioVideoPiped
from pytgcalls.types.input_stream.quality import (
HighQualityAudio,
HighQualityVideo,
LowQualityVideo,
MediumQualityVideo,
)
from youtubesearchpython import VideosSearch
def ytsearch(query):
try:
search = VideosSearch(query, limit=1)
for r in search.result()["result"]:
ytid = r["id"]
if len(r["title"]) > 34:
songname = r["title"][:70]
else:
songname = r["title"]
url = f"https://www.youtube.com/watch?v={ytid}"
return [songname, url]
except Exception as e:
print(e)
return 0
async def ytdl(link):
proc = await asyncio.create_subprocess_exec(
"yt-dlp",
"-g",
"-f",
"best[height<=?720][width<=?1280]",
f"{link}",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await proc.communicate()
if stdout:
return 1, stdout.decode().split("\n")[0]
else:
return 0, stderr.decode()
@Client.on_message(command(["vplay", f"vplay@{BOT_USERNAME}"]) & other_filters)
async def vplay(_, m: Message):
keyboard = InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
text="• Mᴇɴ", callback_data="cbmenu"
),
InlineKeyboardButton(
text="• Cʟsᴇ", callback_data="cls"
),
]
]
)
chat_title = m.chat.title
a = await _.get_chat_member(m.chat.id, BOT_ID)
if a.status != "administrator":
await m.reply_text(f"💡 To use me, I need to be an **Administrator** with the following **permissions**:\n\n» ❌ __Delete messages__\n» ❌ __Ban users__\n» ❌ __Add users__\n» ❌ __Manage voice chat__\n\nData is **updated** automatically after you **promote me**")
return
if not a.can_manage_voice_chats:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Manage voice chat__")
return
if not a.can_delete_messages:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Delete messages__")
return
if not a.can_invite_users:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Add users__")
return
if not a.can_restrict_members:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Ban users__")
return
try:
b = await _.get_chat_member(m.chat.id, USERBOT_ID)
if b.status == "kicked":
await m.reply_text(f"@{ASSISTANT_NAME} **is banned in group** {chat_title}\n\n» **unban the userbot first if you want to use this bot.**")
return
except UserNotParticipant:
if m.chat.username:
try:
await user.join_chat(f"{m.chat.username}")
except Exception as e:
await m.reply_text(f"❌ **userbot failed to join**\n\n**reason**:{e}")
return
else:
try:
pope = await _.export_chat_invite_link(m.chat.id)
pepo = await _.revoke_chat_invite_link(m.chat.id, pope)
await user.join_chat(pepo.invite_link)
except UserAlreadyParticipant:
pass
except Exception as e:
return await m.reply_text(f"❌ **userbot failed to join**\n\n**reason**:{e}")
replied = m.reply_to_message
chat_id = m.chat.id
if replied:
if replied.video or replied.document:
loser = await replied.reply("📥 **downloading video...**")
dl = await replied.download()
link = replied.link
if len(m.command) < 2:
Q = 720
else:
pq = m.text.split(None, 1)[1]
if pq == "720" or "480" or "360":
Q = int(pq)
else:
Q = 720
await loser.edit(
"» __only 720, 480, 360 allowed__ \n💡 **now streaming video in 720p**"
)
try:
if replied.video:
songname = replied.video.file_name[:70]
elif replied.document:
songname = replied.document.file_name[:70]
except BaseException:
songname = "Video"
if chat_id in QUEUE:
pos = add_to_queue(chat_id, songname, dl, link, "Video", Q)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_1}",
caption=f"💡 **Track added to the queue**\n\n🏷 **Name:** [{songname}]({link})\n💭 **Chat:** `{chat_id}`\n🎧 **Request by:** {requester}\n🔢 **At position »** `{pos}`",
reply_markup=keyboard,
)
else:
if Q == 720:
amaze = HighQualityVideo()
elif Q == 480:
amaze = MediumQualityVideo()
elif Q == 360:
amaze = LowQualityVideo()
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
dl,
HighQualityAudio(),
amaze,
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, songname, dl, link, "Video", Q)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_2}",
caption=f"💡 **video streaming started.**\n\n🏷 **Name:** [{songname}]({link})\n💭 **Chat:** `{chat_id}`\n💡 **Status:** `Playing`\n🎧 **Request by:** {requester}",
reply_markup=keyboard,
)
else:
if len(m.command) < 2:
await m.reply(
"» reply to an **video file** or **give something to search.**"
)
else:
loser = await m.reply("🔎 **searching...**")
query = m.text.split(None, 1)[1]
search = ytsearch(query)
Q = 720
amaze = HighQualityVideo()
if search == 0:
await loser.edit("❌ **no results found.**")
else:
songname = search[0]
url = search[1]
veez, ytlink = await ytdl(url)
if veez == 0:
await loser.edit(f"❌ yt-dl issues detected\n\n» `{ytlink}`")
else:
if chat_id in QUEUE:
pos = add_to_queue(
chat_id, songname, ytlink, url, "Video", Q
)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_1}",
caption=f"💡 **Track added to the queue**\n\n🏷 **Name:** [{songname}]({url})\n💭 **Chat:** `{chat_id}`\n🎧 **Request by:** {requester}\n🔢 **At position »** `{pos}`",
reply_markup=keyboard,
)
else:
try:
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
ytlink,
HighQualityAudio(),
amaze,
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, songname, ytlink, url, "Video", Q)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_2}",
caption=f"💡 **video streaming started.**\n\n🏷 **Name:** [{songname}]({url})\n💭 **Chat:** `{chat_id}`\n💡 **Status:** `Playing`\n🎧 **Request by:** {requester}",
reply_markup=keyboard,
)
except Exception as ep:
await m.reply_text(f"🚫 error: `{ep}`")
else:
if len(m.command) < 2:
await m.reply(
"» reply to an **video file** or **give something to search.**"
)
else:
loser = await m.reply("🔎 **searching...**")
query = m.text.split(None, 1)[1]
search = ytsearch(query)
Q = 720
amaze = HighQualityVideo()
if search == 0:
await loser.edit("❌ **no results found.**")
else:
songname = search[0]
url = search[1]
veez, ytlink = await ytdl(url)
if veez == 0:
await loser.edit(f"❌ yt-dl issues detected\n\n» `{ytlink}`")
else:
if chat_id in QUEUE:
pos = add_to_queue(chat_id, songname, ytlink, url, "Video", Q)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_1}",
caption=f"💡 **Track added to the queue**\n\n🏷 **Name:** [{songname}]({url})\n💭 **Chat:** `{chat_id}`\n🎧 **Request by:** {requester}\n🔢 **At position »** `{pos}`",
reply_markup=keyboard,
)
else:
try:
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
ytlink,
HighQualityAudio(),
amaze,
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, songname, ytlink, url, "Video", Q)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_2}",
caption=f"💡 **video streaming started.**\n\n🏷 **Name:** [{songname}]({url})\n💭 **Chat:** `{chat_id}`\n💡 **Status:** `Playing`\n🎧 **Request by:** {requester}",
reply_markup=keyboard,
)
except Exception as ep:
await m.reply_text(f"🚫 error: `{ep}`")
@Client.on_message(command(["vstream", f"vstream@{BOT_USERNAME}"]) & other_filters)
async def vstream(_, m: Message):
keyboard = InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
text="• Mᴇɴ", callback_data="cbmenu"
),
InlineKeyboardButton(
text="• Cʟsᴇ", callback_data="cls"
),
]
]
)
chat_title = m.chat.title
a = await _.get_chat_member(m.chat.id, BOT_ID)
if a.status != "administrator":
await m.reply_text(f"💡 To use me, I need to be an **Administrator** with the following **permissions**:\n\n» ❌ __Delete messages__\n» ❌ __Ban users__\n» ❌ __Add users__\n» ❌ __Manage voice chat__\n\nData is **updated** automatically after you **promote me**")
return
if not a.can_manage_voice_chats:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Manage voice chat__")
return
if not a.can_delete_messages:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Delete messages__")
return
if not a.can_invite_users:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Add users__")
return
if not a.can_restrict_members:
await m.reply_text(
"missing required permission:"
+ "\n\n» ❌ __Ban users__")
return
try:
b = await _.get_chat_member(m.chat.id, USERBOT_ID)
if b.status == "kicked":
await m.reply_text(f"@{ASSISTANT_NAME} **is banned in group** {chat_title}\n\n» **unban the userbot first if you want to use this bot.**")
return
except UserNotParticipant:
if m.chat.username:
try:
await user.join_chat(f"{m.chat.username}")
except Exception as e:
await m.reply_text(f"❌ **userbot failed to join**\n\n**reason**:{e}")
return
else:
try:
pope = await _.export_chat_invite_link(m.chat.id)
pepo = await _.revoke_chat_invite_link(m.chat.id, pope)
await user.join_chat(pepo.invite_link)
except UserAlreadyParticipant:
pass
except Exception as e:
return await m.reply_text(f"❌ **userbot failed to join**\n\n**reason**:{e}")
chat_id = m.chat.id
if len(m.command) < 2:
await m.reply("» give me a live-link/m3u8 url/youtube link to stream.")
else:
if len(m.command) == 2:
link = m.text.split(None, 1)[1]
Q = 720
loser = await m.reply("🔄 **processing stream...**")
elif len(m.command) == 3:
op = m.text.split(None, 1)[1]
link = op.split(None, 1)[0]
quality = op.split(None, 1)[1]
if quality == "720" or "480" or "360":
Q = int(quality)
else:
Q = 720
await m.reply(
"» __only 720, 480, 360 allowed__ \n💡 **now streaming video in 720p**"
)
loser = await m.reply("🔄 **processing stream...**")
else:
await m.reply("**/vstream {link} {720/480/360}**")
regex = r"^(https?\:\/\/)?(www\.youtube\.com|youtu\.?be)\/.+"
match = re.match(regex, link)
if match:
veez, livelink = await ytdl(link)
else:
livelink = link
veez = 1
if veez == 0:
await loser.edit(f"❌ yt-dl issues detected\n\n» `{ytlink}`")
else:
if chat_id in QUEUE:
pos = add_to_queue(chat_id, "Live Stream", livelink, link, "Video", Q)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_1}",
caption=f"💡 **Track added to the queue**\n\n💭 **Chat:** `{chat_id}`\n🎧 **Request by:** {requester}\n🔢 **At position »** `{pos}`",
reply_markup=keyboard,
)
else:
if Q == 720:
amaze = HighQualityVideo()
elif Q == 480:
amaze = MediumQualityVideo()
elif Q == 360:
amaze = LowQualityVideo()
try:
await call_py.join_group_call(
chat_id,
AudioVideoPiped(
livelink,
HighQualityAudio(),
amaze,
),
stream_type=StreamType().pulse_stream,
)
add_to_queue(chat_id, "Live Stream", livelink, link, "Video", Q)
await loser.delete()
requester = f"[{m.from_user.first_name}](tg://user?id={m.from_user.id})"
await m.reply_photo(
photo=f"{IMG_2}",
caption=f"💡 **[Live stream video]({link}) started.**\n\n💭 **Chat:** `{chat_id}`\n💡 **Status:** `Playing`\n🎧 **Request by:** {requester}",
reply_markup=keyboard,
)
except Exception as ep:
await m.reply_text(f"🚫 error: `{ep}`")