Quellcode durchsuchen

Fix f4m downloading on Python 2.6

Philipp Hagemeister vor 11 Jahren
Ursprung
Commit
b53466e168
3 geänderte Dateien mit 28 neuen und 5 gelöschten Zeilen
  1. 4 0
      test/test_utils.py
  2. 6 5
      youtube_dl/downloader/f4m.py
  3. 18 0
      youtube_dl/utils.py

+ 4 - 0
test/test_utils.py

@@ -25,6 +25,7 @@ from youtube_dl.utils import (
     shell_quote,
     shell_quote,
     smuggle_url,
     smuggle_url,
     str_to_int,
     str_to_int,
+    struct_unpack,
     timeconvert,
     timeconvert,
     unescapeHTML,
     unescapeHTML,
     unified_strdate,
     unified_strdate,
@@ -237,5 +238,8 @@ class TestUtil(unittest.TestCase):
         testPL(5, 2, (2, 99), [2, 3, 4])
         testPL(5, 2, (2, 99), [2, 3, 4])
         testPL(5, 2, (20, 99), [])
         testPL(5, 2, (20, 99), [])
 
 
+    def test_struct_unpack(self):
+        self.assertEqual(struct_unpack(u'!B', b'\x00'), (0,))
+
 if __name__ == '__main__':
 if __name__ == '__main__':
     unittest.main()
     unittest.main()

+ 6 - 5
youtube_dl/downloader/f4m.py

@@ -4,13 +4,14 @@ import base64
 import io
 import io
 import itertools
 import itertools
 import os
 import os
-from struct import unpack, pack
 import time
 import time
 import xml.etree.ElementTree as etree
 import xml.etree.ElementTree as etree
 
 
 from .common import FileDownloader
 from .common import FileDownloader
 from .http import HttpFD
 from .http import HttpFD
 from ..utils import (
 from ..utils import (
+    struct_pack,
+    struct_unpack,
     compat_urllib_request,
     compat_urllib_request,
     compat_urlparse,
     compat_urlparse,
     format_bytes,
     format_bytes,
@@ -27,13 +28,13 @@ class FlvReader(io.BytesIO):
 
 
     # Utility functions for reading numbers and strings
     # Utility functions for reading numbers and strings
     def read_unsigned_long_long(self):
     def read_unsigned_long_long(self):
-        return unpack('!Q', self.read(8))[0]
+        return struct_unpack('!Q', self.read(8))[0]
 
 
     def read_unsigned_int(self):
     def read_unsigned_int(self):
-        return unpack('!I', self.read(4))[0]
+        return struct_unpack('!I', self.read(4))[0]
 
 
     def read_unsigned_char(self):
     def read_unsigned_char(self):
-        return unpack('!B', self.read(1))[0]
+        return struct_unpack('!B', self.read(1))[0]
 
 
     def read_string(self):
     def read_string(self):
         res = b''
         res = b''
@@ -196,7 +197,7 @@ def write_flv_header(stream, metadata):
     # Script data
     # Script data
     stream.write(b'\x12')
     stream.write(b'\x12')
     # Size of the metadata with 3 bytes
     # Size of the metadata with 3 bytes
-    stream.write(pack('!L', len(metadata))[1:])
+    stream.write(struct_pack('!L', len(metadata))[1:])
     stream.write(b'\x00\x00\x00\x00\x00\x00\x00')
     stream.write(b'\x00\x00\x00\x00\x00\x00\x00')
     stream.write(metadata)
     stream.write(metadata)
     # Magic numbers extracted from the output files produced by AdobeHDS.php
     # Magic numbers extracted from the output files produced by AdobeHDS.php

+ 18 - 0
youtube_dl/utils.py

@@ -17,6 +17,7 @@ import platform
 import re
 import re
 import ssl
 import ssl
 import socket
 import socket
+import struct
 import subprocess
 import subprocess
 import sys
 import sys
 import traceback
 import traceback
@@ -1220,3 +1221,20 @@ def uppercase_escape(s):
     return re.sub(
     return re.sub(
         r'\\U([0-9a-fA-F]{8})',
         r'\\U([0-9a-fA-F]{8})',
         lambda m: compat_chr(int(m.group(1), base=16)), s)
         lambda m: compat_chr(int(m.group(1), base=16)), s)
+
+try:
+    struct.pack(u'!I', 0)
+except TypeError:
+    # In Python 2.6 (and some 2.7 versions), struct requires a bytes argument
+    def struct_pack(spec, *args):
+        if isinstance(spec, compat_str):
+            spec = spec.encode('ascii')
+        return struct.pack(spec, *args)
+
+    def struct_unpack(spec, *args):
+        if isinstance(spec, compat_str):
+            spec = spec.encode('ascii')
+        return struct.unpack(spec, *args)
+else:
+    struct_pack = struct.pack
+    struct_unpack = struct.unpack