]>
 
 
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/__init__.py 
 
 
 
 
 
 
 
 
   2  # -*- coding: utf-8 -*-  
   5      'Ricardo Garcia Gonzalez' ,  
  13      'Philipp Hagemeister' ,  
  21      'Jaime Marquínez Ferrándiz' ,  
  25      'M. Yasoob Ullah Khalid' ,  
  31  __license__ 
=  'Public Domain'  
  46  from  . update 
import  update_self
 
  47  from  . version 
import  __version__
 
  48  from  . FileDownloader 
import  *  
  49  from  . extractor 
import  gen_extractors
 
  50  from  . YoutubeDL 
import  YoutubeDL
 
  51  from  . PostProcessor 
import  *  
  53  def  parseOpts ( overrideArguments
= None ):  
  54      def  _readOptions ( filename_bytes
):  
  56              optionf 
=  open ( filename_bytes
)  
  58              return  []  # silently skip if file is not present  
  62                  res 
+=  shlex
. split ( l
,  comments
= True )  
  67      def  _format_option_string ( option
):  
  68          ''' ('-o', '--option') -> -o, --format METAVAR'''  
  72          if  option
._ short
_ opts
:  
  73              opts
. append ( option
._ short
_ opts
[ 0 ])  
  75              opts
. append ( option
._l ong
_ opts
[ 0 ])  
  79          if  option
. takes_value ():  opts
. append ( '  %s '  %  option
. metavar
)  
  83      def  _find_term_columns ():  
  84          columns 
=  os
. environ
. get ( 'COLUMNS' ,  None )  
  89              sp 
=  subprocess
. Popen ([ 'stty' ,  'size' ],  stdout
= subprocess
. PIPE
,  stderr
= subprocess
. PIPE
)  
  90              out
, err 
=  sp
. communicate ()  
  91              return  int ( out
. split ()[ 1 ])  
  97      max_help_position 
=  80  
  99      # No need to wrap help messages if we're on a wide console  
 100      columns 
=  _find_term_columns ()  
 101      if  columns
:  max_width 
=  columns
 
 103      fmt 
=  optparse
. IndentedHelpFormatter ( width
= max_width
,  max_help_position
= max_help_position
)  
 104      fmt
. format_option_strings 
=  _format_option_string
 
 107          'version'    :  __version__
,  
 109          'usage'  :  '%prog [options] url [url...]' ,  
 110          'conflict_handler'  :  'resolve' ,  
 113      parser 
=  optparse
. OptionParser (** kw
)  
 116      general        
=  optparse
. OptionGroup ( parser
,  'General Options' )  
 117      selection      
=  optparse
. OptionGroup ( parser
,  'Video Selection' )  
 118      authentication 
=  optparse
. OptionGroup ( parser
,  'Authentication Options' )  
 119      video_format   
=  optparse
. OptionGroup ( parser
,  'Video Format Options' )  
 120      postproc       
=  optparse
. OptionGroup ( parser
,  'Post-processing Options' )  
 121      filesystem     
=  optparse
. OptionGroup ( parser
,  'Filesystem Options' )  
 122      verbosity      
=  optparse
. OptionGroup ( parser
,  'Verbosity / Simulation Options' )  
 124      general
. add_option ( '-h' ,  '--help' ,  
 125              action
= 'help' ,  help = 'print this help text and exit' )  
 126      general
. add_option ( '-v' ,  '--version' ,  
 127              action
= 'version' ,  help = 'print program version and exit' )  
 128      general
. add_option ( '-U' ,  '--update' ,  
 129              action
= 'store_true' ,  dest
= 'update_self' ,  help = 'update this program to latest version' )  
 130      general
. add_option ( '-i' ,  '--ignore-errors' ,  
 131              action
= 'store_true' ,  dest
= 'ignoreerrors' ,  help = 'continue on download errors' ,  default
= False )  
 132      general
. add_option ( '-r' ,  '--rate-limit' ,  
 133              dest
= 'ratelimit' ,  metavar
= 'LIMIT' ,  help = 'maximum download rate (e.g. 50k or 44.6m)' )  
 134      general
. add_option ( '-R' ,  '--retries' ,  
 135              dest
= 'retries' ,  metavar
= 'RETRIES' ,  help = 'number of retries (default is  %def ault)' ,  default
= 10 )  
 136      general
. add_option ( '--buffer-size' ,  
 137              dest
= 'buffersize' ,  metavar
= 'SIZE' ,  help = 'size of download buffer (e.g. 1024 or 16k) (default is  %def ault)' ,  default
= "1024" )  
 138      general
. add_option ( '--no-resize-buffer' ,  
 139              action
= 'store_true' ,  dest
= 'noresizebuffer' ,  
 140              help = 'do not automatically adjust the buffer size. By default, the buffer size is automatically resized from an initial value of SIZE.' ,  default
= False )  
 141      general
