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()