diff options
Diffstat (limited to 'youtube_dl/utils.py')
| -rw-r--r-- | youtube_dl/utils.py | 45 | 
1 files changed, 26 insertions, 19 deletions
| diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 526d2cc02..9287edd8d 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -749,6 +749,8 @@ class ExtractorError(Exception):              expected = True          if video_id is not None:              msg = video_id + ': ' + msg +        if cause: +            msg += u' (caused by %r)' % cause          if not expected:              msg = msg + u'; please report this issue on https://yt-dl.org/bug . Be sure to call youtube-dl with the --verbose flag and include its complete output. Make sure you are using the latest version; type  youtube-dl -U  to update.'          super(ExtractorError, self).__init__(msg) @@ -968,6 +970,7 @@ def unified_strdate(date_str):          '%Y/%m/%d %H:%M:%S',          '%d/%m/%Y %H:%M:%S',          '%Y-%m-%d %H:%M:%S', +        '%Y-%m-%d %H:%M:%S.%f',          '%d.%m.%Y %H:%M',          '%d.%m.%Y %H.%M',          '%Y-%m-%dT%H:%M:%SZ', @@ -1651,33 +1654,37 @@ US_RATINGS = {  } +def parse_age_limit(s): +    if s is None: +        return None +    m = re.match(r'^(?P<age>\d{1,2})\+?$', s) +    return int(m.group('age')) if m else US_RATINGS.get(s, None) + +  def strip_jsonp(code):      return re.sub(r'(?s)^[a-zA-Z0-9_]+\s*\(\s*(.*)\);?\s*?\s*$', r'\1', code)  def js_to_json(code):      def fix_kv(m): -        key = m.group(2) -        if key.startswith("'"): -            assert key.endswith("'") -            assert '"' not in key -            key = '"%s"' % key[1:-1] -        elif not key.startswith('"'): -            key = '"%s"' % key - -        value = m.group(4) -        if value.startswith("'"): -            assert value.endswith("'") -            assert '"' not in value -            value = '"%s"' % value[1:-1] - -        return m.group(1) + key + m.group(3) + value +        v = m.group(0) +        if v in ('true', 'false', 'null'): +            return v +        if v.startswith('"'): +            return v +        if v.startswith("'"): +            v = v[1:-1] +            v = re.sub(r"\\\\|\\'|\"", lambda m: { +                '\\\\': '\\\\', +                "\\'": "'", +                '"': '\\"', +            }[m.group(0)], v) +        return '"%s"' % v      res = re.sub(r'''(?x) -            ([{,]\s*) -            ("[^"]*"|\'[^\']*\'|[a-z0-9A-Z]+) -            (:\s*) -            ([0-9.]+|true|false|"[^"]*"|\'[^\']*\'|\[|\{) +        "(?:[^"\\]*(?:\\\\|\\")?)*"| +        '(?:[^'\\]*(?:\\\\|\\')?)*'| +        [a-zA-Z_][a-zA-Z_0-9]*          ''', fix_kv, code)      res = re.sub(r',(\s*\])', lambda m: m.group(1), res)      return res | 