. add_option ( '--dump-user-agent' ,  
 142              action
= 'store_true' ,  dest
= 'dump_user_agent' ,  
 143              help = 'display the current browser identification' ,  default
= False )  
 144      general
. add_option ( '--user-agent' ,  
 145              dest
= 'user_agent' ,  help = 'specify a custom user agent' ,  metavar
= 'UA' )  
 146      general
. add_option ( '--referer' ,  
 147              dest
= 'referer' ,  help = 'specify a custom referer, use if the video access is restricted to one domain' ,  
 148              metavar
= 'REF' ,  default
= None )  
 149      general
. add_option ( '--list-extractors' ,  
 150              action
= 'store_true' ,  dest
= 'list_extractors' ,  
 151              help = 'List all supported extractors and the URLs they would handle' ,  default
= False )  
 152      general
. add_option ( '--proxy' ,  dest
= 'proxy' ,  default
= None ,  help = 'Use the specified HTTP/HTTPS proxy' ,  metavar
= 'URL' )  
 153      general
. add_option ( '--no-check-certificate' ,  action
= 'store_true' ,  dest
= 'no_check_certificate' ,  default
= False ,  help = 'Suppress HTTPS certificate validation.' )  
 154      general
. add_option ( '--test' ,  action
= 'store_true' ,  dest
= 'test' ,  default
= False ,  help = optparse
. SUPPRESS_HELP
)  
 156      selection
. add_option ( '--playlist-start' ,  
 157              dest
= 'playliststart' ,  metavar
= 'NUMBER' ,  help = 'playlist video to start at (default is  %def ault)' ,  default
= 1 )  
 158      selection
. add_option ( '--playlist-end' ,  
 159              dest
= 'playlistend' ,  metavar
= 'NUMBER' ,  help = 'playlist video to end at (default is last)' ,  default
=- 1 )  
 160      selection
. add_option ( '--match-title' ,  dest
= 'matchtitle' ,  metavar
= 'REGEX' , help = 'download only matching titles (regex or caseless sub-string)' )  
 161      selection
. add_option ( '--reject-title' ,  dest
= 'rejecttitle' ,  metavar
= 'REGEX' , help = 'skip download for matching titles (regex or caseless sub-string)' )  
 162      selection
. add_option ( '--max-downloads' ,  metavar
= 'NUMBER' ,  dest
= 'max_downloads' ,  help = 'Abort after downloading NUMBER files' ,  default
= None )  
 163      selection
. add_option ( '--min-filesize' ,  metavar
= 'SIZE' ,  dest
= 'min_filesize' ,  help = "Do not download any videos smaller than SIZE (e.g. 50k or 44.6m)" ,  default
= None )  
 164      selection
. add_option ( '--max-filesize' ,  metavar
= 'SIZE' ,  dest
= 'max_filesize' ,  help = "Do not download any videos larger than SIZE (e.g. 50k or 44.6m)" ,  default
= None )  
 165      selection
. add_option ( '--date' ,  metavar
= 'DATE' ,  dest
= 'date' ,  help = 'download only videos uploaded in this date' ,  default
= None )  
 166      selection
. add_option ( '--datebefore' ,  metavar
= 'DATE' ,  dest
= 'datebefore' ,  help = 'download only videos uploaded before this date' ,  default
= None )  
 167      selection
. add_option ( '--dateafter' ,  metavar
= 'DATE' ,  dest
= 'dateafter' ,  help = 'download only videos uploaded after this date' ,  default
= None )  
 170      authentication
. add_option ( '-u' ,  '--username' ,  
 171              dest
= 'username' ,  metavar
= 'USERNAME' ,  help = 'account username' )  
 172      authentication
. add_option ( '-p' ,  '--password' ,  
 173              dest
= 'password' ,  metavar
= 'PASSWORD' ,  help = 'account password' )  
 174      authentication
. add_option ( '-n' ,  '--netrc' ,  
 175              action
= 'store_true' ,  dest
= 'usenetrc' ,  help = 'use .netrc authentication data' ,  default
= False )  
 176      authentication
. add_option ( '--video-password' ,  
 177              dest
= 'videopassword' ,  metavar
= 'PASSWORD' ,  help = 'video password (vimeo only)' )  
 180      video_format
. add_option ( '-f' ,  '--format' ,  
 181              action
= 'store' ,  dest
= 'format' ,  metavar
= 'FORMAT' ,  
 182              help = 'video format code, specifiy the order of preference using slashes: "-f 22/17/18"' )  
 183      video_format
. add_option ( '--all-formats' ,  
 184              action
= 'store_const' ,  dest
= 'format' ,  help = 'download all available video formats' ,  const
= 'all' )  
 185      video_format
. add_option ( '--prefer-free-formats' ,  
 186              action
= 'store_true' ,  dest
= 'prefer_free_formats' ,  default
= False ,  help = 'prefer free video formats unless a specific one is requested' )  
 187      video_format
