File size: 2,066 Bytes
f0ceee4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import argparse
from pytube import YouTube
from tqdm import tqdm
import os

def download_youtube_video(video_url, download_captions=False):
    progress_bar = None

    def progress_function(stream, chunk, bytes_remaining):
        nonlocal progress_bar
        if progress_bar is None:
            progress_bar = tqdm(total=stream.filesize, unit='B', unit_scale=True, desc="Downloading Video")
        current = stream.filesize - bytes_remaining
        progress_bar.n = current
        progress_bar.last_print_n = current
        progress_bar.update()

    if not os.path.exists('./downloads'):
        os.makedirs('./downloads')

    yt = YouTube(
        video_url,
        on_progress_callback=progress_function,
    )

    stream = yt.streams.get_highest_resolution()
    stream.download(output_path='./downloads')
    if progress_bar:
        progress_bar.close()

    if download_captions:
        caption = yt.captions.get('en') or yt.captions.get('a.en')
        if caption:
            caption_convert_to_srt = caption.generate_srt_captions()
            caption_convert_to_srt = caption_convert_to_srt.replace("\n\n", "\n")
            with open(os.path.join('./downloads', f"{yt.title}.srt"), "w", encoding="utf-8") as file:
                file.write(caption_convert_to_srt)
            print(f"Captions saved to 'downloads/{yt.title}.srt'")
        else:
            print("No English captions found for this video.")

def download_video(url, download_captions=False):
    video_path = './downloads/' + YouTube(url).streams.get_highest_resolution().default_filename
    download_youtube_video(url, download_captions)
    return video_path

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Download YouTube video and captions")
    parser.add_argument("video_url", help="YouTube video URL")
    parser.add_argument("--captions", action="store_true", help="Download captions if available")
    args = parser.parse_args()

    download_video(args.video_url, args.captions)