tindy2013 / subconverter

Utility to convert between various subscription format
GNU General Public License v3.0
13.36k stars 2.86k forks source link

[Feature] rule-provider without `payload:` #751

Closed ChrAlpha closed 1 month ago

ChrAlpha commented 6 months ago

verify

功能描述

在 mihomo (Clash.Meta) 系应用中,rule-provider 可以处理的 domainset

prepend-rule-providers:
  reject_domainset:
    type: http
    behavior: domain
    format: text
    interval: 43200
    url: https://ruleset.skk.moe/Clash/domainset/reject.txt
    path: ./sukkaw_ruleset/reject_domainset.txt

在尝试 subconverter 转化的时候却无法通过 clash-domain: 展开到 rules 中,即便没有报错:

ruleset=🛑 广告拦截,clash-domain:https://ruleset.skk.moe/Clash/domainset/reject.txt

简单溯源发现 SukkaW/Surge 提供的 Clash Premium 版本 domainset 每条域名规则单独一行且开头没有 payload

this_ruleset_is_made_by_sukkaw.ruleset.skk.moe
+.a1.mzstatic.com
+.a2.mzstatic.com
# ...
payload:
  - '+.a1.mzstatic.com'
  - '+.a2.mzstatic.com'
  - '+.a3.mzstatic.com'
# ...

而在 src/generator/config/ruleconvert.cpp#L31 仅仅通过文件开头 payload 判断为 Clash。

可能的解决方案

src/generator/config/ruleconvert.cpp#L31 增加通过类似 type==RULESET_CLASH_DOMAIN 或者 type=RULESET_CLASH_IPCIDR 在判断 payload: 同级的位置,确保在没有 payload: 的情况下依然能够逐行作为 payload 元素处理。

ChrAlpha commented 1 month ago

rule-provider format