. add_option ( '--max-quality' ,  
 188              action
= 'store' ,  dest
= 'format_limit' ,  metavar
= 'FORMAT' ,  help = 'highest quality format to download' )  
 189      video_format
. add_option ( '-F' ,  '--list-formats' ,  
 190              action
= 'store_true' ,  dest
= 'listformats' ,  help = 'list all available formats (currently youtube only)' )  
 191      video_format
. add_option ( '--write-sub' ,  '--write-srt' ,  
 192              action
= 'store_true' ,  dest
= 'writesubtitles' ,  
 193              help = 'write subtitle file (currently youtube only)' ,  default
= False )  
 194      video_format
. add_option ( '--write-auto-sub' ,  '--write-automatic-sub' ,  
 195              action
= 'store_true' ,  dest
= 'writeautomaticsub' ,  
 196              help = 'write automatic subtitle file (currently youtube only)' ,  default
= False )  
 197      video_format
. add_option ( '--only-sub' ,  
 198              action
= 'store_true' ,  dest
= 'skip_download' ,  
 199              help = '[deprecated] alias of --skip-download' ,  default
= False )  
 200      video_format
. add_option ( '--all-subs' ,  
 201              action
= 'store_true' ,  dest
= 'allsubtitles' ,  
 202              help = 'downloads all the available subtitles of the video (currently youtube only)' ,  default
= False )  
 203      video_format
. add_option ( '--list-subs' ,  
 204              action
= 'store_true' ,  dest
= 'listsubtitles' ,  
 205              help = 'lists all available subtitles for the video (currently youtube only)' ,  default
= False )  
 206      video_format
. add_option ( '--sub-format' ,  
 207              action
= 'store' ,  dest
= 'subtitlesformat' ,  metavar
= 'FORMAT' ,  
 208              help = 'subtitle format [srt/sbv/vtt] (default=srt) (currently youtube only)' ,  default
= 'srt' )  
 209      video_format
. add_option ( '--sub-lang' ,  '--srt-lang' ,  
 210              action
= 'store' ,  dest
= 'subtitleslang' ,  metavar
= 'LANG' ,  
 211              help = 'language of the subtitles to download (optional) use IETF language tags like  \' en \' ' )  
 213      verbosity
. add_option ( '-q' ,  '--quiet' ,  
 214              action
= 'store_true' ,  dest
= 'quiet' ,  help = 'activates quiet mode' ,  default
= False )  
 215      verbosity
. add_option ( '-s' ,  '--simulate' ,  
 216              action
= 'store_true' ,  dest
= 'simulate' ,  help = 'do not download the video and do not write anything to disk' ,  default
= False )  
 217      verbosity
. add_option ( '--skip-download' ,  
 218              action
= 'store_true' ,  dest
= 'skip_download' ,  help = 'do not download the video' ,  default
= False )  
 219      verbosity
. add_option ( '-g' ,  '--get-url' ,  
 220              action
= 'store_true' ,  dest
= 'geturl' ,  help = 'simulate, quiet but print URL' ,  default
= False )  
 221      verbosity
. add_option ( '-e' ,  '--get-title' ,  
 222              action
= 'store_true' ,  dest
= 'gettitle' ,  help = 'simulate, quiet but print title' ,  default
= False )  
 223      verbosity
. add_option ( '--get-id' ,  
 224              action
= 'store_true' ,  dest
= 'getid' ,  help = 'simulate, quiet but print id' ,  default
= False )  
 225      verbosity
. add_option ( '--get-thumbnail' ,  
 226              action
= 'store_true' ,  dest
= 'getthumbnail' ,  
 227              help = 'simulate, quiet but print thumbnail URL' ,  default
= False )  
 228      verbosity
. add_option ( '--get-description' ,  
 229              action
= 'store_true' ,  dest
= 'getdescription' ,  
 230              help = 'simulate, quiet but print video description' ,  default
= False )  
 231      verbosity
. add_option ( '--get-filename' ,  
 232              action
= 'store_true' ,  dest
= 'getfilename' ,  
 233              help = 'simulate, quiet but print output filename' ,  default
= False )  
 234      verbosity
. add_option ( '--get-format' ,  
 235              action
= 'store_true' ,  dest
= 'getformat' ,  
 236              help = 'simulate, quiet but print output format' ,  default
= False )  
 237      verbosity
. add_option ( '--newline' ,  
 238              action
= 'store_true' ,  dest
= 'progress_with_newline' ,  help = 'output progress bar as new lines' ,  default
= False )  
 239      verbosity
. add_option ( '--no-progress' ,  
 240              action
= 'store_true' ,  dest
= 'noprogress' ,  help = 'do not print progress bar' ,  default
= False )  
 241      verbosity
