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) |