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, '"');
}