diff --git a/backend/package.json b/backend/package.json index 209d70b03..0c9bffa10 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.103", + "version": "2.14.104", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/restful/preview.js b/backend/src/restful/preview.js index d8743dca2..97d1b50f8 100644 --- a/backend/src/restful/preview.js +++ b/backend/src/restful/preview.js @@ -20,7 +20,13 @@ async function compareSub(req, res) { content = sub.content; } else { try { - content = await download(sub.url, sub.ua); + content = await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map((url) => download(url, sub.ua)), + ); } catch (err) { failed( res, @@ -34,7 +40,9 @@ async function compareSub(req, res) { } } // parse proxies - const original = ProxyUtils.parse(content); + const original = (Array.isArray(content) ? content : [content]) + .map((i) => ProxyUtils.parse(i)) + .flat(); // add id original.forEach((proxy, i) => { @@ -80,10 +88,18 @@ async function compareCollection(req, res) { if (sub.source === 'local') { raw = sub.content; } else { - raw = await download(sub.url, sub.ua); + raw = await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map((url) => download(url, sub.ua)), + ); } // parse proxies - let currentProxies = ProxyUtils.parse(raw); + let currentProxies = (Array.isArray(raw) ? raw : [raw]) + .map((i) => ProxyUtils.parse(i)) + .flat(); currentProxies.forEach((proxy) => { proxy.subName = sub.name; diff --git a/backend/src/restful/sync.js b/backend/src/restful/sync.js index fbff45553..d86074600 100644 --- a/backend/src/restful/sync.js +++ b/backend/src/restful/sync.js @@ -30,16 +30,31 @@ async function produceArtifact({ type, name, platform, url, ua, content }) { const sub = findByName(allSubs, name); let raw; if (url) { - raw = await download(url, ua); + raw = await Promise.all( + url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map((url) => download(url, ua)), + ); } else if (content) { raw = content; } else if (sub.source === 'local') { raw = sub.content; } else { - raw = await download(sub.url, sub.ua); + raw = await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map((url) => download(url, sub.ua)), + ); } // parse proxies - let proxies = ProxyUtils.parse(raw); + let proxies = (Array.isArray(raw) ? raw : [raw]) + .map((i) => ProxyUtils.parse(i)) + .flat(); + proxies.forEach((proxy) => { proxy.subName = sub.name; }); @@ -90,10 +105,18 @@ async function produceArtifact({ type, name, platform, url, ua, content }) { if (sub.source === 'local') { raw = sub.content; } else { - raw = await download(sub.url, sub.ua); + raw = await await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map((url) => download(url, sub.ua)), + ); } // parse proxies - let currentProxies = ProxyUtils.parse(raw); + let currentProxies = (Array.isArray(raw) ? raw : [raw]) + .map((i) => ProxyUtils.parse(i)) + .flat(); currentProxies.forEach((proxy) => { proxy.subName = sub.name;