2021-10-28 15:49:13 +00:00
# Copyright (C) 2021 By Veez Music-Project
# Commit Start Date 20/10/2021
# Finished On 28/10/2021
2021-10-29 19:01:26 +00:00
import re
2021-11-02 07:51:28 +00:00
import asyncio
2021-10-29 19:01:26 +00:00
from pyrogram import Client
2021-11-02 08:52:40 +00:00
from driver . veez import call_py , user
2021-11-02 13:23:51 +00:00
from __main__ import BOT_ID , USERBOT_ID
2021-11-02 07:51:28 +00:00
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
2021-10-29 19:01:26 +00:00
from pyrogram . types import InlineKeyboardButton , InlineKeyboardMarkup , Message
2021-11-02 07:51:28 +00:00
from pyrogram . errors import UserAlreadyParticipant , UserNotParticipant
2021-10-29 19:01:26 +00:00
from pytgcalls import StreamType
2021-10-26 05:58:34 +00:00
from pytgcalls . types . input_stream import AudioVideoPiped
2021-10-29 19:01:26 +00:00
from pytgcalls . types . input_stream . quality import (
HighQualityAudio ,
HighQualityVideo ,
LowQualityVideo ,
MediumQualityVideo ,
)
from youtubesearchpython import VideosSearch
2021-10-26 05:58:34 +00:00
def ytsearch ( query ) :
2021-10-29 19:01:26 +00:00
try :
search = VideosSearch ( query , limit = 1 )
for r in search . result ( ) [ " result " ] :
ytid = r [ " id " ]
if len ( r [ " title " ] ) > 34 :
2021-10-30 22:49:56 +00:00
songname = r [ " title " ] [ : 70 ]
2021-10-29 19:01:26 +00:00
else :
songname = r [ " title " ]
url = f " https://www.youtube.com/watch?v= { ytid } "
return [ songname , url ]
except Exception as e :
print ( e )
return 0
2021-10-26 05:58:34 +00:00
async def ytdl ( link ) :
2021-10-29 19:01:26 +00:00
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 ( )
2021-10-26 05:58:34 +00:00
@Client.on_message ( command ( [ " vplay " , f " vplay@ { BOT_USERNAME } " ] ) & other_filters )
2021-11-02 07:51:28 +00:00
async def vplay ( _ , m : Message ) :
2021-10-29 19:01:26 +00:00
keyboard = InlineKeyboardMarkup (
[
2021-10-27 08:53:08 +00:00
[
2021-10-29 19:01:26 +00:00
InlineKeyboardButton (
2021-11-01 08:16:52 +00:00
text = " • Mᴇɴᴜ " , callback_data = " cbmenu "
2021-10-29 19:01:26 +00:00
) ,
InlineKeyboardButton (
2021-11-01 08:16:52 +00:00
text = " • Cʟᴏ sᴇ " , callback_data = " cls "
2021-10-29 19:01:26 +00:00
) ,
2021-10-27 08:53:08 +00:00
]
2021-10-29 19:01:26 +00:00
]
)
2021-11-02 07:51:28 +00:00
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 \n Data 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
2021-11-02 07:56:48 +00:00
except UserNotParticipant :
if m . chat . username :
try :
2021-11-02 08:52:40 +00:00
await user . join_chat ( f " { m . chat . username } " )
2021-11-02 07:56:48 +00:00
except Exception as e :
await m . reply_text ( f " ❌ **userbot failed to join** \n \n **reason**: { e } " )
return
else :
2021-11-02 07:51:28 +00:00
try :
2021-11-02 07:56:48 +00:00
pope = await _ . export_chat_invite_link ( m . chat . id )
pepo = await _ . revoke_chat_invite_link ( m . chat . id , pope )
2021-11-02 08:52:40 +00:00
await user . join_chat ( pepo . invite_link )
2021-11-02 07:56:48 +00:00
except UserAlreadyParticipant :
pass
2021-11-02 07:51:28 +00:00
except Exception as e :
2021-11-02 07:56:48 +00:00
return await m . reply_text ( f " ❌ **userbot failed to join** \n \n **reason**: { e } " )
2021-10-29 19:01:26 +00:00
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
2021-10-26 05:58:34 +00:00
else :
2021-10-29 19:01:26 +00:00
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** "
)
2021-11-01 03:15:46 +00:00
try :
if replied . video :
songname = replied . video . file_name [ : 70 ]
elif replied . document :
songname = replied . document . file_name [ : 70 ]
2021-11-01 04:21:29 +00:00
except BaseException :
2021-11-01 03:15:46 +00:00
songname = " Video "
2021-10-29 19:01:26 +00:00
if chat_id in QUEUE :
pos = add_to_queue ( chat_id , songname , dl , link , " Video " , Q )
await loser . delete ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-29 19:01:26 +00:00
await m . reply_photo (
photo = f " { IMG_1 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **Track added to the queue** \n \n 🏷 **Name:** [ { songname } ]( { link } ) \n 💭 **Chat:** ` { chat_id } ` \n 🎧 **Request by:** { requester } \n 🔢 **At position »** ` { pos } ` " ,
2021-10-29 19:01:26 +00:00
reply_markup = keyboard ,
)
2021-10-26 05:58:34 +00:00
else :
2021-10-29 19:01:26 +00:00
if Q == 720 :
amaze = HighQualityVideo ( )
elif Q == 480 :
amaze = MediumQualityVideo ( )
elif Q == 360 :
amaze = LowQualityVideo ( )
await call_py . join_group_call (
chat_id ,
2021-11-01 14:04:49 +00:00
AudioVideoPiped (
dl ,
HighQualityAudio ( ) ,
amaze ,
) ,
2021-10-29 19:01:26 +00:00
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , songname , dl , link , " Video " , Q )
await loser . delete ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-29 19:01:26 +00:00
await m . reply_photo (
photo = f " { IMG_2 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **video streaming started.** \n \n 🏷 **Name:** [ { songname } ]( { link } ) \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { requester } " ,
2021-10-29 19:01:26 +00:00
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 ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-29 19:01:26 +00:00
await m . reply_photo (
photo = f " { IMG_1 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **Track added to the queue** \n \n 🏷 **Name:** [ { songname } ]( { url } ) \n 💭 **Chat:** ` { chat_id } ` \n 🎧 **Request by:** { requester } \n 🔢 **At position »** ` { pos } ` " ,
2021-10-29 19:01:26 +00:00
reply_markup = keyboard ,
)
else :
try :
await call_py . join_group_call (
chat_id ,
2021-11-01 14:04:49 +00:00
AudioVideoPiped (
ytlink ,
HighQualityAudio ( ) ,
amaze ,
) ,
2021-10-29 19:01:26 +00:00
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , songname , ytlink , url , " Video " , Q )
await loser . delete ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-29 19:01:26 +00:00
await m . reply_photo (
photo = f " { IMG_2 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **video streaming started.** \n \n 🏷 **Name:** [ { songname } ]( { url } ) \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { requester } " ,
2021-10-29 19:01:26 +00:00
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 :
2021-10-26 05:58:34 +00:00
loser = await m . reply ( " 🔎 **searching...** " )
query = m . text . split ( None , 1 ) [ 1 ]
search = ytsearch ( query )
Q = 720
amaze = HighQualityVideo ( )
2021-10-29 19:01:26 +00:00
if search == 0 :
await loser . edit ( " ❌ **no results found.** " )
2021-10-26 05:58:34 +00:00
else :
2021-10-29 19:01:26 +00:00
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 )
2021-10-27 08:53:08 +00:00
await loser . delete ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-27 08:53:08 +00:00
await m . reply_photo (
2021-10-29 19:01:26 +00:00
photo = f " { IMG_1 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **Track added to the queue** \n \n 🏷 **Name:** [ { songname } ]( { url } ) \n 💭 **Chat:** ` { chat_id } ` \n 🎧 **Request by:** { requester } \n 🔢 **At position »** ` { pos } ` " ,
2021-10-29 19:01:26 +00:00
reply_markup = keyboard ,
2021-10-27 08:53:08 +00:00
)
2021-10-29 19:01:26 +00:00
else :
try :
await call_py . join_group_call (
chat_id ,
2021-11-01 14:04:49 +00:00
AudioVideoPiped (
ytlink ,
HighQualityAudio ( ) ,
2021-11-01 14:09:30 +00:00
amaze ,
2021-11-01 14:04:49 +00:00
) ,
2021-10-29 19:01:26 +00:00
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , songname , ytlink , url , " Video " , Q )
await loser . delete ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-29 19:01:26 +00:00
await m . reply_photo (
photo = f " { IMG_2 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **video streaming started.** \n \n 🏷 **Name:** [ { songname } ]( { url } ) \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { requester } " ,
2021-10-29 19:01:26 +00:00
reply_markup = keyboard ,
)
except Exception as ep :
await m . reply_text ( f " 🚫 error: ` { ep } ` " )
2021-10-26 05:58:34 +00:00
@Client.on_message ( command ( [ " vstream " , f " vstream@ { BOT_USERNAME } " ] ) & other_filters )
2021-11-02 07:52:20 +00:00
async def vstream ( _ , m : Message ) :
2021-10-29 19:01:26 +00:00
keyboard = InlineKeyboardMarkup (
[
2021-10-27 08:53:08 +00:00
[
2021-10-29 19:01:26 +00:00
InlineKeyboardButton (
2021-11-01 08:16:52 +00:00
text = " • Mᴇɴᴜ " , callback_data = " cbmenu "
2021-10-29 19:01:26 +00:00
) ,
InlineKeyboardButton (
2021-11-01 08:16:52 +00:00
text = " • Cʟᴏ sᴇ " , callback_data = " cls "
2021-10-29 19:01:26 +00:00
) ,
2021-10-27 08:53:08 +00:00
]
2021-10-29 19:01:26 +00:00
]
)
2021-11-02 07:51:28 +00:00
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 \n Data 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
2021-11-02 07:59:51 +00:00
except UserNotParticipant :
if m . chat . username :
try :
2021-11-02 08:52:40 +00:00
await user . join_chat ( f " { m . chat . username } " )
2021-11-02 07:59:51 +00:00
except Exception as e :
await m . reply_text ( f " ❌ **userbot failed to join** \n \n **reason**: { e } " )
return
else :
2021-11-02 07:51:28 +00:00
try :
2021-11-02 07:59:51 +00:00
pope = await _ . export_chat_invite_link ( m . chat . id )
pepo = await _ . revoke_chat_invite_link ( m . chat . id , pope )
2021-11-02 08:52:40 +00:00
await user . join_chat ( pepo . invite_link )
2021-11-02 07:59:51 +00:00
except UserAlreadyParticipant :
pass
2021-11-02 07:51:28 +00:00
except Exception as e :
2021-11-02 07:59:51 +00:00
return await m . reply_text ( f " ❌ **userbot failed to join** \n \n **reason**: { e } " )
2021-10-29 19:01:26 +00:00
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 ]
2021-10-26 05:58:34 +00:00
Q = 720
2021-10-29 19:01:26 +00:00
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}** " )
2021-10-26 05:58:34 +00:00
2021-10-29 19:01:26 +00:00
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
2021-10-26 05:58:34 +00:00
2021-10-29 19:01:26 +00:00
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 ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-29 19:01:26 +00:00
await m . reply_photo (
photo = f " { IMG_1 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **Track added to the queue** \n \n 💭 **Chat:** ` { chat_id } ` \n 🎧 **Request by:** { requester } \n 🔢 **At position »** ` { pos } ` " ,
2021-10-29 19:01:26 +00:00
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 ,
2021-11-01 14:04:49 +00:00
AudioVideoPiped (
livelink ,
HighQualityAudio ( ) ,
2021-11-01 14:09:30 +00:00
amaze ,
2021-11-01 14:04:49 +00:00
) ,
2021-10-29 19:01:26 +00:00
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , " Live Stream " , livelink , link , " Video " , Q )
await loser . delete ( )
2021-11-02 08:17:22 +00:00
requester = f " [ { m . from_user . first_name } ](tg://user?id= { m . from_user . id } ) "
2021-10-29 19:01:26 +00:00
await m . reply_photo (
photo = f " { IMG_2 } " ,
2021-11-02 08:17:22 +00:00
caption = f " 💡 **[Live stream video]( { link } ) started.** \n \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { requester } " ,
2021-10-29 19:01:26 +00:00
reply_markup = keyboard ,
)
except Exception as ep :
await m . reply_text ( f " 🚫 error: ` { ep } ` " )