mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 03:56:43 +08:00
refactor: unify bangumi module contracts
This commit is contained in:
@@ -146,6 +146,13 @@ _METHOD_CONTRACTS = {
|
||||
"douban_person_detail": ModuleMethodContract(family="douban", input_contract="DoubanPersonRequest", result_contract="MediaPerson | None", aggregation=ModuleResultAggregation.FIRST_NON_EMPTY, required_parameters=("person_id",)),
|
||||
"douban_tv_credits": ModuleMethodContract(family="douban", input_contract="DoubanMediaRequest", result_contract="list[MediaPerson]", result_shape=ModuleResultShape.LIST, aggregation=ModuleResultAggregation.ORDERED_LIST_MERGE, required_parameters=("doubanid",)),
|
||||
"douban_tv_recommend": ModuleMethodContract(family="douban", input_contract="DoubanMediaRequest", result_contract="list[MediaInfo]", result_shape=ModuleResultShape.LIST, aggregation=ModuleResultAggregation.ORDERED_LIST_MERGE, required_parameters=("doubanid",)),
|
||||
"bangumi_calendar": ModuleMethodContract(family="bangumi", input_contract="BangumiCalendarRequest", result_contract="list[MediaInfo]", result_shape=ModuleResultShape.LIST, aggregation=ModuleResultAggregation.ORDERED_LIST_MERGE),
|
||||
"bangumi_credits": ModuleMethodContract(family="bangumi", input_contract="BangumiMediaRequest", result_contract="list[MediaPerson]", result_shape=ModuleResultShape.LIST, aggregation=ModuleResultAggregation.ORDERED_LIST_MERGE, required_parameters=("bangumiid",)),
|
||||
"bangumi_discover": ModuleMethodContract(family="bangumi", input_contract="BangumiDiscoverArguments", result_contract="list[MediaInfo]", result_shape=ModuleResultShape.LIST, aggregation=ModuleResultAggregation.ORDERED_LIST_MERGE),
|
||||
"bangumi_info": ModuleMethodContract(family="bangumi", input_contract="BangumiMediaRequest", result_contract="dict | None", result_shape=ModuleResultShape.MAPPING, aggregation=ModuleResultAggregation.FIRST_NON_EMPTY, required_parameters=("bangumiid",)),
|
||||
"bangumi_person_credits": ModuleMethodContract(family="bangumi", input_contract="BangumiPersonRequest", result_contract="list[MediaInfo]", result_shape=ModuleResultShape.LIST, aggregation=ModuleResultAggregation.ORDERED_LIST_MERGE, required_parameters=("person_id",)),
|
||||
"bangumi_person_detail": ModuleMethodContract(family="bangumi", input_contract="BangumiPersonRequest", result_contract="MediaPerson | None", aggregation=ModuleResultAggregation.FIRST_NON_EMPTY, required_parameters=("person_id",)),
|
||||
"bangumi_recommend": ModuleMethodContract(family="bangumi", input_contract="BangumiMediaRequest", result_contract="list[MediaInfo]", result_shape=ModuleResultShape.LIST, aggregation=ModuleResultAggregation.ORDERED_LIST_MERGE, required_parameters=("bangumiid",)),
|
||||
"send_message": ModuleMethodContract(family="messaging", input_contract="MessageSendRequest", result_contract="Message | None", aggregation=ModuleResultAggregation.FIRST_NON_EMPTY),
|
||||
"finalize_message": ModuleMethodContract(family="messaging", input_contract="MessageFinalizeRequest", result_contract="Message | None", aggregation=ModuleResultAggregation.FIRST_NON_EMPTY, required_parameters=("response",)),
|
||||
"register_commands": ModuleMethodContract(family="messaging", input_contract="CommandRegistrationRequest", result_contract="None", required_parameters=("commands",)),
|
||||
@@ -200,6 +207,13 @@ _METHOD_CONTRACTS.update({
|
||||
"async_douban_person_detail": _METHOD_CONTRACTS["douban_person_detail"],
|
||||
"async_douban_tv_credits": _METHOD_CONTRACTS["douban_tv_credits"],
|
||||
"async_douban_tv_recommend": _METHOD_CONTRACTS["douban_tv_recommend"],
|
||||
"async_bangumi_calendar": _METHOD_CONTRACTS["bangumi_calendar"],
|
||||
"async_bangumi_credits": _METHOD_CONTRACTS["bangumi_credits"],
|
||||
"async_bangumi_discover": _METHOD_CONTRACTS["bangumi_discover"],
|
||||
"async_bangumi_info": _METHOD_CONTRACTS["bangumi_info"],
|
||||
"async_bangumi_person_credits": _METHOD_CONTRACTS["bangumi_person_credits"],
|
||||
"async_bangumi_person_detail": _METHOD_CONTRACTS["bangumi_person_detail"],
|
||||
"async_bangumi_recommend": _METHOD_CONTRACTS["bangumi_recommend"],
|
||||
})
|
||||
|
||||
_PREFIX_CONTRACTS = (
|
||||
|
||||
+84
-64
@@ -2623,95 +2623,103 @@
|
||||
"version": 1
|
||||
},
|
||||
"async_bangumi_calendar": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiCalendarRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"async_bangumi_credits": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiMediaRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"bangumiid"
|
||||
],
|
||||
"result_contract": "list[MediaPerson]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"async_bangumi_discover": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiDiscoverArguments",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"async_bangumi_info": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "first_non_empty",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiMediaRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"bangumiid"
|
||||
],
|
||||
"result_contract": "dict | None",
|
||||
"result_shape": "mapping",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"async_bangumi_person_credits": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiPersonRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"person_id"
|
||||
],
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"async_bangumi_person_detail": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "first_non_empty",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiPersonRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"required_parameters": [
|
||||
"person_id"
|
||||
],
|
||||
"result_contract": "MediaPerson | None",
|
||||
"result_shape": "any",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
@@ -2719,16 +2727,18 @@
|
||||
"version": 1
|
||||
},
|
||||
"async_bangumi_recommend": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiMediaRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"bangumiid"
|
||||
],
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
@@ -3494,95 +3504,103 @@
|
||||
"version": 1
|
||||
},
|
||||
"bangumi_calendar": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiCalendarRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"bangumi_credits": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiMediaRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"bangumiid"
|
||||
],
|
||||
"result_contract": "list[MediaPerson]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"bangumi_discover": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiDiscoverArguments",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"bangumi_info": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "first_non_empty",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiMediaRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"bangumiid"
|
||||
],
|
||||
"result_contract": "dict | None",
|
||||
"result_shape": "mapping",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"bangumi_person_credits": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiPersonRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"person_id"
|
||||
],
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
"version": 1
|
||||
},
|
||||
"bangumi_person_detail": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "first_non_empty",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiPersonRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"required_parameters": [
|
||||
"person_id"
|
||||
],
|
||||
"result_contract": "MediaPerson | None",
|
||||
"result_shape": "any",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
@@ -3590,16 +3608,18 @@
|
||||
"version": 1
|
||||
},
|
||||
"bangumi_recommend": {
|
||||
"aggregation": "legacy",
|
||||
"aggregation": "ordered_list_merge",
|
||||
"error_policy": "isolate_provider",
|
||||
"execution": "sync_or_async",
|
||||
"family": "bangumi",
|
||||
"input_contract": "BangumiKeywordArguments",
|
||||
"input_contract": "BangumiMediaRequest",
|
||||
"plugin_short_circuit": true,
|
||||
"public_to_plugins": true,
|
||||
"required_parameters": [],
|
||||
"result_contract": "BangumiProviderResult",
|
||||
"result_shape": "any",
|
||||
"required_parameters": [
|
||||
"bangumiid"
|
||||
],
|
||||
"result_contract": "list[MediaInfo]",
|
||||
"result_shape": "list",
|
||||
"supports_async": true,
|
||||
"supports_sync": true,
|
||||
"timeout_policy": "caller_budget",
|
||||
|
||||
@@ -352,6 +352,28 @@ def test_sync_and_async_douban_capabilities_share_contracts() -> None:
|
||||
assert contract.aggregation is expected
|
||||
|
||||
|
||||
def test_sync_and_async_bangumi_capabilities_share_contracts() -> None:
|
||||
"""Bangumi 同步与异步 provider 应共享列表或首值契约。"""
|
||||
list_methods = {
|
||||
"bangumi_calendar",
|
||||
"bangumi_credits",
|
||||
"bangumi_discover",
|
||||
"bangumi_person_credits",
|
||||
"bangumi_recommend",
|
||||
}
|
||||
value_methods = {"bangumi_info", "bangumi_person_detail"}
|
||||
|
||||
for sync_method in list_methods | value_methods:
|
||||
contract = get_module_method_contract(sync_method)
|
||||
assert contract is get_module_method_contract(f"async_{sync_method}")
|
||||
expected = (
|
||||
ModuleResultAggregation.ORDERED_LIST_MERGE
|
||||
if sync_method in list_methods
|
||||
else ModuleResultAggregation.FIRST_NON_EMPTY
|
||||
)
|
||||
assert contract.aggregation is expected
|
||||
|
||||
|
||||
def test_attachment_result_diagnostics_distinguish_bytes_and_strings() -> None:
|
||||
"""附件契约应区分二进制内容和可展示字符串,偏差仍仅供诊断。"""
|
||||
assert diagnose_module_result("download_qq_file_bytes", b"content") == ()
|
||||
|
||||
Reference in New Issue
Block a user