]> jfr.im git - yt-dlp.git/blob - yt_dlp/dependencies/Cryptodome.py
b95f45d720a5eb7d23f4221d45ec5131033b2ba7
[yt-dlp.git] / yt_dlp / dependencies / Cryptodome.py
1 import importlib
2
3 from ..compat import functools
4 from ..compat.compat_utils import EnhancedModule, passthrough_module
5
6 EnhancedModule(__name__)
7
8 try:
9 import Cryptodome as _parent
10 except ImportError:
11 try:
12 import Crypto as _parent
13 except (ImportError, SyntaxError): # Old Crypto gives SyntaxError in newer Python
14 _parent = EnhancedModule('Cryptodome')
15 __bool__ = lambda: False
16
17
18 @functools.cache
19 def __getattr__(name):
20 try:
21 submodule = importlib.import_module(f'.{name}', _parent.__name__)
22 except ImportError:
23 return getattr(_parent, name)
24 return passthrough_module(f'{__name__}.{name}', submodule)
25
26
27 @property
28 @functools.cache
29 def _yt_dlp__identifier():
30 if _parent.__name__ == 'Crypto':
31 from Crypto.Cipher import AES
32 try:
33 # In pycrypto, mode defaults to ECB. See:
34 # https://www.pycryptodome.org/en/latest/src/vs_pycrypto.html#:~:text=not%20have%20ECB%20as%20default%20mode
35 AES.new(b'abcdefghijklmnop')
36 except TypeError:
37 return 'pycrypto'
38 return _parent.__name__