2
0
Эх сурвалжийг харах

[Misc] Fixes for 2.6 compatibility

dirkf 2 жил өмнө
parent
commit
f24bc9272e

+ 6 - 4
test/test_jsinterp.py

@@ -492,10 +492,12 @@ class TestJSInterpreter(unittest.TestCase):
         jsi = JSInterpreter('''
         jsi = JSInterpreter('''
         function x() { let a=/,,[/,913,/](,)}/; "".replace(a, ""); return a; }
         function x() { let a=/,,[/,913,/](,)}/; "".replace(a, ""); return a; }
         ''')
         ''')
-        attrs = set(('findall', 'finditer', 'flags', 'groupindex',
-                     'groups', 'match', 'pattern', 'scanner',
-                     'search', 'split', 'sub', 'subn'))
-        self.assertTrue(set(dir(jsi.call_function('x'))) > attrs)
+        attrs = set(('findall', 'finditer', 'match', 'scanner', 'search',
+                     'split', 'sub', 'subn'))
+        if sys.version_info >= (2, 7):
+            # documented for 2.6 but may not be found
+            attrs.update(('flags', 'groupindex', 'groups', 'pattern'))
+        self.assertSetEqual(set(dir(jsi.call_function('x'))) & attrs, attrs)
 
 
         jsi = JSInterpreter('''
         jsi = JSInterpreter('''
         function x() { let a=/,,[/,913,/](,)}/i; return a; }
         function x() { let a=/,,[/,913,/](,)}/i; return a; }

+ 1 - 1
test/test_utils.py

@@ -1612,7 +1612,7 @@ Line 1
         self.assertEqual(traverse_obj(_TEST_DATA, lambda x, y: x == 'urls' and isinstance(y, list)),
         self.assertEqual(traverse_obj(_TEST_DATA, lambda x, y: x == 'urls' and isinstance(y, list)),
                          [_TEST_DATA['urls']],
                          [_TEST_DATA['urls']],
                          msg='function as query key should perform a filter based on (key, value)')
                          msg='function as query key should perform a filter based on (key, value)')
-        self.assertCountEqual(traverse_obj(_TEST_DATA, lambda _, x: isinstance(x[0], compat_str)), {'str'},
+        self.assertCountEqual(traverse_obj(_TEST_DATA, lambda _, x: isinstance(x[0], compat_str)), ('str',),
                               msg='exceptions in the query function should be caught')
                               msg='exceptions in the query function should be caught')
 
 
         # Test alternative paths
         # Test alternative paths

+ 5 - 1
youtube_dl/YoutubeDL.py

@@ -25,7 +25,11 @@ import tokenize
 import traceback
 import traceback
 import random
 import random
 
 
-from ssl import OPENSSL_VERSION
+try:
+    from ssl import OPENSSL_VERSION
+except ImportError:
+    # Must be Python 2.6, should be built against 1.0.2
+    OPENSSL_VERSION = 'OpenSSL 1.0.2(?)'
 from string import ascii_letters
 from string import ascii_letters
 
 
 from .compat import (
 from .compat import (

+ 12 - 0
youtube_dl/compat.py

@@ -1,10 +1,12 @@
 # coding: utf-8
 # coding: utf-8
 from __future__ import unicode_literals
 from __future__ import unicode_literals
+from __future__ import division
 
 
 import base64
 import base64
 import binascii
 import binascii
 import collections
 import collections
 import ctypes
 import ctypes
+import datetime
 import email
 import email
 import getpass
 import getpass
 import io
 import io
@@ -3150,6 +3152,15 @@ def compat_register_utf8():
             lambda name: lookup('utf-8') if name == 'cp65001' else None)
             lambda name: lookup('utf-8') if name == 'cp65001' else None)
 
 
 
 
+# compat_datetime_timedelta_total_seconds
+try:
+    compat_datetime_timedelta_total_seconds = datetime.timedelta.total_seconds
+except AttributeError:
+    # Py 2.6
+    def compat_datetime_timedelta_total_seconds(td):
+        return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
+
+
 legacy = [
 legacy = [
     'compat_HTMLParseError',
     'compat_HTMLParseError',
     'compat_HTMLParser',
     'compat_HTMLParser',
@@ -3187,6 +3198,7 @@ __all__ = [
     'compat_chr',
     'compat_chr',
     'compat_collections_abc',
     'compat_collections_abc',
     'compat_collections_chain_map',
     'compat_collections_chain_map',
+    'compat_datetime_timedelta_total_seconds',
     'compat_http_cookiejar',
     'compat_http_cookiejar',
     'compat_http_cookiejar_Cookie',
     'compat_http_cookiejar_Cookie',
     'compat_http_cookies',
     'compat_http_cookies',

+ 12 - 1
youtube_dl/jsinterp.py

@@ -277,9 +277,20 @@ class JSInterpreter(object):
 
 
         def __getattr__(self, name):
         def __getattr__(self, name):
             self.__instantiate()
             self.__instantiate()
+            # make Py 2.6 conform to its lying documentation
+            if name == 'flags':
+                self.flags = self.__flags
+            elif name == 'pattern':
+                self.pattern = self.__pattern_txt
+            elif name in ('groupindex', 'groups'):
+                # in case these get set after a match?
+                if hasattr(self.__self, name):
+                    setattr(self, name, getattr(self.__self, name))
+                else:
+                    return 0 if name == 'groupindex' else {}
             if hasattr(self, name):
             if hasattr(self, name):
                 return getattr(self, name)
                 return getattr(self, name)
-            return super(JSInterpreter.JS_RegExp, self).__getattr__(name)
+            raise AttributeError('{0} has no attribute named {1}'.format(self, name))
 
 
         @classmethod
         @classmethod
         def regex_flags(cls, expr):
         def regex_flags(cls, expr):

+ 2 - 1
youtube_dl/utils.py

@@ -47,6 +47,7 @@ from .compat import (
     compat_collections_abc,
     compat_collections_abc,
     compat_cookiejar,
     compat_cookiejar,
     compat_ctypes_WINFUNCTYPE,
     compat_ctypes_WINFUNCTYPE,
+    compat_datetime_timedelta_total_seconds,
     compat_etree_fromstring,
     compat_etree_fromstring,
     compat_expanduser,
     compat_expanduser,
     compat_html_entities,
     compat_html_entities,
@@ -3102,7 +3103,7 @@ def unified_timestamp(date_str, day_first=True):
             pass
             pass
     timetuple = email.utils.parsedate_tz(date_str)
     timetuple = email.utils.parsedate_tz(date_str)
     if timetuple:
     if timetuple:
-        return calendar.timegm(timetuple) + pm_delta * 3600 - timezone.total_seconds()
+        return calendar.timegm(timetuple) + pm_delta * 3600 - compat_datetime_timedelta_total_seconds(timezone)
 
 
 
 
 def determine_ext(url, default_ext='unknown_video'):
 def determine_ext(url, default_ext='unknown_video'):