diff options
author | pukkandan <pukkandan.ytdlp@gmail.com> | 2021-04-11 05:39:55 +0530 |
---|---|---|
committer | pukkandan <pukkandan.ytdlp@gmail.com> | 2021-04-11 06:06:12 +0530 |
commit | 9de3ea31269c396dabf5b26f92fa65bc99038ede (patch) | |
tree | 4be7d0a920a52f8f9b43696857c3c21eff99cdf9 | |
parent | e01d6aa4352ea76059f4dfcd06637311dc8a8389 (diff) | |
download | hypervideo-pre-9de3ea31269c396dabf5b26f92fa65bc99038ede.tar.lz hypervideo-pre-9de3ea31269c396dabf5b26f92fa65bc99038ede.tar.xz hypervideo-pre-9de3ea31269c396dabf5b26f92fa65bc99038ede.zip |
Pass any field to `--exec` using similar syntax to output template
Related: https://github.com/ytdl-org/youtube-dl/issues/28642
-rw-r--r-- | README.md | 11 | ||||
-rw-r--r-- | yt_dlp/options.py | 6 | ||||
-rw-r--r-- | yt_dlp/postprocessor/execafterdownload.py | 15 |
3 files changed, 21 insertions, 11 deletions
@@ -686,9 +686,14 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t path to the binary or its containing directory --exec CMD Execute a command on the file after - downloading and post-processing, similar to - find's -exec syntax. Example: --exec 'adb - push {} /sdcard/Music/ && rm {}' + downloading and post-processing. Similar + syntax to the output template can be used + to pass any field as arguments to the + command. An additional field "filepath" + that contains the final path of the + downloaded file is also available. If no + fields are passed, "%(filepath)s" is + appended to the end of the command --convert-subs FORMAT Convert the subtitles to another format (currently supported: srt|ass|vtt|lrc) (Alias: --convert-subtitles) diff --git a/yt_dlp/options.py b/yt_dlp/options.py index ace353042..c4cb57e2f 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -1195,7 +1195,11 @@ def parseOpts(overrideArguments=None): postproc.add_option( '--exec', metavar='CMD', dest='exec_cmd', - help='Execute a command on the file after downloading and post-processing, similar to find\'s -exec syntax. Example: --exec \'adb push {} /sdcard/Music/ && rm {}\'') + help=( + 'Execute a command on the file after downloading and post-processing. ' + 'Similar syntax to the output template can be used to pass any field as arguments to the command. ' + 'An additional field "filepath" that contains the final path of the downloaded file is also available. ' + 'If no fields are passed, "%(filepath)s" is appended to the end of the command')) postproc.add_option( '--convert-subs', '--convert-sub', '--convert-subtitles', metavar='FORMAT', dest='convertsubtitles', default=None, diff --git a/yt_dlp/postprocessor/execafterdownload.py b/yt_dlp/postprocessor/execafterdownload.py index 24dc64ef0..95159cbc2 100644 --- a/yt_dlp/postprocessor/execafterdownload.py +++ b/yt_dlp/postprocessor/execafterdownload.py @@ -20,12 +20,13 @@ class ExecAfterDownloadPP(PostProcessor): def pp_key(cls): return 'Exec' - def run(self, information): - cmd = self.exec_cmd - if '{}' not in cmd: - cmd += ' {}' - - cmd = cmd.replace('{}', compat_shlex_quote(information['filepath'])) + def run(self, info): + tmpl, info_copy = self._downloader.prepare_outtmpl(self.exec_cmd, info) + cmd = tmpl % info_copy + if cmd == self.exec_cmd: # No replacements were made + if '{}' not in self.exec_cmd: + self.exec_cmd += ' {}' + cmd = self.exec_cmd.replace('{}', compat_shlex_quote(info['filepath'])) self.to_screen('Executing command: %s' % cmd) retCode = subprocess.call(encodeArgument(cmd), shell=True) @@ -33,4 +34,4 @@ class ExecAfterDownloadPP(PostProcessor): raise PostProcessingError( 'Command returned error code %d' % retCode) - return [], information + return [], info |