|
from pytube import YouTube |
|
import os |
|
import argparse |
|
import twitchdl.commands as twitch_downloader |
|
import twitchdl.twitch |
|
from twitchdl.commands.download import _parse_playlists |
|
|
|
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): |
|
|
|
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() |
|
|
|
|
|
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] |
|
|
|
|
|
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}' |
|
|
|
|
|
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) |
|
|
|
|
|
video_streams = yt.streams.filter(mime_type="video/mp4") |
|
|
|
|
|
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" |
|
|
|
|
|
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 |
|
|
|
|
|
video_stream.download(filename=f'{VIDEO_FOLDER}/{DOWNLOAD_VIDEO_NAME}.{DOWNLOAD_VIDEO_FORMAT}') |
|
|
|
def download_youtube_audio(url): |
|
yt = YouTube(url) |
|
|
|
|
|
audio_streams = yt.streams.filter(mime_type="audio/mp4") |
|
|
|
|
|
abr_list = [] |
|
for stream in audio_streams: |
|
abr_list.append(stream.abr) |
|
abr_list = sorted(set(abr_list)) |
|
|
|
|
|
audio_stream = audio_streams.filter(abr=abr_list[0]).first() |
|
|
|
|
|
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 |
|
if 'twitch' in url.lower(): |
|
download_twitch(url, DOWNLOAD_VIDEO) |
|
download_twitch(url, DOWNLOAD_AUDIO) |
|
elif 'youtube' in url.lower() or 'youtu.be' in url.lower(): |
|
download_youtube(url, DOWNLOAD_VIDEO) |
|
download_youtube(url, DOWNLOAD_AUDIO) |
|
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) |