subhra74/xdm · error

Manifest type dynamic is not supported

Error message

Manifest type dynamic is not supported

What it means

The MPD parser only supports static (VOD) DASH manifests. After validating the root tag, Parse reads the MPD element's "type" attribute and throws this error when it equals "dynamic", i.e. a live stream manifest. Dynamic manifests change over time and are not supported by this code path.

Solutions

  1. Use a static (VOD) MPD URL instead of the live one; look for the on-demand rendition of the content.
  2. Wait until the live event finishes and grab the archived/static manifest if one is published.
  3. Remove or adapt this check only if you genuinely need live support (requires SegmentTemplate/availabilityTimeOffset handling) — not a quick fix.
  4. Catch the error upstream and inform the user that live DASH is not supported.
Defensive patterns

Strategy: validation

Validate before calling

var body = await http.GetStringAsync(manifestUrl);
if (body.Contains("type=\"dynamic\"") || body.Contains("type='dynamic'"))
    throw new Exception("Live (dynamic) DASH manifest not supported");

Try / catch

try { return MpdParser.Parse(url, null); }
catch (Exception ex) when (ex.Message == "Manifest type dynamic is not supported")
{ throw new UnsupportedStreamException("Live DASH streams are not supported", ex); }

Prevention

When it happens

Trigger: Parsing an MPD whose root element carries type="dynamic" — typically a live/linear DASH stream URL rather than an on-demand (type="static" or no type) manifest.

Common situations: User pastes a live TV or live-event DASH URL expecting a download; a VOD site accidentally serves the live variant of a manifest; broadcaster periodically switches manifests during events.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of subhra74/xdm@1ca5a25aae (2026-09-13). Data as JSON: /api/errors/629264e738d3cf40. Report an issue: GitHub.

Appendix: source

Thrown at app/XDM/XDM.Core/MediaParser/Dash/MpdParser.cs:35

        private static string trickModeUri = "http://dashif.org/guidelines/trickmode";
        private static readonly Regex TemplatePattern =
            new Regex(@"\$(RepresentationID|Time|Time%0(?<time_digits>[\d]+)(?<time_dx>[dx])?|Number|Number%0(?<num_digits>[\d]+)(?<num_dx>[dx])?|Bandwidth)\$");
        //@"\$(RepresentationID|Time|Time(%0([\d]+)([dx])?)?|Number|Number(%0([\d]+)([dx])?)?|Bandwidth)\$");
        public static IList<IList<KeyValuePair<Representation?, Representation?>>> Parse(
            string[] manifestLines,
            string playlistUrl)
        {
            using var memstream = new MemoryStream(Encoding.UTF8.GetBytes(string.Join("\n", manifestLines)));
            var xmldoc = new XmlDocument();
            xmldoc.Load(new XmlTextReader(memstream)
            {
                Namespaces = false
            });

            if (xmldoc.DocumentElement?.Name != "MPD")
                throw new Exception("Missing MPD start tag: " + xmldoc.DocumentElement.Name);
            if (xmldoc.DocumentElement.Attributes["type"]?.Value == "dynamic")
                throw new Exception("Manifest type dynamic is not supported");
            if (xmldoc.DocumentElement.SelectSingleNode("descendant::ContentProtection") != null)
                throw new Exception("Encrypted manifest");

            var mediaList = new List<IList<KeyValuePair<Representation?, Representation?>>>();

            var mediaPresentationDuration =
                DashUtil.ParseXsDuration(xmldoc.DocumentElement.Attributes["mediaPresentationDuration"]?.Value ?? "0");
            var baseUrl = new Uri(playlistUrl);
            var baseUrlNodeRoot = xmldoc.DocumentElement.SelectSingleNode("child::BaseURL");
            if (baseUrlNodeRoot != null)
            {
                baseUrl = UrlResolver.Resolve(baseUrl, baseUrlNodeRoot.InnerText);
            }

            var periods = xmldoc.DocumentElement.SelectNodes("child::Period");
            if (periods == null || periods.Count < 1) throw new Exception("No period found!");
            if (periods.Count > 1)
            {

View on GitHub (pinned to 1ca5a25aae)