Option --windows-filenames to force use of windows compatible filenames

* Also changed `--trim-file-name` to `--trim-filenames` to be similar to related options

Related: https://web.archive.org/web/20210217190806/https://old.reddit.com/r/youtubedl/comments/llc4o5/do_you_guys_also_have_this_error

:ci skip dl
This commit is contained in:
pukkandan 2021-02-18 00:39:38 +05:30
parent 55e36f035c
commit c2934512c2
5 changed files with 37 additions and 20 deletions

View file

@ -361,6 +361,12 @@ ## Filesystem Options:
filenames filenames
--no-restrict-filenames Allow Unicode characters, "&" and spaces in --no-restrict-filenames Allow Unicode characters, "&" and spaces in
filenames (default) filenames (default)
--windows-filenames Force filenames to be windows compatible
--no-windows-filenames Make filenames windows compatible only if
using windows (default)
--trim-filenames LENGTH Limit the filename length (excluding
extension) to the specified number of
characters
-w, --no-overwrites Do not overwrite any files -w, --no-overwrites Do not overwrite any files
--force-overwrites Overwrite all video and metadata files. --force-overwrites Overwrite all video and metadata files.
This option includes --no-continue This option includes --no-continue
@ -411,8 +417,6 @@ ## Filesystem Options:
may change may change
--no-cache-dir Disable filesystem caching --no-cache-dir Disable filesystem caching
--rm-cache-dir Delete all filesystem cache files --rm-cache-dir Delete all filesystem cache files
--trim-file-name LENGTH Limit the filename length (extension
excluded)
## Thumbnail Images: ## Thumbnail Images:
--write-thumbnail Write thumbnail image to disk --write-thumbnail Write thumbnail image to disk

View file

@ -868,13 +868,6 @@ def _prepare_filename(self, info_dict, tmpl_type='default'):
sub_ext = fn_groups[-2] sub_ext = fn_groups[-2]
filename = '.'.join(filter(None, [fn_groups[0][:trim_file_name], sub_ext, ext])) filename = '.'.join(filter(None, [fn_groups[0][:trim_file_name], sub_ext, ext]))
# Temporary fix for #4787
# 'Treat' all problem characters by passing filename through preferredencoding
# to workaround encoding issues with subprocess on python2 @ Windows
if sys.version_info < (3, 0) and sys.platform == 'win32':
filename = encodeFilename(filename, True).decode(preferredencoding())
filename = sanitize_path(filename)
return filename return filename
except ValueError as err: except ValueError as err:
self.report_error('Error in output template: ' + str(err) + ' (encoding: ' + repr(preferredencoding()) + ')') self.report_error('Error in output template: ' + str(err) + ' (encoding: ' + repr(preferredencoding()) + ')')
@ -901,7 +894,14 @@ def prepare_filename(self, info_dict, dir_type='', warn=False):
assert isinstance(homepath, compat_str) assert isinstance(homepath, compat_str)
subdir = expand_path(paths.get(dir_type, '').strip()) if dir_type else '' subdir = expand_path(paths.get(dir_type, '').strip()) if dir_type else ''
assert isinstance(subdir, compat_str) assert isinstance(subdir, compat_str)
return sanitize_path(os.path.join(homepath, subdir, filename)) path = os.path.join(homepath, subdir, filename)
# Temporary fix for #4787
# 'Treat' all problem characters by passing filename through preferredencoding
# to workaround encoding issues with subprocess on python2 @ Windows
if sys.version_info < (3, 0) and sys.platform == 'win32':
path = encodeFilename(path, True).decode(preferredencoding())
return sanitize_path(path, force=self.params.get('windowsfilenames'))
def _match_entry(self, info_dict, incomplete): def _match_entry(self, info_dict, incomplete):
""" Returns None if the file should be downloaded """ """ Returns None if the file should be downloaded """

View file

@ -440,6 +440,7 @@ def report_args_compat(arg, name):
'autonumber_size': opts.autonumber_size, 'autonumber_size': opts.autonumber_size,
'autonumber_start': opts.autonumber_start, 'autonumber_start': opts.autonumber_start,
'restrictfilenames': opts.restrictfilenames, 'restrictfilenames': opts.restrictfilenames,
'windowsfilenames': opts.windowsfilenames,
'ignoreerrors': opts.ignoreerrors, 'ignoreerrors': opts.ignoreerrors,
'force_generic_extractor': opts.force_generic_extractor, 'force_generic_extractor': opts.force_generic_extractor,
'ratelimit': opts.ratelimit, 'ratelimit': opts.ratelimit,

View file

@ -878,8 +878,20 @@ def _dict_from_multiple_values_options_callback(
help='Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames') help='Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames')
filesystem.add_option( filesystem.add_option(
'--no-restrict-filenames', '--no-restrict-filenames',
action='store_false', dest='restrictfilenames', default=False, action='store_false', dest='restrictfilenames',
help='Allow Unicode characters, "&" and spaces in filenames (default)') help='Allow Unicode characters, "&" and spaces in filenames (default)')
filesystem.add_option(
'--windows-filenames',
action='store_true', dest='windowsfilenames', default=False,
help='Force filenames to be windows compatible')
filesystem.add_option(
'--no-windows-filenames',
action='store_false', dest='windowsfilenames',
help='Make filenames windows compatible only if using windows (default)')
filesystem.add_option(
'--trim-filenames', '--trim-file-names', metavar='LENGTH',
dest='trim_file_name', default=0, type=int,
help='Limit the filename length (excluding extension) to the specified number of characters')
filesystem.add_option( filesystem.add_option(
'-A', '--auto-number', '-A', '--auto-number',
action='store_true', dest='autonumber', default=False, action='store_true', dest='autonumber', default=False,
@ -992,10 +1004,6 @@ def _dict_from_multiple_values_options_callback(
'--rm-cache-dir', '--rm-cache-dir',
action='store_true', dest='rm_cachedir', action='store_true', dest='rm_cachedir',
help='Delete all filesystem cache files') help='Delete all filesystem cache files')
filesystem.add_option(
'--trim-file-name', metavar='LENGTH',
dest='trim_file_name', default=0, type=int,
help='Limit the filename length (extension excluded)')
thumbnail = optparse.OptionGroup(parser, 'Thumbnail Images') thumbnail = optparse.OptionGroup(parser, 'Thumbnail Images')
thumbnail.add_option( thumbnail.add_option(

View file

@ -2125,13 +2125,17 @@ def replace_insane(char):
return result return result
def sanitize_path(s): def sanitize_path(s, force=False):
"""Sanitizes and normalizes path on Windows""" """Sanitizes and normalizes path on Windows"""
if sys.platform != 'win32': if sys.platform == 'win32':
drive_or_unc, _ = os.path.splitdrive(s)
if sys.version_info < (2, 7) and not drive_or_unc:
drive_or_unc, _ = os.path.splitunc(s)
elif force:
drive_or_unc = ''
else:
return s return s
drive_or_unc, _ = os.path.splitdrive(s)
if sys.version_info < (2, 7) and not drive_or_unc:
drive_or_unc, _ = os.path.splitunc(s)
norm_path = os.path.normpath(remove_start(s, drive_or_unc)).split(os.path.sep) norm_path = os.path.normpath(remove_start(s, drive_or_unc)).split(os.path.sep)
if drive_or_unc: if drive_or_unc:
norm_path.pop(0) norm_path.pop(0)