File size: 5,691 Bytes
43cd37c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import os
import shutil
import tempfile
from pathlib import Path

import gradio as gr
import yt_dlp

from App_Function_Libraries.Utils.Utils import sanitize_filename, downloaded_files


def create_utilities_yt_video_tab():
    with gr.TabItem("YouTube Video Downloader", id='youtube_dl', visible=True):
        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.TabItem("YouTube Audio Downloader", id="youtube audio downloader", visible=True):
        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.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.TabItem("YouTube Timestamp URL Generator", id="timestamp-gen", visible=True):
        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)}"