diff options
| author | remitamine <remitamine@gmail.com> | 2016-03-16 18:48:06 +0100 | 
|---|---|---|
| committer | Remita Amine <remitamine@gmail.com> | 2016-06-26 14:03:58 +0100 | 
| commit | 4f3c5e062715bb8c2084bda139ddcd9a2036f267 (patch) | |
| tree | 635303c308485ea0ce02113eb6ac0e8cc0c3dc26 | |
| parent | 1ac5705f62aa3f6fdb6f2a97fbd24594010b7598 (diff) | |
[utils] add helper function for parsing codecs
| -rw-r--r-- | test/test_utils.py | 24 | ||||
| -rw-r--r-- | youtube_dl/utils.py | 36 | 
2 files changed, 60 insertions, 0 deletions
| diff --git a/test/test_utils.py b/test/test_utils.py index b7ef51f8d..d84eb438f 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -78,6 +78,7 @@ from youtube_dl.utils import (      cli_option,      cli_valueless_option,      cli_bool_option, +    parse_codecs,  )  from youtube_dl.compat import (      compat_chr, @@ -579,6 +580,29 @@ class TestUtil(unittest.TestCase):              limit_length('foo bar baz asd', 12).startswith('foo bar'))          self.assertTrue('...' in limit_length('foo bar baz asd', 12)) +    def test_parse_codecs(self): +        self.assertEqual(parse_codecs(''), {}) +        self.assertEqual(parse_codecs('avc1.77.30, mp4a.40.2'), { +            'vcodec': 'avc1.77.30', +            'acodec': 'mp4a.40.2', +        }) +        self.assertEqual(parse_codecs('mp4a.40.2'), { +            'vcodec': 'none', +            'acodec': 'mp4a.40.2', +        }) +        self.assertEqual(parse_codecs('mp4a.40.5,avc1.42001e'), { +            'vcodec': 'avc1.42001e', +            'acodec': 'mp4a.40.5', +        }) +        self.assertEqual(parse_codecs('avc3.640028'), { +            'vcodec': 'avc3.640028', +            'acodec': 'none', +        }) +        self.assertEqual(parse_codecs(', h264,,newcodec,aac'), { +            'vcodec': 'h264', +            'acodec': 'aac', +        }) +      def test_escape_rfc3986(self):          reserved = "!*'();:@&=+$,/?#[]"          unreserved = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~' diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 562031fe1..fe175e82c 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -2060,6 +2060,42 @@ def mimetype2ext(mt):      }.get(res, res) +def parse_codecs(codecs_str): +    # http://tools.ietf.org/html/rfc6381 +    if not codecs_str: +        return {} +    splited_codecs = list(filter(None, map( +        lambda str: str.strip(), codecs_str.strip().strip(',').split(',')))) +    vcodec, acodec = None, None +    for full_codec in splited_codecs: +        codec = full_codec.split('.')[0] +        if codec in ('avc1', 'avc2', 'avc3', 'avc4', 'vp9', 'vp8', 'hev1', 'hev2', 'h263', 'h264', 'mp4v'): +            if not vcodec: +                vcodec = full_codec +        elif codec in ('mp4a', 'opus', 'vorbis', 'mp3', 'aac'): +            if not acodec: +                acodec = full_codec +        else: +            write_string('WARNING: Unknown codec %s' % full_codec, sys.stderr) +    if not vcodec and not acodec: +        if len(splited_codecs) == 2: +            return { +                'vcodec': vcodec, +                'acodec': acodec, +            } +        elif len(splited_codecs) == 1: +            return { +                'vcodec': 'none', +                'acodec': vcodec, +            } +    else: +        return { +            'vcodec': vcodec or 'none', +            'acodec': acodec or 'none', +        } +    return {} + +  def urlhandle_detect_ext(url_handle):      getheader = url_handle.headers.get | 
