privateone's picture
Update YukkiMusic/utils/stream/stream.py
405c029 verified
#
# 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"