import type { PlayUrlResponse } from '../services/types'; /** * 从 Bilibili DASH 响应生成 MPD data URI。 * 选取 id === qn 的视频流(找不到则取第一条),带宽最高的音频流。 * 返回 "data:application/dash+xml;base64,..." 供 react-native-video (ExoPlayer) 使用。 */ export function buildDashDataUri(playData: PlayUrlResponse, qn: number): string { const dash = playData.dash!; const video = dash.video.find(v => v.id === qn) ?? dash.video[0]; const audio = dash.audio.reduce((best, a) => a.bandwidth > best.bandwidth ? a : best ); const dur = dash.duration; const vSeg = video.segment_base; const aSeg = audio.segment_base; const videoSegmentBase = vSeg ? `\n \n \n ` : ''; const audioSegmentBase = aSeg ? `\n \n \n ` : ''; const xml = ` ${escapeXml(video.baseUrl)}${videoSegmentBase} ${escapeXml(audio.baseUrl)}${audioSegmentBase} `; return `data:application/dash+xml;base64,${btoa(xml)}`; } function escapeXml(s: string): string { return s .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"'); }