diff options
Diffstat (limited to 'youtube_dl/__init__.py')
| -rw-r--r-- | youtube_dl/__init__.py | 62 | 
1 files changed, 40 insertions, 22 deletions
diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index d2446b670..0775b72fd 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -37,6 +37,7 @@ __authors__  = (      'Anton Larionov',      'Takuya Tsuchida',      'Sergey M.', +    'Michael Orlitzky',  )  __license__ = 'Public Domain' @@ -48,7 +49,6 @@ import os  import random  import re  import shlex -import subprocess  import sys @@ -57,11 +57,13 @@ from .utils import (      DateRange,      decodeOption,      determine_ext, +    get_term_width,      DownloadError,      get_cachedir,      MaxDownloadsReached,      preferredencoding,      SameFileError, +    setproctitle,      std_headers,      write_string,  ) @@ -113,19 +115,6 @@ def parseOpts(overrideArguments=None):      def _comma_separated_values_options_callback(option, opt_str, value, parser):          setattr(parser.values, option.dest, value.split(',')) -    def _find_term_columns(): -        columns = os.environ.get('COLUMNS', None) -        if columns: -            return int(columns) - -        try: -            sp = subprocess.Popen(['stty', 'size'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) -            out,err = sp.communicate() -            return int(out.split()[1]) -        except: -            pass -        return None -      def _hide_login_info(opts):          opts = list(opts)          for private_opt in ['-p', '--password', '-u', '--username', '--video-password']: @@ -140,7 +129,7 @@ def parseOpts(overrideArguments=None):      max_help_position = 80      # No need to wrap help messages if we're on a wide console -    columns = _find_term_columns() +    columns = get_term_width()      if columns: max_width = columns      fmt = optparse.IndentedHelpFormatter(width=max_width, max_help_position=max_help_position) @@ -204,6 +193,9 @@ def parseOpts(overrideArguments=None):      general.add_option(          '--socket-timeout', dest='socket_timeout',          type=float, default=None, help=optparse.SUPPRESS_HELP) +    general.add_option( +        '--bidi-workaround', dest='bidi_workaround', action='store_true', +        help=u'Work around terminals that lack bidirectional text support. Requires fribidi executable in PATH')      selection.add_option('--playlist-start', @@ -220,6 +212,14 @@ def parseOpts(overrideArguments=None):      selection.add_option('--date', metavar='DATE', dest='date', help='download only videos uploaded in this date', default=None)      selection.add_option('--datebefore', metavar='DATE', dest='datebefore', help='download only videos uploaded before this date', default=None)      selection.add_option('--dateafter', metavar='DATE', dest='dateafter', help='download only videos uploaded after this date', default=None) +    selection.add_option( +        '--min-views', metavar='COUNT', dest='min_views', +        default=None, type=int, +        help="Do not download any videos with less than COUNT views",) +    selection.add_option( +        '--max-views', metavar='COUNT', dest='max_views', +        default=None, type=int, +        help="Do not download any videos with more than COUNT views",)      selection.add_option('--no-playlist', action='store_true', dest='noplaylist', help='download only the currently playing video', default=False)      selection.add_option('--age-limit', metavar='YEARS', dest='age_limit',                           help='download only videos suitable for the given age', @@ -300,6 +300,9 @@ def parseOpts(overrideArguments=None):      verbosity.add_option('--get-description',              action='store_true', dest='getdescription',              help='simulate, quiet but print video description', default=False) +    verbosity.add_option('--get-duration', +            action='store_true', dest='getduration', +            help='simulate, quiet but print video length', default=False)      verbosity.add_option('--get-filename',              action='store_true', dest='getfilename',              help='simulate, quiet but print output filename', default=False) @@ -360,6 +363,9 @@ def parseOpts(overrideArguments=None):              help='Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames', default=False)      filesystem.add_option('-a', '--batch-file',              dest='batchfile', metavar='FILE', help='file containing URLs to download (\'-\' for stdin)') +    filesystem.add_option('--load-info', +            dest='load_info_filename', metavar='FILE', +            help='json file containing the video information (created with the "--write-json" option')      filesystem.add_option('-w', '--no-overwrites',              action='store_true', dest='nooverwrites', help='do not overwrite files', default=False)      filesystem.add_option('-c', '--continue', @@ -467,12 +473,15 @@ def parseOpts(overrideArguments=None):      return parser, opts, args +  def _real_main(argv=None):      # Compatibility fixes for Windows      if sys.platform == 'win32':          # https://github.com/rg3/youtube-dl/issues/820          codecs.register(lambda name: codecs.lookup('utf-8') if name == 'cp65001' else None) +    setproctitle(u'youtube-dl') +      parser, opts, args = parseOpts(argv)      # Set user agent @@ -611,27 +620,30 @@ def _real_main(argv=None):              or (opts.useid and u'%(id)s.%(ext)s')              or (opts.autonumber and u'%(autonumber)s-%(id)s.%(ext)s')              or u'%(title)s-%(id)s.%(ext)s') -    if '%(ext)s' not in outtmpl and opts.extractaudio: +    if not os.path.splitext(outtmpl)[1] and opts.extractaudio:          parser.error(u'Cannot download a video and extract audio into the same' -                     u' file! Use "%%(ext)s" instead of %r' % -                     determine_ext(outtmpl, u'')) +                     u' file! Use "{0}.%(ext)s" instead of "{0}" as the output' +                     u' template'.format(outtmpl)) + +    any_printing = opts.geturl or opts.gettitle or opts.getid or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat or opts.getduration or opts.dumpjson      ydl_opts = {          'usenetrc': opts.usenetrc,          'username': opts.username,          'password': opts.password,          'videopassword': opts.videopassword, -        'quiet': (opts.quiet or opts.geturl or opts.gettitle or opts.getid or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat or opts.dumpjson), +        'quiet': (opts.quiet or any_printing),          'forceurl': opts.geturl,          'forcetitle': opts.gettitle,          'forceid': opts.getid,          'forcethumbnail': opts.getthumbnail,          'forcedescription': opts.getdescription, +        'forceduration': opts.getduration,          'forcefilename': opts.getfilename,          'forceformat': opts.getformat,          'forcejson': opts.dumpjson,          'simulate': opts.simulate, -        '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 or opts.dumpjson), +        'skip_download': (opts.skip_download or opts.simulate or any_printing),          'format': opts.format,          'format_limit': opts.format_limit,          'listformats': opts.listformats, @@ -675,6 +687,8 @@ def _real_main(argv=None):          'keepvideo': opts.keepvideo,          'min_filesize': opts.min_filesize,          'max_filesize': opts.max_filesize, +        'min_views': opts.min_views, +        'max_views': opts.max_views,          'daterange': date,          'cachedir': opts.cachedir,          'youtube_print_sig_code': opts.youtube_print_sig_code, @@ -684,6 +698,7 @@ def _real_main(argv=None):          'nocheckcertificate': opts.no_check_certificate,          'proxy': opts.proxy,          'socket_timeout': opts.socket_timeout, +        'bidi_workaround': opts.bidi_workaround,      }      with YoutubeDL(ydl_opts) as ydl: @@ -706,14 +721,17 @@ def _real_main(argv=None):              update_self(ydl.to_screen, opts.verbose)          # Maybe do nothing -        if len(all_urls) < 1: +        if (len(all_urls) < 1) and (opts.load_info_filename is None):              if not opts.update_self:                  parser.error(u'you must provide at least one URL')              else:                  sys.exit()          try: -            retcode = ydl.download(all_urls) +            if opts.load_info_filename is not None: +                retcode = ydl.download_with_info_file(opts.load_info_filename) +            else: +                retcode = ydl.download(all_urls)          except MaxDownloadsReached:              ydl.to_screen(u'--max-download limit reached, aborting.')              retcode = 101  | 
