File size: 5,560 Bytes
2b5d662
 
 
 
 
 
92d4e30
2b5d662
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
830ffb4
 
2b5d662
 
 
 
 
 
 
 
 
 
 
 
 
a21793c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2b5d662
 
 
92d4e30
 
2b5d662
 
92d4e30
2b5d662
92d4e30
2b5d662
a21793c
92d4e30
a21793c
92d4e30
2b5d662
 
 
 
 
 
 
 
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from pytube import YouTube
import os
import argparse
import twitchdl.commands as twitch_downloader
import twitchdl.twitch
from twitchdl.commands.download import _parse_playlists
from tqdm import tqdm

VIDEO_FOLDER = 'videos'
AUDIO_FOLDER = 'audios'

DOWNLOAD_VIDEO_NAME = 'download_video'
DOWNLOAD_AUDIO_NAME = 'download_audio'

DOWNLOAD_VIDEO_FORMAT = 'mp4'
DOWNLOAD_AUDIO_FORMAT = 'mp3'

DOWNLOAD_VIDEO = 'video'
DOWNLOAD_AUDIO = 'audio'

def download_twitch(url, type):
    # Create a new parser for the download command
    argparser = argparse.ArgumentParser(description='Download twitch video from URL')
    argparser.add_argument('--auth-token', default=None, help='Twitch auth token')
    argparser.add_argument('--chapter', default=None, help='Chapter to download')
    argparser.add_argument('--debug', default=False, help='Debug', action='store_true')
    argparser.add_argument('--end', default=None, help='End')
    argparser.add_argument('--format', default=f'{DOWNLOAD_VIDEO_FORMAT}', help='Format')
    argparser.add_argument('--keep', default=False, help='Keep', action='store_true')
    argparser.add_argument('--max_workers', default=5, help='Max workers')
    argparser.add_argument('--no_color', default=False, help='No color', action='store_true')
    argparser.add_argument('--no_join', default=False, help='No join', action='store_true')
    argparser.add_argument('--output', default=f'{VIDEO_FOLDER}/{DOWNLOAD_VIDEO_NAME}.{format}', help='Output')
    argparser.add_argument('--overwrite', default=False, help='Overwrite', action='store_true')
    argparser.add_argument('--quality', default=None, help='Quality')
    argparser.add_argument('--rate_limit', default=None, help='Rate limit')
    argparser.add_argument('--start', default=None, help='Start')
    argparser.add_argument('--version', default=False, help='Version', action='store_true')
    argparser.add_argument('videos', default=[url], help='Videos', nargs='+')
    args = argparser.parse_args()

    # Get qualitys
    access_token = twitchdl.twitch.get_access_token(1942562640, None)
    playlists_m3u8 = twitchdl.twitch.get_playlists(1942562640, access_token)
    playlists = list(_parse_playlists(playlists_m3u8))
    qualitys = [name for (name, _, _) in playlists]

    # Select quality
    if type == DOWNLOAD_VIDEO:
        args.quality = qualitys[0]
        if args.quality == '1080p' or args.quality == '720p':
            args.quality = f'{args.quality}60'
        args.format = DOWNLOAD_VIDEO_FORMAT
        args.output = f'{VIDEO_FOLDER}/{DOWNLOAD_VIDEO_NAME}.{args.format}'
    elif type == DOWNLOAD_AUDIO:
        args.quality = qualitys[-1]
        args.format = "mkv"
        args.output = f'{AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{args.format}'

    # Download
    twitch_downloader.download(args)
    if type == DOWNLOAD_AUDIO:
        os.system(f'ffmpeg -i {AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{args.format} -c:a libmp3lame -b:a 192k -stats -loglevel warning {AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{DOWNLOAD_AUDIO_FORMAT}')
        os.system(f'rm {AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{args.format}')

def download_youtube_video(url):
    yt = YouTube(url)

    # Get all video streams
    video_streams = yt.streams.filter(mime_type="video/mp4")

    # Get max resolution of video streams
    max_resolution = 0
    for stream in video_streams:
        if stream.audio_codec is not None:
            resolution = int(stream.resolution[:-1])
            if resolution > max_resolution:
                max_resolution = resolution
    max_resolution = f"{max_resolution}p"

    # Get stream with max resolution
    video_streams_max_resolution = video_streams.filter(resolution=max_resolution)
    for stream in video_streams_max_resolution:
        if stream.audio_codec is not None:
            video_stream = stream
    
    # Download video
    video_stream.download(filename=f'{VIDEO_FOLDER}/{DOWNLOAD_VIDEO_NAME}.{DOWNLOAD_VIDEO_FORMAT}')

def download_youtube_audio(url):
    yt = YouTube(url)

    # Get all audio streams
    audio_streams = yt.streams.filter(mime_type="audio/mp4")

    # Get sorted list of audio bitrates 
    abr_list = []
    for stream in audio_streams:
        abr_list.append(stream.abr)
    abr_list = sorted(set(abr_list))

    # Get stream with max audio bitrate
    audio_stream = audio_streams.filter(abr=abr_list[0]).first()

    # Download audio
    audio_stream.download(filename=f'{AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{DOWNLOAD_AUDIO_FORMAT}')

def download_youtube(url, type):
    if type == DOWNLOAD_VIDEO:
        download_youtube_video(url)
    elif type == DOWNLOAD_AUDIO:
        download_youtube_audio(url)
    else:
        print('Unknown youtube download type')

def main(args):
    url = args.url
    num_works = 2
    download_progress_bar = tqdm(total=num_works, desc='Downloading video and audio progress')
    if 'twitch' in url.lower():
        download_twitch(url, DOWNLOAD_VIDEO)
        download_progress_bar.update(1)
        download_twitch(url, DOWNLOAD_AUDIO)
        download_progress_bar.update(1)
    elif 'youtube' in url.lower() or 'youtu.be' in url.lower():
        download_youtube(url, DOWNLOAD_VIDEO)
        download_progress_bar.update(1)
        download_youtube(url, DOWNLOAD_AUDIO)
        download_progress_bar.update(1)
    else:
        print('Unknown video source')

if __name__ == "__main__":
    argparser = argparse.ArgumentParser(description='Download video from URL')
    argparser.add_argument('url', help='URL of video')
    args = argparser.parse_args()
    main(args)