fix(ClashRuleProvider): 修复模板规则失效问题

This commit is contained in:
wumode
2025-07-07 15:51:07 +08:00
parent 9e9060dbb0
commit 89496f03a1
5 changed files with 90 additions and 75 deletions

View File

@@ -154,7 +154,7 @@ class ClashRuleProvider(_PluginBase):
self._clash_template['proxies'] = self._clash_template.get('proxies') or []
self._clash_template['proxy-groups'] = self._clash_template.get('proxy-groups') or []
self._clash_template['rule-providers'] = self._clash_template.get('rule-providers') or {}
self._clash_template['rules'] = self._clash_template.get('rule-providers') or []
self._clash_template['rules'] = self._clash_template.get('rules') or []
except yaml.YAMLError as exc:
logger.error(f"Error loading clash template yaml: {exc}")
if self._group_by_region:
@@ -1097,6 +1097,8 @@ class ClashRuleProvider(_PluginBase):
branch = 'meta'
api_url = f"https://api.github.com/repos/{owner}/{repo}/contents/geo"
resp = RequestUtils().get_res(api_url, headers=settings.GITHUB_HEADERS, params={'ref': branch})
if not resp:
return
for path in resp.json():
if path["type"] == "dir" and path["name"] in self._geo_rules:
tree_sha = path["sha"]
@@ -1301,7 +1303,7 @@ class ClashRuleProvider(_PluginBase):
)
clash_config['rules'] = clash_config.get('rules', [])
if not self._discard_rules:
clash_config['rules'] += first_config.get('rules', [])
clash_config['rules'] = first_config.get('rules', []) + clash_config['rules']
clash_config['rule-providers'] = clash_config.get('rule-providers') or {}
clash_config['rule-providers'].update(first_config.get('rule-providers', {}))
@@ -1364,7 +1366,16 @@ class ClashRuleProvider(_PluginBase):
logger.warn(f"规则集合 {rule.payload} 不存在, 跳过 {rule.raw_rule}")
continue
top_rules.append(rule.raw_rule)
clash_config["rules"] = self._top_rules + clash_config.get("rules", [])
for raw_rule in clash_config.get("rules", []):
rule = ClashRuleParser.parse_rule_line(raw_rule)
if not rule:
logger.warn(f"无效的规则 {raw_rule}, 跳过")
continue
if not isinstance(rule.action, Action) and rule.action not in outbound_names:
logger.warn(f"出站 {rule.action} 不存在, 跳过 {rule.raw_rule}")
continue
top_rules.append(rule.raw_rule)
clash_config["rules"] = top_rules
if self._rule_provider:
clash_config['rule-providers'] = clash_config.get('rule-providers') or {}
clash_config['rule-providers'].update(self._rule_provider)

View File

@@ -1016,7 +1016,7 @@ class Converter:
dc_buf = Converter.decode_base64(cipher_raw).decode('utf-8')
if dc_buf.startswith("ss://"):
dc_buf = dc_buf[len("ss://"):]
dc_buf = Converter.decode_base64(dc_buf).decode('utf-8')
dc_buf = Converter.decode_base64(dc_buf).decode('utf-8')
cipher, password = dc_buf.split(":", 1)
server = parsed.hostname
port = parsed.port

View File

