mirror of
https://github.com/Jerryplusy/rc-plugin.git
synced 2025-10-14 08:09:19 +00:00
🐞 fix(bilibili.js): 修复 av 号无法解析问题 [#86]
This commit is contained in:
parent
9845705a4d
commit
f8f9d77376
@ -66,7 +66,6 @@ import NeteaseMusicInfo from '../model/neteaseMusicInfo.js';
|
||||
import * as aBogus from "../utils/a-bogus.cjs";
|
||||
import { downloadM3u8Videos, mergeAcFileToMp4, parseM3u8, parseUrl } from "../utils/acfun.js";
|
||||
import { startBBDown } from "../utils/bbdown-util.js";
|
||||
import { av2BV } from "../utils/bilibili-bv-av-convert.js";
|
||||
import {
|
||||
BILI_HEADER,
|
||||
downloadBFile,
|
||||
@ -879,11 +878,6 @@ export class tools extends plugin {
|
||||
}
|
||||
// 补充https
|
||||
url = url.startsWith("https://") ? url : "https://" + url;
|
||||
// av处理
|
||||
const matched = url.match(/\/(AV|av)(\w+)/);
|
||||
if (matched) {
|
||||
url = url.replace(matched[0].replace("\/", ""), av2BV(Number(matched[2])));
|
||||
}
|
||||
// 直播间分享
|
||||
// logger.info(url)
|
||||
if (url.includes("live.bilibili.com")) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
- {
|
||||
version: 1.10.0-rc2,
|
||||
version: 1.10.1,
|
||||
data:
|
||||
[
|
||||
新增<span class="cmd">RBS查看哔哩哔哩状态</span>功能,
|
||||
|
@ -1,29 +0,0 @@
|
||||
const table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
|
||||
const tr = Array.from(table).reduce((o, c, i) => Object.assign(o, { [c]: i }), {})
|
||||
const s = [11, 10, 3, 8, 4, 6]
|
||||
const xor = 177451812
|
||||
const add = 8728348608
|
||||
/** 算法来源:https://www.zhihu.com/question/381784377/answer/1099438784 **/
|
||||
|
||||
/**
|
||||
* Convert a BV string to AV number
|
||||
* @param {string} bv The BV string to be converted to AV number
|
||||
* @returns {number} The AV number converted from the provided BV string
|
||||
*/
|
||||
function bv2AV(bv) {
|
||||
return (new Uint8Array(6).reduce((r, _, i) => r + tr[bv[s[i]]] * 58 ** i, 0) - add) ^ xor
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a AV number to BV string
|
||||
* @param {number} av The AV number to be converted to BV string
|
||||
* @returns {string} The BV string converted from the provided AV number
|
||||
*/
|
||||
function av2BV(av) {
|
||||
return (new Uint8Array(6).reduce((r, _, i) => { r.splice(s[i], 1, table[Math.floor(((av ^ xor) + add) / 58 ** i % 58)]); return r }, Array.from('BV1 4 1 7 '))).join('')
|
||||
}
|
||||
|
||||
export {
|
||||
bv2AV,
|
||||
av2BV
|
||||
}
|
@ -204,7 +204,15 @@ async function axelDownloadBFile(url, fullFileName, progressCallback, videoDownl
|
||||
* @returns {Promise<any>}
|
||||
*/
|
||||
export async function getDownloadUrl(url, SESSDATA, qn) {
|
||||
const videoId = /video\/[^\?\/ ]+/.exec(url)[0].split("/")[1];
|
||||
let videoId = /video\/[^\?\/ ]+/.exec(url)[0].split("/")[1];
|
||||
// AV号特殊处理
|
||||
let cid = "";
|
||||
if (videoId.toLowerCase().startsWith('av')) {
|
||||
// 将 AV 转换为 BV
|
||||
const { bvid, cid: newCid } = await getVideoInfo(url);
|
||||
videoId = bvid;
|
||||
cid = newCid;
|
||||
}
|
||||
// 转换画质数字为分辨率
|
||||
let qualityText;
|
||||
switch(parseInt(qn)) {
|
||||
@ -215,7 +223,7 @@ export async function getDownloadUrl(url, SESSDATA, qn) {
|
||||
default: qualityText = "480P"; break;
|
||||
}
|
||||
logger.info(`[R插件][BILI下载] 开始获取视频下载链接,视频ID: ${videoId}, 请求画质: ${qualityText}`);
|
||||
const dash = await getBiliVideoWithSession(videoId, "", SESSDATA, qn);
|
||||
const dash = await getBiliVideoWithSession(videoId, cid, SESSDATA, qn);
|
||||
// 获取关键信息
|
||||
const { video, audio } = dash;
|
||||
|
||||
@ -388,7 +396,7 @@ export async function m4sToMp3(m4sUrl, path) {
|
||||
export async function getBiliAudio(bvid, cid) {
|
||||
// 转换cid
|
||||
if (!cid)
|
||||
cid = await fetchCID(bvid).catch((err) => console.log(err))
|
||||
cid = await fetchCID(bvid).catch((err) => logger.info(err))
|
||||
|
||||
// 返回一个fetch的promise
|
||||
return (new Promise((resolve, reject) => {
|
||||
@ -447,11 +455,11 @@ export async function getBiliVideoWithSession(bvid, cid, SESSDATA, qn) {
|
||||
* @returns {Promise<*>}
|
||||
*/
|
||||
export const fetchCID = async (bvid) => {
|
||||
//console.log('Data.js Calling fetchCID:' + URL_BVID_TO_CID.replace("{bvid}", bvid))
|
||||
const res = await fetch(BILI_BVID_TO_CID.replace("{bvid}", bvid))
|
||||
const json = await res.json()
|
||||
const cid = json.data[0].cid
|
||||
return cid
|
||||
//logger.info('Data.js Calling fetchCID:' + URL_BVID_TO_CID.replace("{bvid}", bvid))
|
||||
const res = await fetch(BILI_BVID_TO_CID.replace("{bvid}", bvid));
|
||||
const json = await res.json();
|
||||
const cid = json.data[0].cid;
|
||||
return cid;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -462,8 +470,16 @@ export const fetchCID = async (bvid) => {
|
||||
export async function getVideoInfo(url) {
|
||||
// const baseVideoInfo = "http://api.bilibili.com/x/web-interface/view";
|
||||
const videoId = /video\/[^\?\/ ]+/.exec(url)[0].split("/")[1];
|
||||
// 如果匹配到的是AV号特殊处理
|
||||
let finalUrl = `${ BILI_VIDEO_INFO }?`;
|
||||
if (videoId.toLowerCase().startsWith('av')) {
|
||||
finalUrl += `aid=${ videoId.slice(2) }`;
|
||||
} else {
|
||||
finalUrl += `bvid=${ videoId }`;
|
||||
}
|
||||
logger.debug(finalUrl);
|
||||
// 获取视频信息,然后发送
|
||||
return fetch(`${ BILI_VIDEO_INFO }?bvid=${ videoId }`)
|
||||
return fetch(finalUrl)
|
||||
.then(async resp => {
|
||||
const respJson = await resp.json();
|
||||
const respData = respJson.data;
|
||||
@ -521,7 +537,7 @@ export async function getDynamic(dynamicId, SESSDATA) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// console.log(dynamic_src)
|
||||
// logger.info(dynamic_src)
|
||||
return {
|
||||
dynamicSrc,
|
||||
dynamicDesc
|
||||
|
Loading…
x
Reference in New Issue
Block a user