import crypto from "node:crypto"; import axios from "axios"; // @ts-ignore import safeEval from "safe-eval"; import { parseScript, parseFunctionName } from "../utils.js"; import type { Video, streamType, DanmuItem } from "../types.js"; /** * 获取原始视频弹幕 */ export async function getDanmu( vid: string, startTime: number, endTime: number = -1 ) { const url = "https://v.douyu.com/wgapi/vod/center/getBarrageList"; const res = await axios.get(url, { params: { vid: vid, start_time: startTime, end_time: endTime, }, }); return res.data; } /** * 获取视频所有弹幕 */ export async function getVideoDanmu(vid: string) { const items: DanmuItem[] = []; let startTime = 0; while (startTime !== -1) { const res = await getDanmu(vid, startTime); startTime = res.data.end_time; const list: any[] = res.data.list; items.push(...list); } return items; } /** * 获取视频point_id * @param videoId 视频id */ export async function requestPointId(videoId: string) { const response = await axios.get(`https://v.douyu.com/show/${videoId}`); const reg = new RegExp(`{"vid":"${videoId}","point_id":(\\d+)`); return response.data.toString().match(reg)[1]; } /** * 获取视频流 * @param videoId 视频id */ export async function getStreamUrls(data: string): Promise<{ timestamp: number; thumb_video: { [key: string]: { url: string; fsize: number; bit_rate: number; name: string; stream_type: streamType; level: number; stream_format: "264"; now_free: number; has_pms: number; }; }; }> { const response = await axios({ method: "POST", data: data, url: "https://v.douyu.com/wgapi/vodnc/front/stream/getStreamUrlWeb", headers: { "Content-Type": "application/x-www-form-urlencoded", }, }); return response.data.data; } /** * 获取所有分p视频 */ export async function getVideos( videoId: string, upId: string ): Promise<{ data: string; list: { cover: string; hash_id: string; is_version: number; nickname: string; rank: number; show_id: string; show_remark: string; title: string; vid: number; video_duartion: number; view_num: number; }[]; }> { const response = await axios.get( `https://v.douyu.com/wgapi/vod/center/getShowReplayList`, { params: { vid: videoId, up_id: upId, }, } ); return response.data.data; } /** * 解析视频页 */ export async function parseVideo(url: string): Promise