Correct JSON writing (Closes #596)
authorPhilipp Hagemeister <phihag@phihag.de>
Thu, 20 Dec 2012 12:13:24 +0000 (13:13 +0100)
committerPhilipp Hagemeister <phihag@phihag.de>
Thu, 20 Dec 2012 12:13:24 +0000 (13:13 +0100)
youtube_dl/FileDownloader.py
youtube_dl/utils.py

index e8c62ce07adbff3b10942c0d21700b06592bdad1..be70ec7557b15625506d73d5de401a9a72f9f30a 100644 (file)
@@ -454,9 +454,8 @@ class FileDownloader(object):
                 self.trouble(u'ERROR: No JSON encoder found. Update to Python 2.6+, setup a json module, or leave out --write-info-json.')
                 return
             try:
-                with io.open(encodeFilename(infofn), 'w', 'utf-8') as infof:
-                    json_info_dict = dict((k, v) for k,v in info_dict.items() if not k in ['urlhandle'])
-                    json.dump(json_info_dict, infof)
+                json_info_dict = dict((k, v) for k,v in info_dict.items() if not k in ['urlhandle'])
+                write_json_file(json_info_dict, encodeFilename(infofn))
             except (OSError, IOError):
                 self.trouble(u'ERROR: Cannot write metadata to JSON file ' + infofn)
                 return
index 25b67db0665af756ee32dac797f18a647004ff1f..4e64f327a67338a7cc9bb53ed347945df3f04b34 100644 (file)
@@ -3,6 +3,7 @@
 
 import gzip
 import io
+import json
 import locale
 import os
 import re
@@ -175,6 +176,18 @@ else:
         assert type(s) == type(u'')
         print(s)
 
+# In Python 2.x, json.dump expects a bytestream.
+# In Python 3.x, it writes to a character stream
+if sys.version_info < (3,0):
+    def write_json_file(obj, fn):
+        with open(fn, 'wb') as f:
+            json.dump(obj, f)
+else:
+    def write_json_file(obj, fn):
+        with open(fn, 'w', encoding='utf-8') as f:
+            json.dump(obj, f)
+
+
 def htmlentity_transform(matchobj):
     """Transforms an HTML entity to a character.