Merge pull request #4247 from ivan/info-json
authorJaime Marquínez Ferrándiz <jaimeMF@users.noreply.github.com>
Thu, 20 Nov 2014 07:16:42 +0000 (08:16 +0100)
committerJaime Marquínez Ferrándiz <jaimeMF@users.noreply.github.com>
Thu, 20 Nov 2014 07:16:42 +0000 (08:16 +0100)
Fix #4246 and #4244 .info.json bugs

youtube_dl/utils.py

index 94b496dd0a693ae61997881458e1e202a184a330..bfe88b40bac05eea67d065953707c88549a190b6 100644 (file)
@@ -71,10 +71,10 @@ 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):
+    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
@@ -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: