@@ -5,11 +5,82 @@ _download_config() {
55 local url=$2
66 [ " ${url: 0: 4} " = ' file' ] || _okcat ' ⏳' ' 正在下载...'
77 _download_raw_config " $dest " " $url " || return 1
8- _okcat ' 🍃' ' 验证订阅配置...'
9- _valid_config " $dest " || {
10- _failcat ' 🍂' " 验证失败:尝试订阅转换..."
8+ _normalize_sub_config " $dest " || return 1
9+
10+ _is_html_response " $dest " && {
11+ _errorcat " 订阅响应疑似 HTML 页面,请检查订阅链接或 User-Agent"
12+ return 1
13+ }
14+
15+ _is_native_yaml_config " $dest " && {
16+ _okcat ' 🍃' ' 检测到原生 Clash/Mihomo 配置'
17+ _valid_config " $dest " && _valid_sub_nodes " $dest " && return
18+ _failcat ' 🍂' " 原生配置验证失败:尝试订阅转换..."
1119 cat " $dest " > " ${dest} .raw"
12- _download_convert_config " $dest " " $url "
20+ _download_convert_config " $dest " " $url " || return
21+ _normalize_sub_config " $dest " || return
22+ _valid_sub_nodes " $dest "
23+ return
24+ }
25+
26+ _okcat ' 🍃' ' 验证订阅配置...'
27+ _valid_config " $dest " && _valid_sub_nodes " $dest " && return
28+
29+ _failcat ' 🍂' " 验证失败:尝试订阅转换..."
30+ cat " $dest " > " ${dest} .raw"
31+ _download_convert_config " $dest " " $url " || return
32+ _normalize_sub_config " $dest " || return
33+ _valid_sub_nodes " $dest "
34+ }
35+
36+ _normalize_sub_config () {
37+ local dest=$1
38+
39+ [ -s " $dest " ] || {
40+ _errorcat " 订阅响应为空,请检查订阅链接"
41+ return 1
42+ }
43+
44+ LC_ALL=C sed -i ' 1s/^\xEF\xBB\xBF//' " $dest " 2> /dev/null || true
45+ sed -i ' s/\r$//' " $dest " 2> /dev/null || true
46+
47+ command -v iconv > /dev/null || return 0
48+ iconv -f UTF-8 -t UTF-8 " $dest " > /dev/null 2>&1 && return 0
49+
50+ local charset
51+ for charset in GB18030 GBK BIG5; do
52+ iconv -f " $charset " -t UTF-8 " $dest " -o " ${dest} .utf8" 2> /dev/null && {
53+ /bin/mv -f " ${dest} .utf8" " $dest "
54+ _okcat ' 🔤' " 订阅已从 $charset 转为 UTF-8"
55+ return 0
56+ }
57+ done
58+
59+ /usr/bin/rm -f " ${dest} .utf8" 2> /dev/null
60+ return 0
61+ }
62+
63+ _is_html_response () {
64+ LC_ALL=C grep -qiE ' <[[:space:]]*(!doctype|html|head|body|title)([[:space:]>]|$)' " $1 "
65+ }
66+
67+ _is_native_yaml_config () {
68+ " $BIN_YQ " -e '
69+ ((.proxies // []) | type == "!!seq" and length > 0) or
70+ ((.proxy-providers // {}) | type == "!!map" and length > 0)
71+ ' " $1 " > /dev/null 2>&1
72+ }
73+
74+ _valid_sub_nodes () {
75+ local config=$1 count
76+ count=$( " $BIN_YQ " '
77+ ((.proxies // []) | length) +
78+ ((.proxy-providers // {}) | length)
79+ ' " $config " 2> /dev/null) || return 0
80+
81+ [ " ${count:- 0} " -gt 0 ] || {
82+ _errorcat " 订阅未解析出任何节点,请检查订阅内容或转换器版本"
83+ return 1
1384 }
1485}
1586
0 commit comments