diff --git a/apps/tools.js b/apps/tools.js
index 3af6f58..ba68ec6 100644
--- a/apps/tools.js
+++ b/apps/tools.js
@@ -23,12 +23,12 @@ import {
} from "../utils/bilibili.js";
import { downloadM3u8Videos, mergeAcFileToMp4, parseM3u8, parseUrl } from "../utils/acfun.js";
import {
+ BILI_CDN_SELECT_LIST,
BILI_DEFAULT_INTRO_LEN_LIMIT,
COMMON_USER_AGENT,
DIVIDING_LINE,
douyinTypeMap,
HELP_DOC,
- IMAGE_TRANSLATION_PROMPT,
REDIS_YUNZAI_ISOVERSEA,
REDIS_YUNZAI_LAGRANGE,
SUMMARY_PROMPT,
@@ -43,7 +43,8 @@ import {
downloadImg,
estimateReadingTime,
formatBiliInfo,
- retryAxiosReq, saveJsonToFile,
+ retryAxiosReq,
+ saveJsonToFile,
secondsToTime,
testProxy,
truncateString
@@ -73,7 +74,6 @@ import {
WEISHI_VIDEO_INFO,
XHS_REQ_LINK
} from "../constants/tools.js";
-import { processTikTokUrl } from "../utils/tiktok.js";
import { getDS } from "../utils/mihoyo.js";
import GeneralLinkAdapter from "../utils/general-link-adapter.js";
import { mid2id } from "../utils/weibo.js";
@@ -207,6 +207,8 @@ export class tools extends plugin {
this.biliDuration = this.toolsConfig.biliDuration;
// 加载哔哩哔哩是否使用BBDown
this.biliUseBBDown = this.toolsConfig.biliUseBBDown;
+ // 加载 BBDown 的CDN配置
+ this.biliCDN = this.toolsConfig.biliCDN;
// 加载哔哩哔哩是否使用Aria2
this.biliUseAria2 = this.toolsConfig.biliUseAria2;
// 加载抖音Cookie
@@ -625,7 +627,11 @@ export class tools extends plugin {
// 删除之前的文件
await checkAndRemoveFile(`${ tempPath }.mp4`);
// 下载视频
- await startBBDown(url, path, this.biliSessData, this.biliUseAria2);
+ await startBBDown(url, path, {
+ biliSessData: this.biliSessData,
+ biliUseAria2: this.biliUseAria2,
+ biliCDN: BILI_CDN_SELECT_LIST.find(item => item.value === this.biliCDN)?.sign,
+ });
// 发送视频
return this.sendVideoToUpload(e, `${ tempPath }.mp4`);
}
diff --git a/config/tools.yaml b/config/tools.yaml
index 416f223..1842dcb 100644
--- a/config/tools.yaml
+++ b/config/tools.yaml
@@ -10,6 +10,7 @@ biliSessData: '' # 哔哩哔哩的SESSDATA
biliIntroLenLimit: 50 # 哔哩哔哩简介长度限制,填 0 或者 -1 可以不做任何限制,显示完整简介
biliDuration: 480 # 哔哩哔哩限制的最大视频时长(默认8分钟),单位:秒
biliUseBBDown: false # 是否使用BBDown,默认不开启,开启后使用强劲的BBDown下载最高画质
+biliCDN: 0 # 哔哩哔哩 CDN,默认为0表示不使用
biliUseAria2: false # 是否使用Aria2下载
douyinCookie: '' # douyin's cookie, 格式:odin_tt=xxx;passport_fe_beating_status=xxx;sid_guard=xxx;uid_tt=xxx;uid_tt_ss=xxx;sid_tt=xxx;sessionid=xxx;sessionid_ss=xxx;sid_ucp_v1=xxx;ssid_ucp_v1=xxx;passport_assist_user=xxx;ttwid=xxx;
diff --git a/config/version.yaml b/config/version.yaml
index a0b541f..52b3113 100644
--- a/config/version.yaml
+++ b/config/version.yaml
@@ -1,10 +1,10 @@
- {
- version: 1.7.3,
+ version: 1.7.4,
data:
[
+ 新增BBDown更换CDN功能,
新增Aria2下载选项功能,
新增最大上传限制选项功能,
- 新增BBDown下载方式功能,
支持锅巴插件,方便查看和修改配置,
输入#R帮助获取插件帮助,
输入#R更新更新插件,
diff --git a/constants/constant.js b/constants/constant.js
index 30ab011..42f1ce2 100644
--- a/constants/constant.js
+++ b/constants/constant.js
@@ -116,4 +116,13 @@ export const SUMMARY_CONTENT_ESTIMATOR_PATTERNS = [
{ reg: /(?:https?:\/\/)?sspai.com\/[a-zA-Z\d._?%&+\-=\/#]*/, name: '少数派' },
{ reg: /(?:https?:\/\/)?www\.bilibili\.com\/read\/[A-Za-z\d._?%&+\-=\/#]*/, name: '哔哩哔哩专栏' },
{ reg: /(?:https?:\/\/)?(www\.)chinadaily.com.cn\/a\/[a-zA-Z0-9\d._?%&+\-=\/#]*/, name: 'ChinaDaily' }
-];
\ No newline at end of file
+];
+
+export const BILI_CDN_SELECT_LIST = Object.freeze([
+ { label: '不使用', value: 0, sign: '' },
+ { label: '腾讯CDN【推荐】', value: 1, sign: 'upos-sz-mirrorcos.bilivideo.com' },
+ { label: '百度CDN', value: 2, sign: 'upos-sz-mirrorbd.bilivideo.com' },
+ { label: '华为CDN', value: 3, sign: 'upos-sz-mirrorhw.bilivideo.com' },
+ { label: '阿卡迈(海外)', value: 4 , sign: 'upos-sz-mirrorakamai.bilivideo.com'},
+ { label: 'HK-CDN', value: 5, sign: 'upos-sz-mirroraliov.bilivideo.com' }
+]);
\ No newline at end of file
diff --git a/guoba.support.js b/guoba.support.js
index 7ffd87a..d4c467e 100644
--- a/guoba.support.js
+++ b/guoba.support.js
@@ -1,6 +1,7 @@
import path from "path";
import model from "./model/index.js";
import _ from "lodash";
+import { BILI_CDN_SELECT_LIST } from "./constants/constant.js";
const _path = process.cwd() + "/plugins/rconsole-plugin";
export function supportGuoba() {
@@ -129,6 +130,15 @@ export function supportGuoba() {
component: "Switch",
required: false,
},
+ {
+ field: "tools.biliCDN",
+ label: "强制使用CDN",
+ bottomHelpMessage: "BBDown强制使用CDN:【只影响开启后的BBDown,一定程度可以影响BBDown速度】哔哩哔哩的CDN地址更换,如果不需要默认不使用,如果选择了其他的CDN将会使用",
+ component: "Select",
+ componentProps: {
+ options: BILI_CDN_SELECT_LIST,
+ }
+ },
{
field: "tools.biliUseAria2",
label: "使用Aria2下载",
diff --git a/utils/bbdown-util.js b/utils/bbdown-util.js
index 58a98bd..f79bc2e 100644
--- a/utils/bbdown-util.js
+++ b/utils/bbdown-util.js
@@ -25,10 +25,11 @@ export function checkBBDown() {
* 使用BBDown下载
* @param videoUrl 视频链接
* @param downloadDir 下载目录
- * @param biliSessData cookie
- * @param biliUseAria2 使用Aria2
+ * @param BBDownOptions BBDown选项(目前仅支持session登录、使用Aria2下载、CDN)
*/
-export function startBBDown(videoUrl, downloadDir, biliSessData, biliUseAria2) {
+export function startBBDown(videoUrl, downloadDir, BBDownOptions) {
+ const { biliSessData, biliUseAria2, biliCDN } = BBDownOptions;
+
return new Promise((resolve, reject) => {
// logger.info(videoUrl);
// 解析URL并提取参数p(页数)
@@ -44,7 +45,8 @@ export function startBBDown(videoUrl, downloadDir, biliSessData, biliUseAria2) {
urlObj.search = newParams.toString();
videoUrl = urlObj.toString();
// 说明:-F 自定义名称,-c 自定义Cookie, --work-dir 设置下载目录,-M 多p下载的时候命名
- const command = `BBDown ${videoUrl} --work-dir ${downloadDir} ${biliSessData ? '-c SESSDATA=' + biliSessData : ''} ${pageParam ? '-p ' + pageParam + ' -M \"temp\"' : '-p 1' + ' -M \"temp\"'} -F temp --skip-subtitle --skip-cover ${biliUseAria2 ? '--use-aria2c' : ''}`;
+ const command = `BBDown ${videoUrl} --work-dir ${downloadDir} ${biliSessData ? '-c SESSDATA=' + biliSessData : ''} ${pageParam ? '-p ' + pageParam + ' -M \"temp\"' : '-p 1' + ' -M \"temp\"'} -F temp --skip-subtitle --skip-cover ${biliUseAria2 ? '--use-aria2c' : ''} ${biliCDN ? '--upos-host ' + biliCDN : ''}`;
+ logger.info(command);
// logger.info(command);
// 直接调用BBDown,因为它已经在系统路径中
exec(command, (error, stdout, stderr) => {
diff --git a/utils/tiktok.js b/utils/tiktok.js
deleted file mode 100644
index fa0ac09..0000000
--- a/utils/tiktok.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { HttpsProxyAgent } from 'https-proxy-agent';
-
-/**
- * Tiktok专属解析链接的Fetch
- * @param url 地址
- * @param isOversea 是否是海外
- * @param proxy 梯子
- */
-const fetchTiktokUrl = async (url, isOversea, proxy) => {
- // 处理特殊情况 & 非特殊情况的header
- const headers = url.includes("vm.tiktok") || url.includes("tiktok.com/t")
- ? { "User-Agent": "facebookexternalhit/1.1" }
- : {};
-
- return fetch(url, {
- headers,
- redirect: "follow",
- follow: 10,
- timeout: 10000,
- agent: isOversea ? undefined : new HttpsProxyAgent(proxy),
- }).then(resp => resp.url);
-};
-
-/**
- * 处理Tiktok链接
- * @param url 用户发送的链接,可能存在一些问题,需要正则匹配处理
- * @param isOversea 是否是海外
- * @param proxy 梯子
- */
-export const processTikTokUrl = async (url, isOversea, proxy) => {
- // 合并正则表达式
- // const urlShortRex = /(http:|https:)\/\/vt.tiktok.com\/[A-Za-z\d._?%&+\-=\/#]*/g;
- // const urlShortRex2 = /(http:|https:)\/\/vm.tiktok.com\/[A-Za-z\d._?%&+\-=\/#]*/g;
- // const urlShortRex3 = /(http:|https:)\/\/www.tiktok.com\/t\/[A-Za-z\d._?%&+\-=\/#]*/g;
- const tikTokRegex = /(http:|https:)\/\/(www\.tiktok\.com\/|vt\.tiktok\.com\/|vm\.tiktok\.com\/www\.tiktok\.com\/t\/)[A-Za-z\d._?%&+\-=\/#@]*/g;
- const match = tikTokRegex.exec(url);
-
- if (match) {// 如果URL匹配任何TikTok相关的模式,则进行处理
- url = await fetchTiktokUrl(match[0], isOversea, proxy);
- }
-
- // 这里可以处理其他逻辑,例如更新URL、记录日志等
- // 或者其他处理结果
- return url;
-};
\ No newline at end of file