mirror of https://github.com/yt-dlp/yt-dlp.git
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:
parent
55e36f035c
commit
c2934512c2
|
@ -361,6 +361,12 @@ Then simply type this
|
||||||
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 @@ Then simply type this
|
||||||
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
|
||||||
|
|
|
@ -868,13 +868,6 @@ class YoutubeDL(object):
|
||||||
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 @@ class YoutubeDL(object):
|
||||||
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 """
|
||||||
|
|
|
@ -440,6 +440,7 @@ def _real_main(argv=None):
|
||||||
'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,
|
||||||
|
|
|
@ -878,8 +878,20 @@ def parseOpts(overrideArguments=None):
|
||||||
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 parseOpts(overrideArguments=None):
|
||||||
'--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(
|
||||||
|
|
|
@ -2125,13 +2125,17 @@ def sanitize_filename(s, restricted=False, is_id=False):
|
||||||
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)
|
||||||
|
|
Loading…
Reference in New Issue