138 lines
4.3 KiB
Python
138 lines
4.3 KiB
Python
import importlib.util
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import yaml
|
|
|
|
from framework import F
|
|
from plugin import *
|
|
|
|
|
|
REQUIRED_PACKAGES = [
|
|
("cloudscraper", "cloudscraper"),
|
|
("beautifulsoup4", "bs4"),
|
|
("requests-cache", "requests_cache"),
|
|
("lxml", "lxml"),
|
|
]
|
|
|
|
|
|
def _get_runtime_package_name():
|
|
return (__package__ or "").split(".")[0] or os.path.basename(os.path.dirname(__file__))
|
|
|
|
|
|
def _get_declared_package_name():
|
|
info_path = os.path.join(os.path.dirname(__file__), "info.yaml")
|
|
try:
|
|
with open(info_path, encoding="utf-8") as file:
|
|
info = yaml.safe_load(file) or {}
|
|
package_name = str(info.get("package_name", "")).strip()
|
|
if package_name != "":
|
|
return package_name
|
|
except Exception:
|
|
pass
|
|
return os.path.basename(os.path.dirname(__file__))
|
|
|
|
|
|
def _sync_runtime_package_metadata():
|
|
runtime_package_name = _get_runtime_package_name()
|
|
info_path = os.path.join(os.path.dirname(__file__), "info.yaml")
|
|
try:
|
|
with open(info_path, encoding="utf-8") as file:
|
|
info = yaml.safe_load(file) or {}
|
|
if str(info.get("package_name", "")).strip() != runtime_package_name:
|
|
info["package_name"] = runtime_package_name
|
|
with open(info_path, "w", encoding="utf-8") as file:
|
|
yaml.safe_dump(info, file, allow_unicode=True, sort_keys=False)
|
|
except Exception:
|
|
pass
|
|
return runtime_package_name
|
|
|
|
|
|
def ensure_sqlalchemy_bind(package_name=None):
|
|
package_name = package_name or _get_declared_package_name()
|
|
runtime_package_name = _get_runtime_package_name()
|
|
try:
|
|
if getattr(F, "app", None) is None:
|
|
return package_name
|
|
binds = F.app.config.setdefault("SQLALCHEMY_BINDS", {})
|
|
runtime_uri = binds.get(runtime_package_name)
|
|
if runtime_uri in [None, ""]:
|
|
runtime_db_path = os.path.join(F.config["path_data"], "db", f"{runtime_package_name}.db")
|
|
runtime_uri = f"sqlite:///{runtime_db_path}?check_same_thread=False"
|
|
binds[runtime_package_name] = runtime_uri
|
|
if package_name not in binds:
|
|
binds[package_name] = runtime_uri
|
|
|
|
db_instance = getattr(F, "db", None)
|
|
if db_instance is not None:
|
|
try:
|
|
engines = db_instance.engines
|
|
runtime_engine = engines.get(runtime_package_name)
|
|
if runtime_engine is not None and package_name not in engines:
|
|
engines[package_name] = runtime_engine
|
|
except Exception:
|
|
pass
|
|
except Exception:
|
|
pass
|
|
return package_name
|
|
|
|
|
|
def ensure_sqlalchemy_binds():
|
|
names = []
|
|
for candidate in [_get_declared_package_name(), _get_runtime_package_name()]:
|
|
candidate = str(candidate or "").strip()
|
|
if candidate != "" and candidate not in names:
|
|
names.append(candidate)
|
|
for name in names:
|
|
ensure_sqlalchemy_bind(name)
|
|
return names
|
|
|
|
|
|
def _ensure_requirements():
|
|
missing = [package for package, module_name in REQUIRED_PACKAGES if importlib.util.find_spec(module_name) is None]
|
|
if not missing:
|
|
return
|
|
|
|
if getattr(P, "logger", None) is not None:
|
|
P.logger.info("Installing missing packages: %s", ", ".join(missing))
|
|
|
|
subprocess.check_call([sys.executable, "-m", "pip", "install", *missing])
|
|
|
|
|
|
runtime_package_name = _sync_runtime_package_metadata()
|
|
|
|
setting = {
|
|
"filepath": __file__,
|
|
"use_db": True,
|
|
"use_default_setting": True,
|
|
"home_module": "category",
|
|
"menu": {
|
|
"uri": runtime_package_name,
|
|
"name": "linkkf",
|
|
"list": [
|
|
{"uri": "setting", "name": "설정"},
|
|
{"uri": "request", "name": "요청"},
|
|
{"uri": "category", "name": "카테고리"},
|
|
{"uri": "queue", "name": "대기열"},
|
|
{"uri": "list", "name": "목록"},
|
|
{"uri": "log", "name": "로그"},
|
|
],
|
|
},
|
|
"setting_menu": None,
|
|
"default_route": "single",
|
|
}
|
|
|
|
ensure_sqlalchemy_binds()
|
|
P = create_plugin_instance(setting)
|
|
ensure_sqlalchemy_binds()
|
|
ensure_sqlalchemy_bind(P.package_name)
|
|
_ensure_requirements()
|
|
|
|
try:
|
|
from .mod_basic import ModuleBasic
|
|
|
|
P.set_module_list([ModuleBasic])
|
|
except Exception as e:
|
|
P.logger.error(f"Exception:{str(e)}")
|
|
P.logger.error(traceback.format_exc())
|