mirror of
https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
synced 2026-03-23 14:13:15 +08:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f1940630a | ||
|
|
5a0bdb1276 | ||
|
|
a1b86e26a2 | ||
|
|
6ec8c29f6a |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "sub-store",
|
||||
"version": "2.14.256",
|
||||
"version": "2.14.260",
|
||||
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.",
|
||||
"main": "src/main.js",
|
||||
"scripts": {
|
||||
|
||||
@@ -39,8 +39,7 @@ function AllRuleParser() {
|
||||
content: params[1],
|
||||
};
|
||||
if (
|
||||
rule.type === 'IP-CIDR' ||
|
||||
rule.type === 'IP-CIDR6'
|
||||
['IP-CIDR', 'IP-CIDR6', 'GEOIP'].includes(rule.type)
|
||||
) {
|
||||
rule.options = params.slice(2);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ function QXFilter() {
|
||||
'SRC-IP',
|
||||
'IN-PORT',
|
||||
'PROTOCOL',
|
||||
'GEOSITE',
|
||||
'GEOIP',
|
||||
];
|
||||
if (UNSUPPORTED.indexOf(rule.type) !== -1) return null;
|
||||
|
||||
@@ -29,6 +31,8 @@ function QXFilter() {
|
||||
function SurgeRuleSet() {
|
||||
const type = 'SINGLE';
|
||||
const func = (rule) => {
|
||||
const UNSUPPORTED = ['GEOSITE', 'GEOIP'];
|
||||
if (UNSUPPORTED.indexOf(rule.type) !== -1) return null;
|
||||
let output = `${rule.type},${rule.content}`;
|
||||
if (['IP-CIDR', 'IP-CIDR6'].includes(rule.type)) {
|
||||
output +=
|
||||
@@ -43,7 +47,7 @@ function LoonRules() {
|
||||
const type = 'SINGLE';
|
||||
const func = (rule) => {
|
||||
// skip unsupported rules
|
||||
const UNSUPPORTED = ['DEST-PORT', 'SRC-IP', 'IN-PORT', 'PROTOCOL'];
|
||||
const UNSUPPORTED = ['SRC-IP', 'GEOSITE', 'GEOIP'];
|
||||
if (UNSUPPORTED.indexOf(rule.type) !== -1) return null;
|
||||
if (['IP-CIDR', 'IP-CIDR6'].includes(rule.type) && rule.options) {
|
||||
// Loon only supports the no-resolve option
|
||||
@@ -69,7 +73,7 @@ function ClashRuleProvider() {
|
||||
let output = `${TRANSFORM[rule.type] || rule.type},${
|
||||
rule.content
|
||||
}`;
|
||||
if (['IP-CIDR', 'IP-CIDR6'].includes(rule.type)) {
|
||||
if (['IP-CIDR', 'IP-CIDR6', 'GEOIP'].includes(rule.type)) {
|
||||
if (rule.options) {
|
||||
// Clash only supports the no-resolve option
|
||||
rule.options = rule.options.filter((option) =>
|
||||
|
||||
@@ -128,10 +128,19 @@ async function doSync() {
|
||||
files.map((item) => [item.path, item]),
|
||||
);
|
||||
}
|
||||
const url = files[encodeURIComponent(artifact.name)]?.raw_url;
|
||||
artifact.url = isGitLab
|
||||
? url
|
||||
: url?.replace(/\/raw\/[^/]*\/(.*)/, '/raw/$1');
|
||||
const raw_url =
|
||||
files[encodeURIComponent(artifact.name)]?.raw_url;
|
||||
const new_url = isGitLab
|
||||
? raw_url
|
||||
: raw_url?.replace(/\/raw\/[^/]*\/(.*)/, '/raw/$1');
|
||||
$.info(
|
||||
`上传配置完成\n文件列表: ${Object.keys(files).join(
|
||||
', ',
|
||||
)}\n当前文件: ${encodeURIComponent(
|
||||
artifact.name,
|
||||
)}\n响应返回的原始链接: ${raw_url}\n处理完的新链接: ${new_url}`,
|
||||
);
|
||||
artifact.url = new_url;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -79,8 +79,7 @@ async function downloadSubscription(req, res) {
|
||||
|
||||
if (
|
||||
sub.source !== 'local' ||
|
||||
['localFirst', 'remoteFirst'].includes(sub.mergeSources) ||
|
||||
url
|
||||
['localFirst', 'remoteFirst'].includes(sub.mergeSources)
|
||||
) {
|
||||
try {
|
||||
url = `${url || sub.url}`
|
||||
|
||||
@@ -153,11 +153,14 @@ async function gistBackup(req, res) {
|
||||
}
|
||||
success(res);
|
||||
} catch (err) {
|
||||
$.error(
|
||||
`Failed to ${action} gist data.\nReason: ${err.message ?? err}`,
|
||||
);
|
||||
failed(
|
||||
res,
|
||||
new InternalServerError(
|
||||
'BACKUP_FAILED',
|
||||
`Failed to ${action} data to gist!`,
|
||||
`Failed to ${action} gist data!`,
|
||||
`Reason: ${err.message ?? err}`,
|
||||
),
|
||||
);
|
||||
|
||||
@@ -563,10 +563,19 @@ async function syncArtifacts() {
|
||||
files.map((item) => [item.path, item]),
|
||||
);
|
||||
}
|
||||
const url = files[encodeURIComponent(artifact.name)]?.raw_url;
|
||||
artifact.url = isGitLab
|
||||
? url
|
||||
: url?.replace(/\/raw\/[^/]*\/(.*)/, '/raw/$1');
|
||||
const raw_url =
|
||||
files[encodeURIComponent(artifact.name)]?.raw_url;
|
||||
const new_url = isGitLab
|
||||
? raw_url
|
||||
: raw_url?.replace(/\/raw\/[^/]*\/(.*)/, '/raw/$1');
|
||||
$.info(
|
||||
`上传配置完成\n文件列表: ${Object.keys(files).join(
|
||||
', ',
|
||||
)}\n当前文件: ${encodeURIComponent(
|
||||
artifact.name,
|
||||
)}\n响应返回的原始链接: ${raw_url}\n处理完的新链接: ${new_url}`,
|
||||
);
|
||||
artifact.url = new_url;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -660,10 +669,18 @@ async function syncArtifact(req, res) {
|
||||
isGitLab = true;
|
||||
files = Object.fromEntries(files.map((item) => [item.path, item]));
|
||||
}
|
||||
const url = files[encodeURIComponent(artifact.name)]?.raw_url;
|
||||
artifact.url = isGitLab
|
||||
? url
|
||||
: url?.replace(/\/raw\/[^/]*\/(.*)/, '/raw/$1');
|
||||
const raw_url = files[encodeURIComponent(artifact.name)]?.raw_url;
|
||||
const new_url = isGitLab
|
||||
? raw_url
|
||||
: raw_url?.replace(/\/raw\/[^/]*\/(.*)/, '/raw/$1');
|
||||
$.info(
|
||||
`上传配置完成\n文件列表: ${Object.keys(files).join(
|
||||
', ',
|
||||
)}\n当前文件: ${encodeURIComponent(
|
||||
artifact.name,
|
||||
)}\n响应返回的原始链接: ${raw_url}\n处理完的新链接: ${new_url}`,
|
||||
);
|
||||
artifact.url = new_url;
|
||||
$.write(allArtifacts, ARTIFACTS_KEY);
|
||||
success(res, artifact);
|
||||
} catch (err) {
|
||||
|
||||
@@ -49,7 +49,10 @@ function operator(proxies = [], targetPlatform, context) {
|
||||
|
||||
// 2. sing-box
|
||||
|
||||
// 但是一般不需要这样用, 可参考 1. https://t.me/zhetengsha/1111 和 2. https://t.me/zhetengsha/1070
|
||||
// 但是一般不需要这样用, 可参考
|
||||
// 1. https://t.me/zhetengsha/1111
|
||||
// 2. https://t.me/zhetengsha/1070
|
||||
// 3. https://t.me/zhetengsha/1241
|
||||
|
||||
// let singboxProxies = await produceArtifact({
|
||||
// type: 'subscription', // type: 'subscription' 或 'collection'
|
||||
@@ -63,24 +66,41 @@ function operator(proxies = [], targetPlatform, context) {
|
||||
|
||||
// 3. clash.meta
|
||||
|
||||
// 但是一般不需要这样用, 可参考 1. https://t.me/zhetengsha/1111 和 2. https://t.me/zhetengsha/1070
|
||||
// 但是一般不需要这样用, 可参考
|
||||
// 1. https://t.me/zhetengsha/1111
|
||||
// 2. https://t.me/zhetengsha/1070
|
||||
// 3. https://t.me/zhetengsha/1234
|
||||
|
||||
// let clashMetaProxies = await produceArtifact({
|
||||
// type: 'subscription',
|
||||
// name: 'sub',
|
||||
// platform: 'ClashMeta',
|
||||
// produceType: 'internal' // 'internal' produces an Array, otherwise produces a String( ProxyUtils.yaml.safeLoad('YAML String').proxies )
|
||||
// }))
|
||||
// })
|
||||
|
||||
// // YAML
|
||||
// ProxyUtils.yaml.load('YAML String')
|
||||
// ProxyUtils.yaml.safeLoad('YAML String')
|
||||
// $content = ProxyUtils.yaml.safeDump({})
|
||||
// $content = ProxyUtils.yaml.dump({})
|
||||
|
||||
// 一个往文件里插入本地节点的例子:
|
||||
// const yaml = ProxyUtils.yaml.safeLoad($content ?? $files[0])
|
||||
// let clashMetaProxies = await produceArtifact({
|
||||
// type: 'collection',
|
||||
// name: '机场',
|
||||
// platform: 'ClashMeta',
|
||||
// produceType: 'internal'
|
||||
// })
|
||||
// yaml.proxies.unshift(...clashMetaProxies)
|
||||
// $content = ProxyUtils.yaml.dump(yaml)
|
||||
|
||||
|
||||
// { $content, $files } will be passed to the next operator
|
||||
// $content is the final content of the file
|
||||
// flowUtils 为机场订阅流量信息处理工具
|
||||
// 可参考 https://t.me/zhetengsha/948
|
||||
// https://github.com/sub-store-org/Sub-Store/blob/31b6dd0507a9286d6ab834ec94ad3050f6bdc86b/backend/src/utils/download.js#L104
|
||||
// 可参考:
|
||||
// 1. https://t.me/zhetengsha/948
|
||||
|
||||
// context 为传入的上下文
|
||||
// 有三种情况, 按需判断
|
||||
|
||||
Reference in New Issue
Block a user