33 lines
1.4 KiB
Python
33 lines
1.4 KiB
Python
"""Расширения-экстракторы для сайтов с непрямыми ссылками.
|
||
|
||
Каждый модуль здесь регистрирует свою стратегию декоратором @register из
|
||
app.services.downloader. Добавить сайт = положить сюда один файл; ядро не
|
||
трогаем. load_extractors() импортирует все модули пакета — её зовут на старте
|
||
приложения (lifespan в app/main.py).
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import importlib
|
||
import logging
|
||
import pkgutil
|
||
|
||
logger = logging.getLogger("pvideodl.extractors")
|
||
|
||
|
||
def load_extractors() -> list[str]:
|
||
"""Импортировать все модули пакета — при импорте они себя регистрируют.
|
||
|
||
Идемпотентно: при повторном вызове модули уже в sys.modules, их тело (а с ним
|
||
и @register) заново не выполняется — реестр не задваивается.
|
||
"""
|
||
loaded: list[str] = []
|
||
for info in pkgutil.iter_modules(__path__, __name__ + "."):
|
||
if info.name.rsplit(".", 1)[-1].startswith("_"):
|
||
continue
|
||
importlib.import_module(info.name)
|
||
loaded.append(info.name)
|
||
if loaded:
|
||
logger.info("Загружено экстракторов: %d (%s)", len(loaded), ", ".join(loaded))
|
||
return loaded
|