diff options
Diffstat (limited to 'youtube_dl/__init__.py')
| -rw-r--r-- | youtube_dl/__init__.py | 64 | 
1 files changed, 43 insertions, 21 deletions
diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index ed22f169f..9f131f5db 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -19,6 +19,7 @@ from .compat import (      compat_expanduser,      compat_getpass,      compat_print, +    compat_shlex_split,      workaround_optparse_bug9161,  )  from .utils import ( @@ -168,8 +169,11 @@ def _real_main(argv=None):          if not opts.audioquality.isdigit():              parser.error('invalid audio quality specified')      if opts.recodevideo is not None: -        if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv']: +        if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv', 'avi']:              parser.error('invalid video recode format specified') +    if opts.convertsubtitles is not None: +        if opts.convertsubtitles not in ['srt', 'vtt', 'ass']: +            parser.error('invalid subtitle format specified')      if opts.date is not None:          date = DateRange.day(opts.date) @@ -185,18 +189,14 @@ def _real_main(argv=None):      if opts.allsubtitles and not opts.writeautomaticsub:          opts.writesubtitles = True -    if sys.version_info < (3,): -        # In Python 2, sys.argv is a bytestring (also note http://bugs.python.org/issue2128 for Windows systems) -        if opts.outtmpl is not None: -            opts.outtmpl = opts.outtmpl.decode(preferredencoding()) -    outtmpl = ((opts.outtmpl is not None and opts.outtmpl) -               or (opts.format == '-1' and opts.usetitle and '%(title)s-%(id)s-%(format)s.%(ext)s') -               or (opts.format == '-1' and '%(id)s-%(format)s.%(ext)s') -               or (opts.usetitle and opts.autonumber and '%(autonumber)s-%(title)s-%(id)s.%(ext)s') -               or (opts.usetitle and '%(title)s-%(id)s.%(ext)s') -               or (opts.useid and '%(id)s.%(ext)s') -               or (opts.autonumber and '%(autonumber)s-%(id)s.%(ext)s') -               or DEFAULT_OUTTMPL) +    outtmpl = ((opts.outtmpl is not None and opts.outtmpl) or +               (opts.format == '-1' and opts.usetitle and '%(title)s-%(id)s-%(format)s.%(ext)s') or +               (opts.format == '-1' and '%(id)s-%(format)s.%(ext)s') or +               (opts.usetitle and opts.autonumber and '%(autonumber)s-%(title)s-%(id)s.%(ext)s') or +               (opts.usetitle and '%(title)s-%(id)s.%(ext)s') or +               (opts.useid and '%(id)s.%(ext)s') or +               (opts.autonumber and '%(autonumber)s-%(id)s.%(ext)s') or +               DEFAULT_OUTTMPL)      if not os.path.splitext(outtmpl)[1] and opts.extractaudio:          parser.error('Cannot download a video and extract audio into the same'                       ' file! Use "{0}.%(ext)s" instead of "{0}" as the output' @@ -209,6 +209,11 @@ def _real_main(argv=None):      # PostProcessors      postprocessors = []      # Add the metadata pp first, the other pps will copy it +    if opts.metafromtitle: +        postprocessors.append({ +            'key': 'MetadataFromTitle', +            'titleformat': opts.metafromtitle +        })      if opts.addmetadata:          postprocessors.append({'key': 'FFmpegMetadata'})      if opts.extractaudio: @@ -223,23 +228,30 @@ def _real_main(argv=None):              'key': 'FFmpegVideoConvertor',              'preferedformat': opts.recodevideo,          }) +    if opts.convertsubtitles: +        postprocessors.append({ +            'key': 'FFmpegSubtitlesConvertor', +            'format': opts.convertsubtitles, +        })      if opts.embedsubtitles:          postprocessors.append({              'key': 'FFmpegEmbedSubtitle', -            'subtitlesformat': opts.subtitlesformat,          })      if opts.xattrs:          postprocessors.append({'key': 'XAttrMetadata'})      if opts.embedthumbnail: -        if not opts.addmetadata: -            postprocessors.append({'key': 'FFmpegAudioFix'}) -        postprocessors.append({'key': 'AtomicParsley'}) +        already_have_thumbnail = opts.writethumbnail or opts.write_all_thumbnails +        postprocessors.append({ +            'key': 'EmbedThumbnail', +            'already_have_thumbnail': already_have_thumbnail +        }) +        if not already_have_thumbnail: +            opts.writethumbnail = True      # Please keep ExecAfterDownload towards the bottom as it allows the user to modify the final file in any way.      # So if the user is able to remove the file before your postprocessor runs it might cause a few problems.      if opts.exec_cmd:          postprocessors.append({              'key': 'ExecAfterDownload', -            'verboseOutput': opts.verbose,              'exec_cmd': opts.exec_cmd,          })      if opts.xattr_set_filesize: @@ -248,6 +260,12 @@ def _real_main(argv=None):              xattr  # Confuse flake8          except ImportError:              parser.error('setting filesize xattr requested but python-xattr is not available') +    external_downloader_args = None +    if opts.external_downloader_args: +        external_downloader_args = compat_shlex_split(opts.external_downloader_args) +    postprocessor_args = None +    if opts.postprocessor_args: +        postprocessor_args = compat_shlex_split(opts.postprocessor_args)      match_filter = (          None if opts.match_filter is None          else match_filter_func(opts.match_filter)) @@ -273,12 +291,12 @@ def _real_main(argv=None):          'simulate': opts.simulate or any_getting,          'skip_download': opts.skip_download,          'format': opts.format, -        'format_limit': opts.format_limit,          'listformats': opts.listformats,          'outtmpl': outtmpl,          'autonumber_size': opts.autonumber_size,          'restrictfilenames': opts.restrictfilenames,          'ignoreerrors': opts.ignoreerrors, +        'force_generic_extractor': opts.force_generic_extractor,          'ratelimit': opts.ratelimit,          'nooverwrites': opts.nooverwrites,          'retries': opts_retries, @@ -336,7 +354,6 @@ def _real_main(argv=None):          'default_search': opts.default_search,          'youtube_include_dash_manifest': opts.youtube_include_dash_manifest,          'encoding': opts.encoding, -        'exec_cmd': opts.exec_cmd,          'extract_flat': opts.extract_flat,          'merge_output_format': opts.merge_output_format,          'postprocessors': postprocessors, @@ -350,12 +367,17 @@ def _real_main(argv=None):          'xattr_set_filesize': opts.xattr_set_filesize,          'match_filter': match_filter,          'no_color': opts.no_color, +        'ffmpeg_location': opts.ffmpeg_location, +        'hls_prefer_native': opts.hls_prefer_native, +        'external_downloader_args': external_downloader_args, +        'postprocessor_args': postprocessor_args, +        'cn_verification_proxy': opts.cn_verification_proxy,      }      with YoutubeDL(ydl_opts) as ydl:          # Update version          if opts.update_self: -            update_self(ydl.to_screen, opts.verbose) +            update_self(ydl.to_screen, opts.verbose, ydl._opener)          # Remove cache dir          if opts.rm_cachedir:  | 
