parse static method

UDashManifest? parse(
  1. String content, {
  2. String? baseUrl,
})

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