New option --get-filename to print output filename
When using youtube-dl within scripts, it is very useful to know what will be the final output filename with all the title settings and filename templates applied. Add option to the quiet mode operations to print that info. For this I had to move the filename-generation into its own function. As much as I can tell it should work almost always well, ie. not to break things if one not actually interested in the title, like in case of other forced printing. That is, unless there's an invalid system charset or the user specified a wrong output template. In that case probably could be assumed that the user does have a problem (the former) or did want to mess with the filename (the latter). Signed-off-by: Gergely Imreh <imrehg@gmail.com>
This commit is contained in:
parent
b940c84a24
commit
9f7963468b
31
youtube-dl
31
youtube-dl
|
@ -258,6 +258,7 @@ class FileDownloader(object):
|
||||||
forcetitle: Force printing title.
|
forcetitle: Force printing title.
|
||||||
forcethumbnail: Force printing thumbnail URL.
|
forcethumbnail: Force printing thumbnail URL.
|
||||||
forcedescription: Force printing description.
|
forcedescription: Force printing description.
|
||||||
|
forcefilename: Force printing final filename.
|
||||||
simulate: Do not download the video files.
|
simulate: Do not download the video files.
|
||||||
format: Video format code.
|
format: Video format code.
|
||||||
format_limit: Highest quality format to try.
|
format_limit: Highest quality format to try.
|
||||||
|
@ -494,8 +495,21 @@ class FileDownloader(object):
|
||||||
"""Increment the ordinal that assigns a number to each file."""
|
"""Increment the ordinal that assigns a number to each file."""
|
||||||
self._num_downloads += 1
|
self._num_downloads += 1
|
||||||
|
|
||||||
|
def prepare_filename(self, info_dict):
|
||||||
|
"""Generate the output filename."""
|
||||||
|
try:
|
||||||
|
template_dict = dict(info_dict)
|
||||||
|
template_dict['epoch'] = unicode(long(time.time()))
|
||||||
|
template_dict['autonumber'] = unicode('%05d' % self._num_downloads)
|
||||||
|
filename = self.params['outtmpl'] % template_dict
|
||||||
|
return filename
|
||||||
|
except (ValueError, KeyError), err:
|
||||||
|
self.trouble(u'ERROR: invalid system charset or erroneous output template')
|
||||||
|
return None
|
||||||
|
|
||||||
def process_info(self, info_dict):
|
def process_info(self, info_dict):
|
||||||
"""Process a single dictionary returned by an InfoExtractor."""
|
"""Process a single dictionary returned by an InfoExtractor."""
|
||||||
|
filename = self.prepare_filename(info_dict)
|
||||||
# Do nothing else if in simulate mode
|
# Do nothing else if in simulate mode
|
||||||
if self.params.get('simulate', False):
|
if self.params.get('simulate', False):
|
||||||
# Forced printings
|
# Forced printings
|
||||||
|
@ -507,16 +521,12 @@ class FileDownloader(object):
|
||||||
print info_dict['thumbnail'].encode(preferredencoding(), 'xmlcharrefreplace')
|
print info_dict['thumbnail'].encode(preferredencoding(), 'xmlcharrefreplace')
|
||||||
if self.params.get('forcedescription', False) and 'description' in info_dict:
|
if self.params.get('forcedescription', False) and 'description' in info_dict:
|
||||||
print info_dict['description'].encode(preferredencoding(), 'xmlcharrefreplace')
|
print info_dict['description'].encode(preferredencoding(), 'xmlcharrefreplace')
|
||||||
|
if self.params.get('forcefilename', False) and filename is not None:
|
||||||
|
print filename.encode(preferredencoding(), 'xmlcharrefreplace')
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
if filename is None:
|
||||||
template_dict = dict(info_dict)
|
|
||||||
template_dict['epoch'] = unicode(long(time.time()))
|
|
||||||
template_dict['autonumber'] = unicode('%05d' % self._num_downloads)
|
|
||||||
filename = self.params['outtmpl'] % template_dict
|
|
||||||
except (ValueError, KeyError), err:
|
|
||||||
self.trouble(u'ERROR: invalid system charset or erroneous output template')
|
|
||||||
return
|
return
|
||||||
if self.params.get('nooverwrites', False) and os.path.exists(filename):
|
if self.params.get('nooverwrites', False) and os.path.exists(filename):
|
||||||
self.to_stderr(u'WARNING: file exists and will be skipped')
|
self.to_stderr(u'WARNING: file exists and will be skipped')
|
||||||
|
@ -2384,6 +2394,8 @@ if __name__ == '__main__':
|
||||||
action='store_true', dest='getthumbnail', help='simulate, quiet but print thumbnail URL', default=False)
|
action='store_true', dest='getthumbnail', help='simulate, quiet but print thumbnail URL', default=False)
|
||||||
verbosity.add_option('--get-description',
|
verbosity.add_option('--get-description',
|
||||||
action='store_true', dest='getdescription', help='simulate, quiet but print video description', default=False)
|
action='store_true', dest='getdescription', help='simulate, quiet but print video description', default=False)
|
||||||
|
verbosity.add_option('--get-filename',
|
||||||
|
action='store_true', dest='getfilename', help='simulate, quiet but print output filename', default=False)
|
||||||
verbosity.add_option('--no-progress',
|
verbosity.add_option('--no-progress',
|
||||||
action='store_true', dest='noprogress', help='do not print progress bar', default=False)
|
action='store_true', dest='noprogress', help='do not print progress bar', default=False)
|
||||||
verbosity.add_option('--console-title',
|
verbosity.add_option('--console-title',
|
||||||
|
@ -2503,12 +2515,13 @@ if __name__ == '__main__':
|
||||||
'usenetrc': opts.usenetrc,
|
'usenetrc': opts.usenetrc,
|
||||||
'username': opts.username,
|
'username': opts.username,
|
||||||
'password': opts.password,
|
'password': opts.password,
|
||||||
'quiet': (opts.quiet or opts.geturl or opts.gettitle or opts.getthumbnail or opts.getdescription),
|
'quiet': (opts.quiet or opts.geturl or opts.gettitle or opts.getthumbnail or opts.getdescription or opts.getfilename),
|
||||||
'forceurl': opts.geturl,
|
'forceurl': opts.geturl,
|
||||||
'forcetitle': opts.gettitle,
|
'forcetitle': opts.gettitle,
|
||||||
'forcethumbnail': opts.getthumbnail,
|
'forcethumbnail': opts.getthumbnail,
|
||||||
'forcedescription': opts.getdescription,
|
'forcedescription': opts.getdescription,
|
||||||
'simulate': (opts.simulate or opts.geturl or opts.gettitle or opts.getthumbnail or opts.getdescription),
|
'forcefilename': opts.getfilename,
|
||||||
|
'simulate': (opts.simulate or opts.geturl or opts.gettitle or opts.getthumbnail or opts.getdescription or opts.getfilename),
|
||||||
'format': opts.format,
|
'format': opts.format,
|
||||||
'format_limit': opts.format_limit,
|
'format_limit': opts.format_limit,
|
||||||
'outtmpl': ((opts.outtmpl is not None and opts.outtmpl.decode(preferredencoding()))
|
'outtmpl': ((opts.outtmpl is not None and opts.outtmpl.decode(preferredencoding()))
|
||||||
|
|
Loading…
Reference in New Issue