oceansweep's picture
Syncing latest changes, lets see what breaks
fa9a583 verified
raw
history blame
5.56 kB
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)}"