@bililive-tools/huya-recorder
Version:
bililive-tools huya recorder implemention
88 lines (87 loc) • 3.49 kB
JavaScript
// import { createHash, randomInt } from "node:crypto";
// import { URLSearchParams } from "node:url";
import axios from "axios";
import { utils } from "@bililive-tools/manager";
import { assert, getFormatSources } from "./utils.js";
const requester = axios.create({
timeout: 10e3,
headers: {
"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko)",
},
});
export async function getRoomInfo(roomIdOrShortId, formatPriorities = ["flv", "hls"]) {
const res = await requester.get(`https://mp.huya.com/cache.php?m=Live&do=profileRoom&roomid=${roomIdOrShortId}`);
const html = res.data;
assert(html, `Unexpected resp, hyPlayerConfig is null`);
if (res.status !== 200) {
throw new Error(`Unexpected resp, status is ${res.status}`);
}
const profile = html.data;
const sources = {
flv: [],
hls: [],
};
// const uid = await getAnonymousUid();
for (const item of profile?.stream?.baseSteamInfoList ?? []) {
if (item.sFlvAntiCode && item.sFlvAntiCode.length > 0) {
// const { uid, urlQuery, seq_id, ws_time, ws_secret } = generateStreamParams({
// sFlvAntiCode: item.sFlvAntiCode,
// sStreamName: item.sStreamName,
// });
// console.log("uid", uid, urlQuery);
// const url = `${item.sFlvUrl}/${item.sStreamName}.${item.sFlvUrlSuffix}?wsSecret=${ws_secret}&wsTime=${ws_time}&seqid=${seq_id}&ctype=${urlQuery.get("ctype")}&ver=1&fs=${urlQuery.get("fs")}&t=${urlQuery.get("t")}&uid=${uid}`;
const url = `${item.sFlvUrl}/${item.sStreamName}.${item.sFlvUrlSuffix}?${item.sFlvAntiCode}`;
sources.flv.push({
name: item.sCdnType,
url,
});
}
if (item.sHlsAntiCode && item.sHlsAntiCode.length > 0) {
const url = `${item.sHlsUrl}/${item.sStreamName}.${item.sHlsUrlSuffix}?${item.sHlsAntiCode}`;
sources.hls.push({
name: item.sCdnType,
url,
});
}
}
const streams = {
hls: profile.stream.hls.rateArray.map((info) => ({
desc: info.sDisplayName,
bitRate: info.iBitRate,
})),
flv: profile.stream.flv.rateArray.map((info) => ({
desc: info.sDisplayName,
bitRate: info.iBitRate,
})),
};
const startTime = new Date(profile.liveData?.startTime * 1000);
const formatSources = getFormatSources(sources, formatPriorities);
if (!formatSources) {
throw new Error("No format sources found");
}
return {
living: profile.liveStatus === "ON",
id: profile.liveData.profileRoom,
owner: profile.liveData.nick,
title: profile.liveData.introduction,
roomId: profile.liveData.profileRoom,
avatar: profile.liveData.avatar180,
cover: profile.liveData.screenshot,
streams: formatSources.formatName === "hls" ? streams.hls : streams.flv,
sources: formatSources.sources,
startTime,
liveId: utils.md5(`${roomIdOrShortId}-${startTime?.getTime()}`),
};
}
// type CacheProfileData = CacheProfileOffData | CacheProfileReplayData | CacheProfileOnData;
const cdn = {
AL: "阿里",
AL13: "阿里13",
TX15: "腾讯15",
HW16: "华为16",
HYZJ: "不知道是啥",
TX: "腾讯",
HW: "华为",
HS: "火山",
WS: "网宿",
};