From f05d29c932a73588a09e196e70edb94383bfac96 Mon Sep 17 00:00:00 2001
From: Pierre Mdawar
Date: Wed, 6 Feb 2019 09:58:48 +0200
Subject: [PATCH 1/3] [postprocessor/ffmpeg] added option --force-recode-video
to force recoding a video
---
youtube_dl/__init__.py | 1 +
youtube_dl/options.py | 4 ++++
youtube_dl/postprocessor/ffmpeg.py | 9 ++++++---
3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py
index ba435ea42..6129ae74b 100644
--- a/youtube_dl/__init__.py
+++ b/youtube_dl/__init__.py
@@ -263,6 +263,7 @@ def _real_main(argv=None):
postprocessors.append({
'key': 'FFmpegVideoConvertor',
'preferedformat': opts.recodevideo,
+ 'force_recode': opts.force_recode_video
})
# FFmpegMetadataPP should be run after FFmpegVideoConvertorPP and
# FFmpegExtractAudioPP as containers before conversion may not support
diff --git a/youtube_dl/options.py b/youtube_dl/options.py
index e7d8e8910..4e3704282 100644
--- a/youtube_dl/options.py
+++ b/youtube_dl/options.py
@@ -794,6 +794,10 @@ def parseOpts(overrideArguments=None):
'--recode-video',
metavar='FORMAT', dest='recodevideo', default=None,
help='Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm|mkv|avi)')
+ postproc.add_option(
+ '--force-recode-video',
+ action='store_true', dest='force_recode_video', default=False,
+ help='Force recoding a video if it is already in the target format')
postproc.add_option(
'--postprocessor-args',
dest='postprocessor_args', metavar='ARGS',
diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py
index 5bcb00ac0..7ff9d3701 100644
--- a/youtube_dl/postprocessor/ffmpeg.py
+++ b/youtube_dl/postprocessor/ffmpeg.py
@@ -350,13 +350,16 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
class FFmpegVideoConvertorPP(FFmpegPostProcessor):
- def __init__(self, downloader=None, preferedformat=None):
+ def __init__(self, downloader=None, preferedformat=None, force_recode=False):
super(FFmpegVideoConvertorPP, self).__init__(downloader)
self._preferedformat = preferedformat
+ self._force_recode = force_recode
def run(self, information):
path = information['filepath']
- if information['ext'] == self._preferedformat:
+ if self._force_recode:
+ self._downloader.to_screen('[ffmpeg] Forcing video file recoding as %s' % (self._preferedformat))
+ if information['ext'] == self._preferedformat and not self._force_recode:
self._downloader.to_screen('[ffmpeg] Not converting video file %s - already is in target format %s' % (path, self._preferedformat))
return [], information
options = []
@@ -364,7 +367,7 @@ class FFmpegVideoConvertorPP(FFmpegPostProcessor):
options.extend(['-c:v', 'libxvid', '-vtag', 'XVID'])
prefix, sep, ext = path.rpartition('.')
outpath = prefix + sep + self._preferedformat
- self._downloader.to_screen('[' + 'ffmpeg' + '] Converting video from %s to %s, Destination: ' % (information['ext'], self._preferedformat) + outpath)
+ self._downloader.to_screen('[ffmpeg] Converting video from %s to %s, Destination: ' % (information['ext'], self._preferedformat) + outpath)
self.run_ffmpeg(path, outpath, options)
information['filepath'] = outpath
information['format'] = self._preferedformat
From 5e925259ebe349148959a36c19f4e80cd07b870d Mon Sep 17 00:00:00 2001
From: Pierre Mdawar
Date: Wed, 6 Feb 2019 10:32:50 +0200
Subject: [PATCH 2/3] [postprocessor/ffmpeg] changed the name of the output
file if recoding is forced
---
youtube_dl/postprocessor/ffmpeg.py | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py
index 7ff9d3701..2a17e20ea 100644
--- a/youtube_dl/postprocessor/ffmpeg.py
+++ b/youtube_dl/postprocessor/ffmpeg.py
@@ -357,16 +357,22 @@ class FFmpegVideoConvertorPP(FFmpegPostProcessor):
def run(self, information):
path = information['filepath']
- if self._force_recode:
- self._downloader.to_screen('[ffmpeg] Forcing video file recoding as %s' % (self._preferedformat))
- if information['ext'] == self._preferedformat and not self._force_recode:
- self._downloader.to_screen('[ffmpeg] Not converting video file %s - already is in target format %s' % (path, self._preferedformat))
- return [], information
+ if information['ext'] == self._preferedformat:
+ if self._force_recode:
+ self._downloader.to_screen('[ffmpeg] Forcing video file recoding as %s' % (self._preferedformat))
+ # ffmpeg cannot read and write to the same file, we add a suffix to write to a new one
+ suffix = '.recoded'
+ else:
+ self._downloader.to_screen('[ffmpeg] Not converting video file %s - already is in target format %s' % (path, self._preferedformat))
+ return [], information
+ else:
+ # no need for a suffix if the output path is not the same
+ suffix = ''
options = []
if self._preferedformat == 'avi':
options.extend(['-c:v', 'libxvid', '-vtag', 'XVID'])
prefix, sep, ext = path.rpartition('.')
- outpath = prefix + sep + self._preferedformat
+ outpath = prefix + suffix + sep + self._preferedformat
self._downloader.to_screen('[ffmpeg] Converting video from %s to %s, Destination: ' % (information['ext'], self._preferedformat) + outpath)
self.run_ffmpeg(path, outpath, options)
information['filepath'] = outpath
From 71b3b08b7520a1edee1cfc5c23a7ea36a672bc90 Mon Sep 17 00:00:00 2001
From: Pierre Mdawar
Date: Wed, 6 Feb 2019 11:02:35 +0200
Subject: [PATCH 3/3] [README] updated with the option --force-recode-video
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index c1572f771..38017d90f 100644
--- a/README.md
+++ b/README.md
@@ -399,6 +399,8 @@ Alternatively, refer to the [developer instructions](#developer-instructions) fo
--recode-video FORMAT Encode the video to another format if
necessary (currently supported:
mp4|flv|ogg|webm|mkv|avi)
+ --force-recode-video Force recoding a video if it is already in
+ the target format
--postprocessor-args ARGS Give these arguments to the postprocessor
-k, --keep-video Keep the video file on disk after the post-
processing; the video is erased by default