4 import xml
.etree
.ElementTree
as etree
6 from ._deprecated
import * # noqa: F401, F403
7 from .compat_utils
import passthrough_module
9 # XXX: Implement this the same way as other DeprecationWarnings without circular import
10 passthrough_module(__name__
, '._legacy', callback
=lambda attr
: warnings
.warn(
11 DeprecationWarning(f
'{__name__}.{attr} is deprecated'), stacklevel
=5))
14 # HTMLParseError has been deprecated in Python 3.3 and removed in
15 # Python 3.5. Introducing dummy exception for Python >3.5 for compatible
16 # and uniform cross-version exception handling
17 class compat_HTMLParseError(ValueError):
21 class _TreeBuilder(etree
.TreeBuilder
):
22 def doctype(self
, name
, pubid
, system
):
26 def compat_etree_fromstring(text
):
27 return etree
.XML(text
, parser
=etree
.XMLParser(target
=_TreeBuilder()))
30 compat_os_name
= os
._name
if os
.name
== 'java' else os
.name
33 if compat_os_name
== 'nt':
34 def compat_shlex_quote(s
):
36 return s
if re
.match(r
'^[-_\w./]+$', s
) else '"%s"' % s
.replace('"', '\\"')
38 from shlex
import quote
as compat_shlex_quote
# noqa: F401
42 return c
if isinstance(c
, int) else ord(c
)
45 if compat_os_name
== 'nt' and sys
.version_info
< (3, 8):
46 # os.path.realpath on Windows does not follow symbolic links
47 # prior to Python 3.8 (see https://bugs.python.org/issue9949)
48 def compat_realpath(path
):
49 while os
.path
.islink(path
):
50 path
= os
.path
.abspath(os
.readlink(path
))
51 return os
.path
.realpath(path
)
53 compat_realpath
= os
.path
.realpath
56 # Python 3.8+ does not honor %HOME% on windows, but this breaks compatibility with youtube-dl
57 # See https://github.com/yt-dlp/yt-dlp/issues/792
58 # https://docs.python.org/3/library/os.path.html#os.path.expanduser
59 if compat_os_name
in ('nt', 'ce'):
60 def compat_expanduser(path
):
61 HOME
= os
.environ
.get('HOME')
63 return os
.path
.expanduser(path
)
64 elif not path
.startswith('~'):
66 i
= path
.replace('\\', '/', 1).find('/') # ~user
69 userhome
= os
.path
.join(os
.path
.dirname(HOME
), path
[1:i
]) if i
> 1 else HOME
70 return userhome
+ path
[i
:]
72 compat_expanduser
= os
.path
.expanduser
75 def urllib_req_to_req(urllib_request
):
76 """Convert urllib Request to a networking Request"""
77 from ..networking
import Request
78 from ..utils
.networking
import HTTPHeaderDict
80 urllib_request
.get_full_url(), data
=urllib_request
.data
, method
=urllib_request
.get_method(),
81 headers
=HTTPHeaderDict(urllib_request
.headers
, urllib_request
.unredirected_hdrs
),
82 extensions
={'timeout': urllib_request.timeout}
if hasattr(urllib_request
, 'timeout') else None)