#!/usr/bin/env python from __future__ import print_function from pytube import YouTube from pytube.utils import print_status from pytube.utils import FullPaths from pytube.exceptions import YouTubeError from pprint import pprint import sys import os import argparse def _main(): parser = argparse.ArgumentParser(description='YouTube video downloader') parser.add_argument("url", help="The URL of the Video to be downloaded") parser.add_argument("--extension", "-e", help="The requested format of the video", dest="ext") parser.add_argument("--resolution", "-r", help="The requested resolution", dest="res") parser.add_argument("--path", "-p", action=FullPaths, default=os.getcwd(), help="The path to save the video to.", dest="path") parser.add_argument("--filename", "-f", dest="filename", help=("The filename, without extension, " "to save the video in.")) args = parser.parse_args() yt = YouTube() try: yt.url = args.url res_formts = yt.videos res_formts = ["%s %s" % (str(res_formts[index].extension), str(res_formts[index].resolution)) for index, video in enumerate(res_formts)] except YouTubeError: print("Incorrect video URL.") sys.exit(1) if args.filename: yt.filename = args.filename if args.ext or args.res: if not all([args.ext, args.res]): print("\nMake sure you give either of the below specified format/resolution combination.\n") pprint(res_formts) sys.exit(1) if args.ext and args.res: # There's only ope video that matches both so get it vid = yt.get(args.ext, args.res) # Check if there's a video returned if not vid: print("\nThere's no video with the specified format/resolution combination.\n") pprint(res_formts) sys.exit(1) elif args.ext: # There are several videos with the same extension videos = yt.filter(extension=args.ext) # Check if we have a video if not videos: print("There are no videos in the specified format.") sys.exit(1) # Select the highest resolution one vid = max(videos) elif args.res: # There might be several videos in the same resolution videos = yt.filter(res=args.res) # Check if we have a video if not videos: print("There are no videos in the specified in the specified resolution.") sys.exit(1) # Select the highest resolution one vid = max(videos) else: # If nothing is specified get the highest resolution one vid = max(yt.videos) try: vid.download(path=args.path, on_progress=print_status) except KeyboardInterrupt: print("Download interrupted.") sys.exit(1) if __name__ == '__main__': _main()