Vertex 自动继续辅种任务+自动根据站点限速JS脚本
IYUU需在下载器管理中关闭 校验后做种
自行修改配置的站点限速
将代码添加进Vertex定时脚本
async () => {
const util = require('../libs/util');
// 站点配置
const SITE_CONFIG = {
// 普通限速
normalLimit: {
speed: 90 * 1024 * 1024, // 90M/s
description: '普通限速'
},
// 不限速站点列表
unlimitedSites: ['qingwa', 'ubits'],
// 特殊限速站点配置
specialSites: [
{
keyword: 'carpt',
speed: 29 * 1024 * 1024, // 29M/s
description: 'carpt站点限速'
},
{
keyword: 'btschool', // 会匹配 btschool.club 等任何包含 btschool 的域名
speed: 25 * 1024 * 1024, // 25M/s
description: 'btschool站点限速'
}
]
};
// 允许处理的下载器ID列表
const allowedClientIds = ['507a7287', '1d99a25c', 'fb8ed0d3'];
// 从URL中提取域名(使用缓存优化)
const domainCache = new Map();
function extractDomain(url) {
if (domainCache.has(url)) {
return domainCache.get(url);
}
try {
let domain = url.replace(/^https?:\/\//, '').split(/[/?]/)[0];
domainCache.set(url, domain);
return domain;
} catch (error) {
return url;
}
}
async function processTorrent(torrent, runningClient, client) {
if (!torrent || torrent.category !== 'IYUU自动辅种' || torrent.progress !== 1) {
return;
}
// 获取所有 tracker
const trackers = torrent.trackers || [torrent.tracker];
const domains = [...new Set(trackers.map(t => extractDomain(t.url || t)))].join(', ');
// 检查是否有任何一个 tracker 匹配不限速列表
const trackerUrls = trackers.map(t => (t.url || t).toLowerCase());
const shouldUnlimit = SITE_CONFIG.unlimitedSites.some(site =>
trackerUrls.some(url => url.includes(site.toLowerCase()))
);
let speedInfo;
let speed;
if (shouldUnlimit) {
speed = -1;
speedInfo = '不限速';
} else {
// 检查是否匹配特殊限速
const matchedSite = SITE_CONFIG.specialSites.find(site =>
trackerUrls.some(url => url.includes(site.keyword.toLowerCase()))
);
if (matchedSite) {
speed = matchedSite.speed;
speedInfo = `${matchedSite.speed/(1024*1024)}M/s`;
} else {
speed = SITE_CONFIG.normalLimit.speed;
speedInfo = `${SITE_CONFIG.normalLimit.speed/(1024*1024)}M/s`;
}
}
// 批量执行操作
await Promise.all([
runningClient.resumeTorrent(torrent.hash),
runningClient.setSpeedLimit(torrent.hash, 'upload', speed)
]);
// 输出简洁的日志
logger.sc(`[${client.alias}] ${domains} | ${speedInfo} | ${torrent.name}`);
}
async function resumeAllTorrents() {
const QB_CLIENTS = util.listClient();
const filteredClients = QB_CLIENTS.filter(client => allowedClientIds.includes(client.id));
await Promise.all(filteredClients.map(async (client) => {
const clientId = client.id;
const runningClient = global.runningClient[clientId];
if (!runningClient?.status) {
return;
}
const torrents = runningClient.maindata.torrents;
if (!torrents?.length) {
return;
}
// 并行处理所有种子
await Promise.all(torrents.map(torrent =>
processTorrent(torrent, runningClient, client)
));
}));
}
try {
await resumeAllTorrents();
} catch (error) {
logger.sc("执行过程中出错:", error);
}
};
其他文章