2021-10-28 15:49:34 +00:00
# Copyright (C) 2021 By Veez Music-Project
# Commit Start Date 20/10/2021
# Finished On 28/10/2021
2021-10-29 20:24:14 +00:00
import re
2021-11-02 08:07:40 +00:00
import asyncio
2021-10-29 20:24:14 +00:00
from pyrogram import Client
2021-11-02 08:51:33 +00:00
from driver . veez import call_py , user
2021-11-02 08:07:40 +00:00
from program import BOT_ID , USERBOT_ID
from driver . queues import QUEUE , add_to_queue
from driver . filters import command , other_filters
from pyrogram . errors import UserAlreadyParticipant , UserNotParticipant
2021-10-29 20:24:14 +00:00
from pyrogram . types import InlineKeyboardButton , InlineKeyboardMarkup , Message
2021-11-02 08:07:40 +00:00
from config import BOT_USERNAME , GROUP_SUPPORT , IMG_1 , IMG_2 , UPDATES_CHANNEL , ASSISTANT_NAME
2021-10-29 20:24:14 +00:00
from pytgcalls import StreamType
2021-10-26 07:00:00 +00:00
from pytgcalls . types . input_stream import AudioPiped
2021-10-29 20:24:14 +00:00
from youtubesearchpython import VideosSearch
2021-10-26 07:00:00 +00:00
def ytsearch ( query ) :
2021-10-29 20:24:14 +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:09 +00:00
songname = r [ " title " ] [ : 70 ]
2021-10-29 20:24:14 +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 07:00:00 +00:00
async def ytdl ( link ) :
2021-10-29 20:24:14 +00:00
proc = await asyncio . create_subprocess_exec (
" yt-dlp " ,
" -g " ,
" -f " ,
" bestaudio " ,
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 07:00:00 +00:00
@Client.on_message ( command ( [ " play " , f " play@ { BOT_USERNAME } " ] ) & other_filters )
2021-10-29 21:01:56 +00:00
async def play ( _ , m : Message ) :
2021-10-29 20:24:14 +00:00
keyboard = InlineKeyboardMarkup (
[
2021-10-27 14:08:39 +00:00
[
2021-10-29 20:24:14 +00:00
InlineKeyboardButton (
2021-11-01 08:16:06 +00:00
text = " • Mᴇɴᴜ " , callback_data = " cbmenu "
2021-10-29 20:24:14 +00:00
) ,
InlineKeyboardButton (
2021-11-01 08:16:06 +00:00
text = " • Cʟᴏ sᴇ " , callback_data = " cls "
2021-10-29 20:24:14 +00:00
) ,
2021-10-27 14:08:39 +00:00
]
2021-10-29 20:24:14 +00:00
]
)
2021-11-02 08:07:40 +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
except UserNotParticipant :
if m . chat . username :
try :
2021-11-02 08:51:33 +00:00
await user . join_chat ( f " { m . chat . username } " )
2021-11-02 08:07:40 +00:00
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 )
2021-11-02 08:51:33 +00:00
await user . join_chat ( pepo . invite_link )
2021-11-02 08:07:40 +00:00
except UserAlreadyParticipant :
pass
except Exception as e :
return await m . reply_text ( f " ❌ **userbot failed to join** \n \n **reason**: { e } " )
2021-10-29 20:24:14 +00:00
replied = m . reply_to_message
chat_id = m . chat . id
if replied :
if replied . audio or replied . voice :
suhu = await replied . reply ( " 📥 **downloading audio...** " )
dl = await replied . download ( )
link = replied . link
if replied . audio :
if replied . audio . title :
2021-10-30 22:49:09 +00:00
songname = replied . audio . title [ : 70 ]
2021-10-29 20:24:14 +00:00
else :
2021-11-01 03:21:16 +00:00
if replied . audio . file_name :
songname = replied . audio . file_name [ : 70 ]
else :
songname = " Audio "
2021-10-29 20:24:14 +00:00
elif replied . voice :
songname = " Voice Note "
if chat_id in QUEUE :
pos = add_to_queue ( chat_id , songname , dl , link , " Audio " , 0 )
await suhu . delete ( )
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:** { m . from_user . mention ( ) } \n 🔢 **At position »** ` { pos } ` " ,
reply_markup = keyboard ,
)
2021-10-26 07:00:00 +00:00
else :
2021-10-29 20:24:14 +00:00
await call_py . join_group_call (
chat_id ,
AudioPiped (
dl ,
) ,
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , songname , dl , link , " Audio " , 0 )
2021-10-29 21:01:56 +00:00
await suhu . delete ( )
2021-10-29 20:24:14 +00:00
await m . reply_photo (
photo = f " { IMG_2 } " ,
caption = f " 💡 **music streaming started.** \n \n 🏷 **Name:** [ { songname } ]( { link } ) \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { m . from_user . mention ( ) } " ,
reply_markup = keyboard ,
)
else :
if len ( m . command ) < 2 :
await m . reply (
" » reply to an **audio file** or **give something to search.** "
)
2021-10-26 07:00:00 +00:00
else :
2021-10-29 20:24:14 +00:00
suhu = await m . reply ( " 🔎 **searching...** " )
query = m . text . split ( None , 1 ) [ 1 ]
search = ytsearch ( query )
if search == 0 :
await suhu . edit ( " ❌ **no results found.** " )
else :
songname = search [ 0 ]
url = search [ 1 ]
veez , ytlink = await ytdl ( url )
if veez == 0 :
await suhu . edit ( f " ❌ yt-dl issues detected \n \n » ` { ytlink } ` " )
else :
if chat_id in QUEUE :
pos = add_to_queue (
chat_id , songname , ytlink , url , " Audio " , 0
)
await suhu . delete ( )
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:** { m . from_user . mention ( ) } \n 🔢 **At position »** ` { pos } ` " ,
reply_markup = keyboard ,
)
else :
try :
await call_py . join_group_call (
chat_id ,
AudioPiped (
ytlink ,
) ,
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , songname , ytlink , url , " Audio " , 0 )
await suhu . delete ( )
await m . reply_photo (
photo = f " { IMG_2 } " ,
caption = f " 💡 **music streaming started.** \n \n 🏷 **Name:** [ { songname } ]( { url } ) \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { m . from_user . mention ( ) } " ,
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 **audio file** or **give something to search.** "
)
else :
2021-10-26 07:00:00 +00:00
suhu = await m . reply ( " 🔎 **searching...** " )
query = m . text . split ( None , 1 ) [ 1 ]
search = ytsearch ( query )
2021-10-29 20:24:14 +00:00
if search == 0 :
await suhu . edit ( " ❌ **no results found.** " )
2021-10-26 07:00:00 +00:00
else :
2021-10-29 20:24:14 +00:00
songname = search [ 0 ]
url = search [ 1 ]
veez , ytlink = await ytdl ( url )
if veez == 0 :
2021-10-30 11:12:58 +00:00
await suhu . edit ( f " ❌ yt-dl issues detected \n \n » ` { ytlink } ` " )
2021-10-29 20:24:14 +00:00
else :
if chat_id in QUEUE :
pos = add_to_queue ( chat_id , songname , ytlink , url , " Audio " , 0 )
2021-10-27 14:08:39 +00:00
await suhu . delete ( )
await m . reply_photo (
2021-10-29 20:24:14 +00:00
photo = f " { IMG_1 } " ,
caption = f " 💡 **Track added to the queue** \n \n 🏷 **Name:** [ { songname } ]( { url } ) \n 💭 **Chat:** ` { chat_id } ` \n 🎧 **Request by:** { m . from_user . mention ( ) } \n 🔢 **At position »** ` { pos } ` " ,
reply_markup = keyboard ,
2021-10-27 14:08:39 +00:00
)
2021-10-29 20:24:14 +00:00
else :
try :
await call_py . join_group_call (
chat_id ,
AudioPiped (
ytlink ,
) ,
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , songname , ytlink , url , " Audio " , 0 )
await suhu . delete ( )
await m . reply_photo (
photo = f " { IMG_2 } " ,
caption = f " 💡 **music streaming started.** \n \n 🏷 **Name:** [ { songname } ]( { url } ) \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { m . from_user . mention ( ) } " ,
reply_markup = keyboard ,
)
except Exception as ep :
await m . reply_text ( f " 🚫 error: ` { ep } ` " )
2021-10-26 07:00:00 +00:00
2021-10-29 10:14:03 +00:00
# stream is used for live streaming only
2021-10-27 14:08:39 +00:00
2021-10-26 07:00:00 +00:00
@Client.on_message ( command ( [ " stream " , f " stream@ { BOT_USERNAME } " ] ) & other_filters )
2021-10-29 21:01:56 +00:00
async def stream ( _ , m : Message ) :
2021-10-29 20:24:14 +00:00
keyboard = InlineKeyboardMarkup (
[
2021-10-27 14:08:39 +00:00
[
2021-10-29 20:24:14 +00:00
InlineKeyboardButton (
2021-11-01 08:16:06 +00:00
text = " • Mᴇɴᴜ " , callback_data = " cbmenu "
2021-10-29 20:24:14 +00:00
) ,
InlineKeyboardButton (
2021-11-01 08:16:06 +00:00
text = " • Cʟᴏ sᴇ " , callback_data = " cls "
2021-10-29 20:24:14 +00:00
) ,
2021-10-27 14:08:39 +00:00
]
2021-10-29 20:24:14 +00:00
]
)
2021-11-02 08:07:40 +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
except UserNotParticipant :
if m . chat . username :
try :
2021-11-02 08:51:33 +00:00
await user . join_chat ( f " { m . chat . username } " )
2021-11-02 08:07:40 +00:00
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 )
2021-11-02 08:51:33 +00:00
await user . join_chat ( pepo . invite_link )
2021-11-02 08:07:40 +00:00
except UserAlreadyParticipant :
pass
except Exception as e :
return await m . reply_text ( f " ❌ **userbot failed to join** \n \n **reason**: { e } " )
2021-10-29 20:24:14 +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 :
link = m . text . split ( None , 1 ) [ 1 ]
suhu = await m . reply ( " 🔄 **processing stream...** " )
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 suhu . edit ( f " ❌ yt-dl issues detected \n \n » ` { ytlink } ` " )
else :
if chat_id in QUEUE :
pos = add_to_queue ( chat_id , " Radio " , livelink , link , " Audio " , 0 )
await suhu . delete ( )
await m . reply_photo (
photo = f " { IMG_1 } " ,
caption = f " 💡 **Track added to the queue** \n \n 💭 **Chat:** ` { chat_id } ` \n 🎧 **Request by:** { m . from_user . mention ( ) } \n 🔢 **At position »** ` { pos } ` " ,
reply_markup = keyboard ,
)
else :
try :
await call_py . join_group_call (
chat_id ,
AudioPiped (
livelink ,
) ,
stream_type = StreamType ( ) . pulse_stream ,
)
add_to_queue ( chat_id , " Radio " , livelink , link , " Audio " , 0 )
await suhu . delete ( )
await m . reply_photo (
photo = f " { IMG_2 } " ,
caption = f " 💡 **[Radio live]( { link } ) stream started.** \n \n 💭 **Chat:** ` { chat_id } ` \n 💡 **Status:** `Playing` \n 🎧 **Request by:** { m . from_user . mention ( ) } " ,
reply_markup = keyboard ,
)
except Exception as ep :
await m . reply_text ( f " 🚫 error: ` { ep } ` " )