Add postprocessor for converting subtitles (closes #4954)
This commit is contained in:
parent
0f2c0d335b
commit
e9fade72f3
|
@ -170,6 +170,9 @@ def _real_main(argv=None):
|
||||||
if opts.recodevideo is not None:
|
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']:
|
||||||
parser.error('invalid video recode format specified')
|
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:
|
if opts.date is not None:
|
||||||
date = DateRange.day(opts.date)
|
date = DateRange.day(opts.date)
|
||||||
|
@ -223,6 +226,11 @@ def _real_main(argv=None):
|
||||||
'key': 'FFmpegVideoConvertor',
|
'key': 'FFmpegVideoConvertor',
|
||||||
'preferedformat': opts.recodevideo,
|
'preferedformat': opts.recodevideo,
|
||||||
})
|
})
|
||||||
|
if opts.convertsubtitles:
|
||||||
|
postprocessors.append({
|
||||||
|
'key': 'FFmpegSubtitlesConvertor',
|
||||||
|
'format': opts.convertsubtitles,
|
||||||
|
})
|
||||||
if opts.embedsubtitles:
|
if opts.embedsubtitles:
|
||||||
postprocessors.append({
|
postprocessors.append({
|
||||||
'key': 'FFmpegEmbedSubtitle',
|
'key': 'FFmpegEmbedSubtitle',
|
||||||
|
|
|
@ -751,6 +751,10 @@ def parseOpts(overrideArguments=None):
|
||||||
'--exec',
|
'--exec',
|
||||||
metavar='CMD', dest='exec_cmd',
|
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 {}\'')
|
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(general)
|
||||||
parser.add_option_group(network)
|
parser.add_option_group(network)
|
||||||
|
|
|
@ -11,6 +11,7 @@ from .ffmpeg import (
|
||||||
FFmpegMergerPP,
|
FFmpegMergerPP,
|
||||||
FFmpegMetadataPP,
|
FFmpegMetadataPP,
|
||||||
FFmpegVideoConvertorPP,
|
FFmpegVideoConvertorPP,
|
||||||
|
FFmpegSubtitlesConvertorPP,
|
||||||
)
|
)
|
||||||
from .xattrpp import XAttrMetadataPP
|
from .xattrpp import XAttrMetadataPP
|
||||||
from .execafterdownload import ExecAfterDownloadPP
|
from .execafterdownload import ExecAfterDownloadPP
|
||||||
|
@ -31,6 +32,7 @@ __all__ = [
|
||||||
'FFmpegMergerPP',
|
'FFmpegMergerPP',
|
||||||
'FFmpegMetadataPP',
|
'FFmpegMetadataPP',
|
||||||
'FFmpegPostProcessor',
|
'FFmpegPostProcessor',
|
||||||
|
'FFmpegSubtitlesConvertorPP',
|
||||||
'FFmpegVideoConvertorPP',
|
'FFmpegVideoConvertorPP',
|
||||||
'XAttrMetadataPP',
|
'XAttrMetadataPP',
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import io
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
@ -635,3 +636,40 @@ class FFmpegFixupM4aPP(FFmpegPostProcessor):
|
||||||
os.rename(encodeFilename(temp_filename), encodeFilename(filename))
|
os.rename(encodeFilename(temp_filename), encodeFilename(filename))
|
||||||
|
|
||||||
return True, info
|
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
|
||||||
|
|
Loading…
Reference in New Issue