[videoconvertor] Generalize with remuxer and allow conditional recoding

This commit is contained in:
pukkandan 2021-05-22 13:08:12 +05:30
parent a927acb1ec
commit 857f63136d
No known key found for this signature in database
GPG key ID: 0F00D95A001F4698
2 changed files with 42 additions and 48 deletions

View file

@ -1141,7 +1141,8 @@ def _dict_from_options_callback(
metavar='FORMAT', dest='recodevideo', default=None, metavar='FORMAT', dest='recodevideo', default=None,
help=( help=(
'Re-encode the video into another format if re-encoding is necessary. ' 'Re-encode the video into another format if re-encoding is necessary. '
'The supported formats are the same as --remux-video')) 'You can specify multiple rules similar to --remux-video. '
'The supported formats are also the same as --remux-video'))
postproc.add_option( postproc.add_option(
'--postprocessor-args', '--ppa', '--postprocessor-args', '--ppa',
metavar='NAME:ARGS', dest='postprocessor_args', default={}, type='str', metavar='NAME:ARGS', dest='postprocessor_args', default={}, type='str',

View file

@ -399,64 +399,57 @@ def run(self, information):
return [path], information return [path], information
class FFmpegVideoRemuxerPP(FFmpegPostProcessor):
def __init__(self, downloader=None, preferedformat=None):
super(FFmpegVideoRemuxerPP, self).__init__(downloader)
self._preferedformats = preferedformat.lower().split('/')
def run(self, information):
path = information['filepath']
sourceext, targetext = information['ext'].lower(), None
for pair in self._preferedformats:
kv = pair.split('>')
if len(kv) == 1 or kv[0].strip() == sourceext:
targetext = kv[-1].strip()
break
_skip_msg = (
'could not find a mapping for %s' if not targetext
else 'already is in target format %s' if sourceext == targetext
else None)
if _skip_msg:
self.to_screen('Not remuxing media file %s; %s' % (path, _skip_msg % sourceext))
return [], information
options = ['-c', 'copy', '-map', '0', '-dn']
if targetext in ['mp4', 'm4a', 'mov']:
options.extend(['-movflags', '+faststart'])
prefix, sep, oldext = path.rpartition('.')
outpath = prefix + sep + targetext
self.to_screen('Remuxing video from %s to %s; Destination: %s' % (sourceext, targetext, outpath))
self.run_ffmpeg(path, outpath, options)
information['filepath'] = outpath
information['format'] = targetext
information['ext'] = targetext
return [path], information
class FFmpegVideoConvertorPP(FFmpegPostProcessor): class FFmpegVideoConvertorPP(FFmpegPostProcessor):
_action = 'converting'
def __init__(self, downloader=None, preferedformat=None): def __init__(self, downloader=None, preferedformat=None):
super(FFmpegVideoConvertorPP, self).__init__(downloader) super(FFmpegVideoConvertorPP, self).__init__(downloader)
self._preferedformat = preferedformat self._preferedformats = preferedformat.lower().split('/')
def _target_ext(self, source_ext):
for pair in self._preferedformats:
kv = pair.split('>')
if len(kv) == 1 or kv[0].strip() == source_ext:
return kv[-1].strip()
@staticmethod
def _options(target_ext):
if target_ext == 'avi':
return ['-c:v', 'libxvid', '-vtag', 'XVID']
return []
def run(self, information): def run(self, information):
path = information['filepath'] path = information['filepath']
if information['ext'] == self._preferedformat: target_ext = self._target_ext(information['ext'].lower())
self.to_screen('Not converting video file %s - already is in target format %s' % (path, self._preferedformat)) _skip_msg = (
'could not find a mapping for %s' if not target_ext
else 'already is in target format %s' if source_ext == target_ext
else None)
if _skip_msg:
self.to_screen('Not %s media file %s; %s' % (self._action, path, _skip_msg % source_ext))
return [], information return [], information
options = []
if self._preferedformat == 'avi': prefix, sep, oldext = path.rpartition('.')
options.extend(['-c:v', 'libxvid', '-vtag', 'XVID']) outpath = prefix + sep + target_ext
prefix, sep, ext = path.rpartition('.') self.to_screen('%s video from %s to %s; Destination: %s' % (self._action.title(), source_ext, target_ext, outpath))
outpath = prefix + sep + self._preferedformat self.run_ffmpeg(path, outpath, self._options(target_ext))
self.to_screen('Converting video from %s to %s, Destination: ' % (information['ext'], self._preferedformat) + outpath)
self.run_ffmpeg(path, outpath, options)
information['filepath'] = outpath information['filepath'] = outpath
information['format'] = self._preferedformat information['format'] = information['ext'] = target_ext
information['ext'] = self._preferedformat
return [path], information return [path], information
class FFmpegVideoRemuxerPP(FFmpegVideoConvertorPP):
_action = 'remuxing'
@staticmethod
def _options(target_ext):
options = ['-c', 'copy', '-map', '0', '-dn']
if target_ext in ['mp4', 'm4a', 'mov']:
options.extend(['-movflags', '+faststart'])
return options
class FFmpegEmbedSubtitlePP(FFmpegPostProcessor): class FFmpegEmbedSubtitlePP(FFmpegPostProcessor):
def __init__(self, downloader=None, already_have_subtitle=False): def __init__(self, downloader=None, already_have_subtitle=False):
super(FFmpegEmbedSubtitlePP, self).__init__(downloader) super(FFmpegEmbedSubtitlePP, self).__init__(downloader)