diff --git a/app/api/endpoints/search.py b/app/api/endpoints/search.py index bd65fba7c..23171280b 100644 --- a/app/api/endpoints/search.py +++ b/app/api/endpoints/search.py @@ -10,7 +10,7 @@ from fastapi.responses import StreamingResponse from app.adapters.web.security.access import verify_resource_token, verify_token from app.api.response import ResponseAPIRouter from app.application.security.url import SecurityUtils -from app.chain.search import SearchChain +from app.chain.search import SearchChain # pylint: disable=no-name-in-module from app.domain.media import normalize_music_type from app.runtime.localization import LocaleHelper from app.runtime.log import logger @@ -19,7 +19,6 @@ from app.schemas.response import Response as _SchemaResponse from app.schemas.search import SearchLastContextData as _SchemaSearchLastContextData from app.schemas.search import SearchRecommendStatusData as _SchemaSearchRecommendStatusData from app.schemas.search import SubtitleInfo as _SchemaSubtitleInfo -from app.schemas.system import TorrentInfo as _SchemaTorrentInfo from app.schemas.token import TokenPayload as _SchemaTokenPayload from app.schemas.types import MediaSource, MediaType from app.schemas.workflow import Context as _SchemaContext diff --git a/docs/architecture-optimization-checklist.md b/docs/architecture-optimization-checklist.md index 3d9304319..dccc6c116 100644 --- a/docs/architecture-optimization-checklist.md +++ b/docs/architecture-optimization-checklist.md @@ -78,7 +78,7 @@ MoviePilot V3 已经形成较清晰的模块化单体:`foundation`、`domain` | Event Contract | 53 | 均已有 payload model,但当前全部是 diagnostic enforcement | | Python 源码量 | 约 298,700 行 | 60 个文件超过 1,000 行,10 个超过 2,000 行 | | 长方法 | 299 个超过 80 行 | 70 个超过 150 行,23 个超过 250 行;大量是私有方法 | -| 全量 mypy 历史债务 | 10,496 / 594 文件 | strict frontier 当前覆盖 41 个文件,Plugin owner 拆分及受益调用方低水位已固化 | +| 全量 mypy 历史债务 | 10,495 / 594 文件 | strict frontier 当前覆盖 41 个文件,Plugin owner 拆分及受益调用方低水位已固化 | | Ruff 历史诊断 | 654 | 低水位门禁通过,但规则集只覆盖 `E4/E7/E9/F/I` | | 覆盖率低水位 | Application 80.92%,Domain 79.87% | Chain、Runtime、Agent、Adapter、Startup 未进入包级覆盖率门禁 | diff --git a/scripts/architecture/baseline.py b/scripts/architecture/baseline.py index 834024120..2aece15b6 100644 --- a/scripts/architecture/baseline.py +++ b/scripts/architecture/baseline.py @@ -1067,17 +1067,44 @@ def git_head(repository: Path) -> str: return result.stdout.strip() if result.returncode == 0 else "unknown" -def collect_plugin_imports(path: Path) -> set[str]: - """收集单个插件文件静态声明及字面量动态加载的 app 模块。""" +def _plugin_attribute_parts(node: ast.AST) -> tuple[str, ...]: + """把插件属性表达式拆成点分片段,动态下标等无法证明的表达式返回空。""" + if isinstance(node, ast.Name): + return (node.id,) + if isinstance(node, ast.Attribute): + prefix = _plugin_attribute_parts(node.value) + return (*prefix, node.attr) if prefix else () + return () + + +def collect_plugin_import_contracts( + path: Path, +) -> tuple[set[str], set[str], Counter[str]]: + """收集插件模块、from-import 符号及可证明的导入对象属性调用。""" + tree = parse_source(path) imports: set[str] = set() - for node in ast.walk(parse_source(path)): + from_imports: set[str] = set() + imported_bindings: dict[str, set[str]] = defaultdict(set) + for node in ast.walk(tree): if isinstance(node, ast.Import): - imports.update( - alias.name for alias in node.names if alias.name.startswith("app.") - ) + for alias in node.names: + if not alias.name.startswith("app."): + continue + imports.add(alias.name) + if alias.asname: + imported_bindings[alias.asname].add(alias.name) + else: + root_name = alias.name.split(".", maxsplit=1)[0] + imported_bindings[root_name].add(root_name) elif isinstance(node, ast.ImportFrom) and node.module: if node.module.startswith("app."): imports.add(node.module) + for alias in node.names: + if alias.name == "*": + continue + target = f"{node.module}.{alias.name}" + from_imports.add(target) + imported_bindings[alias.asname or alias.name].add(target) elif isinstance(node, ast.Call) and node.args: function_name = ( node.func.id @@ -1092,6 +1119,24 @@ def collect_plugin_imports(path: Path) -> set[str]: and module_arg.value.startswith("app.") ): imports.add(module_arg.value) + + attribute_calls: Counter[str] = Counter() + for node in ast.walk(tree): + if not isinstance(node, ast.Call) or not isinstance(node.func, ast.Attribute): + continue + parts = _plugin_attribute_parts(node.func) + if len(parts) < 2: + continue + for imported_target in imported_bindings.get(parts[0], set()): + target = ".".join((imported_target, *parts[1:])) + if target.startswith("app."): + attribute_calls[target] += 1 + return imports, from_imports, attribute_calls + + +def collect_plugin_imports(path: Path) -> set[str]: + """收集单个插件文件静态声明及字面量动态加载的 app 模块。""" + imports, _, _ = collect_plugin_import_contracts(path) return imports @@ -1204,6 +1249,9 @@ def collect_official_plugin_baseline(plugin_repo: Path) -> dict[str, Any]: } ) import_files: dict[str, set[str]] = defaultdict(set) + from_import_files: dict[str, set[str]] = defaultdict(set) + attribute_call_files: dict[str, set[str]] = defaultdict(set) + attribute_call_counts: Counter[str] = Counter() hook_files: dict[str, set[str]] = defaultdict(set) api_contracts: dict[str, list[dict[str, Any]]] = {} digest = hashlib.sha256() @@ -1213,8 +1261,16 @@ def collect_official_plugin_baseline(plugin_repo: Path) -> dict[str, Any]: digest.update(relative.encode("utf-8")) digest.update(b"\0") digest.update(content) - for imported_module in collect_plugin_imports(path): + imported_modules, imported_symbols, attribute_calls = ( + collect_plugin_import_contracts(path) + ) + for imported_module in imported_modules: import_files[imported_module].add(relative) + for imported_symbol in imported_symbols: + from_import_files[imported_symbol].add(relative) + for attribute_call, count in attribute_calls.items(): + attribute_call_files[attribute_call].add(relative) + attribute_call_counts[attribute_call] += count routes = collect_plugin_api_contracts(path) if routes: api_contracts[relative] = routes @@ -1228,7 +1284,7 @@ def collect_official_plugin_baseline(plugin_repo: Path) -> dict[str, Any]: if hook in defined_names: hook_files[hook].add(relative) return { - "schema_version": 3, + "schema_version": 4, "scope": { "repository": "MoviePilot-Plugins", "roots": [*[root.name for root in versioned_roots], "plugins"], @@ -1246,6 +1302,21 @@ def collect_official_plugin_baseline(plugin_repo: Path) -> dict[str, Any]: } for module, files in sorted(import_files.items()) }, + "from_imports": { + symbol: { + "file_count": len(files), + "files": sorted(files), + } + for symbol, files in sorted(from_import_files.items()) + }, + "attribute_calls": { + target: { + "call_count": attribute_call_counts[target], + "file_count": len(files), + "files": sorted(files), + } + for target, files in sorted(attribute_call_files.items()) + }, "hooks": { hook: { "file_count": len(hook_files.get(hook, set())), @@ -1358,25 +1429,33 @@ def _migrate_runtime_baseline(value: dict[str, Any]) -> dict[str, Any]: def _migrate_plugin_baseline(value: dict[str, Any]) -> dict[str, Any]: - """把来源信息混排的 v2 插件基线转换为 scope/provenance 结构。""" - if value.get("schema_version") != 2: - return value - source = value["source"] - return { - "schema_version": 3, - "scope": { - "repository": source["repository"], - "roots": source["roots"], - }, - "provenance": { - "head": source["head"], - "python_file_count": source["python_file_count"], - "source_sha256": source["source_sha256"], - }, - "imports": value["imports"], - "hooks": value["hooks"], - "api_routes": value["api_routes"], - } + """链式迁移旧插件基线,并为空缺的符号/调用合同建立显式空快照。""" + migrated = value + if migrated.get("schema_version") == 2: + source = migrated["source"] + migrated = { + "schema_version": 3, + "scope": { + "repository": source["repository"], + "roots": source["roots"], + }, + "provenance": { + "head": source["head"], + "python_file_count": source["python_file_count"], + "source_sha256": source["source_sha256"], + }, + "imports": migrated["imports"], + "hooks": migrated["hooks"], + "api_routes": migrated["api_routes"], + } + if migrated.get("schema_version") == 3: + migrated = { + **migrated, + "schema_version": 4, + "from_imports": {}, + "attribute_calls": {}, + } + return migrated def semantic_baseline(path: Path, value: dict[str, Any]) -> dict[str, Any]: diff --git a/tests/fixtures/architecture/llm-provider-facade.json b/tests/fixtures/architecture/llm-provider-facade.json new file mode 100644 index 000000000..c81626e87 --- /dev/null +++ b/tests/fixtures/architecture/llm-provider-facade.json @@ -0,0 +1,102 @@ +{ + "class": "LLMProviderManager", + "methods": { + "clear_auth": { + "async": true, + "parameters": "self, provider_id: str", + "returns": "None" + }, + "create_bedrock_client": { + "async": false, + "parameters": "self, service_name: str, region: str, credentials: dict[str, Any], base_url: Optional[str]=None, use_proxy: Optional[bool]=None, read_timeout: Optional[int]=None", + "returns": "Any" + }, + "get_auth_status": { + "async": false, + "parameters": "self, provider_id: str", + "returns": "dict[str, Any]" + }, + "get_models_dev_data": { + "async": true, + "parameters": "self, force_refresh: bool=False, use_proxy: Optional[bool]=None", + "returns": "dict[str, Any]" + }, + "get_provider": { + "async": false, + "parameters": "self, provider_id: str", + "returns": "ProviderSpec" + }, + "get_saved_auth": { + "async": false, + "parameters": "self, provider_id: str", + "returns": "dict[str, Any] | None" + }, + "get_session_status": { + "async": false, + "parameters": "self, session_id: str", + "returns": "dict[str, Any]" + }, + "handle_chatgpt_callback": { + "async": true, + "parameters": "self, provider_id: str, code: Optional[str], state: Optional[str], error: Optional[str], error_description: Optional[str]", + "returns": "tuple[bool, str]" + }, + "list_models": { + "async": true, + "parameters": "self, provider_id: str, api_key: Optional[str]=None, base_url: Optional[str]=None, base_url_preset_id: Optional[str]=None, user_agent: Optional[str]=None, use_proxy: Optional[bool]=None, force_refresh: bool=False", + "returns": "list[dict[str, Any]]" + }, + "list_providers": { + "async": false, + "parameters": "self", + "returns": "list[dict[str, Any]]" + }, + "list_providers_async": { + "async": true, + "parameters": "self, force_refresh: bool=False, use_proxy: Optional[bool]=None", + "returns": "list[dict[str, Any]]" + }, + "poll_auth_session": { + "async": true, + "parameters": "self, session_id: str", + "returns": "dict[str, Any]" + }, + "provider_manage": { + "async": true, + "parameters": "self, provider: str, action: str, **params: Any", + "returns": "Dict[str, Any]" + }, + "resolve_cached_model_metadata": { + "async": false, + "parameters": "self, provider_id: str, model_id: Optional[str], base_url: Optional[str]=None, base_url_preset_id: Optional[str]=None", + "returns": "dict[str, Any] | None" + }, + "resolve_model_list_base_url": { + "async": false, + "parameters": "self, provider_id: str, base_url: Optional[str], base_url_preset_id: Optional[str]=None", + "returns": "Optional[str]" + }, + "resolve_model_metadata": { + "async": true, + "parameters": "self, provider_id: str, model_id: Optional[str], base_url: Optional[str]=None, base_url_preset_id: Optional[str]=None, use_proxy: Optional[bool]=None", + "returns": "dict[str, Any] | None" + }, + "resolve_runtime": { + "async": true, + "parameters": "self, provider_id: str, model: Optional[str], api_key: Optional[str]=None, base_url: Optional[str]=None, base_url_preset_id: Optional[str]=None, user_agent: Optional[str]=None, use_proxy: Optional[bool]=None", + "returns": "dict[str, Any]" + }, + "save_auth": { + "async": true, + "parameters": "self, provider_id: str, auth_data: dict[str, Any]", + "returns": "None" + }, + "start_auth": { + "async": true, + "parameters": "self, provider_id: str, method_id: str, callback_url: Optional[str]=None", + "returns": "dict[str, Any]" + } + }, + "module": "app.agent.llm.provider", + "schema_version": 1 +} diff --git a/tests/fixtures/architecture/mypy-baseline.json b/tests/fixtures/architecture/mypy-baseline.json index 08b0883f7..f14337a4a 100644 --- a/tests/fixtures/architecture/mypy-baseline.json +++ b/tests/fixtures/architecture/mypy-baseline.json @@ -941,7 +941,7 @@ }, "app/api/endpoints/search.py": { "arg-type": 2, - "attr-defined": 4, + "attr-defined": 3, "misc": 11, "no-untyped-call": 3, "no-untyped-def": 4, diff --git a/tests/fixtures/architecture/official-plugin-baseline.json b/tests/fixtures/architecture/official-plugin-baseline.json index 646564bb1..ae25b56b0 100644 --- a/tests/fixtures/architecture/official-plugin-baseline.json +++ b/tests/fixtures/architecture/official-plugin-baseline.json @@ -2891,6 +2891,3635 @@ } ] }, + "attribute_calls": { + "app.adapters.external.server.MoviePilotServerHelper.sub_done_async": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v3/bangumicoll/__init__.py" + ] + }, + "app.agent.llm.LLMHelper.extract_text_content": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.agent.llm.LLMHelper.get_llm": { + "call_count": 6, + "file_count": 6, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/courseorganizer/providers.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v3/chatgpt/openai.py", + "plugins.v3/courseorganizer/providers.py", + "plugins.v3/lunatvsource/ai.py" + ] + }, + "app.agent.llm.helper.LLMHelper.get_llm": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.agent.llm.helper.LLMHelper.test_current_settings": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.agent.tools.manager.moviepilot_tool_manager._load_tools": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/__init__.py" + ] + }, + "app.core.config.settings.LLM_PROVIDER.lower": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.core.config.settings.MP_DOMAIN": { + "call_count": 7, + "file_count": 5, + "files": [ + "plugins.v2/oidcauth/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py" + ] + }, + "app.core.config.settings.RENAME_FORMAT": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.core.config.settings.REPO_GITHUB_HEADERS": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.core.config.settings.SECURITY_IMAGE_DOMAINS.append": { + "call_count": 3, + "file_count": 2, + "files": [ + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py" + ] + }, + "app.core.event.eventmanager.disable_event_handler": { + "call_count": 5, + "file_count": 2, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v3/chatgpt/__init__.py" + ] + }, + "app.core.event.eventmanager.enable_event_handler": { + "call_count": 3, + "file_count": 2, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v3/chatgpt/__init__.py" + ] + }, + "app.core.event.eventmanager.register": { + "call_count": 79, + "file_count": 56, + "files": [ + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.core.event.eventmanager.send_event": { + "call_count": 12, + "file_count": 6, + "files": [ + "plugins.v2/autoclean/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/removelink/__init__.py" + ] + }, + "app.db.models.TransferHistory.get_by_src": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/historytov2/__init__.py", + "plugins.v3/historytov2/__init__.py" + ] + }, + "app.db.models.downloadhistory.DownloadHistory.date.desc": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/dailysummary/__init__.py" + ] + }, + "app.db.models.siteuserdata.SiteUserData.get_by_date": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/dailysummary/__init__.py" + ] + }, + "app.db.models.siteuserdata.SiteUserData.get_latest": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/dailysummary/__init__.py" + ] + }, + "app.db.models.transferhistory.TransferHistory.download_hash.in_": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.db.models.user.User.get": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/oidcauth/__init__.py" + ] + }, + "app.db.models.user.User.get_by_name": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/oidcauth/__init__.py" + ] + }, + "app.helper.directory.DirectoryHelper.get_media_root_path": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.helper.llm.LLMHelper.extract_text_content": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.helper.llm.LLMHelper.get_llm": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.helper.module.ModuleHelper.load": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/contractcheck/__init__.py" + ] + }, + "app.helper.service.ServiceConfigHelper.get_downloader_configs": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.helper.service.ServiceConfigHelper.get_notification_configs": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.helper.system.SystemHelper.restart": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/moviepilotupdatenotify/__init__.py" + ] + }, + "app.log.logger.debug": { + "call_count": 205, + "file_count": 41, + "files": [ + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdupt.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/imdbsource/officialapi.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/subtitle.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/tobypasstrackers/dns_helper.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wechatclawbot/ilink/client.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/removelink/__init__.py", + "plugins/zvideohelper/DoubanHelper.py" + ] + }, + "app.log.logger.error": { + "call_count": 611, + "file_count": 111, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/agentresourceofficer/feishu_channel.py", + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/animeupscale/__init__.py", + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/__init__.py", + "plugins.v2/autosignin/sites/btschool.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/haidan.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdcity.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/hdupt.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/pterclub.py", + "plugins.v2/autosignin/sites/pttime.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/zhuque.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/clashruleprovider/helper/dataupgrader/v_2_1_0.py", + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/goldprice/__init__.py", + "plugins.v2/historytov2/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/imdbsource/officialapi.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/pipeline.py", + "plugins.v2/lexiannot/subtitle.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/oidcauth/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins.v2/synccookiecloud/__init__.py", + "plugins.v2/tmdbwallpaper/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wechatclawbot/ilink/client.py", + "plugins.v2/wxpusher/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cleaninvalidplugin/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/customindexer/__init__.py", + "plugins/customsites/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/ipdetect/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/remoteidentifiers/__init__.py", + "plugins/removelink/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/trackereditor/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/DoubanHelper.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.log.logger.info": { + "call_count": 851, + "file_count": 112, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/agentresourceofficer/feishu_channel.py", + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/animeupscale/__init__.py", + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/btschool.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/haidan.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdcity.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/hdupt.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/pterclub.py", + "plugins.v2/autosignin/sites/pttime.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/zhuque.py", + "plugins.v2/bangumiproxy/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/clashruleprovider/api.py", + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/goldprice/__init__.py", + "plugins.v2/historytov2/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/pipeline.py", + "plugins.v2/lexiannot/spacyworker.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/notifyimage/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins.v2/synccookiecloud/__init__.py", + "plugins.v2/tmdbwallpaper/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wechatclawbot/ilink/client.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cleaninvalidplugin/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/customsites/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/ipdetect/__init__.py", + "plugins/iyuuauth/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/mpserverstatus/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/remoteidentifiers/__init__.py", + "plugins/removelink/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/trackereditor/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/DoubanHelper.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.log.logger.warn": { + "call_count": 205, + "file_count": 50, + "files": [ + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/historytov2/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/subtitle.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/wxpusher/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cleaninvalidplugin/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/ipdetect/__init__.py", + "plugins/iyuuauth/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/mpserverstatus/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/removelink/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py" + ] + }, + "app.log.logger.warning": { + "call_count": 226, + "file_count": 50, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/agentresourceofficer/feishu_channel.py", + "plugins.v2/agentresourceofficer/services/hdhive_browser.py", + "plugins.v2/agentresourceofficer/services/quark_transfer.py", + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/animeupscale/__init__.py", + "plugins.v2/bangumiproxy/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/clashruleprovider/models/configuration.py", + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/goldprice/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wechatclawbot/ilink/client.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/iyuumsg/__init__.py" + ] + }, + "app.plugins.ffmpegthumb.ffmpeg_helper.FfmpegHelper.get_thumb": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/ffmpegthumb/__init__.py" + ] + }, + "app.plugins.imdbsource.imdbhelper.ImdbHelper.compare_names": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.imdbhelper.ImdbHelper.convert_mediainfo": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.imdbhelper.ImdbHelper.get_category": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.imdbhelper.ImdbHelper.title_to_mediainfo": { + "call_count": 4, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.imdbhelper.ImdbHelper.type_to_mtype": { + "call_count": 3, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.officialapi.INTERESTS_ID.items": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.p115strmhelper.core.config.configer.get_ios_ua_app": { + "call_count": 4, + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/services/p115_transfer.py", + "plugins.v3/agentresourceofficer/services/p115_transfer.py" + ] + }, + "app.schemas.MediaType.__members__.values": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/libraryscraper/__init__.py", + "plugins.v3/libraryscraper/__init__.py" + ] + }, + "app.schemas.types.MediaType.from_agent": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/__init__.py" + ] + }, + "app.schemas.types.MessageChannel.__members__.values": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.sdk.config.settings.SECURITY_IMAGE_DOMAINS.append": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v3/imdbsource/__init__.py" + ] + }, + "app.sdk.events.eventmanager.register": { + "call_count": 19, + "file_count": 12, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/mediainforenameenhancer/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.sdk.events.eventmanager.send_event": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v3/autoclean/__init__.py" + ] + }, + "app.sdk.logging.logger.debug": { + "call_count": 93, + "file_count": 9, + "files": [ + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/imdbsource/officialapi.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.sdk.logging.logger.error": { + "call_count": 131, + "file_count": 19, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/feishu_channel.py", + "plugins.v3/animeupscale/__init__.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/imdbsource/officialapi.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.sdk.logging.logger.info": { + "call_count": 156, + "file_count": 18, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/feishu_channel.py", + "plugins.v3/animeupscale/__init__.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.logging.logger.warn": { + "call_count": 49, + "file_count": 13, + "files": [ + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.logging.logger.warning": { + "call_count": 48, + "file_count": 12, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/feishu_channel.py", + "plugins.v3/agentresourceofficer/services/hdhive_browser.py", + "plugins.v3/agentresourceofficer/services/quark_transfer.py", + "plugins.v3/animeupscale/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/mediainforenameenhancer/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.sdk.network.WebUtils.get_location": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v3/mediaservermsg/__init__.py" + ] + }, + "app.sdk.utilities.CryptoJsUtils.decrypt": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py" + ] + }, + "app.sdk.utilities.DomUtils.tag_value": { + "call_count": 3, + "file_count": 1, + "files": [ + "plugins.v3/doubanrank/__init__.py" + ] + }, + "app.sdk.utilities.StringUtils.clear": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v3/imdbsource/imdbhelper.py" + ] + }, + "app.sdk.utilities.StringUtils.generate_random_str": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v3/brushflow/__init__.py" + ] + }, + "app.sdk.utilities.StringUtils.get_url_domain": { + "call_count": 4, + "file_count": 2, + "files": [ + "plugins.v3/brushflow/__init__.py", + "plugins.v3/downloadsitetag/__init__.py" + ] + }, + "app.sdk.utilities.StringUtils.is_chinese": { + "call_count": 8, + "file_count": 1, + "files": [ + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.sdk.utilities.StringUtils.is_number": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v3/imdbsource/imdbhelper.py" + ] + }, + "app.sdk.utilities.StringUtils.str_filesize": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v3/brushflow/__init__.py" + ] + }, + "app.sdk.utilities.SystemUtils.list_files": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v3/libraryscraper/__init__.py" + ] + }, + "app.utils.crypto.CryptoJsUtils.decrypt": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/synccookiecloud/__init__.py" + ] + }, + "app.utils.crypto.CryptoJsUtils.encrypt": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/synccookiecloud/__init__.py" + ] + }, + "app.utils.dom.DomUtils.tag_value": { + "call_count": 3, + "file_count": 1, + "files": [ + "plugins.v2/doubanrank/__init__.py" + ] + }, + "app.utils.ip.IpUtils.is_ipv4": { + "call_count": 3, + "file_count": 2, + "files": [ + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py" + ] + }, + "app.utils.ip.IpUtils.is_ipv6": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins/cloudflarespeedtest/__init__.py" + ] + }, + "app.utils.ip.IpUtils.is_private_ip": { + "call_count": 3, + "file_count": 1, + "files": [ + "plugins.v2/speedlimiter/__init__.py" + ] + }, + "app.utils.site.SiteUtils.is_checkin": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/autosignin/__init__.py" + ] + }, + "app.utils.site.SiteUtils.is_logged_in": { + "call_count": 5, + "file_count": 2, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py" + ] + }, + "app.utils.string.StringUtils.clear": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/imdbhelper.py" + ] + }, + "app.utils.string.StringUtils.compare_version": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.utils.string.StringUtils.generate_random_str": { + "call_count": 4, + "file_count": 4, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/torrenttransfer/__init__.py" + ] + }, + "app.utils.string.StringUtils.get_url_domain": { + "call_count": 14, + "file_count": 8, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/mteam.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins/siterefresh/__init__.py" + ] + }, + "app.utils.string.StringUtils.get_url_netloc": { + "call_count": 7, + "file_count": 2, + "files": [ + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/qbcommand/__init__.py" + ] + }, + "app.utils.string.StringUtils.get_url_sld": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/torrentremover/__init__.py" + ] + }, + "app.utils.string.StringUtils.is_chinese": { + "call_count": 8, + "file_count": 1, + "files": [ + "plugins.v2/personmeta/__init__.py" + ] + }, + "app.utils.string.StringUtils.is_number": { + "call_count": 2, + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/imdbhelper.py" + ] + }, + "app.utils.string.StringUtils.num_filesize": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins.v2/contractcheck/siteuserinfo/nexus_php.py", + "plugins.v2/contractcheck/siteuserinfo/nexus_ttg.py" + ] + }, + "app.utils.string.StringUtils.str_filesize": { + "call_count": 31, + "file_count": 7, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.utils.string.StringUtils.to_bool": { + "call_count": 3, + "file_count": 3, + "files": [ + "plugins.v2/clashruleprovider/helper/converters/hysteria.py", + "plugins.v2/clashruleprovider/helper/converters/hysteria2.py", + "plugins.v2/clashruleprovider/helper/converters/trojan.py" + ] + }, + "app.utils.string.StringUtils.url_equal": { + "call_count": 20, + "file_count": 20, + "files": [ + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/__init__.py", + "plugins.v2/autosignin/sites/btschool.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/haidan.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdcity.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/hdupt.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/pterclub.py", + "plugins.v2/autosignin/sites/pttime.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/zhuque.py" + ] + }, + "app.utils.system.SystemUtils.copy": { + "call_count": 2, + "file_count": 2, + "files": [ + "plugins/autosubv2/__init__.py", + "plugins/linkmonitor/__init__.py" + ] + }, + "app.utils.system.SystemUtils.execute": { + "call_count": 5, + "file_count": 2, + "files": [ + "plugins.v2/ffmpegthumb/ffmpeg_helper.py", + "plugins/cloudflarespeedtest/__init__.py" + ] + }, + "app.utils.system.SystemUtils.is_bluray_dir": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/chinesesubfinder/__init__.py" + ] + }, + "app.utils.system.SystemUtils.is_macos": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins/cloudflarespeedtest/__init__.py" + ] + }, + "app.utils.system.SystemUtils.is_windows": { + "call_count": 13, + "file_count": 3, + "files": [ + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/linkmonitor/__init__.py" + ] + }, + "app.utils.system.SystemUtils.link": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins/linkmonitor/__init__.py" + ] + }, + "app.utils.system.SystemUtils.list_files": { + "call_count": 5, + "file_count": 4, + "files": [ + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins/linkmonitor/__init__.py" + ] + }, + "app.utils.timer.TimerUtils.random_scheduler": { + "call_count": 3, + "file_count": 3, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/crossseed/__init__.py" + ] + }, + "app.utils.web.WebUtils.get_location": { + "call_count": 1, + "file_count": 1, + "files": [ + "plugins.v2/mediaservermsg/__init__.py" + ] + } + }, + "from_imports": { + "app.adapters.external.server.MoviePilotServerHelper": { + "file_count": 1, + "files": [ + "plugins.v3/bangumicoll/__init__.py" + ] + }, + "app.agent.llm.LLMHelper": { + "file_count": 6, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/courseorganizer/providers.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v3/chatgpt/openai.py", + "plugins.v3/courseorganizer/providers.py", + "plugins.v3/lunatvsource/ai.py" + ] + }, + "app.agent.llm.helper.LLMHelper": { + "file_count": 1, + "files": [ + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.agent.tools.base.MoviePilotTool": { + "file_count": 3, + "files": [ + "plugins.v2/agentresourceofficer/agenttool.py", + "plugins.v2/lexiannot/agenttool.py", + "plugins.v3/agentresourceofficer/agenttool.py" + ] + }, + "app.agent.tools.manager.moviepilot_tool_manager": { + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/__init__.py" + ] + }, + "app.api.deps.get_current_active_superuser": { + "file_count": 1, + "files": [ + "plugins.v3/courseorganizer/__init__.py" + ] + }, + "app.api.endpoints.download": { + "file_count": 1, + "files": [ + "plugins.v3/lunatvsource/__init__.py" + ] + }, + "app.api.endpoints.plugin.register_plugin_api": { + "file_count": 4, + "files": [ + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v3/brushflow/__init__.py" + ] + }, + "app.application.directory.DirectoryHelper": { + "file_count": 1, + "files": [ + "plugins.v3/lunatvsource/__init__.py" + ] + }, + "app.chain.ChainBase": { + "file_count": 2, + "files": [ + "plugins.v2/imdbsource/__init__.py", + "plugins.v3/imdbsource/__init__.py" + ] + }, + "app.chain.anilist.AniListChain": { + "file_count": 1, + "files": [ + "plugins.v2/fullscreenposterwall/__init__.py" + ] + }, + "app.chain.download.DownloadChain": { + "file_count": 12, + "files": [ + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/rsssubscribe/__init__.py", + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.chain.media.MediaChain": { + "file_count": 13, + "files": [ + "plugins.v2/agentresourceofficer/services/hdhive_openapi.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/courseorganizer/providers.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v3/agentresourceofficer/services/hdhive_openapi.py", + "plugins.v3/courseorganizer/providers.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.chain.mediaserver.MediaServerChain": { + "file_count": 3, + "files": [ + "plugins.v2/personmeta/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.chain.message.MessageChain": { + "file_count": 1, + "files": [ + "plugins.v2/wechatclawbot/__init__.py" + ] + }, + "app.chain.recommend.RecommendChain": { + "file_count": 3, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v3/agentresourceofficer/__init__.py" + ] + }, + "app.chain.scraping.ScrapingChain": { + "file_count": 1, + "files": [ + "plugins.v3/libraryscraper/__init__.py" + ] + }, + "app.chain.search.SearchChain": { + "file_count": 4, + "files": [ + "plugins.v2/doubansync/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/lunatvsource/__init__.py" + ] + }, + "app.chain.site.SiteChain": { + "file_count": 2, + "files": [ + "plugins.v2/sitestatistic/__init__.py", + "plugins/siterefresh/__init__.py" + ] + }, + "app.chain.storage.StorageChain": { + "file_count": 4, + "files": [ + "plugins.v2/autoclean/__init__.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/lunatvsource/__init__.py" + ] + }, + "app.chain.subscribe.SubscribeChain": { + "file_count": 10, + "files": [ + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.chain.system.SystemChain": { + "file_count": 1, + "files": [ + "plugins.v2/moviepilotupdatenotify/__init__.py" + ] + }, + "app.chain.tmdb.TmdbChain": { + "file_count": 5, + "files": [ + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins/trendingshow/__init__.py" + ] + }, + "app.chain.torrents.TorrentsChain": { + "file_count": 4, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v3/brushflow/__init__.py" + ] + }, + "app.chain.transfer.TransferChain": { + "file_count": 2, + "files": [ + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/lunatvsource/__init__.py" + ] + }, + "app.command.Command": { + "file_count": 1, + "files": [ + "plugins.v2/wechatclawbot/__init__.py" + ] + }, + "app.core.auth.create_plugin_auth_ticket": { + "file_count": 1, + "files": [ + "plugins.v2/oidcauth/__init__.py" + ] + }, + "app.core.auth_bridge.create_plugin_auth_ticket": { + "file_count": 1, + "files": [ + "plugins.v2/oidcauth/__init__.py" + ] + }, + "app.core.cache.Cache": { + "file_count": 1, + "files": [ + "plugins.v2/clashruleprovider/state.py" + ] + }, + "app.core.cache.cached": { + "file_count": 9, + "files": [ + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/imdbsource/officialapi.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/spacyworker.py", + "plugins.v2/mediaservermsg/__init__.py" + ] + }, + "app.core.config.global_vars": { + "file_count": 2, + "files": [ + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.core.config.settings": { + "file_count": 85, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/agentresourceofficer/services/hdhive_openapi.py", + "plugins.v2/agentresourceofficer/services/p115_transfer.py", + "plugins.v2/agentresourceofficer/services/quark_transfer.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/__init__.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/mteam.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/yema.py", + "plugins.v2/autosignin/sites/zhuque.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/clashruleprovider/api.py", + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py", + "plugins.v2/courseorganizer/providers.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/oidcauth/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/synccookiecloud/__init__.py", + "plugins.v2/tmdbwallpaper/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/categoryeditor/__init__.py", + "plugins/cleaninvalidplugin/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/ipdetect/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/remoteidentifiers/__init__.py", + "plugins/removelink/__init__.py", + "plugins/webhook/__init__.py", + "plugins/zvideohelper/DoubanHelper.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.core.context.Context": { + "file_count": 5, + "files": [ + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py" + ] + }, + "app.core.context.MediaInfo": { + "file_count": 15, + "files": [ + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins/autosubv2/__init__.py" + ] + }, + "app.core.context.TorrentInfo": { + "file_count": 2, + "files": [ + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py" + ] + }, + "app.core.event.Event": { + "file_count": 49, + "files": [ + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.core.event.EventManager": { + "file_count": 1, + "files": [ + "plugins/customsites/__init__.py" + ] + }, + "app.core.event.eventmanager": { + "file_count": 61, + "files": [ + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/removelink/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.core.meta.MetaBase": { + "file_count": 4, + "files": [ + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins/zvideohelper/DoubanHelper.py" + ] + }, + "app.core.meta.words.WordsMatcher": { + "file_count": 1, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py" + ] + }, + "app.core.metainfo.MetaInfo": { + "file_count": 10, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.core.metainfo.MetaInfoPath": { + "file_count": 2, + "files": [ + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/libraryscraper/__init__.py" + ] + }, + "app.core.module.ModuleManager": { + "file_count": 1, + "files": [ + "plugins/ipdetect/__init__.py" + ] + }, + "app.core.plugin.PluginManager": { + "file_count": 6, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/agentresourceofficer/agenttool.py", + "plugins.v2/agentresourceofficer/services/p115_transfer.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/lexiannot/agenttool.py", + "plugins/cleaninvalidplugin/__init__.py" + ] + }, + "app.db.ScopedSession": { + "file_count": 1, + "files": [ + "plugins.v2/dailysummary/__init__.py" + ] + }, + "app.db.SessionFactory": { + "file_count": 4, + "files": [ + "plugins.v2/historytov2/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v3/historytov2/__init__.py" + ] + }, + "app.db.db_query": { + "file_count": 1, + "files": [ + "plugins.v3/bangumicoll/__init__.py" + ] + }, + "app.db.downloadhistory_oper.DownloadHistory": { + "file_count": 1, + "files": [ + "plugins.v2/subscribeclear/__init__.py" + ] + }, + "app.db.downloadhistory_oper.DownloadHistoryOper": { + "file_count": 6, + "files": [ + "plugins.v2/autoclean/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.db.message_oper.MessageOper": { + "file_count": 1, + "files": [ + "plugins.v2/wechatclawbot/__init__.py" + ] + }, + "app.db.models.PluginData": { + "file_count": 1, + "files": [ + "plugins.v3/episodegroupmeta/__init__.py" + ] + }, + "app.db.models.TransferHistory": { + "file_count": 2, + "files": [ + "plugins.v2/historytov2/__init__.py", + "plugins.v3/historytov2/__init__.py" + ] + }, + "app.db.models.downloadhistory.DownloadHistory": { + "file_count": 3, + "files": [ + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v3/downloadsitetag/__init__.py" + ] + }, + "app.db.models.siteuserdata.SiteUserData": { + "file_count": 3, + "files": [ + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/sitestatistic/__init__.py" + ] + }, + "app.db.models.subscribehistory.SubscribeHistory": { + "file_count": 1, + "files": [ + "plugins.v3/bangumicoll/__init__.py" + ] + }, + "app.db.models.transferhistory.TransferHistory": { + "file_count": 1, + "files": [ + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.db.models.user.User": { + "file_count": 1, + "files": [ + "plugins.v2/oidcauth/__init__.py" + ] + }, + "app.db.oper.downloadhistory.DownloadHistoryOper": { + "file_count": 3, + "files": [ + "plugins.v3/autoclean/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/lunatvsource/__init__.py" + ] + }, + "app.db.oper.site.SiteOper": { + "file_count": 2, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py" + ] + }, + "app.db.oper.subscribe.SubscribeOper": { + "file_count": 4, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/lunatvsource/__init__.py" + ] + }, + "app.db.oper.systemconfig.SystemConfigOper": { + "file_count": 1, + "files": [ + "plugins.v3/courseorganizer/__init__.py" + ] + }, + "app.db.oper.transferhistory.TransferHistoryOper": { + "file_count": 2, + "files": [ + "plugins.v3/autoclean/__init__.py", + "plugins.v3/libraryscraper/__init__.py" + ] + }, + "app.db.oper.user.UserOper": { + "file_count": 1, + "files": [ + "plugins.v3/doubansync/__init__.py" + ] + }, + "app.db.plugindata_oper.PluginDataOper": { + "file_count": 3, + "files": [ + "plugins.v2/clashruleprovider/helper/dataupgrader/v_2_1_0.py", + "plugins.v2/clashruleprovider/state.py", + "plugins.v2/dailysummary/__init__.py" + ] + }, + "app.db.site_oper.SiteOper": { + "file_count": 11, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/synccookiecloud/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins/siterefresh/__init__.py" + ] + }, + "app.db.subscribe_oper.SubscribeOper": { + "file_count": 3, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubansync/__init__.py" + ] + }, + "app.db.systemconfig_oper.SystemConfigOper": { + "file_count": 2, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins/cleaninvalidplugin/__init__.py" + ] + }, + "app.db.transferhistory_oper.TransferHistoryOper": { + "file_count": 5, + "files": [ + "plugins.v2/autoclean/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins/removelink/__init__.py" + ] + }, + "app.db.user_oper.UserOper": { + "file_count": 1, + "files": [ + "plugins.v2/doubansync/__init__.py" + ] + }, + "app.db.user_oper.get_current_active_superuser": { + "file_count": 1, + "files": [ + "plugins.v2/courseorganizer/__init__.py" + ] + }, + "app.db.user_oper.get_current_active_user": { + "file_count": 1, + "files": [ + "plugins.v2/oidcauth/__init__.py" + ] + }, + "app.helper.browser.BrowserPage": { + "file_count": 1, + "files": [ + "plugins.v2/maoyanrank/__init__.py" + ] + }, + "app.helper.browser.PlaywrightHelper": { + "file_count": 5, + "files": [ + "plugins.v2/agentresourceofficer/services/hdhive_browser.py", + "plugins.v2/agentresourceofficer/services/hdhive_openapi.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/__init__.py", + "plugins.v2/maoyanrank/__init__.py" + ] + }, + "app.helper.cloudflare.under_challenge": { + "file_count": 2, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py" + ] + }, + "app.helper.cookiecloud.CookieCloudHelper": { + "file_count": 3, + "files": [ + "plugins.v2/dynamicwechat/__init__.py", + "plugins/customsites/__init__.py", + "plugins/zvideohelper/DoubanHelper.py" + ] + }, + "app.helper.directory.DirectoryHelper": { + "file_count": 2, + "files": [ + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.helper.downloader.DownloaderHelper": { + "file_count": 14, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py" + ] + }, + "app.helper.image.ImageHelper": { + "file_count": 1, + "files": [ + "plugins.v2/fullscreenposterwall/__init__.py" + ] + }, + "app.helper.image.WallpaperHelper": { + "file_count": 1, + "files": [ + "plugins.v2/tmdbwallpaper/__init__.py" + ] + }, + "app.helper.llm.LLMHelper": { + "file_count": 2, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.helper.mediaserver.MediaServerHelper": { + "file_count": 4, + "files": [ + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/speedlimiter/__init__.py" + ] + }, + "app.helper.module.ModuleHelper": { + "file_count": 2, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/contractcheck/__init__.py" + ] + }, + "app.helper.nfo.NfoReader": { + "file_count": 1, + "files": [ + "plugins.v2/libraryscraper/__init__.py" + ] + }, + "app.helper.ocr.OcrHelper": { + "file_count": 2, + "files": [ + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/opencd.py" + ] + }, + "app.helper.rss.RssHelper": { + "file_count": 2, + "files": [ + "plugins.v2/doubansync/__init__.py", + "plugins.v2/rsssubscribe/__init__.py" + ] + }, + "app.helper.service.ServiceConfigHelper": { + "file_count": 1, + "files": [ + "plugins.v2/qbuploadlimiter/__init__.py" + ] + }, + "app.helper.sites.SitesHelper": { + "file_count": 12, + "files": [ + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins/customindexer/__init__.py" + ] + }, + "app.helper.system.SystemHelper": { + "file_count": 1, + "files": [ + "plugins.v2/moviepilotupdatenotify/__init__.py" + ] + }, + "app.helper.thread.ThreadHelper": { + "file_count": 2, + "files": [ + "plugins.v2/animeupscale/__init__.py", + "plugins.v2/brushflow/__init__.py" + ] + }, + "app.helper.torrent.TorrentHelper": { + "file_count": 4, + "files": [ + "plugins.v2/crossseed/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/traktcleaner/__init__.py" + ] + }, + "app.helper.wallpaper.WallpaperHelper": { + "file_count": 1, + "files": [ + "plugins.v2/tmdbwallpaper/__init__.py" + ] + }, + "app.log.logger": { + "file_count": 129, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/agentresourceofficer/feishu_channel.py", + "plugins.v2/agentresourceofficer/services/hdhive_browser.py", + "plugins.v2/agentresourceofficer/services/quark_transfer.py", + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/animeupscale/__init__.py", + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/__init__.py", + "plugins.v2/autosignin/sites/btschool.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/haidan.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdcity.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/hdupt.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/pterclub.py", + "plugins.v2/autosignin/sites/pttime.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/zhuque.py", + "plugins.v2/bangumiproxy/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/clashruleprovider/api.py", + "plugins.v2/clashruleprovider/helper/dataupgrader/v_2_1_0.py", + "plugins.v2/clashruleprovider/models/configuration.py", + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/nexus_php.py", + "plugins.v2/courseorganizer/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/goldprice/__init__.py", + "plugins.v2/historytov2/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/imdbsource/officialapi.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/pipeline.py", + "plugins.v2/lexiannot/spacyworker.py", + "plugins.v2/lexiannot/subtitle.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/notifyimage/__init__.py", + "plugins.v2/oidcauth/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins.v2/synccookiecloud/__init__.py", + "plugins.v2/tmdbwallpaper/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/tobypasstrackers/dns_helper.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wechatclawbot/ilink/client.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cleaninvalidplugin/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/customindexer/__init__.py", + "plugins/customsites/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/ipdetect/__init__.py", + "plugins/iyuuauth/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/mpserverstatus/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/remoteidentifiers/__init__.py", + "plugins/removelink/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/trackereditor/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/DoubanHelper.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.modules.bangumi.bangumi": { + "file_count": 1, + "files": [ + "plugins.v2/bangumiproxy/__init__.py" + ] + }, + "app.modules.fanart.FanartModule": { + "file_count": 1, + "files": [ + "plugins.v2/fullscreenposterwall/__init__.py" + ] + }, + "app.modules.filemanager.storages.StorageBase": { + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.modules.filemanager.storages.local.LocalStorage": { + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.modules.filemanager.transhandler.TransHandler": { + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.modules.qbittorrent.Qbittorrent": { + "file_count": 4, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins/trackereditor/__init__.py" + ] + }, + "app.modules.themoviedb.CategoryHelper": { + "file_count": 3, + "files": [ + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins/categoryeditor/__init__.py" + ] + }, + "app.modules.themoviedb.TmdbApi": { + "file_count": 1, + "files": [ + "plugins.v3/bangumicoll/__init__.py" + ] + }, + "app.modules.themoviedb.tmdbapi.TmdbApi": { + "file_count": 1, + "files": [ + "plugins.v2/fullscreenposterwall/__init__.py" + ] + }, + "app.modules.themoviedb.tmdbv3api.TV": { + "file_count": 1, + "files": [ + "plugins.v3/episodegroupmeta/__init__.py" + ] + }, + "app.modules.transmission.Transmission": { + "file_count": 4, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins/trackereditor/__init__.py" + ] + }, + "app.modules.wechat.WeChat": { + "file_count": 1, + "files": [ + "plugins.v2/dynamicwechat/helper.py" + ] + }, + "app.plugins._PluginBase": { + "file_count": 118, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/animeupscale/__init__.py", + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/bangumiproxy/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/bugreporter/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/courseorganizer/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/goldprice/__init__.py", + "plugins.v2/historytov2/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/notifyimage/__init__.py", + "plugins.v2/oidcauth/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/storagecleanup/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins.v2/synccookiecloud/__init__.py", + "plugins.v2/tmdbwallpaper/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/animeupscale/__init__.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/mediainforenameenhancer/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/categoryeditor/__init__.py", + "plugins/cleaninvalidplugin/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/customindexer/__init__.py", + "plugins/customsites/__init__.py", + "plugins/dailyword/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/ipdetect/__init__.py", + "plugins/iyuuauth/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/mpserverstatus/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/remoteidentifiers/__init__.py", + "plugins/removelink/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/trackereditor/__init__.py", + "plugins/trendingshow/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.plugins.autosignin.sites._ISiteSigninHandler": { + "file_count": 21, + "files": [ + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/btschool.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/haidan.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdcity.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/hdupt.py", + "plugins.v2/autosignin/sites/mteam.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/pterclub.py", + "plugins.v2/autosignin/sites/pttime.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/yema.py", + "plugins.v2/autosignin/sites/zhuque.py" + ] + }, + "app.plugins.chatgpt.openai.OpenAi": { + "file_count": 2, + "files": [ + "plugins.v2/chatgpt/__init__.py", + "plugins.v3/chatgpt/__init__.py" + ] + }, + "app.plugins.ffmpegthumb.ffmpeg_helper.FfmpegHelper": { + "file_count": 1, + "files": [ + "plugins.v2/ffmpegthumb/__init__.py" + ] + }, + "app.plugins.imdbsource.imdbhelper.ImdbHelper": { + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.officialapi.INTERESTS_ID": { + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.schema.ImdbMediaInfo": { + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.schema.ImdbTitle": { + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.schema.SearchParams": { + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.schema.StaffPickApiResponse": { + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.imdbsource.schema.StaffPickEntry": { + "file_count": 1, + "files": [ + "plugins.v2/imdbsource/__init__.py" + ] + }, + "app.plugins.iyuuauth.iyuu_helper.IyuuHelper": { + "file_count": 1, + "files": [ + "plugins/iyuuauth/__init__.py" + ] + }, + "app.plugins.iyuuautoseed.iyuu_helper.IyuuHelper": { + "file_count": 1, + "files": [ + "plugins.v2/iyuuautoseed/__init__.py" + ] + }, + "app.plugins.p115strmhelper.core.config.configer": { + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/services/p115_transfer.py", + "plugins.v3/agentresourceofficer/services/p115_transfer.py" + ] + }, + "app.runtime.thread.ThreadHelper": { + "file_count": 2, + "files": [ + "plugins.v3/animeupscale/__init__.py", + "plugins.v3/brushflow/__init__.py" + ] + }, + "app.scheduler.Scheduler": { + "file_count": 6, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins/ipdetect/__init__.py" + ] + }, + "app.schemas.AgentLLMProviderEventData": { + "file_count": 1, + "files": [ + "plugins.v3/chatgpt/__init__.py" + ] + }, + "app.schemas.AgentTokensUsageEventData": { + "file_count": 1, + "files": [ + "plugins.v3/chatgpt/__init__.py" + ] + }, + "app.schemas.CommingMessage": { + "file_count": 1, + "files": [ + "plugins.v2/wechatclawbot/__init__.py" + ] + }, + "app.schemas.Context": { + "file_count": 2, + "files": [ + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/pipeline.py" + ] + }, + "app.schemas.DiscoverSourceEventData": { + "file_count": 5, + "files": [ + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.schemas.DownloadHistory": { + "file_count": 2, + "files": [ + "plugins.v2/autoclean/__init__.py", + "plugins.v3/autoclean/__init__.py" + ] + }, + "app.schemas.DownloadingTorrent": { + "file_count": 1, + "files": [ + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.schemas.ExistMediaInfo": { + "file_count": 2, + "files": [ + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.schemas.FileItem": { + "file_count": 2, + "files": [ + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py" + ] + }, + "app.schemas.MediaImageSet": { + "file_count": 1, + "files": [ + "plugins.v3/imdbsource/schema/imdbapi.py" + ] + }, + "app.schemas.MediaInfo": { + "file_count": 2, + "files": [ + "plugins.v2/personmeta/__init__.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.schemas.MediaRecognizeConvertEventData": { + "file_count": 2, + "files": [ + "plugins.v2/imdbsource/__init__.py", + "plugins.v3/imdbsource/__init__.py" + ] + }, + "app.schemas.MediaServerItem": { + "file_count": 4, + "files": [ + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.schemas.MediaSource": { + "file_count": 3, + "files": [ + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/maoyanrank/__init__.py" + ] + }, + "app.schemas.MediaType": { + "file_count": 8, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/maoyanrank/__init__.py" + ] + }, + "app.schemas.MessageResponse": { + "file_count": 1, + "files": [ + "plugins.v2/wechatclawbot/__init__.py" + ] + }, + "app.schemas.Notification": { + "file_count": 1, + "files": [ + "plugins.v2/wechatclawbot/__init__.py" + ] + }, + "app.schemas.NotificationType": { + "file_count": 24, + "files": [ + "plugins.v2/autoclean/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/ipdetect/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/removelink/__init__.py", + "plugins/trackereditor/__init__.py" + ] + }, + "app.schemas.RecommendSourceEventData": { + "file_count": 3, + "files": [ + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v3/imdbsource/__init__.py" + ] + }, + "app.schemas.RefreshMediaItem": { + "file_count": 1, + "files": [ + "plugins.v2/mediaserverrefresh/__init__.py" + ] + }, + "app.schemas.Response": { + "file_count": 1, + "files": [ + "plugins.v2/lexiannot/__init__.py" + ] + }, + "app.schemas.ServiceInfo": { + "file_count": 20, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/subscribeclear/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.schemas.TmdbEpisode": { + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.schemas.TorrentInfo": { + "file_count": 2, + "files": [ + "plugins.v2/brushflow/__init__.py", + "plugins.v3/brushflow/__init__.py" + ] + }, + "app.schemas.TransferDirectoryConf": { + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.schemas.TransferInfo": { + "file_count": 7, + "files": [ + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins/autosubv2/__init__.py" + ] + }, + "app.schemas.TransferInterceptEventData": { + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.schemas.TransferOverwriteCheckEventData": { + "file_count": 1, + "files": [ + "plugins.v2/blurayremux/__init__.py" + ] + }, + "app.schemas.TransferTorrent": { + "file_count": 1, + "files": [ + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.schemas.WebhookEventInfo": { + "file_count": 3, + "files": [ + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v3/mediaservermsg/__init__.py" + ] + }, + "app.schemas.context.MediaCredit": { + "file_count": 1, + "files": [ + "plugins.v3/imdbsource/schema/imdbapi.py" + ] + }, + "app.schemas.event.ResourceDownloadEventData": { + "file_count": 1, + "files": [ + "plugins.v2/hrblocker/__init__.py" + ] + }, + "app.schemas.event.ResourceSelectionEventData": { + "file_count": 1, + "files": [ + "plugins.v2/hrblocker/__init__.py" + ] + }, + "app.schemas.exception.ImmediateException": { + "file_count": 1, + "files": [ + "plugins.v3/imdbsource/officialapi.py" + ] + }, + "app.schemas.types.ChainEventType": { + "file_count": 16, + "files": [ + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/hrblocker/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/mediainforenameenhancer/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.schemas.types.EventType": { + "file_count": 67, + "files": [ + "plugins.v2/agenttokens/__init__.py", + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autoclean/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chatgpt/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/dailysummary/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/dynamicwechat/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/mediaserverrefresh/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/scrapefileclean/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/speedlimiter/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v2/updatewechatip/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/chatgpt/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/customsites/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/linkmonitor/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/removelink/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.schemas.types.MediaImageType": { + "file_count": 2, + "files": [ + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v3/mediaservermsg/__init__.py" + ] + }, + "app.schemas.types.MediaSource": { + "file_count": 16, + "files": [ + "plugins.v3/agentresourceofficer/services/hdhive_openapi.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/courseorganizer/providers.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.schemas.types.MediaType": { + "file_count": 30, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/blurayremux/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/episodetag/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/lexiannot/pipeline.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v2/tvfirstwatch/__init__.py", + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.schemas.types.MessageChannel": { + "file_count": 4, + "files": [ + "plugins.v2/dynamicwechat/helper.py", + "plugins.v2/qbuploadlimiter/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.schemas.types.NotificationType": { + "file_count": 32, + "files": [ + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/dynamicwechat/helper.py", + "plugins.v2/goldprice/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/mediaservermsg/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/multiclass/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/traktcleaner/__init__.py", + "plugins.v2/wxpusher/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/iyuumsg/__init__.py", + "plugins/ntfymsg/__init__.py", + "plugins/pushdeermsg/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/siterefresh/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/__init__.py" + ] + }, + "app.schemas.types.SystemConfigKey": { + "file_count": 7, + "files": [ + "plugins.v2/airecognizerenhancer/__init__.py", + "plugins.v2/doubansync/__init__.py", + "plugins.v2/rsssubscribe/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/rsssubscribe/__init__.py", + "plugins/cleaninvalidplugin/__init__.py" + ] + }, + "app.schemas.types.TorrentStatus": { + "file_count": 2, + "files": [ + "plugins.v2/traktcleaner/__init__.py", + "plugins/downloadingmsg/__init__.py" + ] + }, + "app.schemas.types.media_type_to_agent": { + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/__init__.py" + ] + }, + "app.sdk.browser.launch_browser_context": { + "file_count": 3, + "files": [ + "plugins.v3/agentresourceofficer/services/hdhive_browser.py", + "plugins.v3/agentresourceofficer/services/hdhive_openapi.py", + "plugins.v3/maoyanrank/__init__.py" + ] + }, + "app.sdk.cache.cached": { + "file_count": 4, + "files": [ + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/imdbsource/officialapi.py", + "plugins.v3/mediaservermsg/__init__.py" + ] + }, + "app.sdk.config.settings": { + "file_count": 23, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/services/hdhive_openapi.py", + "plugins.v3/agentresourceofficer/services/p115_transfer.py", + "plugins.v3/agentresourceofficer/services/quark_transfer.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/courseorganizer/providers.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/lunatvsource/ai.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.sdk.events.Event": { + "file_count": 12, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/mediainforenameenhancer/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.sdk.events.eventmanager": { + "file_count": 14, + "files": [ + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/mediainforenameenhancer/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.sdk.logging.logger": { + "file_count": 25, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/feishu_channel.py", + "plugins.v3/agentresourceofficer/services/hdhive_browser.py", + "plugins.v3/agentresourceofficer/services/quark_transfer.py", + "plugins.v3/animeupscale/__init__.py", + "plugins.v3/autoclean/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/courseorganizer/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/imdbsource/officialapi.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/mediainforenameenhancer/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/rsssubscribe/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.sdk.media.Context": { + "file_count": 2, + "files": [ + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.media.MediaInfo": { + "file_count": 8, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.media.MetaBase": { + "file_count": 5, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/imdbsource/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.sdk.media.MetaInfo": { + "file_count": 8, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.media.MetaInfoPath": { + "file_count": 2, + "files": [ + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/mediaservermsg/__init__.py" + ] + }, + "app.sdk.media.NfoReader": { + "file_count": 1, + "files": [ + "plugins.v3/libraryscraper/__init__.py" + ] + }, + "app.sdk.media.TorrentInfo": { + "file_count": 2, + "files": [ + "plugins.v3/lunatvsource/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.media.build_media_key": { + "file_count": 2, + "files": [ + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py" + ] + }, + "app.sdk.media.normalize_media_source": { + "file_count": 5, + "files": [ + "plugins.v3/doubansync/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.media.parse_media_key": { + "file_count": 1, + "files": [ + "plugins.v3/episodegroupmeta/__init__.py" + ] + }, + "app.sdk.media.resolve_media_identity": { + "file_count": 10, + "files": [ + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/doubansync/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/libraryscraper/__init__.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/neodbsync/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.network.AsyncRequestUtils": { + "file_count": 3, + "files": [ + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/imdbsource/officialapi.py" + ] + }, + "app.sdk.network.RequestUtils": { + "file_count": 12, + "files": [ + "plugins.v3/animeupscale/__init__.py", + "plugins.v3/bangumicoll/__init__.py", + "plugins.v3/brushflow/__init__.py", + "plugins.v3/doubanrank/__init__.py", + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/historytov2/__init__.py", + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/imdbsource/officialapi.py", + "plugins.v3/maoyanrank/__init__.py", + "plugins.v3/personmeta/__init__.py", + "plugins.v3/tvdbdiscover/__init__.py" + ] + }, + "app.sdk.network.RssHelper": { + "file_count": 2, + "files": [ + "plugins.v3/doubansync/__init__.py", + "plugins.v3/rsssubscribe/__init__.py" + ] + }, + "app.sdk.network.SitesHelper": { + "file_count": 2, + "files": [ + "plugins.v3/brushflow/__init__.py", + "plugins.v3/downloadsitetag/__init__.py" + ] + }, + "app.sdk.network.WebUtils": { + "file_count": 1, + "files": [ + "plugins.v3/mediaservermsg/__init__.py" + ] + }, + "app.sdk.plugins.PluginManager": { + "file_count": 3, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py", + "plugins.v3/agentresourceofficer/agenttool.py", + "plugins.v3/agentresourceofficer/services/p115_transfer.py" + ] + }, + "app.sdk.services.DownloaderHelper": { + "file_count": 2, + "files": [ + "plugins.v3/brushflow/__init__.py", + "plugins.v3/downloadsitetag/__init__.py" + ] + }, + "app.sdk.services.MediaServerHelper": { + "file_count": 3, + "files": [ + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/mediaservermsg/__init__.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.sdk.utilities.CryptoJsUtils": { + "file_count": 1, + "files": [ + "plugins.v3/agentresourceofficer/__init__.py" + ] + }, + "app.sdk.utilities.DomUtils": { + "file_count": 1, + "files": [ + "plugins.v3/doubanrank/__init__.py" + ] + }, + "app.sdk.utilities.StringUtils": { + "file_count": 4, + "files": [ + "plugins.v3/brushflow/__init__.py", + "plugins.v3/downloadsitetag/__init__.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.sdk.utilities.SystemUtils": { + "file_count": 1, + "files": [ + "plugins.v3/libraryscraper/__init__.py" + ] + }, + "app.sdk.utilities.convert": { + "file_count": 2, + "files": [ + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.sdk.utilities.retry": { + "file_count": 5, + "files": [ + "plugins.v3/episodegroupmeta/__init__.py", + "plugins.v3/imdbsource/imdbapi.py", + "plugins.v3/imdbsource/imdbhelper.py", + "plugins.v3/imdbsource/officialapi.py", + "plugins.v3/personmeta/__init__.py" + ] + }, + "app.utils.common.retry": { + "file_count": 4, + "files": [ + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/imdbsource/officialapi.py", + "plugins.v2/personmeta/__init__.py", + "plugins/remoteidentifiers/__init__.py" + ] + }, + "app.utils.crypto.CryptoJsUtils": { + "file_count": 2, + "files": [ + "plugins.v2/agentresourceofficer/__init__.py", + "plugins.v2/synccookiecloud/__init__.py" + ] + }, + "app.utils.dom.DomUtils": { + "file_count": 1, + "files": [ + "plugins.v2/doubanrank/__init__.py" + ] + }, + "app.utils.http.AsyncRequestUtils": { + "file_count": 5, + "files": [ + "plugins.v2/clashruleprovider/services.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/imdbsource/officialapi.py" + ] + }, + "app.utils.http.RequestUtils": { + "file_count": 60, + "files": [ + "plugins.v2/animeupscale/__init__.py", + "plugins.v2/autoauction/__init__.py", + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/__init__.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/mteam.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/yema.py", + "plugins.v2/autosignin/sites/zhuque.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py", + "plugins.v2/doubanrank/__init__.py", + "plugins.v2/fullscreenposterwall/__init__.py", + "plugins.v2/historytov2/__init__.py", + "plugins.v2/imdbsource/__init__.py", + "plugins.v2/imdbsource/imdbapi.py", + "plugins.v2/imdbsource/officialapi.py", + "plugins.v2/invitessignin/__init__.py", + "plugins.v2/iqiyidiscover/__init__.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/iyuuautoseed/iyuu_helper.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/maoyanrank/__init__.py", + "plugins.v2/meowmsg/__init__.py", + "plugins.v2/moviepilotupdatenotify/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/tmdbwallpaper/__init__.py", + "plugins.v2/tobypasstrackers/__init__.py", + "plugins.v2/tvdbdiscover/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins.v2/wechatclawbot/ilink/client.py", + "plugins.v2/wxpusher/__init__.py", + "plugins/apprisemsg/__init__.py", + "plugins/barkmsg/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/dailyword/__init__.py", + "plugins/dingdingmsg/__init__.py", + "plugins/feishumsg/__init__.py", + "plugins/gotifymsg/__init__.py", + "plugins/iyuuauth/iyuu_helper.py", + "plugins/iyuumsg/__init__.py", + "plugins/mpserverstatus/__init__.py", + "plugins/pushplusmsg/__init__.py", + "plugins/remoteidentifiers/__init__.py", + "plugins/webhook/__init__.py", + "plugins/workwechatmsg/__init__.py", + "plugins/wxpushermsg/__init__.py", + "plugins/zvideohelper/DoubanHelper.py" + ] + }, + "app.utils.ip.IpUtils": { + "file_count": 3, + "files": [ + "plugins.v2/speedlimiter/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py" + ] + }, + "app.utils.singleton.Singleton": { + "file_count": 1, + "files": [ + "plugins.v2/lexiannot/schemas.py" + ] + }, + "app.utils.site.SiteUtils": { + "file_count": 2, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/__init__.py" + ] + }, + "app.utils.string.StringUtils": { + "file_count": 45, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/autosignin/sites/52pt.py", + "plugins.v2/autosignin/sites/__init__.py", + "plugins.v2/autosignin/sites/btschool.py", + "plugins.v2/autosignin/sites/chdbits.py", + "plugins.v2/autosignin/sites/haidan.py", + "plugins.v2/autosignin/sites/hares.py", + "plugins.v2/autosignin/sites/hdarea.py", + "plugins.v2/autosignin/sites/hdchina.py", + "plugins.v2/autosignin/sites/hdcity.py", + "plugins.v2/autosignin/sites/hdsky.py", + "plugins.v2/autosignin/sites/hdupt.py", + "plugins.v2/autosignin/sites/mteam.py", + "plugins.v2/autosignin/sites/nexushd.py", + "plugins.v2/autosignin/sites/opencd.py", + "plugins.v2/autosignin/sites/pterclub.py", + "plugins.v2/autosignin/sites/pttime.py", + "plugins.v2/autosignin/sites/rousipro.py", + "plugins.v2/autosignin/sites/tjupt.py", + "plugins.v2/autosignin/sites/ttg.py", + "plugins.v2/autosignin/sites/u2.py", + "plugins.v2/autosignin/sites/zhuque.py", + "plugins.v2/brushflow/__init__.py", + "plugins.v2/clashruleprovider/__init__.py", + "plugins.v2/clashruleprovider/helper/converters/hysteria.py", + "plugins.v2/clashruleprovider/helper/converters/hysteria2.py", + "plugins.v2/clashruleprovider/helper/converters/trojan.py", + "plugins.v2/cleaninvalidseed/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/contractcheck/siteuserinfo/nexus_php.py", + "plugins.v2/contractcheck/siteuserinfo/nexus_ttg.py", + "plugins.v2/crossseed/__init__.py", + "plugins.v2/downloadsitetag/__init__.py", + "plugins.v2/imdbsource/imdbhelper.py", + "plugins.v2/iyuuautoseed/__init__.py", + "plugins.v2/lexiannot/__init__.py", + "plugins.v2/personmeta/__init__.py", + "plugins.v2/promotiontag/__init__.py", + "plugins.v2/qbcommand/__init__.py", + "plugins.v2/sitestatistic/__init__.py", + "plugins.v2/torrentremover/__init__.py", + "plugins.v2/torrenttransfer/__init__.py", + "plugins.v2/wechatclawbot/__init__.py", + "plugins/downloadingmsg/__init__.py", + "plugins/siterefresh/__init__.py" + ] + }, + "app.utils.system.SystemUtils": { + "file_count": 9, + "files": [ + "plugins.v2/chinesesubfinder/__init__.py", + "plugins.v2/ffmpegthumb/__init__.py", + "plugins.v2/ffmpegthumb/ffmpeg_helper.py", + "plugins.v2/libraryscraper/__init__.py", + "plugins.v2/playletcategory/__init__.py", + "plugins/autosubv2/__init__.py", + "plugins/cloudflarespeedtest/__init__.py", + "plugins/customhosts/__init__.py", + "plugins/linkmonitor/__init__.py" + ] + }, + "app.utils.timer.TimerUtils": { + "file_count": 3, + "files": [ + "plugins.v2/autosignin/__init__.py", + "plugins.v2/contractcheck/__init__.py", + "plugins.v2/crossseed/__init__.py" + ] + }, + "app.utils.web.WebUtils": { + "file_count": 1, + "files": [ + "plugins.v2/mediaservermsg/__init__.py" + ] + } + }, "hooks": { "get_actions": { "file_count": 0, @@ -5709,7 +9338,7 @@ "python_file_count": 285, "source_sha256": "3a47cb221cbcc48c92aaa05838a98d23a13b66d9c3742cac73b1233d88d23fde" }, - "schema_version": 3, + "schema_version": 4, "scope": { "default_plugins": [ "AppriseMsg", diff --git a/tests/test_architecture_baseline_cli.py b/tests/test_architecture_baseline_cli.py index 2c37bc77e..a59b974d1 100644 --- a/tests/test_architecture_baseline_cli.py +++ b/tests/test_architecture_baseline_cli.py @@ -397,9 +397,17 @@ def test_official_plugin_baseline_includes_effective_v3_default_fallback( "plugins.v3/current/__init__.py": ( "import importlib\n" "from app.sdk.events import Event\n" + "from app.agent.llm import LLMHelper as PublicLLMHelper\n" + "from app.agent.llm.helper import LLMHelper as DirectLLMHelper\n" + "from app.helper.llm import LLMHelper as CompatLLMHelper\n" + "from app.agent.tools.manager import moviepilot_tool_manager\n" "_optional_import('app.chain.media', 'MediaChain')\n" "importlib.import_module('app.chain.search')\n" "__import__('app.chain.download')\n" + "PublicLLMHelper.get_llm(streaming=False)\n" + "DirectLLMHelper.extract_text_content('ok')\n" + "CompatLLMHelper.test_current_settings()\n" + "moviepilot_tool_manager._load_tools()\n" ), "plugins.v2/legacy/__init__.py": "from app.core.event import Event\n", "plugins/shared/__init__.py": "from app.log import logger\n", @@ -437,6 +445,7 @@ def test_official_plugin_baseline_includes_effective_v3_default_fallback( "default_plugins": ["Shared"], } assert baseline["provenance"]["python_file_count"] == 3 + assert baseline["schema_version"] == 4 assert baseline["imports"]["app.log"]["files"] == [ "plugins/shared/__init__.py" ] @@ -449,6 +458,24 @@ def test_official_plugin_baseline_includes_effective_v3_default_fallback( assert baseline["imports"]["app.chain.download"]["files"] == [ "plugins.v3/current/__init__.py" ] + assert set(baseline["from_imports"]) >= { + "app.agent.llm.LLMHelper", + "app.agent.llm.helper.LLMHelper", + "app.helper.llm.LLMHelper", + "app.agent.tools.manager.moviepilot_tool_manager", + } + assert baseline["attribute_calls"][ + "app.agent.llm.LLMHelper.get_llm" + ]["call_count"] == 1 + assert baseline["attribute_calls"][ + "app.agent.llm.helper.LLMHelper.extract_text_content" + ]["call_count"] == 1 + assert baseline["attribute_calls"][ + "app.helper.llm.LLMHelper.test_current_settings" + ]["call_count"] == 1 + assert baseline["attribute_calls"][ + "app.agent.tools.manager.moviepilot_tool_manager._load_tools" + ]["call_count"] == 1 assert not any(module.startswith("app.unused") for module in baseline["imports"]) @@ -488,6 +515,10 @@ def test_plugin_v2_fixture_migrates_before_semantic_comparison(tmp_path: Path): baseline_path, old_value, ) == architecture_baseline.semantic_baseline(baseline_path, new_value) + migrated = architecture_baseline.semantic_baseline(baseline_path, old_value) + assert migrated["schema_version"] == 4 + assert migrated["from_imports"] == {} + assert migrated["attribute_calls"] == {} def test_transaction_ratchet_allows_removal_but_rejects_new_method() -> None: diff --git a/tests/test_architecture_contract_baseline.py b/tests/test_architecture_contract_baseline.py index 14fba8b6f..0cb63ecc5 100644 --- a/tests/test_architecture_contract_baseline.py +++ b/tests/test_architecture_contract_baseline.py @@ -16,20 +16,36 @@ def test_official_plugin_baseline_records_external_source(): baseline_path = BASELINE_ROOT / "official-plugin-baseline.json" baseline = json.loads(baseline_path.read_text(encoding="utf-8")) - assert baseline["schema_version"] == 3 + assert baseline["schema_version"] == 4 assert baseline["scope"]["repository"] == "MoviePilot-Plugins" assert baseline["scope"]["roots"] == ["plugins.v2", "plugins.v3", "plugins"] assert baseline["scope"]["default_plugins"] assert len(baseline["provenance"]["head"]) == 40 assert all( not path.startswith("app/plugins/") - for contract in (*baseline["imports"].values(), *baseline["hooks"].values()) + for contract in ( + *baseline["imports"].values(), + *baseline["from_imports"].values(), + *baseline["attribute_calls"].values(), + *baseline["hooks"].values(), + ) for path in contract["files"] ) assert all( not path.startswith("app/plugins/") for path in baseline["api_routes"] ) + assert { + "app.agent.llm.LLMHelper", + "app.agent.llm.helper.LLMHelper", + "app.helper.llm.LLMHelper", + } <= set(baseline["from_imports"]) + assert { + "app.agent.llm.LLMHelper.get_llm", + "app.agent.llm.helper.LLMHelper.test_current_settings", + "app.helper.llm.LLMHelper.get_llm", + "app.agent.tools.manager.moviepilot_tool_manager._load_tools", + } <= set(baseline["attribute_calls"]) def test_dependency_baseline_records_nonempty_host_graph() -> None: diff --git a/tests/test_llm_facade_governance.py b/tests/test_llm_facade_governance.py new file mode 100644 index 000000000..638e73eae --- /dev/null +++ b/tests/test_llm_facade_governance.py @@ -0,0 +1,150 @@ +"""LLM 公开 Facade、Gateway 与旧插件导入路径的治理门禁。""" + +from __future__ import annotations + +import ast +import json +import subprocess +import sys +from pathlib import Path + +PROJECT_ROOT = Path(__file__).parents[1] +FACADE_FIXTURE = ( + PROJECT_ROOT / "tests" / "fixtures" / "architecture" / "llm-provider-facade.json" +) + + +def _run_isolated(script: str) -> dict[str, object]: + """在全新解释器中运行导入探针,避免当前测试进程模块缓存干扰。""" + completed = subprocess.run( + [sys.executable, "-c", script], + check=True, + capture_output=True, + text=True, + ) + return json.loads(completed.stdout) + + +def _manager_facade_snapshot() -> dict[str, object]: + """从源码提取 Manager 稳定公开方法,不导入重量 provider 实现。""" + path = PROJECT_ROOT / "app" / "agent" / "llm" / "provider.py" + tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path)) + manager = next( + node + for node in tree.body + if isinstance(node, ast.ClassDef) and node.name == "LLMProviderManager" + ) + methods = { + node.name: { + "async": isinstance(node, ast.AsyncFunctionDef), + "parameters": ast.unparse(node.args), + "returns": ast.unparse(node.returns) if node.returns else None, + } + for node in manager.body + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) + and not node.name.startswith("_") + } + return { + "schema_version": 1, + "module": "app.agent.llm.provider", + "class": "LLMProviderManager", + "methods": dict(sorted(methods.items())), + } + + +def test_llm_provider_manager_public_facade_matches_signature_snapshot() -> None: + """Manager 拆分不得静默删除、改名或改变既有公开调用签名。""" + expected = json.loads(FACADE_FIXTURE.read_text(encoding="utf-8")) + + assert _manager_facade_snapshot() == expected + + +def test_llm_helper_three_paths_share_identity_and_keep_provider_lazy() -> None: + """包根、canonical 子模块与旧 helper 路径必须解析为同一惰性 Helper。""" + result = _run_isolated( + """ +import json +import sys + +import app.agent.llm as facade +cold = { + "helper": "app.agent.llm.helper" in sys.modules, + "provider": "app.agent.llm.provider" in sys.modules, +} +from app.agent.llm import LLMHelper as PackageHelper +from app.agent.llm.helper import LLMHelper as CanonicalHelper +from app.helper.llm import LLMHelper as CompatHelper +print(json.dumps({ + "cold": cold, + "package_identity": PackageHelper is CanonicalHelper, + "compat_identity": CompatHelper is CanonicalHelper, + "helper_loaded": "app.agent.llm.helper" in sys.modules, + "provider_loaded": "app.agent.llm.provider" in sys.modules, +})) +""" + ) + + assert result == { + "cold": {"helper": False, "provider": False}, + "package_identity": True, + "compat_identity": True, + "helper_loaded": True, + "provider_loaded": False, + } + + +def test_llm_gateway_protocol_and_registration_delegate_to_one_runtime() -> None: + """Gateway 只保存组合根 runtime,并完整声明 Helper/API 所需 Facade 协议。""" + from app.agent.llm import gateway + + protocol_methods = { + name + for name, value in vars(gateway.LLMProviderRuntimePort).items() + if callable(value) and not name.startswith("_") + } + assert protocol_methods == { + "create_bedrock_client", + "handle_chatgpt_callback", + "list_models", + "provider_manage", + "resolve_cached_model_metadata", + "resolve_model_list_base_url", + "resolve_runtime", + } + + runtime = object() + previous = gateway.register_llm_provider_runtime(lambda: runtime) + try: + assert gateway.resolve_llm_provider_runtime() is runtime + finally: + gateway.register_llm_provider_runtime(previous) + + +def test_llm_package_root_does_not_duplicate_internal_owner_exports() -> None: + """兼容包根只保留既有 ABI,不得重新导出拆分后的内部 owner。""" + path = PROJECT_ROOT / "app" / "agent" / "llm" / "__init__.py" + tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path)) + assignments = { + target.id: ast.literal_eval(node.value) + for node in tree.body + if isinstance(node, ast.Assign) + for target in node.targets + if isinstance(target, ast.Name) and target.id in {"_EXPORT_MODULES", "__all__"} + } + exported = set(assignments["__all__"]) | set(assignments["_EXPORT_MODULES"]) + forbidden = { + "LLMProviderRuntimePort", + "PendingAuthSession", + "ProviderAuthMethod", + "ProviderSpec", + "ProviderUrlPreset", + "register_llm_provider_runtime", + "resolve_llm_provider_runtime", + } + + assert exported.isdisjoint(forbidden) + assert not any( + isinstance(node, ast.ImportFrom) + and (node.module or "").startswith("app.agent.llm.") + for node in tree.body + )