@@ -4563,6 +4563,7 @@ const newProxyGroup = ref({
// 组件状态
const loading = ref(true);
const importProxiesLoading = ref(false);
const error = ref(null);
const rules = ref([]);
const rulesetRules = ref([]);
@@ -5007,6 +5008,7 @@ async function importRule() {
async function importExtraProxiesFun() {
try {
importProxiesLoading.value = true;
const requestData = {
type: importExtraProxies.value.type,
payload: importExtraProxies.value.payload
@@ -5019,9 +5021,11 @@ async function importExtraProxiesFun() {
message: '节点导入失败',
color: 'error'
};
importProxiesLoading.value = false;
return
}
importExtraProxiesDialog.value = false;
importProxiesLoading.value = false;
await refreshData();
// 显示成功提示
snackbar.value = {
@@ -5030,6 +5034,7 @@ async function importExtraProxiesFun() {
color: 'success'
};
} catch (err) {
importProxiesLoading.value = false;
error.value = '节点导入失败: ' + (err.message || '未知错误');
snackbar.value = {
show: true,
@@ -6021,7 +6026,6 @@ return (_ctx, _cache) => {
disabled: !isManual(item.source)
}, {
default: _withCtx(() => [
_cache[117] || (_cache[117] = _createTextVNode(" > ")),
_createVNode(_component_v_icon, null, {
default: _withCtx(() => _cache[116] || (_cache[116] = [
_createTextVNode("mdi-delete")
@@ -6037,7 +6041,7 @@ return (_ctx, _cache) => {
activator: "parent",
location: "top"
}, {
default: _withCtx(() => _cache[118] || (_cache[118] = [
default: _withCtx(() => _cache[117] || (_cache[117] = [
_createTextVNode(" 非手动添加 ")
])),
_: 1
@@ -6075,7 +6079,7 @@ return (_ctx, _cache) => {
]),
_: 1
}, 8, ["headers", "items", "page", "items-per-page"]),
_cache[119] || (_cache[119] = _createElementVNode("div", { class: "text-caption text-grey mt-2" }, null, -1))
_cache[118] || (_cache[118] = _createElementVNode("div", { class: "text-caption text-grey mt-2" }, null, -1))
])
]),
_: 1
@@ -6085,7 +6089,7 @@ return (_ctx, _cache) => {
_createElementVNode("div", _hoisted_33, [
_createElementVNode("div", _hoisted_34, [
_createElementVNode("div", _hoisted_35, [
_cache[122] || (_cache[122] = _createElementVNode("div", { class: "text-h6" }, "规则集合", -1)),
_cache[121] || (_cache[121] = _createElementVNode("div", { class: "text-h6" }, "规则集合", -1)),
_createElementVNode("div", _hoisted_36, [
_createVNode(_component_v_text_field, {
modelValue: searchRuleProviders.value,
@@ -6104,12 +6108,12 @@ return (_ctx, _cache) => {
}, {
default: _withCtx(() => [
_createVNode(_component_v_icon, { left: "" }, {
default: _withCtx(() => _cache[120] || (_cache[120] = [
default: _withCtx(() => _cache[119] || (_cache[119] = [
_createTextVNode("mdi-plus")
])),
_: 1
}),
_cache[121] || (_cache[121] = _createTextVNode(" 添加规则集合 "))
_cache[120] || (_cache[120] = _createTextVNode(" 添加规则集合 "))
]),
_: 1
})
@@ -6145,9 +6149,8 @@ return (_ctx, _cache) => {
disabled: !isManual(item.source)
}, {
default: _withCtx(() => [
_cache[124] || (_cache[124] = _createTextVNode(" > ")),
_createVNode(_component_v_icon, null, {
default: _withCtx(() => _cache[123] || (_cache[123] = [
default: _withCtx(() => _cache[122] || (_cache[122] = [
_createTextVNode("mdi-pencil")
])),
_: 1
@@ -6165,7 +6168,7 @@ return (_ctx, _cache) => {
}, {
default: _withCtx(() => [
_createVNode(_component_v_icon, null, {
default: _withCtx(() => _cache[125] || (_cache[125] = [
default: _withCtx(() => _cache[123] || (_cache[123] = [
_createTextVNode("mdi-delete")
])),
_: 1
@@ -6179,7 +6182,7 @@ return (_ctx, _cache) => {
activator: "parent",
location: "top"
}, {
default: _withCtx(() => _cache[126] || (_cache[126] = [
default: _withCtx(() => _cache[124] || (_cache[124] = [
_createTextVNode(" 非手动添加 ")
])),
_: 1
@@ -6238,7 +6241,7 @@ return (_ctx, _cache) => {
_createVNode(_component_v_card, { class: "h-100" }, {
default: _withCtx(() => [
_createVNode(_component_v_card_title, { class: "text-h6 font-weight-medium" }, {
default: _withCtx(() => _cache[127] || (_cache[127] = [
default: _withCtx(() => _cache[125] || (_cache[125] = [
_createTextVNode("状态信息")
])),
_: 1
@@ -6247,7 +6250,7 @@ return (_ctx, _cache) => {
default: _withCtx(() => [
_createElementVNode("div", _hoisted_40, [
_createElementVNode("div", _hoisted_41, [
_cache[128] || (_cache[128] = _createElementVNode("span", null, "状态", -1)),
_cache[126] || (_cache[126] = _createElementVNode("span", null, "状态", -1)),
_createVNode(_component_v_chip, {
size: "small",
color: status.value === 'running' ? 'success' : 'warning'
@@ -6259,23 +6262,23 @@ return (_ctx, _cache) => {
}, 8, ["color"])
]),
_createElementVNode("div", _hoisted_42, [
_cache[129] || (_cache[129] = _createElementVNode("span", null, "订阅配置规则数", -1)),
_cache[127] || (_cache[127] = _createElementVNode("span", null, "订阅配置规则数", -1)),
_createElementVNode("span", null, _toDisplayString(subscriptionInfo.value.rule_size), 1)
]),
_createElementVNode("div", _hoisted_43, [
_cache[130] || (_cache[130] = _createElementVNode("span", null, "置顶规则数", -1)),
_cache[128] || (_cache[128] = _createElementVNode("span", null, "置顶规则数", -1)),
_createElementVNode("span", null, _toDisplayString(sortedRules.value.length), 1)
]),
_createElementVNode("div", _hoisted_44, [
_cache[131] || (_cache[131] = _createElementVNode("span", null, "规则集规则数", -1)),
_cache[129] || (_cache[129] = _createElementVNode("span", null, "规则集规则数", -1)),
_createElementVNode("span", null, _toDisplayString(sortedRulesetRules.value.length), 1)
]),
_createElementVNode("div", _hoisted_45, [
_cache[132] || (_cache[132] = _createElementVNode("span", null, "代理组数", -1)),
_cache[130] || (_cache[130] = _createElementVNode("span", null, "代理组数", -1)),
_createElementVNode("span", null, _toDisplayString(proxyGroups.value.length), 1)
]),
_createElementVNode("div", _hoisted_46, [
_cache[133] || (_cache[133] = _createElementVNode("span", null, "最后更新", -1)),
_cache[131] || (_cache[131] = _createElementVNode("span", null, "最后更新", -1)),
_createElementVNode("span", null, _toDisplayString(lastUpdated.value), 1)
])
])
@@ -6297,7 +6300,7 @@ return (_ctx, _cache) => {
default: _withCtx(() => [
_createVNode(_component_v_card_title, { class: "d-flex justify-space-between align-center" }, {
default: _withCtx(() => [
_cache[135] || (_cache[135] = _createElementVNode("span", { class: "text-h6 font-weight-medium" }, "订阅链接", -1)),
_cache[133] || (_cache[133] = _createElementVNode("span", { class: "text-h6 font-weight-medium" }, "订阅链接", -1)),
_createVNode(_component_v_tooltip, {
location: "top",
text: "复制链接"
@@ -6313,7 +6316,7 @@ return (_ctx, _cache) => {
}), {
default: _withCtx(() => [
_createVNode(_component_v_icon, null, {
default: _withCtx(() => _cache[134] || (_cache[134] = [
default: _withCtx(() => _cache[132] || (_cache[132] = [
_createTextVNode("mdi-content-copy")
])),
_: 1
@@ -6337,12 +6340,12 @@ return (_ctx, _cache) => {
color: "grey",
class: "mr-2"
}, {
default: _withCtx(() => _cache[136] || (_cache[136] = [
default: _withCtx(() => _cache[134] || (_cache[134] = [
_createTextVNode("mdi-link")
])),
_: 1
}),
_cache[137] || (_cache[137] = _createElementVNode("span", { class: "text-grey-darken-1" }, "原始链接:", -1))
_cache[135] || (_cache[135] = _createElementVNode("span", { class: "text-grey-darken-1" }, "原始链接:", -1))
]),
_createElementVNode("div", _hoisted_49, [
(Object.keys(subscriptionsInfo.value).length > 0)
@@ -6363,7 +6366,7 @@ return (_ctx, _cache) => {
]),
_createElementVNode("div", _hoisted_51, [
_createVNode(_component_v_icon, { color: "blue" }, {
default: _withCtx(() => _cache[138] || (_cache[138] = [
default: _withCtx(() => _cache[136] || (_cache[136] = [
_createTextVNode("mdi-arrow-down-bold")
])),
_: 1
@@ -6374,12 +6377,12 @@ return (_ctx, _cache) => {
color: "primary",
class: "mr-2"
}, {
default: _withCtx(() => _cache[139] || (_cache[139] = [
default: _withCtx(() => _cache[137] || (_cache[137] = [
_createTextVNode("mdi-link-variant")
])),
_: 1
}),
_cache[140] || (_cache[140] = _createElementVNode("span", { class: "text-grey-darken-1" }, "生成链接:", -1))
_cache[138] || (_cache[138] = _createElementVNode("span", { class: "text-grey-darken-1" }, "生成链接:", -1))
]),
_createElementVNode("div", _hoisted_53, [
_createElementVNode("a", {
@@ -6413,12 +6416,12 @@ return (_ctx, _cache) => {
_createVNode(_component_v_expansion_panel_title, null, {
default: _withCtx(() => [
_createVNode(_component_v_icon, { left: "" }, {
default: _withCtx(() => _cache[141] || (_cache[141] = [
default: _withCtx(() => _cache[139] || (_cache[139] = [
_createTextVNode("mdi-cloud-download")
])),
_: 1
}),
_cache[142] || (_cache[142] = _createElementVNode("span", { class: "text-subtitle-1 font-weight-medium" }, "订阅管理", -1))
_cache[140] || (_cache[140] = _createElementVNode("span", { class: "text-subtitle-1 font-weight-medium" }, "订阅管理", -1))
]),
_: 1
}),
@@ -6431,7 +6434,7 @@ return (_ctx, _cache) => {
variant: "tonal",
class: "mb-4"
}, {
default: _withCtx(() => _cache[143] || (_cache[143] = [
default: _withCtx(() => _cache[141] || (_cache[141] = [
_createTextVNode(" 暂无订阅信息,请先添加订阅链接 ")
])),
_: 1
@@ -6517,11 +6520,11 @@ return (_ctx, _cache) => {
: _createCommentVNode("", true)
]),
_createElementVNode("div", _hoisted_57, [
_cache[144] || (_cache[144] = _createElementVNode("span", null, "已用流量:", -1)),
_cache[142] || (_cache[142] = _createElementVNode("span", null, "已用流量:", -1)),
_createElementVNode("strong", null, _toDisplayString(formatBytes(info.download + info.upload)), 1)
]),
_createElementVNode("div", _hoisted_58, [
_cache[145] || (_cache[145] = _createElementVNode("span", null, "剩余流量:", -1)),
_cache[143] || (_cache[143] = _createElementVNode("span", null, "剩余流量:", -1)),
_createElementVNode("strong", null, _toDisplayString(formatBytes(info.total - info.download)), 1)
]),
_createVNode(_component_v_progress_linear, {
@@ -6550,12 +6553,12 @@ return (_ctx, _cache) => {
}, {
default: _withCtx(() => [
_createVNode(_component_v_icon, { left: "" }, {
default: _withCtx(() => _cache[146] || (_cache[146] = [
default: _withCtx(() => _cache[144] || (_cache[144] = [
_createTextVNode("mdi-cloud-sync")
])),
_: 1
}),
_cache[147] || (_cache[147] = _createTextVNode(" 更新订阅 "))
_cache[145] || (_cache[145] = _createTextVNode(" 更新订阅 "))
]),
_: 2
}, 1032, ["onClick", "loading"])
@@ -6589,12 +6592,12 @@ return (_ctx, _cache) => {
}, {
default: _withCtx(() => [
_createVNode(_component_v_icon, { left: "" }, {
default: _withCtx(() => _cache[148] || (_cache[148] = [
default: _withCtx(() => _cache[146] || (_cache[146] = [
_createTextVNode("mdi-refresh")
])),
_: 1
}),
_cache[149] || (_cache[149] = _createTextVNode(" 刷新数据 "))
_cache[147] || (_cache[147] = _createTextVNode(" 刷新数据 "))
]),
_: 1
}, 8, ["loading"]),
@@ -6605,12 +6608,12 @@ return (_ctx, _cache) => {
}, {
default: _withCtx(() => [
_createVNode(_component_v_icon, { left: "" }, {
default: _withCtx(() => _cache[150] || (_cache[150] = [
default: _withCtx(() => _cache[148] || (_cache[148] = [
_createTextVNode("mdi-cog")
])),
_: 1
}),
_cache[151] || (_cache[151] = _createTextVNode(" 配置 "))
_cache[149] || (_cache[149] = _createTextVNode(" 配置 "))
]),
_: 1
})
@@ -6765,7 +6768,7 @@ return (_ctx, _cache) => {
color: "secondary",
onClick: closeRuleDialog
}, {
default: _withCtx(() => _cache[152] || (_cache[152] = [
default: _withCtx(() => _cache[150] || (_cache[150] = [
_createTextVNode("取消")
])),
_: 1
@@ -6774,7 +6777,7 @@ return (_ctx, _cache) => {
color: "primary",
type: "submit"
}, {
default: _withCtx(() => _cache[153] || (_cache[153] = [
default: _withCtx(() => _cache[151] || (_cache[151] = [
_createTextVNode("保存")
])),
_: 1
@@ -6990,7 +6993,7 @@ return (_ctx, _cache) => {
}, {
"prepend-inner": _withCtx(() => [
_createVNode(_component_v_icon, { color: "warning" }, {
default: _withCtx(() => _cache[154] || (_cache[154] = [
default: _withCtx(() => _cache[152] || (_cache[152] = [
_createTextVNode("mdi-timer")
])),
_: 1
@@ -7020,7 +7023,7 @@ return (_ctx, _cache) => {
}, {
"prepend-inner": _withCtx(() => [
_createVNode(_component_v_icon, { color: "warning" }, {
default: _withCtx(() => _cache[155] || (_cache[155] = [
default: _withCtx(() => _cache[153] || (_cache[153] = [
_createTextVNode("mdi-timer")
])),
_: 1
@@ -7152,7 +7155,7 @@ return (_ctx, _cache) => {
class: "mb-6",
variant: "tonal"
}, {
default: _withCtx(() => _cache[156] || (_cache[156] = [
default: _withCtx(() => _cache[154] || (_cache[154] = [
_createTextVNode(" 参考"),
_createElementVNode("a", {
href: "https://wiki.metacubex.one/config/proxy-groups/",
@@ -7168,7 +7171,7 @@ return (_ctx, _cache) => {
color: "secondary",
onClick: _cache[55] || (_cache[55] = $event => (proxyGroupDialog.value = false))
}, {
default: _withCtx(() => _cache[157] || (_cache[157] = [
default: _withCtx(() => _cache[155] || (_cache[155] = [
_createTextVNode("取消")
])),
_: 1
@@ -7177,7 +7180,7 @@ return (_ctx, _cache) => {
color: "primary",
type: "submit"
}, {
default: _withCtx(() => _cache[158] || (_cache[158] = [
default: _withCtx(() => _cache[156] || (_cache[156] = [
_createTextVNode("保存")
])),
_: 1
@@ -7203,7 +7206,7 @@ return (_ctx, _cache) => {
_createVNode(_component_v_card, null, {
default: _withCtx(() => [
_createVNode(_component_v_card_title, { class: "headline" }, {
default: _withCtx(() => _cache[159] || (_cache[159] = [
default: _withCtx(() => _cache[157] || (_cache[157] = [
_createTextVNode("YAML 配置")
])),
_: 1
@@ -7221,7 +7224,7 @@ return (_ctx, _cache) => {
color: "primary",
onClick: _cache[57] || (_cache[57] = $event => (copyToClipboard(displayedYaml.value)))
}, {
default: _withCtx(() => _cache[160] || (_cache[160] = [
default: _withCtx(() => _cache[158] || (_cache[158] = [
_createTextVNode("复制")
])),
_: 1
@@ -7230,7 +7233,7 @@ return (_ctx, _cache) => {
color: "primary",
onClick: _cache[58] || (_cache[58] = $event => (yamlDialog.value = false))
}, {
default: _withCtx(() => _cache[161] || (_cache[161] = [
default: _withCtx(() => _cache[159] || (_cache[159] = [
_createTextVNode("关闭")
])),
_: 1
@@ -7253,7 +7256,7 @@ return (_ctx, _cache) => {
_createVNode(_component_v_card, null, {
default: _withCtx(() => [
_createVNode(_component_v_card_title, null, {
default: _withCtx(() => _cache[162] || (_cache[162] = [
default: _withCtx(() => _cache[160] || (_cache[160] = [
_createTextVNode("导入规则")
])),
_: 1
@@ -7286,7 +7289,7 @@ return (_ctx, _cache) => {
class: "mb-4",
variant: "tonal"
}, {
default: _withCtx(() => _cache[163] || (_cache[163] = [
default: _withCtx(() => _cache[161] || (_cache[161] = [
_createTextVNode(" 请输入 Clash 规则中的 "),
_createElementVNode("strong", null, "rules", -1),
_createTextVNode(" 字段,例如:"),
@@ -7309,7 +7312,7 @@ return (_ctx, _cache) => {
color: "secondary",
onClick: _cache[62] || (_cache[62] = $event => (importRuleDialog.value = false, error.value=null))
}, {
default: _withCtx(() => _cache[164] || (_cache[164] = [
default: _withCtx(() => _cache[162] || (_cache[162] = [
_createTextVNode("取消")
])),
_: 1
@@ -7318,7 +7321,7 @@ return (_ctx, _cache) => {
color: "primary",
onClick: importRule
}, {
default: _withCtx(() => _cache[165] || (_cache[165] = [
default: _withCtx(() => _cache[163] || (_cache[163] = [
_createTextVNode("导入")
])),
_: 1
@@ -7341,7 +7344,7 @@ return (_ctx, _cache) => {
_createVNode(_component_v_card, null, {
default: _withCtx(() => [
_createVNode(_component_v_card_title, null, {
default: _withCtx(() => _cache[166] || (_cache[166] = [
default: _withCtx(() => _cache[164] || (_cache[164] = [
_createTextVNode("导入节点")
])),
_: 1
@@ -7375,7 +7378,7 @@ return (_ctx, _cache) => {
class: "mb-4",
variant: "tonal"
}, {
default: _withCtx(() => _cache[167] || (_cache[167] = [
default: _withCtx(() => _cache[165] || (_cache[165] = [
_createTextVNode(" 请输入 Clash 规则中的 "),
_createElementVNode("strong", null, "proxies", -1),
_createTextVNode(" 字段,例如:"),
@@ -7397,7 +7400,7 @@ return (_ctx, _cache) => {
class: "mb-4",
variant: "tonal"
}, {
default: _withCtx(() => _cache[168] || (_cache[168] = [
default: _withCtx(() => _cache[166] || (_cache[166] = [
_createTextVNode(" 请输入 V2Ray 格式的节点链接,例如:"),
_createElementVNode("br", null, null, -1),
_createElementVNode("code", null, "vmess://xxxx", -1),
@@ -7417,20 +7420,21 @@ return (_ctx, _cache) => {
color: "secondary",
onClick: _cache[66] || (_cache[66] = $event => (importExtraProxiesDialog.value=false, error.value=null))
}, {
default: _withCtx(() => _cache[169] || (_cache[169] = [
default: _withCtx(() => _cache[167] || (_cache[167] = [
_createTextVNode("取消")
])),
_: 1
}),
_createVNode(_component_v_btn, {
color: "primary",
onClick: importExtraProxiesFun
onClick: importExtraProxiesFun,
loading: importProxiesLoading.value
}, {
default: _withCtx(() => _cache[170] || (_cache[170] = [
_createTextVNode("导入")
default: _withCtx(() => _cache[168] || (_cache[168] = [
_createTextVNode(" 导入 ")
])),
_: 1
})
}, 8, ["loading"])
]),
_: 1
})
@@ -7583,7 +7587,7 @@ return (_ctx, _cache) => {
color: "secondary",
onClick: _cache[77] || (_cache[77] = $event => (ruleProviderDialog.value = false, error.value=null))
}, {
default: _withCtx(() => _cache[171] || (_cache[171] = [
default: _withCtx(() => _cache[169] || (_cache[169] = [
_createTextVNode("取消")
])),
_: 1
@@ -7592,7 +7596,7 @@ return (_ctx, _cache) => {
color: "primary",
type: "submit"
}, {
default: _withCtx(() => _cache[172] || (_cache[172] = [
default: _withCtx(() => _cache[170] || (_cache[170] = [
_createTextVNode("保存")
])),
_: 1
@@ -7614,6 +7618,6 @@ return (_ctx, _cache) => {
}
};
const PageComponent = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-77adff9b"]]);
const PageComponent = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-4a22a0ac"]]);
export { PageComponent as default };

View File

@@ -1,13 +1,13 @@
.plugin-page[data-v-77adff9b] {
.plugin-page[data-v-4a22a0ac] {
margin: 0 auto;
}
/* 使卡片等宽并适应移动端 */
.d-flex.flex-wrap[data-v-77adff9b] {
.d-flex.flex-wrap[data-v-4a22a0ac] {
gap: 16px;
}
.url-display[data-v-77adff9b] {
.url-display[data-v-4a22a0ac] {
word-break: break-all;
padding: 8px;
background: rgba(0, 0, 0, 0.05);
@@ -16,19 +16,19 @@
/* 移动端堆叠布局 */
@media (max-width: 768px) {
.d-flex.flex-wrap[data-v-77adff9b] {
.d-flex.flex-wrap[data-v-4a22a0ac] {
flex-direction: column;
}
}
/* Add visual distinction between sections */
.ruleset-section[data-v-77adff9b] {
.ruleset-section[data-v-4a22a0ac] {
border: 1px solid #e0e0e0;
border-radius: 4px;
padding: 16px;
background-color: #f5f5f5;
}
.top-section[data-v-77adff9b] {
.top-section[data-v-4a22a0ac] {
border: 1px solid #e0e0e0;
border-radius: 4px;
padding: 16px;
@@ -36,15 +36,15 @@
}
/* Optional: Add different border colors to further distinguish */
.ruleset-section[data-v-77adff9b] {
.ruleset-section[data-v-4a22a0ac] {
border-left: 4px solid #2196F3; /* Blue accent */
}
.top-section[data-v-77adff9b] {
.top-section[data-v-4a22a0ac] {
border-left: 4px solid #4CAF50; /* Green accent */
}
.drag-handle[data-v-77adff9b] {
.drag-handle[data-v-4a22a0ac] {
cursor: move;
}
.gap-2[data-v-77adff9b] {
.gap-2[data-v-4a22a0ac] {
gap: 8px;
}

View File

@@ -159,7 +159,7 @@ class ImdbSource(_PluginBase):
for entry in entries:
cast = [name for related in entry.get('relatedconst', []) for name in names if name.get('id') == related]
mtype, year, plot = year_and_type(entry)
mp_url = f"/media?mediaid=imdb:{entry.get('ttconst')}&title='{entry.get('name')}'&year={year}&type={mtype.value}"
mp_url = f"/media?mediaid=imdb:{entry.get('ttconst')}&title={entry.get('name')}&year={year}&type={mtype.value}"
primary_img_url = next((f"{image.get('url')}" for image in images
if image.get("id") == entry.get('rmconst')), '')
primary_img_url = f'{self._img_proxy_prefix}{primary_img_url}'