/** * 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; }); }