. add_option ( '--console-title' ,  
 242              action
= 'store_true' ,  dest
= 'consoletitle' ,  
 243              help = 'display progress in console titlebar' ,  default
= False )  
 244      verbosity
. add_option ( '-v' ,  '--verbose' ,  
 245              action
= 'store_true' ,  dest
= 'verbose' ,  help = 'print various debugging information' ,  default
= False )  
 246      verbosity
. add_option ( '--dump-intermediate-pages' ,  
 247              action
= 'store_true' ,  dest
= 'dump_intermediate_pages' ,  default
= False ,  
 248              help = 'print downloaded pages to debug problems(very verbose)' )  
 250      filesystem
. add_option ( '-t' ,  '--title' ,  
 251              action
= 'store_true' ,  dest
= 'usetitle' ,  help = 'use title in file name (default)' ,  default
= False )  
 252      filesystem
. add_option ( '--id' ,  
 253              action
= 'store_true' ,  dest
= 'useid' ,  help = 'use only video ID in file name' ,  default
= False )  
 254      filesystem
. add_option ( '-l' ,  '--literal' ,  
 255              action
= 'store_true' ,  dest
= 'usetitle' ,  help = '[deprecated] alias of --title' ,  default
= False )  
 256      filesystem
. add_option ( '-A' ,  '--auto-number' ,  
 257              action
= 'store_true' ,  dest
= 'autonumber' ,  
 258              help = 'number downloaded files starting from 00000' ,  default
= False )  
 259      filesystem
. add_option ( '-o' ,  '--output' ,  
 260              dest
= 'outtmpl' ,  metavar
= 'TEMPLATE' ,  
 261              help =( 'output filename template. Use  %(title)s  to get the title, '  
 262                    ' %(uploader)s  for the uploader name,  %(uploader_id)s  for the uploader nickname if different, '  
 263                    ' %(autonumber)s  to get an automatically incremented number, '  
 264                    ' %(ext)s  for the filename extension,  %(upload_date)s  for the upload date (YYYYMMDD), '  
 265                    ' %(extractor)s  for the provider (youtube, metacafe, etc), '  
 266                    ' %(id)s  for the video id ,  %(playlist)s  for the playlist the video is in, '  
 267                    ' %(playlist_index)s  for the position in the playlist and  %%  for a literal percent. '  
 268                    'Use - to output to stdout. Can also be used to download to a different directory, '  
 269                    'for example with -o  \' /my/downloads/ %(uploader)s / %(title)s - %(id)s . %(ext)s \'  .' ))  
 270      filesystem
. add_option ( '--autonumber-size' ,  
 271              dest
= 'autonumber_size' ,  metavar
= 'NUMBER' ,  
 272              help = 'Specifies the number of digits in  %(autonumber)s  when it is present in output filename template or --autonumber option is given' )  
 273      filesystem
. add_option ( '--restrict-filenames' ,  
 274              action
= 'store_true' ,  dest
= 'restrictfilenames' ,  
 275              help = 'Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames' ,  default
= False )  
 276      filesystem
. add_option ( '-a' ,  '--batch-file' ,  
 277              dest
= 'batchfile' ,  metavar
= 'FILE' ,  help = 'file containing URLs to download ( \' - \'  for stdin)' )  
 278      filesystem
. add_option ( '-w' ,  '--no-overwrites' ,  
 279              action
= 'store_true' ,  dest
= 'nooverwrites' ,  help = 'do not overwrite files' ,  default
= False )  
 280      filesystem
. add_option ( '-c' ,  '--continue' ,  
 281              action
= 'store_true' ,  dest
= 'continue_dl' ,  help = 'resume partially downloaded files' ,  default
= True )  
 282      filesystem
. add_option ( '--no-continue' ,  
 283              action
= 'store_false' ,  dest
= 'continue_dl' ,  
 284              help = 'do not resume partially downloaded files (restart from beginning)' )  
 285      filesystem
. add_option ( '--cookies' ,  
 286              dest
= 'cookiefile' ,  metavar
= 'FILE' ,  help = 'file to read cookies from and dump cookie jar in' )  
 287      filesystem
. add_option ( '--no-part' ,  
 288              action
= 'store_true' ,  dest
= 'nopart' ,  help = 'do not use .part files' ,  default
= False )  
 289      filesystem
. add_option ( '--no-mtime' ,  
 290              action
= 'store_false' ,  dest
= 'updatetime' ,  
 291              help = 'do not use the Last-modified header to set the file modification time' ,  default
= True )  
 292      filesystem
. add_option ( '--write-description' ,  
 293              action
= 'store_true' ,  dest
= 'writedescription' ,  
 294              help = 'write video description to a .description file' ,  default
= False )  
 295      filesystem
. add_option ( '--write-info-json' ,  
 296              action
= 'store_true' ,  dest
= 'writeinfojson' ,  
 297              help = 'write video metadata to a .info.json file' ,  default
= False )  
 298      filesystem
