managementbot / Powers /utils /web_helpers.py
Captain Ezio
few changes...
11b3887
raw
history blame
6.53 kB
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