diff --git a/substore/README.md b/substore/README.md index 699e297..f5988a2 100644 --- a/substore/README.md +++ b/substore/README.md @@ -16,8 +16,9 @@ https://git.orionc.me/orion/script/raw/branch/main/substore/common.js?v=20260608 2. `yuetong-rename.js`:只清理 YueTong 的品牌前缀和装饰符号。 3. `peiqian-rename.js`:只清理 PeiQian 的推荐/用途描述。 4. `alphaair-rename.js`:只处理 Alpha Air 的供应商压缩、倍率排序和连续编号。 -5. `liangxin-rename.js`:只清理 LiangXin 的高速、BGP、CMCU 等线路描述。 -6. `rename.js`:整合订阅最终重命名,负责国家短码、国旗归位、订阅后缀和去重。 +5. `iriscloud-rename.js`:只处理 Iris Cloud 的入口/落地地区冲突和供应商特征。 +6. `liangxin-rename.js`:只清理 LiangXin 的高速、BGP、CMCU 等线路描述。 +7. `rename.js`:整合订阅最终重命名,负责国家短码、国旗归位、订阅后缀和去重。 如果某个订阅没有对应的专属脚本,直接进入最后的 `rename.js` 即可。 @@ -29,6 +30,7 @@ https://git.orionc.me/orion/script/raw/branch/main/substore/common.js?v=20260608 | `yuetong-rename.js` | YueTong 单订阅 | 去掉 `悦·`、`💎`,把 `AI解锁` 压成 `AI` | | `peiqian-rename.js` | PeiQian 单订阅 | 压短 `电信联通推荐`、`移动联通推荐`、`高速专线`、`hy2`、倍率和用途描述 | | `alphaair-rename.js` | Alpha Air 单订阅 | 去掉提供者/三网/家宽文案,普通节点保留地区,高级非倍率节点保留供应商,倍率节点保留倍率并连续编号 | +| `iriscloud-rename.js` | Iris Cloud 单订阅 | 按 `SG`、`TYO`、其余香港的专属规则重判落地地区,去掉 `SZ`、`HZ`、`[Edge]` 入口标签 | | `liangxin-rename.js` | LiangXin 单订阅 | 去掉 `高速`、`BGP`、`CMCU`、`CM`、`CU`、`CT` 等线路描述 | | `rename.js` | 整合订阅 | 统一国家/城市短码,移动国旗到首部,追加 `- _subName`,处理重名编号 | | `common.js` | 公共依赖 | 被各处理脚本远程加载,不需要单独配置为处理器 | @@ -119,6 +121,25 @@ https://git.orionc.me/orion/script/raw/branch/main/substore/common.js?v=20260608 => 🇭🇰 HK 01 ``` +## Iris Cloud 规则 + +`iriscloud-rename.js` 建议挂在 Iris Cloud 单条订阅里使用。Iris Cloud 的节点名里 `HK` 可能只是入口或线路名,脚本会按落地关键词重新判断地区: + +- 名称包含 `SG`:新加坡节点。 +- 名称包含 `TYO`:日本东京节点。 +- 其余节点:香港节点。 + +```text +🇭🇰 SZ 03 HK-DataCamp-SG - Iris Cloud +=> 🇸🇬 SG 01 DataCamp + +🇭🇰 HZ 01 HK-DMIT-TYO - Iris Cloud +=> 🇯🇵 JP TYO 01 DMIT + +🏴☠️ [Edge] iCable - Iris Cloud +=> 🇭🇰 HK 01 iCable +``` + ## LiangXin 规则 `liangxin-rename.js` 建议挂在 LiangXin 单条订阅里使用。它会删除内嵌的线路描述,以及 `|` 分隔出来的纯线路标签: diff --git a/substore/alphaair-rename.js b/substore/alphaair-rename.js index e8f25e0..c800c17 100644 --- a/substore/alphaair-rename.js +++ b/substore/alphaair-rename.js @@ -180,4 +180,4 @@ async function operator(proxies) { ].filter(Boolean).join(' ').trim(); return item.proxy; }); -} +} \ No newline at end of file diff --git a/substore/iriscloud-rename.js b/substore/iriscloud-rename.js new file mode 100644 index 0000000..7e6b77b --- /dev/null +++ b/substore/iriscloud-rename.js @@ -0,0 +1,115 @@ +/** + * Iris Cloud 专用节点清理脚本 + * - Iris Cloud 名称里 HK 是入口/线路名的一部分,落地以尾部 SG、TYO、HKG 等标识为准 + * - 包含 SG 的节点归新加坡,包含 TYO 的节点归日本东京,其余默认香港 + * - 去掉 SZ/HZ/[Edge] 入口标签,保留 DMIT、DataCamp、iCable、SG.GS 等供应商特征 + */ +// noinspection JSUnusedGlobalSymbols +const COMMON_SCRIPT_VERSION = '20260608-1'; +const COMMON_SCRIPT_URL = `https://git.orionc.me/orion/script/raw/branch/main/substore/common.js?v=${COMMON_SCRIPT_VERSION}`; +const hasCurrentRenameUtils = utils => Boolean( + utils && utils.version === COMMON_SCRIPT_VERSION +); + +async function loadRenameUtils() { + if (typeof globalThis !== 'undefined' && hasCurrentRenameUtils(globalThis.SubStoreRenameUtils)) { + return globalThis.SubStoreRenameUtils; + } + + const cache = typeof scriptResourceCache !== 'undefined' ? scriptResourceCache : null; + let script = cache && cache.get(COMMON_SCRIPT_URL); + if (!script) { + const response = await $substore.http.get({ url: COMMON_SCRIPT_URL }); + script = response && (response.body || response.data || response); + if (cache) cache.set(COMMON_SCRIPT_URL, script); + } + + new Function(String(script))(); + if (!hasCurrentRenameUtils(globalThis.SubStoreRenameUtils)) { + throw new Error('Loaded common.js is missing current rename utilities'); + } + return globalThis.SubStoreRenameUtils; +} + +async function operator(proxies) { + const utils = await loadRenameUtils(); + + const landingPrefixOf = name => { + if (/(?:^|[-\s])SG(?:$|[-\s.])/i.test(name)) return 'SG'; + if (/(?:^|[-\s])TYO(?:$|[-\s])/i.test(name)) return 'JP TYO'; + return 'HK'; + }; + + const providerOf = name => { + if (/DataCamp/i.test(name)) return 'DataCamp'; + if (/iCable/i.test(name)) return 'iCable'; + if (/SG\.GS/i.test(name)) return 'SG.GS'; + if (/DMIT/i.test(name)) return 'DMIT'; + return ''; + }; + + const cleanCoreName = name => { + const { text } = utils.splitLeadingOrInlineFlag(name); + return text + .replace(/\s+-\s*Iris Cloud(?:\s+\d{2})?\s*$/i, '') + .replace(/^\s*(?:SZ|HZ)\s+\d{1,2}\s+/i, '') + .replace(/^\s*\[Edge]\s*/i, '') + .trim(); + }; + + const normalizedItems = proxies.map((proxy, originalIndex) => { + if (typeof proxy.name !== 'string') { + return { + proxy, + originalIndex, + regionPrefix: '', + provider: '' + }; + } + + const coreName = cleanCoreName(proxy.name); + const regionPrefix = landingPrefixOf(coreName); + const regionCode = regionPrefix.split(/\s+/)[0]; + + return { + proxy, + originalIndex, + regionPrefix, + regionCode, + provider: providerOf(coreName), + flag: utils.regionCodeToFlag(regionCode) + }; + }); + + const regionOrder = Object.create(null); + let regionOrderCount = 0; + normalizedItems.forEach(item => { + if (!item.regionPrefix || regionOrder[item.regionPrefix] !== undefined) return; + regionOrder[item.regionPrefix] = regionOrderCount++; + }); + + normalizedItems.sort((firstItem, secondItem) => { + if (!firstItem.regionPrefix || !secondItem.regionPrefix) { + return firstItem.originalIndex - secondItem.originalIndex; + } + + const firstRegionOrder = regionOrder[firstItem.regionPrefix]; + const secondRegionOrder = regionOrder[secondItem.regionPrefix]; + if (firstRegionOrder !== secondRegionOrder) return firstRegionOrder - secondRegionOrder; + return firstItem.originalIndex - secondItem.originalIndex; + }); + + const regionCount = Object.create(null); + return normalizedItems.map(item => { + if (!item.regionPrefix) return item.proxy; + + regionCount[item.regionPrefix] = (regionCount[item.regionPrefix] || 0) + 1; + item.proxy.name = [ + item.flag, + item.regionPrefix, + String(regionCount[item.regionPrefix]).padStart(2, '0'), + item.provider + ].filter(Boolean).join(' ').trim(); + return item.proxy; + }); +}