|
|
|
|
|
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 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, |
|
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: |
|
|
|
vid = yt.get(args.ext, args.res) |
|
|
|
if not vid: |
|
print "\nThere's no video with the specified format/resolution combination.\n" |
|
pprint(res_formts) |
|
sys.exit(1) |
|
|
|
elif args.ext: |
|
|
|
videos = yt.filter(extension=args.ext) |
|
|
|
if not videos: |
|
print "There are no videos in the specified format." |
|
sys.exit(1) |
|
|
|
vid = max(videos) |
|
elif args.res: |
|
|
|
videos = yt.filter(res=args.res) |
|
|
|
if not videos: |
|
print "There are no videos in the specified in the specified resolution." |
|
sys.exit(1) |
|
|
|
vid = max(videos) |
|
else: |
|
|
|
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() |
|
|