From bbbfb6b45e90b27c1eaf0d80a576927b6dd51fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E5=88=80=E9=B1=BC?= <9903082+qdyovo@user.noreply.gitee.com> Date: Mon, 30 Sep 2024 15:40:31 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=B7=BB=E5=8A=A0YouTube?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E7=94=BB=E8=B4=A8=E8=87=AA=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/tools.js | 9 ++++++++- config/tools.yaml | 2 ++ constants/constant.js | 6 ++++++ guoba.support.js | 12 +++++++++++- utils/yt-dlp-util.js | 5 +++-- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/apps/tools.js b/apps/tools.js index b2f508f..52e5d1e 100644 --- a/apps/tools.js +++ b/apps/tools.js @@ -254,6 +254,8 @@ export class tools extends plugin { this.biliDownloadMethod = this.toolsConfig.biliDownloadMethod; // 加载哔哩哔哩最高分辨率 this.biliResolution = this.toolsConfig.biliResolution; + // 加载油管下载画质选项 + this.YouTubeGraphicsOptions = this.toolsConfig.YouTubeGraphicsOptions // 加载抖音Cookie this.douyinCookie = this.toolsConfig.douyinCookie; // 加载抖音是否压缩 @@ -1524,6 +1526,11 @@ export class tools extends plugin { // 匹配并转义 URL 中的 & 符号(仅对 Windows 进行转义) let url = urlRex.exec(e.msg)?.[0]?.replace(/&/g, isWindows ? '^&' : '&') || url2Rex.exec(e.msg)?.[0]?.replace(/&/g, isWindows ? '^&' : '&'); + //非最高画质,就按照设定的来 + let graphics = "" + if (this.YouTubeGraphicsOptions != 0) { + graphics = `[height<=${this.YouTubeGraphicsOptions}]` + } // 适配 YouTube Music if (url.includes("music")) { // https://music.youtube.com/watch?v=F4sRtMoIgUs&si=7ZYrHjlI3fHAha0F @@ -1533,7 +1540,7 @@ export class tools extends plugin { await checkAndRemoveFile(path + "/temp.mp4") const title = await ytDlpGetTilt(url, isOversea, this.myProxy); e.reply(`${ this.identifyPrefix }识别:油管,视频下载中请耐心等待 \n${ title }`); - await ytDlpHelper(path, url, isOversea, this.myProxy, true); + await ytDlpHelper(path, url, isOversea, this.myProxy, true, graphics); this.sendVideoToUpload(e, `${ path }/temp.mp4`); } catch (error) { console.error(error); diff --git a/config/tools.yaml b/config/tools.yaml index c5d51cd..9891ba7 100644 --- a/config/tools.yaml +++ b/config/tools.yaml @@ -19,6 +19,8 @@ biliCDN: 0 # 哔哩哔哩 CDN,默认为0表示不使用 biliDownloadMethod: 0 # 哔哩哔哩的下载方式:0默认使用原生稳定的下载方式,如果你在乎内存可以使用轻量的wget和axel下载方式,如果在乎性能可以使用Aria2下载 biliResolution: 1 # 哔哩哔哩的下载画质,0为原画,1为清晰画,2为流畅画(默认为0) +YouTubeGraphicsOptions: 720 #YouTobe的下载画质,0为原画,1080,720,480,自定义画面高度(默认为720) + 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; douyinCompression: true # true-压缩,false-不压缩;是否使用压缩视频格式的抖音(默认使用),使用后加速视频发送 douyinComments: false # true-开启评论,false-关闭评论 diff --git a/constants/constant.js b/constants/constant.js index 37228fa..15c7a99 100644 --- a/constants/constant.js +++ b/constants/constant.js @@ -187,6 +187,12 @@ export const BILI_RESOLUTION_LIST = Object.freeze([ { label: '360P 流畅', value: 6 }, ]); +export const YOUTUBE_GRAPHICS_LIST = Object.freeze([ + { label: 'Best', value: 0 }, + { label: '1080P 高清', value: 1080 }, + { label: '720P 高清', value: 720 }, + { label: '480P 清晰', value: 480 }, +]); /** * 消息撤回时间 * @type {number} diff --git a/guoba.support.js b/guoba.support.js index 6918e70..0ef076c 100644 --- a/guoba.support.js +++ b/guoba.support.js @@ -1,6 +1,6 @@ import _ from "lodash"; import path from "path"; -import { BILI_CDN_SELECT_LIST, BILI_DOWNLOAD_METHOD, BILI_RESOLUTION_LIST } from "./constants/constant.js"; +import { BILI_CDN_SELECT_LIST, BILI_DOWNLOAD_METHOD, BILI_RESOLUTION_LIST, YOUTUBE_GRAPHICS_LIST } from "./constants/constant.js"; import model from "./model/config.js"; const pluginName = `rconsole-plugin`; @@ -201,6 +201,16 @@ export function supportGuoba() { options: BILI_RESOLUTION_LIST, } }, + { + field: "tools.YouTubeGraphicsOptions", + label: "YouTube最高分辨率", + bottomHelpMessage: + "油管下载的最高分辨率(默认720p,请根据自己魔法流量和服务器承载能力进行调整)", + component: "Select", + componentProps: { + options: YOUTUBE_GRAPHICS_LIST, + } + }, { field: "tools.douyinCookie", label: "抖音的Cookie", diff --git a/utils/yt-dlp-util.js b/utils/yt-dlp-util.js index ddb344b..283f87a 100644 --- a/utils/yt-dlp-util.js +++ b/utils/yt-dlp-util.js @@ -29,12 +29,13 @@ export function ytDlpGetTilt(url, isOversea, proxy) { * @param isOversea 是否是海外用户 * @param proxy 代理地址 * @param merge 是否合并输出为 mp4 格式 (仅适用于视频合并需求) + * @param graphics YouTube画质参数 */ -export async function ytDlpHelper(path, url, isOversea, proxy, merge = false) { +export async function ytDlpHelper(path, url, isOversea, proxy, merge = false, graphics) { return new Promise((resolve, reject) => { const mergeOption = merge ? '--merge-output-format "mp4"' : ''; - const fParam = url.includes("youtu") ? `-f "bv[height<=720][ext=mp4]+ba[ext=m4a]"` : ""; + const fParam = url.includes("youtu") ? `-f "bv${graphics}[ext=mp4]+ba[ext=m4a]"` : ""; const command = `yt-dlp ${fParam} ${constructProxyParam(isOversea, proxy)} -P ${path} -o "temp.%(ext)s" ${url}`;