@ -40,45 +40,35 @@ __authors__ = (
__license__ = ' Public Domain '
__license__ = ' Public Domain '
import codecs
import codecs
import collections
import getpass
import getpass
import optparse
import optparse
import os
import os
import random
import random
import re
import re
import shlex
import shlex
import socket
import subprocess
import subprocess
import sys
import sys
import traceback
import platform
from .utils import (
from .utils import (
compat_cookiejar ,
compat_print ,
compat_print ,
compat_str ,
compat_urllib_request ,
DateRange ,
DateRange ,
decodeOption ,
decodeOption ,
determine_ext ,
determine_ext ,
DownloadError ,
DownloadError ,
get_cachedir ,
get_cachedir ,
make_HTTPS_handler ,
MaxDownloadsReached ,
MaxDownloadsReached ,
platform_name ,
preferredencoding ,
preferredencoding ,
SameFileError ,
SameFileError ,
std_headers ,
std_headers ,
write_string ,
write_string ,
YoutubeDLHandler ,
)
)
from .update import update_self
from .update import update_self
from .version import __version__
from .FileDownloader import (
from .FileDownloader import (
FileDownloader ,
FileDownloader ,
)
)
from .extractor import gen_extractors
from .extractor import gen_extractors
from .version import __version__
from .YoutubeDL import YoutubeDL
from .YoutubeDL import YoutubeDL
from .PostProcessor import (
from .PostProcessor import (
FFmpegMetadataPP ,
FFmpegMetadataPP ,
@ -451,19 +441,6 @@ def _real_main(argv=None):
parser , opts , args = parseOpts ( argv )
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
# Set user agent
if opts . user_agent is not None :
if opts . user_agent is not None :
std_headers [ ' User-Agent ' ] = opts . user_agent
std_headers [ ' User-Agent ' ] = opts . user_agent
@ -495,8 +472,6 @@ def _real_main(argv=None):
all_urls = batchurls + args
all_urls = batchurls + args
all_urls = [ url . strip ( ) for url in all_urls ]
all_urls = [ url . strip ( ) for url in all_urls ]
opener = _setup_opener ( jar = jar , opts = opts )
extractors = gen_extractors ( )
extractors = gen_extractors ( )
if opts . list_extractors :
if opts . list_extractors :
@ -551,7 +526,7 @@ def _real_main(argv=None):
if opts . retries is not None :
if opts . retries is not None :
try :
try :
opts . retries = int ( opts . retries )
opts . retries = int ( opts . retries )
except ( TypeError , ValueError ) as err :
except ( TypeError , ValueError ) :
parser . error ( u ' invalid retry count specified ' )
parser . error ( u ' invalid retry count specified ' )
if opts . buffersize is not None :
if opts . buffersize is not None :
numeric_buffersize = FileDownloader . parse_bytes ( opts . buffersize )
numeric_buffersize = FileDownloader . parse_bytes ( opts . buffersize )
@ -562,13 +537,13 @@ def _real_main(argv=None):
opts . playliststart = int ( opts . playliststart )
opts . playliststart = int ( opts . playliststart )
if opts . playliststart < = 0 :
if opts . playliststart < = 0 :
raise ValueError ( u ' Playlist start must be positive ' )
raise ValueError ( u ' Playlist start must be positive ' )
except ( TypeError , ValueError ) as err :
except ( TypeError , ValueError ) :
parser . error ( u ' invalid playlist start number specified ' )
parser . error ( u ' invalid playlist start number specified ' )
try :
try :
opts . playlistend = int ( opts . playlistend )
opts . playlistend = int ( opts . playlistend )
if opts . playlistend != - 1 and ( opts . playlistend < = 0 or opts . playlistend < opts . playliststart ) :
if opts . playlistend != - 1 and ( opts . playlistend < = 0 or opts . playlistend < opts . playliststart ) :
raise ValueError ( u ' Playlist end must be greater than playlist start ' )
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 ' )
parser . error ( u ' invalid playlist end number specified ' )
if opts . extractaudio :
if opts . extractaudio :
if opts . audioformat not in [ ' best ' , ' aac ' , ' mp3 ' , ' m4a ' , ' opus ' , ' vorbis ' , ' wav ' ] :
if opts . audioformat not in [ ' best ' , ' aac ' , ' mp3 ' , ' m4a ' , ' opus ' , ' vorbis ' , ' wav ' ] :
@ -671,34 +646,12 @@ def _real_main(argv=None):
' youtube_print_sig_code ' : opts . youtube_print_sig_code ,
' youtube_print_sig_code ' : opts . youtube_print_sig_code ,
' age_limit ' : opts . age_limit ,
' age_limit ' : opts . age_limit ,
' download_archive ' : opts . download_archive ,
' download_archive ' : opts . download_archive ,
' cookiefile ' : opts . cookiefile ,
' nocheckcertificate ' : opts . no_check_certificate ,
}
}
with YoutubeDL ( ydl_opts ) as ydl :
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 ( )
ydl . add_default_info_extractors ( )
# PostProcessors
# PostProcessors
@ -729,46 +682,9 @@ def _real_main(argv=None):
ydl . to_screen ( u ' --max-download limit reached, aborting. ' )
ydl . to_screen ( u ' --max-download limit reached, aborting. ' )
retcode = 101
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 )
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 ) :
def main ( argv = None ) :
try :
try :
_real_main ( argv )
_real_main ( argv )