. add_option ( '--write-thumbnail' ,  
 299              action
= 'store_true' ,  dest
= 'writethumbnail' ,  
 300              help = 'write thumbnail image to disk' ,  default
= False )  
 303      postproc
. add_option ( '-x' ,  '--extract-audio' ,  action
= 'store_true' ,  dest
= 'extractaudio' ,  default
= False ,  
 304              help = 'convert video files to audio-only files (requires ffmpeg or avconv and ffprobe or avprobe)' )  
 305      postproc
. add_option ( '--audio-format' ,  metavar
= 'FORMAT' ,  dest
= 'audioformat' ,  default
= 'best' ,  
 306              help = '"best", "aac", "vorbis", "mp3", "m4a", "opus", or "wav"; best by default' )  
 307      postproc
. add_option ( '--audio-quality' ,  metavar
= 'QUALITY' ,  dest
= 'audioquality' ,  default
= '5' ,  
 308              help = 'ffmpeg/avconv audio quality specification, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default 5)' )  
 309      postproc
. add_option ( '--recode-video' ,  metavar
= 'FORMAT' ,  dest
= 'recodevideo' ,  default
= None ,  
 310              help = 'Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm)' )  
 311      postproc
. add_option ( '-k' ,  '--keep-video' ,  action
= 'store_true' ,  dest
= 'keepvideo' ,  default
= False ,  
 312              help = 'keeps the video file on disk after the post-processing; the video is erased by default' )  
 313      postproc
. add_option ( '--no-post-overwrites' ,  action
= 'store_true' ,  dest
= 'nopostoverwrites' ,  default
= False ,  
 314              help = 'do not overwrite post-processed files; the post-processed files are overwritten by default' )  
 317      parser
. add_option_group ( general
)  
 318      parser
. add_option_group ( selection
)  
 319      parser
. add_option_group ( filesystem
)  
 320      parser
. add_option_group ( verbosity
)  
 321      parser
. add_option_group ( video_format
)  
 322      parser
. add_option_group ( authentication
)  
 323      parser
. add_option_group ( postproc
)  
 325      if  overrideArguments 
is not None :  
 326          opts
,  args 
=  parser
. parse_args ( overrideArguments
)  
 328              sys
. stderr
. write ( u
'[debug] Override config: '  +  repr ( overrideArguments
) +  ' \n ' )  
 330          xdg_config_home 
=  os
. environ
. get ( 'XDG_CONFIG_HOME' )  
 332              userConfFile 
=  os
. path
. join ( xdg_config_home
,  'youtube-dl.conf' )  
 334              userConfFile 
=  os
. path
. join ( os
. path
. expanduser ( '~' ),  '.config' ,  'youtube-dl.conf' )  
 335          systemConf 
=  _readOptions ( '/etc/youtube-dl.conf' )  
 336          userConf 
=  _readOptions ( userConfFile
)  
 337          commandLineConf 
=  sys
. argv
[ 1 :]   
 338          argv 
=  systemConf 
+  userConf 
+  commandLineConf
 
 339          opts
,  args 
=  parser
. parse_args ( argv
)  
 341              sys
. stderr
. write ( u
'[debug] System config: '  +  repr ( systemConf
) +  ' \n ' )  
 342              sys
. stderr
. write ( u
'[debug] User config: '  +  repr ( userConf
) +  ' \n ' )  
 343              sys
. stderr
. write ( u
'[debug] Command-line args: '  +  repr ( commandLineConf
) +  ' \n ' )  
 345      return  parser
,  opts
,  args
 
 347  def  _real_main ( argv
= None ):  
 348      # Compatibility fixes for Windows  
 349      if  sys
. platform 
==  'win32' :  
 350          # https://github.com/rg3/youtube-dl/issues/820  
 351          codecs
. register ( lambda  name
:  codecs
. lookup ( 'utf-8' )  if  name 
==  'cp65001'  else None )  
 353      parser
,  opts
,  args 
=  parseOpts ( argv
)  
 355      # Open appropriate CookieJar  
 356      if  opts
. cookiefile 
is None :  
 357          jar 
=  compat_cookiejar
. CookieJar ()  
 360              jar 
=  compat_cookiejar
. MozillaCookieJar ( opts
. cookiefile
)  
 361              if  os
. access ( opts
. cookiefile
,  os
. R_OK
):  
 363          except  ( IOError ,  OSError )  as  err
:  
 365                  traceback
. print_exc ()  
 366              sys
. stderr
. write ( u
'ERROR: unable to open cookie file \n ' )  
 369      if  opts
. user_agent 
is not None :  
 370          std_headers
[ 'User-Agent' ] =  opts
. user_agent
 
 373      if  opts
. referer 
is not None :  
 374          std_headers
[ 'Referer' ] =  opts
. referer
 
 377      if  opts
