diff options
Diffstat (limited to 'youtube_dl/compat.py')
| -rw-r--r-- | youtube_dl/compat.py | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/youtube_dl/compat.py b/youtube_dl/compat.py index d103ab9ad..a3e85264a 100644 --- a/youtube_dl/compat.py +++ b/youtube_dl/compat.py @@ -14,6 +14,7 @@ import socket  import subprocess  import sys  import itertools +import xml.etree.ElementTree  try: @@ -212,6 +213,43 @@ try:  except ImportError:  # Python 2.6      from xml.parsers.expat import ExpatError as compat_xml_parse_error +if sys.version_info[0] >= 3: +    compat_etree_fromstring = xml.etree.ElementTree.fromstring +else: +    # python 2.x tries to encode unicode strings with ascii (see the +    # XMLParser._fixtext method) +    etree = xml.etree.ElementTree + +    try: +        _etree_iter = etree.Element.iter +    except AttributeError:  # Python <=2.6 +        def _etree_iter(root): +            for el in root.findall('*'): +                yield el +                for sub in _etree_iter(el): +                    yield sub + +    # on 2.6 XML doesn't have a parser argument, function copied from CPython +    # 2.7 source +    def _XML(text, parser=None): +        if not parser: +            parser = etree.XMLParser(target=etree.TreeBuilder()) +        parser.feed(text) +        return parser.close() + +    def _element_factory(*args, **kwargs): +        el = etree.Element(*args, **kwargs) +        for k, v in el.items(): +            if isinstance(v, bytes): +                el.set(k, v.decode('utf-8')) +        return el + +    def compat_etree_fromstring(text): +        doc = _XML(text, parser=etree.XMLParser(target=etree.TreeBuilder(element_factory=_element_factory))) +        for el in _etree_iter(doc): +            if el.text is not None and isinstance(el.text, bytes): +                el.text = el.text.decode('utf-8') +        return doc  try:      from urllib.parse import parse_qs as compat_parse_qs @@ -507,6 +545,7 @@ __all__ = [      'compat_chr',      'compat_cookiejar',      'compat_cookies', +    'compat_etree_fromstring',      'compat_expanduser',      'compat_get_terminal_size',      'compat_getenv', | 
