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