. dump_user_agent
:  
 378          compat_print ( std_headers
[ 'User-Agent' ])  
 381      # Batch file verification  
 383      if  opts
. batchfile 
is not None :  
 385              if  opts
. batchfile 
==  '-' :  
 388                  batchfd 
=  open ( opts
. batchfile
,  'r' )  
 389              batchurls 
=  batchfd
. readlines ()  
 390              batchurls 
= [ x
. strip ()  for  x 
in  batchurls
]  
 391              batchurls 
= [ x 
for  x 
in  batchurls 
if  len ( x
) >  0  and not  re
. search ( r
'^[#/;]' ,  x
)]  
 393              sys
. exit ( u
'ERROR: batch file could not be read' )  
 394      all_urls 
=  batchurls 
+  args
 
 395      all_urls 
= [ url
. strip ()  for  url 
in  all_urls
]  
 397      # General configuration  
 398      cookie_processor 
=  compat_urllib_request
. HTTPCookieProcessor ( jar
)  
 399      if  opts
. proxy 
is not None :  
 403              proxies 
= { 'http' :  opts
. proxy
,  'https' :  opts
. proxy
}  
 405          proxies 
=  compat_urllib_request
. getproxies ()  
 406          # Set HTTPS proxy to HTTP one if given (https://github.com/rg3/youtube-dl/issues/805)  
 407          if  'http'  in  proxies 
and  'https'  not in  proxies
:  
 408              proxies
[ 'https' ] =  proxies
[ 'http' ]  
 409      proxy_handler 
=  compat_urllib_request
. ProxyHandler ( proxies
)  
 410      https_handler 
=  make_HTTPS_handler ( opts
)  
 411      opener 
=  compat_urllib_request
. build_opener ( https_handler
,  proxy_handler
,  cookie_processor
,  YoutubeDLHandler ())  
 412      compat_urllib_request
. install_opener ( opener
)  
 413      socket
. setdefaulttimeout ( 300 )  # 5 minutes should be enough (famous last words)  
 415      extractors 
=  gen_extractors ()  
 417      if  opts
. list_extractors
:  
 418          for  ie 
in  extractors
:  
 419              compat_print ( ie
. IE_NAME 
+ ( ' (CURRENTLY BROKEN)'  if not  ie
._ WORKING 
else  '' ))  
 420              matchedUrls 
= [ url 
for  url 
in  all_urls 
if  ie
. suitable ( url
)]  
 421              all_urls 
= [ url 
for  url 
in  all_urls 
if  url 
not in  matchedUrls
]  
 422              for  mu 
in  matchedUrls
:  
 423                  compat_print ( u
'  '  +  mu
)  
 426      # Conflicting, missing and erroneous options  
 427      if  opts
. usenetrc 
and  ( opts
. username 
is not None or  opts
. password 
is not None ):  
 428          parser
. error ( u
'using .netrc conflicts with giving username/password' )  
 429      if  opts
. password 
is not None and  opts
. username 
is None :  
 430          parser
. error ( u
' account username missing \n ' )  
 431      if  opts
. outtmpl 
is not None and  ( opts
. usetitle 
or  opts
. autonumber 
or  opts
. useid
):  
 432          parser
. error ( u
'using output template conflicts with using title, video ID or auto number' )  
 433      if  opts
. usetitle 
and  opts
. useid
:  
 434          parser
. error ( u
'using title conflicts with using video ID' )  
 435      if  opts
. username 
is not None and  opts
. password 
is None :  
 436          opts
. password 
=  getpass
. getpass ( u
'Type account password and press return:' )  
 437      if  opts
. ratelimit 
is not None :  
 438          numeric_limit 
=  FileDownloader
. parse_bytes ( opts
. ratelimit
)  
 439          if  numeric_limit 
is None :  
 440              parser
. error ( u
'invalid rate limit specified' )  
 441          opts
. ratelimit 
=  numeric_limit
 
 442      if  opts
. min_filesize 
is not None :  
 443          numeric_limit 
=  FileDownloader
. parse_bytes ( opts
. min_filesize
)  
 444          if  numeric_limit 
is None :  
 445              parser
. error ( u
'invalid min_filesize specified' )  
 446          opts
. min_filesize 
=  numeric_limit
 
 447      if  opts
. max_filesize 
is not None :  
 448          numeric_limit 
=  FileDownloader
. parse_bytes ( opts
. max_filesize
)  
 449          if  numeric_limit 
is None :  
 450              parser
. error ( u
'invalid max_filesize specified' )  
 451          opts
. max_filesize 
=  numeric_limit
 
 452      if  opts
. retries 
is not None :  
 454              opts
. retries 
=  int ( opts
. retries
)  
 455          except  ( TypeError ,  ValueError )  as  err
:  
 456              parser
. error ( u
'invalid retry count specified' )  
 457      if  opts
