71 lines
2.9 KiB
Python
71 lines
2.9 KiB
Python
import os,sys
|
|
import glob
|
|
import re
|
|
import subprocess
|
|
from core.utils import *
|
|
|
|
def sanitize_filename(filename):
|
|
# Remove or replace illegal characters
|
|
filename = re.sub(r'[<>:"/\\|?*]', '', filename)
|
|
# Ensure filename doesn't start or end with a dot or space
|
|
filename = filename.strip('. ')
|
|
# Use default name if filename is empty
|
|
return filename if filename else 'video'
|
|
|
|
def update_ytdlp():
|
|
try:
|
|
subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", "yt-dlp"])
|
|
if 'yt_dlp' in sys.modules:
|
|
del sys.modules['yt_dlp']
|
|
rprint("[green]yt-dlp updated[/green]")
|
|
except subprocess.CalledProcessError as e:
|
|
rprint("[yellow]Warning: Failed to update yt-dlp: {e}[/yellow]")
|
|
from yt_dlp import YoutubeDL
|
|
return YoutubeDL
|
|
|
|
def download_video_ytdlp(url, save_path='output', resolution='1080'):
|
|
os.makedirs(save_path, exist_ok=True)
|
|
ydl_opts = {
|
|
'format': 'bestvideo+bestaudio/best' if resolution == 'best' else f'bestvideo[height<={resolution}]+bestaudio/best[height<={resolution}]',
|
|
'outtmpl': f'{save_path}/%(title)s.%(ext)s',
|
|
'noplaylist': True,
|
|
'writethumbnail': True,
|
|
'postprocessors': [{'key': 'FFmpegThumbnailsConvertor', 'format': 'jpg'}],
|
|
}
|
|
|
|
# Read Youtube Cookie File
|
|
cookies_path = load_key("youtube.cookies_path")
|
|
if os.path.exists(cookies_path):
|
|
ydl_opts["cookiefile"] = str(cookies_path)
|
|
|
|
# Get YoutubeDL class after updating
|
|
YoutubeDL = update_ytdlp()
|
|
with YoutubeDL(ydl_opts) as ydl:
|
|
ydl.download([url])
|
|
|
|
# Check and rename files after download
|
|
for file in os.listdir(save_path):
|
|
if os.path.isfile(os.path.join(save_path, file)):
|
|
filename, ext = os.path.splitext(file)
|
|
new_filename = sanitize_filename(filename)
|
|
if new_filename != filename:
|
|
os.rename(os.path.join(save_path, file), os.path.join(save_path, new_filename + ext))
|
|
|
|
def find_video_files(save_path='output'):
|
|
video_files = [file for file in glob.glob(save_path + "/*") if os.path.splitext(file)[1][1:].lower() in load_key("allowed_video_formats")]
|
|
# change \\ to /, this happen on windows
|
|
if sys.platform.startswith('win'):
|
|
video_files = [file.replace("\\", "/") for file in video_files]
|
|
video_files = [file for file in video_files if not file.startswith("output/output")]
|
|
if len(video_files) != 1:
|
|
raise ValueError(f"Number of videos found {len(video_files)} is not unique. Please check.")
|
|
return video_files[0]
|
|
|
|
if __name__ == '__main__':
|
|
# Example usage
|
|
url = input('Please enter the URL of the video you want to download: ')
|
|
resolution = input('Please enter the desired resolution (360/480/720/1080, default 1080): ')
|
|
resolution = int(resolution) if resolution.isdigit() else 1080
|
|
download_video_ytdlp(url, resolution=resolution)
|
|
print(f"🎥 Video has been downloaded to {find_video_files()}")
|