diff options
| author | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2015-02-28 14:43:24 +0100 | 
|---|---|---|
| committer | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2015-02-28 14:43:24 +0100 | 
| commit | e9fade72f347cbcce779ff176d516467a425b43a (patch) | |
| tree | ef5ee55d250ec1969b95ba51315f53e40cdd76e3 | |
| parent | 0f2c0d335b14ba1596e6608db7a6f29a0d9e1c86 (diff) | |
Add postprocessor for converting subtitles (closes #4954)
| -rw-r--r-- | youtube_dl/__init__.py | 8 | ||||
| -rw-r--r-- | youtube_dl/options.py | 4 | ||||
| -rw-r--r-- | youtube_dl/postprocessor/__init__.py | 2 | ||||
| -rw-r--r-- | youtube_dl/postprocessor/ffmpeg.py | 38 | 
4 files changed, 52 insertions, 0 deletions
| diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 5ce201800..49f382695 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -170,6 +170,9 @@ def _real_main(argv=None):      if opts.recodevideo is not None:          if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv']:              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) @@ -223,6 +226,11 @@ 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', diff --git a/youtube_dl/options.py b/youtube_dl/options.py index 886ce9613..58f811162 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -751,6 +751,10 @@ def parseOpts(overrideArguments=None):          '--exec',          metavar='CMD', dest='exec_cmd',          help='Execute a command on the file after downloading, similar to find\'s -exec syntax. Example: --exec \'adb push {} /sdcard/Music/ && rm {}\'') +    postproc.add_option( +        '--convert-subtitles', '--convert-subs', +        metavar='FORMAT', dest='convertsubtitles', default=None, +        help='Convert the subtitles to other format (currently supported: srt|ass|vtt)')      parser.add_option_group(general)      parser.add_option_group(network) diff --git a/youtube_dl/postprocessor/__init__.py b/youtube_dl/postprocessor/__init__.py index 0ffbca258..708df3dd4 100644 --- a/youtube_dl/postprocessor/__init__.py +++ b/youtube_dl/postprocessor/__init__.py @@ -11,6 +11,7 @@ from .ffmpeg import (      FFmpegMergerPP,      FFmpegMetadataPP,      FFmpegVideoConvertorPP, +    FFmpegSubtitlesConvertorPP,  )  from .xattrpp import XAttrMetadataPP  from .execafterdownload import ExecAfterDownloadPP @@ -31,6 +32,7 @@ __all__ = [      'FFmpegMergerPP',      'FFmpegMetadataPP',      'FFmpegPostProcessor', +    'FFmpegSubtitlesConvertorPP',      'FFmpegVideoConvertorPP',      'XAttrMetadataPP',  ] diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index 398fe050e..30094c2f3 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -1,5 +1,6 @@  from __future__ import unicode_literals +import io  import os  import subprocess  import sys @@ -635,3 +636,40 @@ class FFmpegFixupM4aPP(FFmpegPostProcessor):          os.rename(encodeFilename(temp_filename), encodeFilename(filename))          return True, info + + +class FFmpegSubtitlesConvertorPP(FFmpegPostProcessor): +    def __init__(self, downloader=None, format=None): +        super(FFmpegSubtitlesConvertorPP, self).__init__(downloader) +        self.format = format + +    def run(self, info): +        subs = info.get('requested_subtitles') +        filename = info['filepath'] +        new_ext = self.format +        new_format = new_ext +        if new_format == 'vtt': +            new_format = 'webvtt' +        if subs is None: +            self._downloader.to_screen('[ffmpeg] There aren\'t any subtitles to convert') +            return True, info +        self._downloader.to_screen('[ffmpeg] Converting subtitles') +        for lang, sub in subs.items(): +            ext = sub['ext'] +            if ext == new_ext: +                self._downloader.to_screen( +                    '[ffmpeg] Subtitle file for %s is already in the requested' +                    'format' % new_ext) +                continue +            new_file = subtitles_filename(filename, lang, new_ext) +            self.run_ffmpeg( +                subtitles_filename(filename, lang, ext), +                new_file, ['-f', new_format]) + +            with io.open(new_file, 'rt', encoding='utf-8') as f: +                subs[lang] = { +                    'ext': ext, +                    'data': f.read(), +                } + +        return True, info | 