. buffersize 
is not None :  
 458          numeric_buffersize 
=  FileDownloader
. parse_bytes ( opts
. buffersize
)  
 459          if  numeric_buffersize 
is None :  
 460              parser
. error ( u
'invalid buffer size specified' )  
 461          opts
. buffersize 
=  numeric_buffersize
 
 463          opts
. playliststart 
=  int ( opts
. playliststart
)  
 464          if  opts
. playliststart 
<=  0 :  
 465              raise  ValueError ( u
'Playlist start must be positive' )  
 466      except  ( TypeError ,  ValueError )  as  err
:  
 467          parser
. error ( u
'invalid playlist start number specified' )  
 469          opts
. playlistend 
=  int ( opts
. playlistend
)  
 470          if  opts
. playlistend 
!= - 1  and  ( opts
. playlistend 
<=  0  or  opts
. playlistend 
<  opts
. playliststart
):  
 471              raise  ValueError ( u
'Playlist end must be greater than playlist start' )  
 472      except  ( TypeError ,  ValueError )  as  err
:  
 473          parser
. error ( u
'invalid playlist end number specified' )  
 474      if  opts
. extractaudio
:  
 475          if  opts
. audioformat 
not in  [ 'best' ,  'aac' ,  'mp3' ,  'm4a' ,  'opus' ,  'vorbis' ,  'wav' ]:  
 476              parser
. error ( u
'invalid audio format specified' )  
 477      if  opts
. audioquality
:  
 478          opts
. audioquality 
=  opts
. audioquality
. strip ( 'k' ). strip ( 'K' )  
 479          if not  opts
. audioquality
. isdigit ():  
 480              parser
. error ( u
'invalid audio quality specified' )  
 481      if  opts
. recodevideo 
is not None :  
 482          if  opts
. recodevideo 
not in  [ 'mp4' ,  'flv' ,  'webm' ,  'ogg' ]:  
 483              parser
. error ( u
'invalid video recode format specified' )  
 484      if  opts
. date 
is not None :  
 485          date 
=  DateRange
. day ( opts
. date
)  
 487          date 
=  DateRange ( opts
. dateafter
,  opts
. datebefore
)  
 489      if  sys
. version_info 
< ( 3 ,):  
 490          # In Python 2, sys.argv is a bytestring (also note http://bugs.python.org/issue2128 for Windows systems)  
 491          if  opts
. outtmpl 
is not None :  
 492              opts
. outtmpl 
=  opts
. outtmpl
. decode ( preferredencoding ())  
 493      outtmpl 
=(( opts
. outtmpl 
is not None and  opts
. outtmpl
)  
 494              or  ( opts
. format 
==  '-1'  and  opts
. usetitle 
and  u
' %(title)s - %(id)s - %(format)s . %(ext)s ' )  
 495              or  ( opts
. format 
==  '-1'  and  u
' %(id)s - %(format)s . %(ext)s ' )  
 496              or  ( opts
. usetitle 
and  opts
. autonumber 
and  u
' %(autonumber)s - %(title)s - %(id)s . %(ext)s ' )  
 497              or  ( opts
. usetitle 
and  u
' %(title)s - %(id)s . %(ext)s ' )  
 498              or  ( opts
. useid 
and  u
' %(id)s . %(ext)s ' )  
 499              or  ( opts
. autonumber 
and  u
' %(autonumber)s - %(id)s . %(ext)s ' )  
 500              or  u
' %(title)s - %(id)s . %(ext)s ' )  
 504          'usenetrc' :  opts
. usenetrc
,  
 505          'username' :  opts
. username
,  
 506          'password' :  opts
. password
,  
 507          'videopassword' :  opts
. videopassword
,  
 508          'quiet' : ( opts
. quiet 
or  opts
. geturl 
or  opts
. gettitle 
or  opts
. getid 
or  opts
. getthumbnail 
or  opts
. getdescription 
or  opts
. getfilename 
or  opts
. getformat
),  
 509          'forceurl' :  opts
. geturl
,  
 510          'forcetitle' :  opts
. gettitle
,  
 511          'forceid' :  opts
. getid
,  
 512          'forcethumbnail' :  opts
. getthumbnail
,  
 513          'forcedescription' :  opts
. getdescription
,  
 514          'forcefilename' :  opts
. getfilename
,  
 515          'forceformat' :  opts
. getformat
,  
 516          'simulate' :  opts
. simulate
,  
 517          'skip_download' : ( opts
. skip_download 
or  opts
. simulate 
or  opts
. geturl 
or  opts
. gettitle 
or  opts
. getid 
or  opts
. getthumbnail 
or  opts
. getdescription 
or  opts
. getfilename 
or  opts
. getformat
),  
 518          'format' :  opts
. format
,  
 519          'format_limit' :  opts
. format_limit
,  
 520          'listformats' :  opts
