UNPKG

@bililive-tools/huya-recorder

Version:
88 lines (87 loc) 3.49 kB
// 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: "网宿", };