Pass any field to `--exec` using similar syntax to output template

Related: https://github.com/ytdl-org/youtube-dl/issues/28642
pull/241/head
pukkandan 2021-04-11 05:39:55 +05:30
rodzic e01d6aa435
commit 9de3ea3126
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 0F00D95A001F4698
3 zmienionych plików z 21 dodań i 11 usunięć

Wyświetl plik

@ -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)

Wyświetl plik

@ -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,

Wyświetl plik

@ -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