. listformats
,  
 522          'autonumber_size' :  opts
. autonumber_size
,  
 523          'restrictfilenames' :  opts
. restrictfilenames
,  
 524          'ignoreerrors' :  opts
. ignoreerrors
,  
 525          'ratelimit' :  opts
. ratelimit
,  
 526          'nooverwrites' :  opts
. nooverwrites
,  
 527          'retries' :  opts
. retries
,  
 528          'buffersize' :  opts
. buffersize
,  
 529          'noresizebuffer' :  opts
. noresizebuffer
,  
 530          'continuedl' :  opts
. continue_dl
,  
 531          'noprogress' :  opts
. noprogress
,  
 532          'progress_with_newline' :  opts
. progress_with_newline
,  
 533          'playliststart' :  opts
. playliststart
,  
 534          'playlistend' :  opts
. playlistend
,  
 535          'logtostderr' :  opts
. outtmpl 
==  '-' ,  
 536          'consoletitle' :  opts
. consoletitle
,  
 537          'nopart' :  opts
. nopart
,  
 538          'updatetime' :  opts
. updatetime
,  
 539          'writedescription' :  opts
. writedescription
,  
 540          'writeinfojson' :  opts
. writeinfojson
,  
 541          'writethumbnail' :  opts
. writethumbnail
,  
 542          'writesubtitles' :  opts
. writesubtitles
,  
 543          'writeautomaticsub' :  opts
. writeautomaticsub
,  
 544          'allsubtitles' :  opts
. allsubtitles
,  
 545          'listsubtitles' :  opts
. listsubtitles
,  
 546          'subtitlesformat' :  opts
. subtitlesformat
,  
 547          'subtitleslang' :  opts
. subtitleslang
,  
 548          'matchtitle' :  decodeOption ( opts
. matchtitle
),  
 549          'rejecttitle' :  decodeOption ( opts
. rejecttitle
),  
 550          'max_downloads' :  opts
. max_downloads
,  
 551          'prefer_free_formats' :  opts
. prefer_free_formats
,  
 552          'verbose' :  opts
. verbose
,  
 553          'dump_intermediate_pages' :  opts
. dump_intermediate_pages
,  
 555          'keepvideo' :  opts
. keepvideo
,  
 556          'min_filesize' :  opts
. min_filesize
,  
 557          'max_filesize' :  opts
. max_filesize
,  
 562          ydl
. to_screen ( u
'[debug] youtube-dl version '  +  __version__
)  
 564              sp 
=  subprocess
. Popen ([ 'git' ,  'rev-parse' ,  '--short' ,  'HEAD' ],  stdout
= subprocess
. PIPE
,  stderr
= subprocess
. PIPE
,  
 565                                    cwd
= os
. path
. dirname ( os
. path
. abspath ( __file__
)))  
 566              out
,  err 
=  sp
. communicate ()  
 567              out 
=  out
. decode (). strip ()  
 568              if  re
. match ( '[0-9a-f]+' ,  out
):  
 569                  ydl
. to_screen ( u
'[debug] Git HEAD: '  +  out
)  
 572          ydl
. to_screen ( u
'[debug] Python version  %s  -  %s '  %( platform
. python_version (),  platform
. platform ()))  
 573          ydl
. to_screen ( u
'[debug] Proxy map: '  +  str ( proxy_handler
. proxies
))  
 575      for  extractor 
in  extractors
:  
 576          ydl
. add_info_extractor ( extractor
)  
 579      if  opts
. extractaudio
:  
 580          ydl
. add_post_processor ( FFmpegExtractAudioPP ( preferredcodec
= opts
. audioformat
,  preferredquality
= opts
. audioquality
,  nopostoverwrites
= opts
. nopostoverwrites
))  
 582          ydl
. add_post_processor ( FFmpegVideoConvertor ( preferedformat
= opts
. recodevideo
))  
 586          update_self ( ydl
. to_screen
,  opts
. verbose
,  sys
. argv
[ 0 ])  
 589      if  len ( all_urls
) <  1 :  
 590          if not  opts
. update_self
:  
 591              parser
. error ( u
'you must provide at least one URL' )  
 596          retcode 
=  ydl
. download ( all_urls
)  
 597      except  MaxDownloadsReached
:  
 598          ydl
. to_screen ( u
'--max-download limit reached, aborting.' )  
 601      # Dump cookie jar if requested  
 602      if  opts
. cookiefile 
is not None :  
 605          except  ( IOError ,  OSError )  as  err
:  
 606              sys
. exit ( u
'ERROR: unable to save cookie jar' )  
 613      except  DownloadError
:  
 615      except  SameFileError
:  
 616          sys
. exit ( u
'ERROR: fixed output name but more than one file to download' )  
 617      except  KeyboardInterrupt :  
 618          sys
. exit ( u
' \n ERROR: Interrupted by user' )