Merge branch 'jython-support'
authorYen Chi Hsuan <yan12125@gmail.com>
Thu, 3 Mar 2016 10:49:32 +0000 (18:49 +0800)
committerYen Chi Hsuan <yan12125@gmail.com>
Thu, 3 Mar 2016 10:49:32 +0000 (18:49 +0800)
Closes #8302

1  2 
youtube_dl/utils.py

diff --combined youtube_dl/utils.py
index 210c47fce873096c995c2a69be0108bba7549c29,fc64a418670f87306234407e8ead182ae44f1131..91c9d820091598d13c252b54522e2d97e4ec6d98
@@@ -160,6 -160,8 +160,6 @@@ if sys.version_info >= (2, 7)
      def find_xpath_attr(node, xpath, key, val=None):
          """ Find the xpath xpath[@key=val] """
          assert re.match(r'^[a-zA-Z_-]+$', key)
 -        if val:
 -            assert re.match(r'^[a-zA-Z0-9@\s:._-]*$', val)
          expr = xpath + ('[@%s]' % key if val is None else "[@%s='%s']" % (key, val))
          return node.find(expr)
  else:
@@@ -465,6 -467,10 +465,10 @@@ def encodeFilename(s, for_subprocess=Fa
      if not for_subprocess and sys.platform == 'win32' and sys.getwindowsversion()[0] >= 5:
          return s
  
+     # Jython assumes filenames are Unicode strings though reported as Python 2.x compatible
+     if sys.platform.startswith('java'):
+         return s
      return s.encode(get_subprocess_encoding(), 'ignore')
  
  
@@@ -903,9 -909,9 +907,9 @@@ def unified_strdate(date_str, day_first
          '%d %b %Y',
          '%B %d %Y',
          '%b %d %Y',
 -        '%b %dst %Y %I:%M%p',
 -        '%b %dnd %Y %I:%M%p',
 -        '%b %dth %Y %I:%M%p',
 +        '%b %dst %Y %I:%M',
 +        '%b %dnd %Y %I:%M',
 +        '%b %dth %Y %I:%M',
          '%Y %m %d',
          '%Y-%m-%d',
          '%Y/%m/%d',
@@@ -1215,13 -1221,23 +1219,23 @@@ if sys.platform == 'win32'
              raise OSError('Unlocking file failed: %r' % ctypes.FormatError())
  
  else:
-     import fcntl
+     # Some platforms, such as Jython, is missing fcntl
+     try:
+         import fcntl
  
-     def _lock_file(f, exclusive):
-         fcntl.flock(f, fcntl.LOCK_EX if exclusive else fcntl.LOCK_SH)
+         def _lock_file(f, exclusive):
+             fcntl.flock(f, fcntl.LOCK_EX if exclusive else fcntl.LOCK_SH)
  
-     def _unlock_file(f):
-         fcntl.flock(f, fcntl.LOCK_UN)
+         def _unlock_file(f):
+             fcntl.flock(f, fcntl.LOCK_UN)
+     except ImportError:
+         UNSUPPORTED_MSG = 'file locking is not supported on this platform'
+         def _lock_file(f, exclusive):
+             raise IOError(UNSUPPORTED_MSG)
+         def _unlock_file(f):
+             raise IOError(UNSUPPORTED_MSG)
  
  
  class locked_file(object):
@@@ -1385,6 -1401,12 +1399,12 @@@ def fix_xml_ampersands(xml_str)
  
  def setproctitle(title):
      assert isinstance(title, compat_str)
+     # ctypes in Jython is not complete
+     # http://bugs.jython.org/issue2148
+     if sys.platform.startswith('java'):
+         return
      try:
          libc = ctypes.cdll.LoadLibrary('libc.so.6')
      except OSError:
@@@ -1568,12 -1590,9 +1588,12 @@@ class PagedList(object)
  
  
  class OnDemandPagedList(PagedList):
 -    def __init__(self, pagefunc, pagesize):
 +    def __init__(self, pagefunc, pagesize, use_cache=False):
          self._pagefunc = pagefunc
          self._pagesize = pagesize
 +        self._use_cache = use_cache
 +        if use_cache:
 +            self._cache = {}
  
      def getslice(self, start=0, end=None):
          res = []
              if start >= nextfirstid:
                  continue
  
 -            page_results = list(self._pagefunc(pagenum))
 +            page_results = None
 +            if self._use_cache:
 +                page_results = self._cache.get(pagenum)
 +            if page_results is None:
 +                page_results = list(self._pagefunc(pagenum))
 +            if self._use_cache:
 +                self._cache[pagenum] = page_results
  
              startv = (
                  start % self._pagesize
@@@ -1853,11 -1866,7 +1873,11 @@@ def mimetype2ext(mt)
  
      return {
          '3gpp': '3gp',
 +        'smptett+xml': 'tt',
 +        'srt': 'srt',
 +        'ttaf+xml': 'dfxp',
          'ttml+xml': 'ttml',
 +        'vtt': 'vtt',
          'x-flv': 'flv',
          'x-mp4-fragmented': 'mp4',
          'x-ms-wmv': 'wmv',
@@@ -2617,41 -2626,3 +2637,41 @@@ def ohdave_rsa_encrypt(data, exponent, 
      payload = int(binascii.hexlify(data[::-1]), 16)
      encrypted = pow(payload, exponent, modulus)
      return '%x' % encrypted
 +
 +
 +def encode_base_n(num, n, table=None):
 +    FULL_TABLE = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
 +    if not table:
 +        table = FULL_TABLE[:n]
 +
 +    if n > len(table):
 +        raise ValueError('base %d exceeds table length %d' % (n, len(table)))
 +
 +    if num == 0:
 +        return table[0]
 +
 +    ret = ''
 +    while num:
 +        ret = table[num % n] + ret
 +        num = num // n
 +    return ret
 +
 +
 +def decode_packed_codes(code):
 +    mobj = re.search(
 +        r"}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)",
 +        code)
 +    obfucasted_code, base, count, symbols = mobj.groups()
 +    base = int(base)
 +    count = int(count)
 +    symbols = symbols.split('|')
 +    symbol_table = {}
 +
 +    while count:
 +        count -= 1
 +        base_n_count = encode_base_n(count, base)
 +        symbol_table[base_n_count] = symbols[count] or base_n_count
 +
 +    return re.sub(
 +        r'\b(\w+)\b', lambda mobj: symbol_table[mobj.group(0)],
 +        obfucasted_code)