import os from random import randint from typing import Union from pyrogram.types import InlineKeyboardMarkup import config from Devine import Carbon, YouTube, app from Devine.core.call import Anony from Devine.misc import db from Devine.utils.database import add_active_video_chat, is_active_chat from Devine.utils.exceptions import AssistantErr from Devine.utils.inline import aq_markup, close_markup, stream_markup from Devine.utils.pastebin import AnonyBin from Devine.utils.stream.queue import put_queue, put_queue_index from Devine.utils.thumbnails import get_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 Anony.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 Anony.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 get_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 AnonyBin(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 Anony.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 get_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 Anony.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 Anony.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 Anony.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 get_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 Anony.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()