✨ feat(core): 新增 Iris Cloud 订阅重命名脚本并更新文档
* 新增 iriscloud-rename.js 脚本,支持根据落地特征自动重判节点地区 * 在新脚本中实现自动去除 SZ、HZ 入口标签及 [Edge] 特征逻辑 * 更新 README.md,补充 Iris Cloud 专属处理逻辑的使用说明与示例 * 优化 alphaair-rename.js 的代码细节,微调文档章节排序与格式
This commit is contained in:
+23
-2
@@ -16,8 +16,9 @@ https://git.orionc.me/orion/script/raw/branch/main/substore/common.js?v=20260608
|
|||||||
2. `yuetong-rename.js`:只清理 YueTong 的品牌前缀和装饰符号。
|
2. `yuetong-rename.js`:只清理 YueTong 的品牌前缀和装饰符号。
|
||||||
3. `peiqian-rename.js`:只清理 PeiQian 的推荐/用途描述。
|
3. `peiqian-rename.js`:只清理 PeiQian 的推荐/用途描述。
|
||||||
4. `alphaair-rename.js`:只处理 Alpha Air 的供应商压缩、倍率排序和连续编号。
|
4. `alphaair-rename.js`:只处理 Alpha Air 的供应商压缩、倍率排序和连续编号。
|
||||||
5. `liangxin-rename.js`:只清理 LiangXin 的高速、BGP、CMCU 等线路描述。
|
5. `iriscloud-rename.js`:只处理 Iris Cloud 的入口/落地地区冲突和供应商特征。
|
||||||
6. `rename.js`:整合订阅最终重命名,负责国家短码、国旗归位、订阅后缀和去重。
|
6. `liangxin-rename.js`:只清理 LiangXin 的高速、BGP、CMCU 等线路描述。
|
||||||
|
7. `rename.js`:整合订阅最终重命名,负责国家短码、国旗归位、订阅后缀和去重。
|
||||||
|
|
||||||
如果某个订阅没有对应的专属脚本,直接进入最后的 `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` |
|
| `yuetong-rename.js` | YueTong 单订阅 | 去掉 `悦·`、`💎`,把 `AI解锁` 压成 `AI` |
|
||||||
| `peiqian-rename.js` | PeiQian 单订阅 | 压短 `电信联通推荐`、`移动联通推荐`、`高速专线`、`hy2`、倍率和用途描述 |
|
| `peiqian-rename.js` | PeiQian 单订阅 | 压短 `电信联通推荐`、`移动联通推荐`、`高速专线`、`hy2`、倍率和用途描述 |
|
||||||
| `alphaair-rename.js` | Alpha Air 单订阅 | 去掉提供者/三网/家宽文案,普通节点保留地区,高级非倍率节点保留供应商,倍率节点保留倍率并连续编号 |
|
| `alphaair-rename.js` | Alpha Air 单订阅 | 去掉提供者/三网/家宽文案,普通节点保留地区,高级非倍率节点保留供应商,倍率节点保留倍率并连续编号 |
|
||||||
|
| `iriscloud-rename.js` | Iris Cloud 单订阅 | 按 `SG`、`TYO`、其余香港的专属规则重判落地地区,去掉 `SZ`、`HZ`、`[Edge]` 入口标签 |
|
||||||
| `liangxin-rename.js` | LiangXin 单订阅 | 去掉 `高速`、`BGP`、`CMCU`、`CM`、`CU`、`CT` 等线路描述 |
|
| `liangxin-rename.js` | LiangXin 单订阅 | 去掉 `高速`、`BGP`、`CMCU`、`CM`、`CU`、`CT` 等线路描述 |
|
||||||
| `rename.js` | 整合订阅 | 统一国家/城市短码,移动国旗到首部,追加 `- _subName`,处理重名编号 |
|
| `rename.js` | 整合订阅 | 统一国家/城市短码,移动国旗到首部,追加 `- _subName`,处理重名编号 |
|
||||||
| `common.js` | 公共依赖 | 被各处理脚本远程加载,不需要单独配置为处理器 |
|
| `common.js` | 公共依赖 | 被各处理脚本远程加载,不需要单独配置为处理器 |
|
||||||
@@ -119,6 +121,25 @@ https://git.orionc.me/orion/script/raw/branch/main/substore/common.js?v=20260608
|
|||||||
=> 🇭🇰 HK 01
|
=> 🇭🇰 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 规则
|
||||||
|
|
||||||
`liangxin-rename.js` 建议挂在 LiangXin 单条订阅里使用。它会删除内嵌的线路描述,以及 `|` 分隔出来的纯线路标签:
|
`liangxin-rename.js` 建议挂在 LiangXin 单条订阅里使用。它会删除内嵌的线路描述,以及 `|` 分隔出来的纯线路标签:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user