diff options
Diffstat (limited to 'youtube_dl/utils.py')
| -rw-r--r-- | youtube_dl/utils.py | 35 | 
1 files changed, 26 insertions, 9 deletions
| diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index fc10fba63..536504e7e 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -500,12 +500,13 @@ def unescapeHTML(s):      result = re.sub(u'(?u)&(.+?);', htmlentity_transform, s)      return result -def encodeFilename(s): + +def encodeFilename(s, for_subprocess=False):      """      @param s The name of the file      """ -    assert type(s) == type(u'') +    assert type(s) == compat_str      # Python 3 has a Unicode API      if sys.version_info >= (3, 0): @@ -515,12 +516,18 @@ def encodeFilename(s):          # Pass u'' directly to use Unicode APIs on Windows 2000 and up          # (Detecting Windows NT 4 is tricky because 'major >= 4' would          # match Windows 9x series as well. Besides, NT 4 is obsolete.) -        return s +        if not for_subprocess: +            return s +        else: +            # For subprocess calls, encode with locale encoding +            # Refer to http://stackoverflow.com/a/9951851/35070 +            encoding = preferredencoding()      else:          encoding = sys.getfilesystemencoding() -        if encoding is None: -            encoding = 'utf-8' -        return s.encode(encoding, 'ignore') +    if encoding is None: +        encoding = 'utf-8' +    return s.encode(encoding, 'ignore') +  def decodeOption(optval):      if optval is None: @@ -850,12 +857,22 @@ def platform_name():  def write_string(s, out=None):      if out is None:          out = sys.stderr -    assert type(s) == type(u'') +    assert type(s) == compat_str      if ('b' in getattr(out, 'mode', '') or              sys.version_info[0] < 3):  # Python 2 lies about mode of sys.stderr          s = s.encode(preferredencoding(), 'ignore') -    out.write(s) +    try: +        out.write(s) +    except UnicodeEncodeError: +        # In Windows shells, this can fail even when the codec is just charmap!? +        # See https://wiki.python.org/moin/PrintFails#Issue +        if sys.platform == 'win32' and hasattr(out, 'encoding'): +            s = s.encode(out.encoding, 'ignore').decode(out.encoding) +            out.write(s) +        else: +            raise +      out.flush() @@ -1071,7 +1088,7 @@ def fix_xml_all_ampersand(xml_str):  def setproctitle(title): -    assert isinstance(title, type(u'')) +    assert isinstance(title, compat_str)      try:          libc = ctypes.cdll.LoadLibrary("libc.so.6")      except OSError: | 
