Files
script/substore/yinyun-rename.js
T
orion 505dc71cdb fix(yinyun-rename): 修复脚本逻辑并简化代码结构
- 移除了多余的数组映射操作
- 简化了代理节点过滤和重命名逻辑
- 优化了备份标签剥离函数的实现
- 统一了节点名称清理和编号处理流程
- 修正了信息节点过滤条件的判断逻辑
- 更新了文档描述以反映功能变更
2026-07-02 23:45:16 +08:00

123 lines
4.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* YinYun 专用节点清理脚本
* - 将中文地区名压成国家短码并补齐国旗
* - 忽略 YinYun 原始的 优选、数字编号和 (T)/(R) 线路标记
* - 按地区出现顺序连续编号,方便全局 rename.js 再追加订阅后缀
*/
// noinspection JSUnusedGlobalSymbols
const COMMON_SCRIPT_VERSION = '20260702-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 regionAliases = [
['哈萨克斯坦', 'KZ'],
['印度尼西亚', 'ID'],
['孟加拉国', 'BD'],
['澳大利亚', 'AU'],
['保加利亚', 'BG'],
['格鲁吉亚', 'GE'],
['立陶宛', 'LT'],
['俄罗斯', 'RU'],
['新加坡', 'SG'],
['马来西亚', 'MY'],
['罗马尼亚', 'RO'],
['亚美尼亚', 'AM'],
['葡萄牙', 'PT'],
['拉脱维亚', 'LV'],
['加拿大', 'CA'],
['澳洲', 'AU'],
['捷克', 'CZ'],
['南非', 'ZA'],
['芬兰', 'FI'],
['瑞士', 'CH'],
['墨西哥', 'MX'],
['瑞典', 'SE'],
['比利时', 'BE'],
['阿联酋', 'AE'],
['法国', 'FR'],
['波兰', 'PL'],
['荷兰', 'NL'],
['奥地利', 'AT'],
['巴西', 'BR'],
['土耳其', 'TR'],
['以色列', 'IL'],
['意大利', 'IT'],
['西班牙', 'ES'],
['乌克兰', 'UA'],
['德国', 'DE'],
['英国', 'UK'],
['印度', 'IN'],
['泰国', 'TH'],
['香港', 'HK'],
['美国', 'US'],
['日本', 'JP'],
['韩国', 'KR'],
['台湾', 'TW']
];
const regionResolver = utils.createRegionResolver(regionAliases);
const stripBackupLabel = name => String(name)
.replace(/\s*(?:ᴮᴬᴷ|BAK|BACKUP)\s*$/iu, '')
.trim();
const stripLineType = name => String(name)
.replace(/\s*[(]\s*[TR]\s*[)]\s*$/i, '')
.trim();
const regionPrefixOf = name => {
if (/魔法节点/i.test(name)) return 'MAGIC';
return regionResolver.aliasRegionPrefixOf(name) || utils.leadingRegionPrefixOf(name);
};
const nextSequence = utils.createSequenceCounter();
return proxies.map(proxy => {
if (typeof proxy.name !== 'string') {
return proxy;
}
const cleanName = utils.stripSubscriptionSuffix(proxy.name, 'YinYun');
const { text } = utils.splitLeadingOrInlineFlag(cleanName);
const coreName = stripLineType(stripBackupLabel(text));
const regionPrefix = regionPrefixOf(coreName);
if (!regionPrefix) {
proxy.name = coreName;
return proxy;
}
const regionCode = regionPrefix.split(/\s+/)[0];
const flag = regionPrefix === 'MAGIC' ? '' : utils.regionCodeToFlag(regionCode);
proxy.name = [
flag,
regionPrefix,
nextSequence(regionPrefix)
].filter(Boolean).join(' ').trim();
return proxy;
});
}