diff --git a/backend/package.json b/backend/package.json index 3b56a44..cd6a73c 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.270", + "version": "2.14.271", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/core/proxy-utils/index.js b/backend/src/core/proxy-utils/index.js index 807eec7..a5bf181 100644 --- a/backend/src/core/proxy-utils/index.js +++ b/backend/src/core/proxy-utils/index.js @@ -15,6 +15,7 @@ import $ from '@/core/app'; import { FILES_KEY, MODULES_KEY } from '@/constants'; import { findByName } from '@/utils/database'; import { produceArtifact } from '@/restful/sync'; +import { getFlag, getISO } from '@/utils/geo'; function preprocess(raw) { for (const processor of PROXY_PREPROCESSORS) { @@ -258,6 +259,8 @@ export const ProxyUtils = { isIPv6, isIP, yaml: YAML, + getFlag, + getISO, }; function tryParse(parser, line) { diff --git a/backend/src/utils/geo.js b/backend/src/utils/geo.js index 0f2caf2..f6138a3 100644 --- a/backend/src/utils/geo.js +++ b/backend/src/utils/geo.js @@ -1,3 +1,105 @@ +const ISOFlags = { + '🏳️‍🌈': ['EXP', 'BAND'], + '🇸🇱': ['TEST', 'SOS'], + '🇦🇩': ['AD', 'AND'], + '🇦🇪': ['AE', 'ARE'], + '🇦🇫': ['AF', 'AFG'], + '🇦🇱': ['AL', 'ALB'], + '🇦🇲': ['AM', 'ARM'], + '🇦🇷': ['AR', 'ARG'], + '🇦🇹': ['AT', 'AUT'], + '🇦🇺': ['AU', 'AUS'], + '🇦🇿': ['AZ', 'AZE'], + '🇧🇦': ['BA', 'BIH'], + '🇧🇩': ['BD', 'BGD'], + '🇧🇪': ['BE', 'BEL'], + '🇧🇬': ['BG', 'BGR'], + '🇧🇭': ['BH', 'BHR'], + '🇧🇷': ['BR', 'BRA'], + '🇧🇾': ['BY', 'BLR'], + '🇨🇦': ['CA', 'CAN'], + '🇨🇭': ['CH', 'CHE'], + '🇨🇱': ['CL', 'CHL'], + '🇨🇴': ['CO', 'COL'], + '🇨🇷': ['CR', 'CRI'], + '🇨🇾': ['CY', 'CYP'], + '🇨🇿': ['CZ', 'CZE'], + '🇩🇪': ['DE', 'DEU'], + '🇩🇰': ['DK', 'DNK'], + '🇪🇨': ['EC', 'ECU'], + '🇪🇪': ['EE', 'EST'], + '🇪🇬': ['EG', 'EGY'], + '🇪🇸': ['ES', 'ESP'], + '🇪🇺': ['EU'], + '🇫🇮': ['FI', 'FIN'], + '🇫🇷': ['FR', 'FRA'], + '🇬🇧': ['GB', 'GBR', 'UK'], + '🇬🇪': ['GE', 'GEO'], + '🇬🇷': ['GR', 'GRC'], + '🇭🇰': ['HK', 'HKG', 'HKT', 'HKBN', 'HGC', 'WTT', 'CMI'], + '🇭🇷': ['HR', 'HRV'], + '🇭🇺': ['HU', 'HUN'], + '🇯🇴': ['JO', 'JOR'], + '🇯🇵': ['JP', 'JPN'], + '🇰🇪': ['KE', 'KEN'], + '🇰🇬': ['KG', 'KGZ'], + '🇰🇭': ['KH', 'KGZ'], + '🇰🇵': ['KP', 'PRK'], + '🇰🇷': ['KR', 'KOR'], + '🇰🇿': ['KZ', 'KAZ'], + '🇮🇩': ['ID', 'IDN'], + '🇮🇪': ['IE', 'IRL'], + '🇮🇱': ['IL', 'ISR'], + '🇮🇲': ['IM', 'IMN'], + '🇮🇳': ['IN', 'IND'], + '🇮🇷': ['IR', 'IRN'], + '🇮🇸': ['IS', 'ISL'], + '🇮🇹': ['IT', 'ITA'], + '🇱🇹': ['LT', 'LTU'], + '🇱🇺': ['LU', 'LUX'], + '🇱🇻': ['LV', 'LVA'], + '🇲🇦': ['MA', 'MAR'], + '🇲🇩': ['MD', 'MDA'], + '🇳🇬': ['NG', 'NGA'], + '🇲🇰': ['MK', 'MKD'], + '🇲🇳': ['MN', 'MNG'], + '🇲🇴': ['MO', 'MAC', 'CTM'], + '🇲🇹': ['MT', 'MLT'], + '🇲🇽': ['MX', 'MEX'], + '🇲🇾': ['MY', 'MYS'], + '🇳🇱': ['NL', 'NLD'], + '🇳🇴': ['NO', 'NOR'], + '🇳🇵': ['NP', 'NPL'], + '🇳🇿': ['NZ', 'NZL'], + '🇵🇦': ['PA', 'PAN'], + '🇵🇪': ['PE', 'PER'], + '🇵🇭': ['PH', 'PHL'], + '🇵🇰': ['PK', 'PAK'], + '🇵🇱': ['PL', 'POL'], + '🇵🇷': ['PR', 'PRI'], + '🇵🇹': ['PT', 'PRT'], + '🇵🇾': ['PY', 'PRY'], + '🇷🇴': ['RO', 'ROU'], + '🇷🇸': ['RS', 'SRB'], + '🇷🇪': ['RE', 'REU'], + '🇷🇺': ['RU', 'RUS'], + '🇸🇦': ['SA', 'SAU'], + '🇸🇪': ['SE', 'SWE'], + '🇸🇬': ['SG', 'SGP'], + '🇸🇮': ['SI', 'SVN'], + '🇸🇰': ['SK', 'SVK'], + '🇹🇭': ['TH', 'THA'], + '🇹🇳': ['TN', 'TUN'], + '🇹🇷': ['TR', 'TUR'], + '🇹🇼': ['TW', 'TWN', 'CHT', 'HINET', 'ROC'], + '🇺🇦': ['UA', 'UKR'], + '🇺🇸': ['US', 'USA', 'LAX', 'SFO'], + '🇺🇾': ['UY', 'URY'], + '🇻🇪': ['VE', 'VEN'], + '🇻🇳': ['VN', 'VNM'], + '🇿🇦': ['ZA', 'ZAF'], + '🇨🇳': ['CN', 'CHN', 'BACK'], +}; // get proxy flag according to its name export function getFlag(name) { // flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js @@ -284,108 +386,6 @@ export function getFlag(name) { ], }; - const ISOFlags = { - '🏳️‍🌈': ['EXP', 'BAND'], - '🇸🇱': ['TEST', 'SOS'], - '🇦🇩': ['AD', 'AND'], - '🇦🇪': ['AE', 'ARE'], - '🇦🇫': ['AF', 'AFG'], - '🇦🇱': ['AL', 'ALB'], - '🇦🇲': ['AM', 'ARM'], - '🇦🇷': ['AR', 'ARG'], - '🇦🇹': ['AT', 'AUT'], - '🇦🇺': ['AU', 'AUS'], - '🇦🇿': ['AZ', 'AZE'], - '🇧🇦': ['BA', 'BIH'], - '🇧🇩': ['BD', 'BGD'], - '🇧🇪': ['BE', 'BEL'], - '🇧🇬': ['BG', 'BGR'], - '🇧🇭': ['BH', 'BHR'], - '🇧🇷': ['BR', 'BRA'], - '🇧🇾': ['BY', 'BLR'], - '🇨🇦': ['CA', 'CAN'], - '🇨🇭': ['CH', 'CHE'], - '🇨🇱': ['CL', 'CHL'], - '🇨🇴': ['CO', 'COL'], - '🇨🇷': ['CR', 'CRI'], - '🇨🇾': ['CY', 'CYP'], - '🇨🇿': ['CZ', 'CZE'], - '🇩🇪': ['DE', 'DEU'], - '🇩🇰': ['DK', 'DNK'], - '🇪🇨': ['EC', 'ECU'], - '🇪🇪': ['EE', 'EST'], - '🇪🇬': ['EG', 'EGY'], - '🇪🇸': ['ES', 'ESP'], - '🇪🇺': ['EU'], - '🇫🇮': ['FI', 'FIN'], - '🇫🇷': ['FR', 'FRA'], - '🇬🇧': ['GB', 'GBR', 'UK'], - '🇬🇪': ['GE', 'GEO'], - '🇬🇷': ['GR', 'GRC'], - '🇭🇰': ['HK', 'HKG', 'HKT', 'HKBN', 'HGC', 'WTT', 'CMI'], - '🇭🇷': ['HR', 'HRV'], - '🇭🇺': ['HU', 'HUN'], - '🇯🇴': ['JO', 'JOR'], - '🇯🇵': ['JP', 'JPN'], - '🇰🇪': ['KE', 'KEN'], - '🇰🇬': ['KG', 'KGZ'], - '🇰🇭': ['KH', 'KGZ'], - '🇰🇵': ['KP', 'PRK'], - '🇰🇷': ['KR', 'KOR'], - '🇰🇿': ['KZ', 'KAZ'], - '🇮🇩': ['ID', 'IDN'], - '🇮🇪': ['IE', 'IRL'], - '🇮🇱': ['IL', 'ISR'], - '🇮🇲': ['IM', 'IMN'], - '🇮🇳': ['IN', 'IND'], - '🇮🇷': ['IR', 'IRN'], - '🇮🇸': ['IS', 'ISL'], - '🇮🇹': ['IT', 'ITA'], - '🇱🇹': ['LT', 'LTU'], - '🇱🇺': ['LU', 'LUX'], - '🇱🇻': ['LV', 'LVA'], - '🇲🇦': ['MA', 'MAR'], - '🇲🇩': ['MD', 'MDA'], - '🇳🇬': ['NG', 'NGA'], - '🇲🇰': ['MK', 'MKD'], - '🇲🇳': ['MN', 'MNG'], - '🇲🇴': ['MO', 'MAC', 'CTM'], - '🇲🇹': ['MT', 'MLT'], - '🇲🇽': ['MX', 'MEX'], - '🇲🇾': ['MY', 'MYS'], - '🇳🇱': ['NL', 'NLD'], - '🇳🇴': ['NO', 'NOR'], - '🇳🇵': ['NP', 'NPL'], - '🇳🇿': ['NZ', 'NZL'], - '🇵🇦': ['PA', 'PAN'], - '🇵🇪': ['PE', 'PER'], - '🇵🇭': ['PH', 'PHL'], - '🇵🇰': ['PK', 'PAK'], - '🇵🇱': ['PL', 'POL'], - '🇵🇷': ['PR', 'PRI'], - '🇵🇹': ['PT', 'PRT'], - '🇵🇾': ['PY', 'PRY'], - '🇷🇴': ['RO', 'ROU'], - '🇷🇸': ['RS', 'SRB'], - '🇷🇪': ['RE', 'REU'], - '🇷🇺': ['RU', 'RUS'], - '🇸🇦': ['SA', 'SAU'], - '🇸🇪': ['SE', 'SWE'], - '🇸🇬': ['SG', 'SGP'], - '🇸🇮': ['SI', 'SVN'], - '🇸🇰': ['SK', 'SVK'], - '🇹🇭': ['TH', 'THA'], - '🇹🇳': ['TN', 'TUN'], - '🇹🇷': ['TR', 'TUR'], - '🇹🇼': ['TW', 'TWN', 'CHT', 'HINET', 'ROC'], - '🇺🇦': ['UA', 'UKR'], - '🇺🇸': ['US', 'USA', 'LAX', 'SFO'], - '🇺🇾': ['UY', 'URY'], - '🇻🇪': ['VE', 'VEN'], - '🇻🇳': ['VN', 'VNM'], - '🇿🇦': ['ZA', 'ZAF'], - '🇨🇳': ['CN', 'CHN', 'BACK'], - }; // 原旗帜或空 let Flag = name.match(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/)?.[0] || @@ -420,3 +420,7 @@ export function getFlag(name) { //console.log(`Final Flag = ${Flag}`) return Flag; } + +export function getISO(name) { + return ISOFlags[getFlag(name)]?.[0]; +}