@imput/youtubei.js
Version:
A JavaScript client for YouTube's private API, known as InnerTube. Fork of youtubei.js
76 lines • 7.58 kB
JavaScript
/** @jsxFactory DashUtils.createElement */
/** @jsxFragmentFactory DashUtils.Fragment */
import * as DashUtils from './DashUtils.js';
import { getStreamingInfo } from './StreamingInfo.js';
import { InnertubeError } from './Utils.js';
async function OTFPostLiveDvrSegmentInfo({ info }) {
if (!info.is_oft && !info.is_post_live_dvr)
return null;
const template = await info.getSegmentTemplate();
return DashUtils.createElement("segmentTemplate", { startNumber: template.init_url ? '1' : '0', timescale: "1000", initialization: template.init_url, media: template.media_url },
DashUtils.createElement("segmentTimeline", null, template.timeline.map((segment_duration) => (DashUtils.createElement("s", { d: segment_duration.duration, r: segment_duration.repeat_count })))));
}
function SegmentInfo({ info }) {
if (info.is_oft || info.is_post_live_dvr) {
return DashUtils.createElement(OTFPostLiveDvrSegmentInfo, { info: info });
}
return DashUtils.createElement(DashUtils.Fragment, null,
DashUtils.createElement("baseURL", null, info.base_url),
DashUtils.createElement("segmentBase", { indexRange: `${info.index_range.start}-${info.index_range.end}` },
DashUtils.createElement("initialization", { range: `${info.init_range.start}-${info.init_range.end}` })));
}
function getDrmSystemId(drm_family) {
switch (drm_family) {
case 'WIDEVINE':
return 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed';
case 'PLAYREADY':
return '9a04f079-9840-4286-ab92-e65be0885f95';
default:
return null;
}
}
async function DashManifest({ streamingData, isPostLiveDvr, transformURL, rejectFormat, cpn, player, actions, storyboards, captionTracks, options }) {
const { getDuration, audio_sets, video_sets, image_sets, text_sets } = getStreamingInfo(streamingData, isPostLiveDvr, transformURL, rejectFormat, cpn, player, actions, storyboards, captionTracks, options);
// XXX: DASH spec: https://standards.iso.org/ittf/PubliclyAvailableStandards/c083314_ISO_IEC%2023009-1_2022(en).zip
return DashUtils.createElement("mPD", { xmlns: "urn:mpeg:dash:schema:mpd:2011", minBufferTime: "PT1.500S", profiles: "urn:mpeg:dash:profile:isoff-main:2011", type: "static", mediaPresentationDuration: `PT${await getDuration()}S`, "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation": "urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" },
DashUtils.createElement("period", null,
audio_sets.map((set, index) => (DashUtils.createElement("adaptationSet", { id: index, mimeType: set.mime_type, startWithSAP: "1", subsegmentAlignment: "true", lang: set.language, codecs: set.codecs, audioSamplingRate: set.audio_sample_rate, contentType: "audio" },
set.drm_families && set.drm_families.map((drm_family) => (DashUtils.createElement("contentProtection", { schemeIdUri: `urn:uuid:${getDrmSystemId(drm_family)}` }))),
set.track_roles && set.track_roles.map((role) => (DashUtils.createElement("role", { schemeIdUri: "urn:mpeg:dash:role:2011", value: role }))),
set.track_name &&
DashUtils.createElement("label", { id: index }, set.track_name),
set.channels &&
DashUtils.createElement("audioChannelConfiguration", { schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011", value: set.channels }),
set.representations.map((rep) => (DashUtils.createElement("representation", { id: rep.uid, bandwidth: rep.bitrate, codecs: rep.codecs, audioSamplingRate: rep.audio_sample_rate },
rep.channels &&
DashUtils.createElement("audioChannelConfiguration", { schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011", value: rep.channels }),
DashUtils.createElement(SegmentInfo, { info: rep.segment_info }))))))),
video_sets.map((set, index) => (DashUtils.createElement("adaptationSet", { id: index + audio_sets.length, mimeType: set.mime_type, startWithSAP: "1", subsegmentAlignment: "true", codecs: set.codecs, maxPlayoutRate: "1", frameRate: set.fps, contentType: "video" },
set.drm_families && set.drm_families.map((drm_family) => (DashUtils.createElement("contentProtection", { schemeIdUri: `urn:uuid:${getDrmSystemId(drm_family)}` }))),
set.color_info.primaries &&
DashUtils.createElement("supplementalProperty", { schemeIdUri: "urn:mpeg:mpegB:cicp:ColourPrimaries", value: set.color_info.primaries }),
set.color_info.transfer_characteristics &&
DashUtils.createElement("supplementalProperty", { schemeIdUri: "urn:mpeg:mpegB:cicp:TransferCharacteristics", value: set.color_info.transfer_characteristics }),
set.color_info.matrix_coefficients &&
DashUtils.createElement("supplementalProperty", { schemeIdUri: "urn:mpeg:mpegB:cicp:MatrixCoefficients", value: set.color_info.matrix_coefficients }),
set.representations.map((rep) => (DashUtils.createElement("representation", { id: rep.uid, bandwidth: rep.bitrate, width: rep.width, height: rep.height, codecs: rep.codecs, frameRate: rep.fps },
DashUtils.createElement(SegmentInfo, { info: rep.segment_info }))))))),
image_sets.map(async (set, index) => {
return DashUtils.createElement("adaptationSet", { id: index + audio_sets.length + video_sets.length, mimeType: await set.getMimeType(), contentType: "image" }, set.representations.map(async (rep) => (DashUtils.createElement("representation", { id: `thumbnails_${rep.thumbnail_width}x${rep.thumbnail_height}`, bandwidth: await rep.getBitrate(), width: rep.sheet_width, height: rep.sheet_height },
DashUtils.createElement("essentialProperty", { schemeIdUri: "http://dashif.org/thumbnail_tile", value: `${rep.columns}x${rep.rows}` }),
DashUtils.createElement("segmentTemplate", { media: rep.template_url, duration: rep.template_duration, startNumber: "0" })))));
}),
text_sets.map((set, index) => {
return DashUtils.createElement("adaptationSet", { id: index + audio_sets.length + video_sets.length + image_sets.length, mimeType: set.mime_type, lang: set.language, contentType: "text" },
set.track_roles.map((role) => (DashUtils.createElement("role", { schemeIdUri: "urn:mpeg:dash:role:2011", value: role }))),
DashUtils.createElement("label", { id: index + audio_sets.length }, set.track_name),
DashUtils.createElement("representation", { id: set.representation.uid, bandwidth: "0" },
DashUtils.createElement("baseURL", null, set.representation.base_url)));
})));
}
export function toDash(streaming_data, is_post_live_dvr = false, url_transformer = (url) => url, format_filter, cpn, player, actions, storyboards, caption_tracks, options) {
if (!streaming_data)
throw new InnertubeError('Streaming data not available');
return DashUtils.renderToString(DashUtils.createElement(DashManifest, { streamingData: streaming_data, isPostLiveDvr: is_post_live_dvr, transformURL: url_transformer, options: options, rejectFormat: format_filter, cpn: cpn, player: player, actions: actions, storyboards: storyboards, captionTracks: caption_tracks }));
}
//# sourceMappingURL=DashManifest.js.map