]> jfr.im git - yt-dlp.git/blob - yt_dlp/dependencies/__init__.py
[rh:requests] Add handler for `requests` HTTP library (#3668)
[yt-dlp.git] / yt_dlp / dependencies / __init__.py
1 # flake8: noqa: F401
2 """Imports all optional dependencies for the project.
3 An attribute "_yt_dlp__identifier" may be inserted into the module if it uses an ambiguous namespace"""
4
5 try:
6 import brotlicffi as brotli
7 except ImportError:
8 try:
9 import brotli
10 except ImportError:
11 brotli = None
12
13
14 try:
15 import certifi
16 except ImportError:
17 certifi = None
18 else:
19 from os.path import exists as _path_exists
20
21 # The certificate may not be bundled in executable
22 if not _path_exists(certifi.where()):
23 certifi = None
24
25
26 try:
27 import mutagen
28 except ImportError:
29 mutagen = None
30
31
32 secretstorage = None
33 try:
34 import secretstorage
35 _SECRETSTORAGE_UNAVAILABLE_REASON = None
36 except ImportError:
37 _SECRETSTORAGE_UNAVAILABLE_REASON = (
38 'as the `secretstorage` module is not installed. '
39 'Please install by running `python3 -m pip install secretstorage`')
40 except Exception as _err:
41 _SECRETSTORAGE_UNAVAILABLE_REASON = f'as the `secretstorage` module could not be initialized. {_err}'
42
43
44 try:
45 import sqlite3
46 # We need to get the underlying `sqlite` version, see https://github.com/yt-dlp/yt-dlp/issues/8152
47 sqlite3._yt_dlp__version = sqlite3.sqlite_version
48 except ImportError:
49 # although sqlite3 is part of the standard library, it is possible to compile python without
50 # sqlite support. See: https://github.com/yt-dlp/yt-dlp/issues/544
51 sqlite3 = None
52
53
54 try:
55 import websockets
56 except (ImportError, SyntaxError):
57 # websockets 3.10 on python 3.6 causes SyntaxError
58 # See https://github.com/yt-dlp/yt-dlp/issues/2633
59 websockets = None
60
61 try:
62 import urllib3
63 except ImportError:
64 urllib3 = None
65
66 try:
67 import requests
68 except ImportError:
69 requests = None
70
71 try:
72 import xattr # xattr or pyxattr
73 except ImportError:
74 xattr = None
75 else:
76 if hasattr(xattr, 'set'): # pyxattr
77 xattr._yt_dlp__identifier = 'pyxattr'
78
79
80 from . import Cryptodome
81
82 all_dependencies = {k: v for k, v in globals().items() if not k.startswith('_')}
83 available_dependencies = {k: v for k, v in all_dependencies.items() if v}
84
85
86 # Deprecated
87 Cryptodome_AES = Cryptodome.AES
88
89
90 __all__ = [
91 'all_dependencies',
92 'available_dependencies',
93 *all_dependencies.keys(),
94 ]