Spaces:
Running
Running
import os | |
import shutil | |
import tempfile | |
from pathlib import Path | |
import gradio as gr | |
import yt_dlp | |
from App_Function_Libraries.Utils import sanitize_filename, downloaded_files | |
def create_utilities_yt_video_tab(): | |
with gr.Tab("YouTube Video Downloader"): | |
with gr.Row(): | |
with gr.Column(): | |
gr.Markdown( | |
"<h3>Youtube Video Downloader</h3><p>This Input takes a Youtube URL as input and creates a webm file for you to download. </br><em>If you want a full-featured one:</em> <strong><em>https://github.com/StefanLobbenmeier/youtube-dl-gui</strong></em> or <strong><em>https://github.com/yt-dlg/yt-dlg</em></strong></p>") | |
youtube_url_input = gr.Textbox(label="YouTube URL", placeholder="Enter YouTube video URL here") | |
download_button = gr.Button("Download Video") | |
with gr.Column(): | |
output_file = gr.File(label="Download Video") | |
output_message = gr.Textbox(label="Status") | |
download_button.click( | |
fn=gradio_download_youtube_video, | |
inputs=youtube_url_input, | |
outputs=[output_file, output_message] | |
) | |
def create_utilities_yt_audio_tab(): | |
with gr.Tab("YouTube Audio Downloader"): | |
with gr.Row(): | |
with gr.Column(): | |
gr.Markdown( | |
"<h3>Youtube Audio Downloader</h3><p>This Input takes a Youtube URL as input and creates an audio file for you to download.</p>" | |
+"\n<em>If you want a full-featured one:</em> <strong><em>https://github.com/StefanLobbenmeier/youtube-dl-gui</strong></em>\n or \n<strong><em>https://github.com/yt-dlg/yt-dlg</em></strong></p>") | |
youtube_url_input_audio = gr.Textbox(label="YouTube URL", placeholder="Enter YouTube video URL here") | |
download_button_audio = gr.Button("Download Audio") | |
with gr.Column(): | |
output_file_audio = gr.File(label="Download Audio") | |
output_message_audio = gr.Textbox(label="Status") | |
from App_Function_Libraries.Audio_Files import download_youtube_audio | |
download_button_audio.click( | |
fn=download_youtube_audio, | |
inputs=youtube_url_input_audio, | |
outputs=[output_file_audio, output_message_audio] | |
) | |
def create_utilities_yt_timestamp_tab(): | |
with gr.Tab("YouTube Timestamp URL Generator"): | |
gr.Markdown("## Generate YouTube URL with Timestamp") | |
with gr.Row(): | |
with gr.Column(): | |
url_input = gr.Textbox(label="YouTube URL") | |
hours_input = gr.Number(label="Hours", value=0, minimum=0, precision=0) | |
minutes_input = gr.Number(label="Minutes", value=0, minimum=0, maximum=59, precision=0) | |
seconds_input = gr.Number(label="Seconds", value=0, minimum=0, maximum=59, precision=0) | |
generate_button = gr.Button("Generate URL") | |
with gr.Column(): | |
output_url = gr.Textbox(label="Timestamped URL") | |
from App_Function_Libraries.Video_DL_Ingestion_Lib import generate_timestamped_url | |
generate_button.click( | |
fn=generate_timestamped_url, | |
inputs=[url_input, hours_input, minutes_input, seconds_input], | |
outputs=output_url | |
) | |
def gradio_download_youtube_video(url): | |
try: | |
# Determine ffmpeg path based on the operating system. | |
ffmpeg_path = './Bin/ffmpeg.exe' if os.name == 'nt' else 'ffmpeg' | |
# Create a temporary directory | |
with tempfile.TemporaryDirectory() as temp_dir: | |
# Extract information about the video | |
with yt_dlp.YoutubeDL({'quiet': True}) as ydl: | |
info_dict = ydl.extract_info(url, download=False) | |
sanitized_title = sanitize_filename(info_dict['title']) | |
original_ext = info_dict['ext'] | |
# Setup the temporary filename | |
temp_file_path = Path(temp_dir) / f"{sanitized_title}.{original_ext}" | |
# Initialize yt-dlp with generic options and the output template | |
ydl_opts = { | |
'format': 'bestvideo+bestaudio/best', | |
'ffmpeg_location': ffmpeg_path, | |
'outtmpl': str(temp_file_path), | |
'noplaylist': True, | |
'quiet': True | |
} | |
# Execute yt-dlp to download the video | |
with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
ydl.download([url]) | |
# Final check to ensure file exists | |
if not temp_file_path.exists(): | |
raise FileNotFoundError(f"Expected file was not found: {temp_file_path}") | |
# Create a persistent directory for the download if it doesn't exist | |
persistent_dir = Path("downloads") | |
persistent_dir.mkdir(exist_ok=True) | |
# Move the file from the temporary directory to the persistent directory | |
persistent_file_path = persistent_dir / f"{sanitized_title}.{original_ext}" | |
shutil.move(str(temp_file_path), str(persistent_file_path)) | |
# Add the file to the list of downloaded files | |
downloaded_files.append(str(persistent_file_path)) | |
return str(persistent_file_path), f"Video downloaded successfully: {sanitized_title}.{original_ext}" | |
except Exception as e: | |
return None, f"Error downloading video: {str(e)}" | |