Spaces:
Paused
Paused
| # | |
| # Copyright (C) 2021-2022 by TeamYukki@Github, < https://github.com/TeamYukki >. | |
| # | |
| # This file is part of < https://github.com/TeamYukki/YukkiMusicBot > project, | |
| # and is released under the "GNU v3.0 License Agreement". | |
| # Please see < https://github.com/TeamYukki/YukkiMusicBot/blob/master/LICENSE > | |
| # | |
| # All rights reserved. | |
| import os | |
| from random import randint | |
| from typing import Union | |
| from pyrogram.types import InlineKeyboardMarkup | |
| import config | |
| from YukkiMusic import Carbon, YouTube, app | |
| from YukkiMusic.core.call import Yukki | |
| from YukkiMusic.misc import db | |
| from YukkiMusic.utils.database import (add_active_chat, | |
| add_active_video_chat, | |
| is_active_chat, | |
| is_video_allowed, music_on) | |
| from YukkiMusic.utils.exceptions import AssistantErr | |
| from YukkiMusic.utils.inline.play import (stream_markup, | |
| telegram_markup) | |
| from YukkiMusic.utils.inline.playlist import close_markup | |
| from YukkiMusic.utils.pastebin import Yukkibin | |
| from YukkiMusic.utils.stream.queue import put_queue, put_queue_index | |
| from YukkiMusic.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 video: | |
| if not await is_video_allowed(chat_id): | |
| raise AssistantErr(_["play_7"]) | |
| if forceplay: | |
| await Yukki.force_stop_stream(chat_id) | |
| if streamtype == "playlist": | |
| msg = f"{_['playlist_16']}\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"{_['playlist_17']} {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_16"]) | |
| await Yukki.join_call( | |
| chat_id, original_chat_id, file_path, video=status | |
| ) | |
| 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(_, vidid, chat_id) | |
| run = await app.send_photo( | |
| original_chat_id, | |
| photo=img, | |
| caption=_["stream_1"].format( | |
| user_name, | |
| f"https://t.me/{app.username}?start=info_{vidid}", | |
| ), | |
| reply_markup=InlineKeyboardMarkup(button), | |
| ) | |
| db[chat_id][0]["mystic"] = run | |
| db[chat_id][0]["markup"] = "stream" | |
| if count == 0: | |
| return | |
| else: | |
| link = await Yukkibin(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=_["playlist_18"].format(link, position), | |
| reply_markup=upl, | |
| ) | |
| elif streamtype == "youtube": | |
| link = result["link"] | |
| vidid = result["vidid"] | |
| title = (result["title"]).title() | |
| duration_min = result["duration_min"] | |
| status = True if video else None | |
| try: | |
| file_path, direct = await YouTube.download( | |
| vidid, mystic, videoid=True, video=status | |
| ) | |
| except: | |
| raise AssistantErr(_["play_16"]) | |
| 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 | |
| await app.send_message( | |
| original_chat_id, | |
| _["queue_4"].format( | |
| position, title[:30], duration_min, user_name | |
| ), | |
| ) | |
| else: | |
| if not forceplay: | |
| db[chat_id] = [] | |
| await Yukki.join_call( | |
| chat_id, original_chat_id, file_path, video=status | |
| ) | |
| 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(_, vidid, chat_id) | |
| run = await app.send_photo( | |
| original_chat_id, | |
| photo=img, | |
| caption=_["stream_1"].format( | |
| user_name, | |
| f"https://t.me/{app.username}?start=info_{vidid}", | |
| ), | |
| 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 | |
| await app.send_message( | |
| original_chat_id, | |
| _["queue_4"].format( | |
| position, title[:30], duration_min, user_name | |
| ), | |
| ) | |
| else: | |
| if not forceplay: | |
| db[chat_id] = [] | |
| await Yukki.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 = telegram_markup(_, chat_id) | |
| run = await app.send_photo( | |
| original_chat_id, | |
| photo=config.SOUNCLOUD_IMG_URL, | |
| caption=_["stream_3"].format( | |
| title, 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() | |
| direct=result["direct"] | |
| 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 | |
| await app.send_message( | |
| original_chat_id, | |
| _["queue_4"].format( | |
| position, title[:30], duration_min, user_name | |
| ), | |
| ) | |
| else: | |
| if not forceplay: | |
| db[chat_id] = [] | |
| await Yukki.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 = telegram_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_4"].format( | |
| title, link, 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() | |
| 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 | |
| await app.send_message( | |
| original_chat_id, | |
| _["queue_4"].format( | |
| position, title[:30], duration_min, user_name | |
| ), | |
| ) | |
| else: | |
| if not forceplay: | |
| db[chat_id] = [] | |
| n, file_path = await YouTube.video(link) | |
| if n == 0: | |
| raise AssistantErr(_["str_3"]) | |
| await Yukki.join_call( | |
| chat_id, original_chat_id, file_path, video=status | |
| ) | |
| 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 = telegram_markup(_, chat_id) | |
| run = await app.send_photo( | |
| original_chat_id, | |
| photo=img, | |
| caption=_["stream_1"].format( | |
| user_name, | |
| f"https://t.me/{app.username}?start=info_{vidid}", | |
| ), | |
| reply_markup=InlineKeyboardMarkup(button), | |
| ) | |
| db[chat_id][0]["mystic"] = run | |
| db[chat_id][0]["markup"] = "tg" | |
| elif streamtype == "index": | |
| link = result | |
| title = "Index or M3u8 Link" | |
| duration_min = "URL stream" | |
| 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 | |
| await mystic.edit_text( | |
| _["queue_4"].format( | |
| position, title[:30], duration_min, user_name | |
| ) | |
| ) | |
| else: | |
| if not forceplay: | |
| db[chat_id] = [] | |
| await Yukki.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 = telegram_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() | |
| elif streamtype == "nodownload": | |
| #print(chat_id,original_chat_id) | |
| link = result["link"] | |
| vidid = result["vidid"] | |
| title = (result["title"]).title() | |
| duration_min = result["duration_min"] | |
| status = True if video else None | |
| try: | |
| video_url, audio_url = await YouTube.audio_video_url_new( | |
| vidid, mystic, videoid=True, video=status | |
| ) | |
| except: | |
| raise AssistantErr(_["play_16"]) | |
| 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 | |
| await app.send_message( | |
| original_chat_id, | |
| _["queue_4"].format( | |
| position, title[:30], duration_min, user_name | |
| ), | |
| ) | |
| else: | |
| if not forceplay: | |
| db[chat_id] = [] | |
| await Yukki.live_call( | |
| chat_id, original_chat_id, video_url, audio_url, video=status | |
| ) | |
| await put_queue( | |
| chat_id, | |
| original_chat_id, | |
| 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(_, vidid, chat_id) | |
| run = await app.send_photo( | |
| original_chat_id, | |
| photo=img, | |
| caption=_["stream_1"].format( | |
| user_name, | |
| f"https://t.me/{app.username}?start=info_{vidid}", | |
| ), | |
| reply_markup=InlineKeyboardMarkup(button), | |
| ) | |
| db[chat_id][0]["mystic"] = run | |
| db[chat_id][0]["markup"] = "stream" |