Spaces:
Sleeping
Sleeping
import json | |
import os | |
from traceback import format_exc | |
from urllib import parse | |
from pyrogram.types import InlineKeyboardButton as IKB | |
from pyrogram.types import InlineKeyboardMarkup as IKM | |
from pyrogram.types import Message | |
# import yt_dlp | |
from pytube import YouTube | |
from youtubesearchpython.__future__ import Video, VideosSearch | |
from Powers.bot_class import LOGGER, MESSAGE_DUMP, Gojo | |
from Powers.utils.http_helper import * | |
from Powers.utils.sticker_help import resize_file_to_sticker_size | |
backUP = "https://artfiles.alphacoders.com/160/160160.jpeg" | |
async def get_file_size(file: Message): | |
if file.photo: | |
size = file.photo.file_size/1024 | |
elif file.document: | |
size = file.document.file_size/1024 | |
elif file.video: | |
size = file.video.file_size/1024 | |
elif file.audio: | |
size = file.audio.file_size/1024 | |
elif file.sticker: | |
size = file.sticker.file_size/1024 | |
elif file.animation: | |
size = file.animation.file_size/1024 | |
elif file.voice: | |
size = file.voice.file_size/1024 | |
elif file.video_note: | |
size = file.video_note.file_size/1024 | |
if size <= 1024: | |
return f"{round(size)} kb" | |
elif size > 1024: | |
size = size/1024 | |
if size <= 1024: | |
return f"{round(size)} mb" | |
elif size > 1024: | |
size = size/1024 | |
return f"{round(size)} gb" | |
def get_duration_in_sec(dur: str): | |
duration = dur.split(":") | |
if len(duration) == 2: | |
dur = (int(duration[0]) * 60) + int(duration[1]) | |
else: | |
dur = int(duration[0]) | |
return dur | |
# Gets yt result of given query. | |
async def song_search(query, is_direct, max_results=1): | |
yt_dict = {} | |
try: | |
if is_direct: | |
vid = Video.getInfo(query) | |
query = vid["title"] | |
else: | |
query = query | |
videos = VideosSearch(query,max_results) | |
results = await videos.next() | |
except Exception as e: | |
LOGGER.error(e) | |
LOGGER.error(format_exc()) | |
return yt_dict | |
nums = 1 | |
for i in results["result"]: | |
durr = i['duration'].split(":") | |
if len(durr) == 3: | |
hour_to_sec = int(durr[0])*60*60 | |
minutes_to_sec = int(durr[1])*60 | |
total = hour_to_sec + minutes_to_sec + int(durr[2]) | |
if len(durr) == 2: | |
minutes_to_sec = int(durr[0])*60 | |
total = minutes_to_sec + int(durr[1]) | |
if not (total > 600): | |
dict_form = { | |
"link": i["link"], | |
"title": i["title"], | |
"views": i["viewCount"]["short"], | |
"channel": i["channel"]["link"], | |
"duration": i["accessibility"]['duration'], | |
"DURATION": i["duration"], | |
"published": i["publishedTime"], | |
"uploader": i ["channel"]["name"] | |
} | |
try: | |
thumb = {"thumbnail": i["richThumbnail"]["url"]} | |
except Exception: | |
thumb = {"thumbnail": None} | |
dict_form.update(thumb) | |
yt_dict.update({nums: dict_form}) | |
nums += 1 | |
else: | |
pass | |
return yt_dict | |
"""song_opts = { | |
"format": "bestaudio", | |
"addmetadata": True, | |
"key": "FFmpegMetadata", | |
"writethumbnail": True, | |
"prefer_ffmpeg": True, | |
"geo_bypass": True, | |
"nocheckcertificate": True, | |
"postprocessors": [ | |
{ | |
"key": "FFmpegExtractAudio", | |
"preferredcodec": "mp3", | |
"preferredquality": "480", | |
} | |
], | |
"outtmpl": "%(id)s.mp3", | |
"quiet": True, | |
"logtostderr": False, | |
} | |
video_opts = { | |
"format": "best", | |
"addmetadata": True, | |
"key": "FFmpegMetadata", | |
"prefer_ffmpeg": True, | |
"geo_bypass": True, | |
"nocheckcertificate": True, | |
"postprocessors": [ | |
{ | |
"key": "FFmpegVideoConvertor", | |
"preferedformat": "mp4", | |
} | |
], | |
"outtmpl": "%(id)s.mp4", | |
"logtostderr": False, | |
"quiet": True, | |
}""" | |
async def youtube_downloader(c:Gojo,m:Message,query:str,is_direct:bool,type_:str): | |
if type_ == "a": | |
# opts = song_opts | |
video = False | |
song = True | |
elif type_ == "v": | |
# opts = video_opts | |
video = True | |
song = False | |
# ydl = yt_dlp.YoutubeDL(opts) | |
dicti = await song_search(query, is_direct,1) | |
if not dicti and type(dicti) != str: | |
await m.reply_text("File with duration less than or equals to 10 minutes is allowed only") | |
elif type(dicti) == str: | |
await m.reply_text(dicti) | |
return | |
try: | |
query = dicti[1]['link'] | |
except KeyError: | |
return | |
yt = YouTube(query) | |
dicti = dicti[1] | |
f_name = dicti["title"] | |
views = dicti["views"] | |
up_url = dicti["channel"] | |
uploader = dicti["uploader"] | |
dura = dicti["duration"] | |
thumb = dicti["thumbnail"] | |
vid_dur = get_duration_in_sec(dicti["DURATION"]) | |
published_on = dicti["published"] | |
if thumb: | |
thumb_ = await c.send_photo(MESSAGE_DUMP,thumb) | |
else: | |
thumb_ = await c.send_photo(MESSAGE_DUMP,backUP) | |
# FILE = ydl.extract_info(query,download=video) | |
url = query | |
thumb = await thumb_.download() | |
if not thumb: | |
thumb = await resize_file_to_sticker_size(thumb,320,320) | |
await thumb_.delete() | |
cap = f""" | |
⤷ Name: `{f_name}` | |
⤷ Duration: `{dura}` | |
⤷ Views: `{views}` | |
⤷ Published: `{published_on}` | |
Downloaded by: @{c.me.username} | |
""" | |
kb = IKM( | |
[ | |
[ | |
IKB(f"✘ {uploader.capitalize()} ✘",url=f"{up_url}") | |
], | |
[ | |
IKB(f"✘ Youtube url ✘", url=f"{url}") | |
] | |
] | |
) | |
if song: | |
audio_stream= yt.streams.filter(only_audio=True).first() | |
f_path = audio_stream.download() | |
# file_path = f"./youtube_downloads/{f_name.strip()}.mp3" | |
file_path = f"./{f_name.strip()}.mp3" | |
os.rename(f_path,file_path) | |
await m.reply_audio(file_path,caption=cap,reply_markup=kb,duration=vid_dur,thumb=thumb,title=f_name) | |
# os.remove(f_path) | |
os.remove(file_path) | |
os.remove(thumb) | |
return | |
elif video: | |
video_stream = yt.streams.get_highest_resolution() | |
file_path = video_stream.download() | |
# file_path = f"./youtube_downloads/{f_name}.mp4" | |
await m.reply_video(file_path,caption=cap,reply_markup=kb,duration=vid_dur,thumb=thumb) | |
os.remove(file_path) | |
os.remove(thumb) | |
return | |