From 61ee5aeb7363d16c16cdec0914ade78af1afd8fd Mon Sep 17 00:00:00 2001 From: Ivan Kozik Date: Thu, 20 Nov 2014 06:04:04 +0000 Subject: [PATCH 1/2] Fix UnicodeEncodeError with --write-info-json on Python 2.7 + Windows Fixes #4244 --- youtube_dl/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 94b496dd0..f339fcb31 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -74,7 +74,7 @@ def write_json_file(obj, fn): """ Encode obj as JSON and write it to fn, atomically """ fn = encodeFilename(fn) - if sys.version_info < (3, 0): + if sys.version_info < (3, 0) and sys.platform != 'win32': encoding = get_filesystem_encoding() # os.path.basename returns a bytes object, but NamedTemporaryFile # will fail if the filename contains non ascii characters unless we From 1394646a0a531f6b13a4af7b1e3eec9951a6f9fb Mon Sep 17 00:00:00 2001 From: Ivan Kozik Date: Thu, 20 Nov 2014 06:05:39 +0000 Subject: [PATCH 2/2] Fix "ERROR: Cannot write metadata to JSON file" on Windows Fixes #4246 --- youtube_dl/utils.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index f339fcb31..bfe88b40b 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -71,7 +71,7 @@ def preferredencoding(): def write_json_file(obj, fn): - """ Encode obj as JSON and write it to fn, atomically """ + """ Encode obj as JSON and write it to fn, atomically if possible """ fn = encodeFilename(fn) if sys.version_info < (3, 0) and sys.platform != 'win32': @@ -108,6 +108,13 @@ def write_json_file(obj, fn): try: with tf: json.dump(obj, tf) + if sys.platform == 'win32': + # Need to remove existing file on Windows, else os.rename raises + # WindowsError or FileExistsError. + try: + os.unlink(fn) + except OSError: + pass os.rename(tf.name, fn) except: try: