parse static method
Implementation
static UDashManifest? parse(String content, {String? baseUrl}) {
final UXmlNode? root = UXml.parse(content);
if (root == null || !root.name.endsWith("MPD")) return null;
final String? manifestBase = _joinBase(baseUrl, root.child("BaseURL")?.text);
final List<UDashPeriod> periods = <UDashPeriod>[];
final Duration total = parseIso8601(root.attr("mediaPresentationDuration"));
for (final UXmlNode periodNode in root.childrenNamed("Period")) {
final String? periodBase = _joinBase(manifestBase, periodNode.child("BaseURL")?.text);
final Duration periodDuration = parseIso8601(periodNode.attr("duration"));
final List<UDashAdaptationSet> sets = <UDashAdaptationSet>[];
for (final UXmlNode setNode in periodNode.childrenNamed("AdaptationSet")) {
final String? setBase = _joinBase(periodBase, setNode.child("BaseURL")?.text);
final UDashSegmentTemplate? setTemplate = _template(setNode.child("SegmentTemplate"));
final List<UDashRepresentation> reps = <UDashRepresentation>[];
for (final UXmlNode repNode in setNode.childrenNamed("Representation")) {
final UDashSegmentTemplate? repTemplate = _template(repNode.child("SegmentTemplate")) ?? setTemplate;
reps.add(
UDashRepresentation(
id: repNode.attr("id") ?? "",
bandwidth: int.tryParse(repNode.attr("bandwidth") ?? "") ?? 0,
width: int.tryParse(repNode.attr("width") ?? setNode.attr("width") ?? ""),
height: int.tryParse(repNode.attr("height") ?? setNode.attr("height") ?? ""),
codecs: repNode.attr("codecs") ?? setNode.attr("codecs"),
mimeType: repNode.attr("mimeType") ?? setNode.attr("mimeType"),
frameRate: _frameRate(repNode.attr("frameRate") ?? setNode.attr("frameRate")),
audioSamplingRate: int.tryParse(repNode.attr("audioSamplingRate") ?? setNode.attr("audioSamplingRate") ?? ""),
audioChannels: int.tryParse(repNode.child("AudioChannelConfiguration")?.attr("value") ?? setNode.child("AudioChannelConfiguration")?.attr("value") ?? ""),
baseUrl: _joinBase(setBase, repNode.child("BaseURL")?.text),
template: repTemplate,
indexRange: repNode.child("SegmentBase")?.attr("indexRange"),
initializationRange: repNode.child("SegmentBase")?.child("Initialization")?.attr("range"),
),
);
}
sets.add(
UDashAdaptationSet(
representations: reps,
contentType: setNode.attr("contentType"),
mimeType: setNode.attr("mimeType"),
language: setNode.attr("lang"),
roles: setNode.childrenNamed("Role").map((UXmlNode n) => n.attr("value") ?? "").where((String v) => v.isNotEmpty).toList(growable: false),
protections: setNode
.childrenNamed("ContentProtection")
.map(
(UXmlNode n) => UDashContentProtection(
schemeIdUri: n.attr("schemeIdUri") ?? "",
value: n.attr("value"),
defaultKid: n.attr("cenc:default_KID") ?? n.attr("default_KID"),
pssh: n.child("pssh")?.text ?? n.child("cenc:pssh")?.text,
),
)
.toList(growable: false),
template: setTemplate,
baseUrl: setBase,
),
);
}
periods.add(
UDashPeriod(
adaptationSets: sets,
id: periodNode.attr("id"),
start: parseIso8601(periodNode.attr("start")),
duration: periodDuration == Duration.zero ? total : periodDuration,
baseUrl: periodBase,
),
);
}
return UDashManifest(
periods: periods,
isDynamic: root.attr("type") == "dynamic",
duration: total,
minBufferTime: parseIso8601(root.attr("minBufferTime")),
baseUrl: manifestBase,
minimumUpdatePeriod: root.attr("minimumUpdatePeriod") == null ? null : parseIso8601(root.attr("minimumUpdatePeriod")),
);
}