|
|
@ -41,45 +41,35 @@ __authors__ = ( |
|
|
|
__license__ = 'Public Domain' |
|
|
|
|
|
|
|
import codecs |
|
|
|
import collections |
|
|
|
import getpass |
|
|
|
import optparse |
|
|
|
import os |
|
|
|
import random |
|
|
|
import re |
|
|
|
import shlex |
|
|
|
import socket |
|
|
|
import subprocess |
|
|
|
import sys |
|
|
|
import traceback |
|
|
|
import platform |
|
|
|
|
|
|
|
|
|
|
|
from .utils import ( |
|
|
|
compat_cookiejar, |
|
|
|
compat_print, |
|
|
|
compat_str, |
|
|
|
compat_urllib_request, |
|
|
|
DateRange, |
|
|
|
decodeOption, |
|
|
|
determine_ext, |
|
|
|
DownloadError, |
|
|
|
get_cachedir, |
|
|
|
make_HTTPS_handler, |
|
|
|
MaxDownloadsReached, |
|
|
|
platform_name, |
|
|
|
preferredencoding, |
|
|
|
SameFileError, |
|
|
|
std_headers, |
|
|
|
write_string, |
|
|
|
YoutubeDLHandler, |
|
|
|
) |
|
|
|
from .update import update_self |
|
|
|
from .version import __version__ |
|
|
|
from .FileDownloader import ( |
|
|
|
FileDownloader, |
|
|
|
) |
|
|
|
from .extractor import gen_extractors |
|
|
|
from .version import __version__ |
|
|
|
from .YoutubeDL import YoutubeDL |
|
|
|
from .PostProcessor import ( |
|
|
|
FFmpegMetadataPP, |
|
|
@ -452,19 +442,6 @@ def _real_main(argv=None): |
|
|
|
|
|
|
|
parser, opts, args = parseOpts(argv) |
|
|
|
|
|
|
|
# Open appropriate CookieJar |
|
|
|
if opts.cookiefile is None: |
|
|
|
jar = compat_cookiejar.CookieJar() |
|
|
|
else: |
|
|
|
try: |
|
|
|
jar = compat_cookiejar.MozillaCookieJar(opts.cookiefile) |
|
|
|
if os.access(opts.cookiefile, os.R_OK): |
|
|
|
jar.load() |
|
|
|
except (IOError, OSError) as err: |
|
|
|
if opts.verbose: |
|
|
|
traceback.print_exc() |
|
|
|
write_string(u'ERROR: unable to open cookie file\n') |
|
|
|
sys.exit(101) |
|
|
|
# Set user agent |
|
|
|
if opts.user_agent is not None: |
|
|
|
std_headers['User-Agent'] = opts.user_agent |
|
|
@ -496,8 +473,6 @@ def _real_main(argv=None): |
|
|
|
all_urls = batchurls + args |
|
|
|
all_urls = [url.strip() for url in all_urls] |
|
|
|
|
|
|
|
opener = _setup_opener(jar=jar, opts=opts) |
|
|
|
|
|
|
|
extractors = gen_extractors() |
|
|
|
|
|
|
|
if opts.list_extractors: |
|
|
@ -552,7 +527,7 @@ def _real_main(argv=None): |
|
|
|
if opts.retries is not None: |
|
|
|
try: |
|
|
|
opts.retries = int(opts.retries) |
|
|
|
except (TypeError, ValueError) as err: |
|
|
|
except (TypeError, ValueError): |
|
|
|
parser.error(u'invalid retry count specified') |
|
|
|
if opts.buffersize is not None: |
|
|
|
numeric_buffersize = FileDownloader.parse_bytes(opts.buffersize) |
|
|
@ -563,13 +538,13 @@ def _real_main(argv=None): |
|
|
|
opts.playliststart = int(opts.playliststart) |
|
|
|
if opts.playliststart <= 0: |
|
|
|
raise ValueError(u'Playlist start must be positive') |
|
|
|
except (TypeError, ValueError) as err: |
|
|
|
except (TypeError, ValueError): |
|
|
|
parser.error(u'invalid playlist start number specified') |
|
|
|
try: |
|
|
|
opts.playlistend = int(opts.playlistend) |
|
|
|
if opts.playlistend != -1 and (opts.playlistend <= 0 or opts.playlistend < opts.playliststart): |
|
|
|
raise ValueError(u'Playlist end must be greater than playlist start') |
|
|
|
except (TypeError, ValueError) as err: |
|
|
|
except (TypeError, ValueError): |
|
|
|
parser.error(u'invalid playlist end number specified') |
|
|
|
if opts.extractaudio: |
|
|
|
if opts.audioformat not in ['best', 'aac', 'mp3', 'm4a', 'opus', 'vorbis', 'wav']: |
|
|
@ -672,34 +647,12 @@ def _real_main(argv=None): |
|
|
|
'youtube_print_sig_code': opts.youtube_print_sig_code, |
|
|
|
'age_limit': opts.age_limit, |
|
|
|
'download_archive': opts.download_archive, |
|
|
|
'cookiefile': opts.cookiefile, |
|
|
|
'nocheckcertificate': opts.no_check_certificate, |
|
|
|
} |
|
|
|
|
|
|
|
with YoutubeDL(ydl_opts) as ydl: |
|
|
|
if opts.verbose: |
|
|
|
write_string(u'[debug] youtube-dl version ' + __version__ + u'\n') |
|
|
|
try: |
|
|
|
sp = subprocess.Popen( |
|
|
|
['git', 'rev-parse', '--short', 'HEAD'], |
|
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
|
|
|
cwd=os.path.dirname(os.path.abspath(__file__))) |
|
|
|
out, err = sp.communicate() |
|
|
|
out = out.decode().strip() |
|
|
|
if re.match('[0-9a-f]+', out): |
|
|
|
write_string(u'[debug] Git HEAD: ' + out + u'\n') |
|
|
|
except: |
|
|
|
try: |
|
|
|
sys.exc_clear() |
|
|
|
except: |
|
|
|
pass |
|
|
|
write_string(u'[debug] Python version %s - %s' % |
|
|
|
(platform.python_version(), platform_name()) + u'\n') |
|
|
|
|
|
|
|
proxy_map = {} |
|
|
|
for handler in opener.handlers: |
|
|
|
if hasattr(handler, 'proxies'): |
|
|
|
proxy_map.update(handler.proxies) |
|
|
|
write_string(u'[debug] Proxy map: ' + compat_str(proxy_map) + u'\n') |
|
|
|
|
|
|
|
ydl.print_debug_header() |
|
|
|
ydl.add_default_info_extractors() |
|
|
|
|
|
|
|
# PostProcessors |
|
|
@ -730,46 +683,9 @@ def _real_main(argv=None): |
|
|
|
ydl.to_screen(u'--max-download limit reached, aborting.') |
|
|
|
retcode = 101 |
|
|
|
|
|
|
|
# Dump cookie jar if requested |
|
|
|
if opts.cookiefile is not None: |
|
|
|
try: |
|
|
|
jar.save() |
|
|
|
except (IOError, OSError): |
|
|
|
sys.exit(u'ERROR: unable to save cookie jar') |
|
|
|
|
|
|
|
sys.exit(retcode) |
|
|
|
|
|
|
|
|
|
|
|
def _setup_opener(jar=None, opts=None, timeout=300): |
|
|
|
if opts is None: |
|
|
|
FakeOptions = collections.namedtuple( |
|
|
|
'FakeOptions', ['proxy', 'no_check_certificate']) |
|
|
|
opts = FakeOptions(proxy=None, no_check_certificate=False) |
|
|
|
|
|
|
|
cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar) |
|
|
|
if opts.proxy is not None: |
|
|
|
if opts.proxy == '': |
|
|
|
proxies = {} |
|
|
|
else: |
|
|
|
proxies = {'http': opts.proxy, 'https': opts.proxy} |
|
|
|
else: |
|
|
|
proxies = compat_urllib_request.getproxies() |
|
|
|
# Set HTTPS proxy to HTTP one if given (https://github.com/rg3/youtube-dl/issues/805) |
|
|
|
if 'http' in proxies and 'https' not in proxies: |
|
|
|
proxies['https'] = proxies['http'] |
|
|
|
proxy_handler = compat_urllib_request.ProxyHandler(proxies) |
|
|
|
https_handler = make_HTTPS_handler(opts) |
|
|
|
opener = compat_urllib_request.build_opener( |
|
|
|
https_handler, proxy_handler, cookie_processor, YoutubeDLHandler()) |
|
|
|
# Delete the default user-agent header, which would otherwise apply in |
|
|
|
# cases where our custom HTTP handler doesn't come into play |
|
|
|
# (See https://github.com/rg3/youtube-dl/issues/1309 for details) |
|
|
|
opener.addheaders = [] |
|
|
|
compat_urllib_request.install_opener(opener) |
|
|
|
socket.setdefaulttimeout(timeout) |
|
|
|
return opener |
|
|
|
|
|
|
|
|
|
|
|
def main(argv=None): |
|
|
|
try: |
|
|
|
_real_main(argv) |
|
|
|