|
import os |
|
from random import randint |
|
from typing import Union |
|
|
|
from pyrogram.types import InlineKeyboardMarkup |
|
|
|
import config |
|
from DragMusic import Carbon, YouTube, app |
|
from DragMusic.core.call import Drag |
|
from DragMusic.misc import db |
|
from DragMusic.utils.database import add_active_video_chat, is_active_chat |
|
from DragMusic.utils.exceptions import AssistantErr |
|
from DragMusic.utils.inline import aq_markup, close_markup, stream_markup |
|
from DragMusic.utils.pastebin import DragBin |
|
from DragMusic.utils.stream.queue import put_queue, put_queue_index |
|
from DragMusic.utils.thumbnails import gen_thumb |
|
|
|
|
|
async def stream( |
|
_, |
|
mystic, |
|
user_id, |
|
result, |
|
chat_id, |
|
user_name, |
|
original_chat_id, |
|
video: Union[bool, str] = None, |
|
streamtype: Union[bool, str] = None, |
|
spotify: Union[bool, str] = None, |
|
forceplay: Union[bool, str] = None, |
|
): |
|
if not result: |
|
return |
|
if forceplay: |
|
await Drag.force_stop_stream(chat_id) |
|
if streamtype == "playlist": |
|
msg = f"{_['play_19']}\n\n" |
|
count = 0 |
|
for search in result: |
|
if int(count) == config.PLAYLIST_FETCH_LIMIT: |
|
continue |
|
try: |
|
( |
|
title, |
|
duration_min, |
|
duration_sec, |
|
thumbnail, |
|
vidid, |
|
) = await YouTube.details(search, False if spotify else True) |
|
except: |
|
continue |
|
if str(duration_min) == "None": |
|
continue |
|
if duration_sec > config.DURATION_LIMIT: |
|
continue |
|
if await is_active_chat(chat_id): |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
f"vid_{vidid}", |
|
title, |
|
duration_min, |
|
user_name, |
|
vidid, |
|
user_id, |
|
"video" if video else "audio", |
|
) |
|
position = len(db.get(chat_id)) - 1 |
|
count += 1 |
|
msg += f"{count}. {title[:70]}\n" |
|
msg += f"{_['play_20']} {position}\n\n" |
|
else: |
|
if not forceplay: |
|
db[chat_id] = [] |
|
status = True if video else None |
|
try: |
|
file_path, direct = await YouTube.download( |
|
vidid, mystic, video=status, videoid=True |
|
) |
|
except: |
|
raise AssistantErr(_["play_14"]) |
|
await Drag.join_call( |
|
chat_id, |
|
original_chat_id, |
|
file_path, |
|
video=status, |
|
image=thumbnail, |
|
) |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
file_path if direct else f"vid_{vidid}", |
|
title, |
|
duration_min, |
|
user_name, |
|
vidid, |
|
user_id, |
|
"video" if video else "audio", |
|
forceplay=forceplay, |
|
) |
|
img = await gen_thumb(vidid) |
|
button = stream_markup(_, chat_id) |
|
run = await app.send_photo( |
|
original_chat_id, |
|
photo=img, |
|
caption=_["stream_1"].format( |
|
f"https://t.me/{app.username}?start=info_{vidid}", |
|
title[:23], |
|
duration_min, |
|
user_name, |
|
), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
db[chat_id][0]["mystic"] = run |
|
db[chat_id][0]["markup"] = "stream" |
|
if count == 0: |
|
return |
|
else: |
|
link = await DragBin(msg) |
|
lines = msg.count("\n") |
|
if lines >= 17: |
|
car = os.linesep.join(msg.split(os.linesep)[:17]) |
|
else: |
|
car = msg |
|
carbon = await Carbon.generate(car, randint(100, 10000000)) |
|
upl = close_markup(_) |
|
return await app.send_photo( |
|
original_chat_id, |
|
photo=carbon, |
|
caption=_["play_21"].format(position, link), |
|
reply_markup=upl, |
|
) |
|
elif streamtype == "youtube": |
|
link = result["link"] |
|
vidid = result["vidid"] |
|
title = (result["title"]).title() |
|
duration_min = result["duration_min"] |
|
thumbnail = result["thumb"] |
|
status = True if video else None |
|
try: |
|
file_path, direct = await YouTube.download( |
|
vidid, mystic, videoid=True, video=status |
|
) |
|
except: |
|
raise AssistantErr(_["play_14"]) |
|
if await is_active_chat(chat_id): |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
file_path if direct else f"vid_{vidid}", |
|
title, |
|
duration_min, |
|
user_name, |
|
vidid, |
|
user_id, |
|
"video" if video else "audio", |
|
) |
|
position = len(db.get(chat_id)) - 1 |
|
button = aq_markup(_, chat_id) |
|
await app.send_message( |
|
chat_id=original_chat_id, |
|
text=_["queue_4"].format(position, title[:27], duration_min, user_name), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
else: |
|
if not forceplay: |
|
db[chat_id] = [] |
|
await Drag.join_call( |
|
chat_id, |
|
original_chat_id, |
|
file_path, |
|
video=status, |
|
image=thumbnail, |
|
) |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
file_path if direct else f"vid_{vidid}", |
|
title, |
|
duration_min, |
|
user_name, |
|
vidid, |
|
user_id, |
|
"video" if video else "audio", |
|
forceplay=forceplay, |
|
) |
|
img = await gen_thumb(vidid) |
|
button = stream_markup(_, chat_id) |
|
run = await app.send_photo( |
|
original_chat_id, |
|
photo=img, |
|
caption=_["stream_1"].format( |
|
f"https://t.me/{app.username}?start=info_{vidid}", |
|
title[:23], |
|
duration_min, |
|
user_name, |
|
), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
db[chat_id][0]["mystic"] = run |
|
db[chat_id][0]["markup"] = "stream" |
|
elif streamtype == "soundcloud": |
|
file_path = result["filepath"] |
|
title = result["title"] |
|
duration_min = result["duration_min"] |
|
if await is_active_chat(chat_id): |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
file_path, |
|
title, |
|
duration_min, |
|
user_name, |
|
streamtype, |
|
user_id, |
|
"audio", |
|
) |
|
position = len(db.get(chat_id)) - 1 |
|
button = aq_markup(_, chat_id) |
|
await app.send_message( |
|
chat_id=original_chat_id, |
|
text=_["queue_4"].format(position, title[:27], duration_min, user_name), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
else: |
|
if not forceplay: |
|
db[chat_id] = [] |
|
await Drag.join_call(chat_id, original_chat_id, file_path, video=None) |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
file_path, |
|
title, |
|
duration_min, |
|
user_name, |
|
streamtype, |
|
user_id, |
|
"audio", |
|
forceplay=forceplay, |
|
) |
|
button = stream_markup(_, chat_id) |
|
run = await app.send_photo( |
|
original_chat_id, |
|
photo=config.SOUNCLOUD_IMG_URL, |
|
caption=_["stream_1"].format( |
|
config.SUPPORT_CHAT, title[:23], duration_min, user_name |
|
), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
db[chat_id][0]["mystic"] = run |
|
db[chat_id][0]["markup"] = "tg" |
|
elif streamtype == "telegram": |
|
file_path = result["path"] |
|
link = result["link"] |
|
title = (result["title"]).title() |
|
duration_min = result["dur"] |
|
status = True if video else None |
|
if await is_active_chat(chat_id): |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
file_path, |
|
title, |
|
duration_min, |
|
user_name, |
|
streamtype, |
|
user_id, |
|
"video" if video else "audio", |
|
) |
|
position = len(db.get(chat_id)) - 1 |
|
button = aq_markup(_, chat_id) |
|
await app.send_message( |
|
chat_id=original_chat_id, |
|
text=_["queue_4"].format(position, title[:27], duration_min, user_name), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
else: |
|
if not forceplay: |
|
db[chat_id] = [] |
|
await Drag.join_call(chat_id, original_chat_id, file_path, video=status) |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
file_path, |
|
title, |
|
duration_min, |
|
user_name, |
|
streamtype, |
|
user_id, |
|
"video" if video else "audio", |
|
forceplay=forceplay, |
|
) |
|
if video: |
|
await add_active_video_chat(chat_id) |
|
button = stream_markup(_, chat_id) |
|
run = await app.send_photo( |
|
original_chat_id, |
|
photo=config.TELEGRAM_VIDEO_URL if video else config.TELEGRAM_AUDIO_URL, |
|
caption=_["stream_1"].format(link, title[:23], duration_min, user_name), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
db[chat_id][0]["mystic"] = run |
|
db[chat_id][0]["markup"] = "tg" |
|
elif streamtype == "live": |
|
link = result["link"] |
|
vidid = result["vidid"] |
|
title = (result["title"]).title() |
|
thumbnail = result["thumb"] |
|
duration_min = "Live Track" |
|
status = True if video else None |
|
if await is_active_chat(chat_id): |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
f"live_{vidid}", |
|
title, |
|
duration_min, |
|
user_name, |
|
vidid, |
|
user_id, |
|
"video" if video else "audio", |
|
) |
|
position = len(db.get(chat_id)) - 1 |
|
button = aq_markup(_, chat_id) |
|
await app.send_message( |
|
chat_id=original_chat_id, |
|
text=_["queue_4"].format(position, title[:27], duration_min, user_name), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
else: |
|
if not forceplay: |
|
db[chat_id] = [] |
|
n, file_path = await YouTube.video(link) |
|
if n == 0: |
|
raise AssistantErr(_["str_3"]) |
|
await Drag.join_call( |
|
chat_id, |
|
original_chat_id, |
|
file_path, |
|
video=status, |
|
image=thumbnail if thumbnail else None, |
|
) |
|
await put_queue( |
|
chat_id, |
|
original_chat_id, |
|
f"live_{vidid}", |
|
title, |
|
duration_min, |
|
user_name, |
|
vidid, |
|
user_id, |
|
"video" if video else "audio", |
|
forceplay=forceplay, |
|
) |
|
img = await gen_thumb(vidid) |
|
button = stream_markup(_, chat_id) |
|
run = await app.send_photo( |
|
original_chat_id, |
|
photo=img, |
|
caption=_["stream_1"].format( |
|
f"https://t.me/{app.username}?start=info_{vidid}", |
|
title[:23], |
|
duration_min, |
|
user_name, |
|
), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
db[chat_id][0]["mystic"] = run |
|
db[chat_id][0]["markup"] = "tg" |
|
elif streamtype == "index": |
|
link = result |
|
title = "ɪɴᴅᴇx ᴏʀ ᴍ3ᴜ8 ʟɪɴᴋ" |
|
duration_min = "00:00" |
|
if await is_active_chat(chat_id): |
|
await put_queue_index( |
|
chat_id, |
|
original_chat_id, |
|
"index_url", |
|
title, |
|
duration_min, |
|
user_name, |
|
link, |
|
"video" if video else "audio", |
|
) |
|
position = len(db.get(chat_id)) - 1 |
|
button = aq_markup(_, chat_id) |
|
await mystic.edit_text( |
|
text=_["queue_4"].format(position, title[:27], duration_min, user_name), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
else: |
|
if not forceplay: |
|
db[chat_id] = [] |
|
await Drag.join_call( |
|
chat_id, |
|
original_chat_id, |
|
link, |
|
video=True if video else None, |
|
) |
|
await put_queue_index( |
|
chat_id, |
|
original_chat_id, |
|
"index_url", |
|
title, |
|
duration_min, |
|
user_name, |
|
link, |
|
"video" if video else "audio", |
|
forceplay=forceplay, |
|
) |
|
button = stream_markup(_, chat_id) |
|
run = await app.send_photo( |
|
original_chat_id, |
|
photo=config.STREAM_IMG_URL, |
|
caption=_["stream_2"].format(user_name), |
|
reply_markup=InlineKeyboardMarkup(button), |
|
) |
|
db[chat_id][0]["mystic"] = run |
|
db[chat_id][0]["markup"] = "tg" |
|
await mystic.delete() |