Streaming Manifest QC
Pricing
$100.00 / 1,000 completed reports
Streaming Manifest QC
Check a supplied HLS master, static VOD playlists, and declared resource inventory for metadata inconsistencies. Get one complete JSON report with playlist, reference, segment, map, and finding records.
Pricing
$100.00 / 1,000 completed reports
Rating
0.0
(0)
Developer
Picknotes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Check a supplied HLS master, static VOD playlists, and declared resource inventory for metadata inconsistencies. Get one complete JSON report with playlist, reference, segment, map, and finding records.
Price
USD 0.10 per completed report, with platform usage included. The synthetic demo has the same price. A complete report can contain error findings: completion means the supported input was fully processed, not that a stream will play. Malformed, unsupported, incomplete, or oversized input does not produce a completed report. If delivery becomes uncertain, check the run's dataset before retrying: an item may already have been stored and billed.
Quickstart
Run with:
{"useDemo":true}
For your own data, set useDemo to false, confirm authorizedNonpersonalNonconfidentialData as true, and put the entire bundle JSON in the string field manifestBundleJson. For example, this Python script creates an input file containing a small supported bundle:
import jsonbundle = {"schemaVersion": "n31-input/1","master": {"uri": "https://example.test/master.m3u8","text": '#EXTM3U\n#EXT-X-VERSION:7\n#EXT-X-STREAM-INF:BANDWIDTH=1000,CODECS="avc1.4d401e"\nvideo/main.m3u8\n'},"media": [{"uri": "https://example.test/video/main.m3u8","text": "#EXTM3U\n#EXT-X-VERSION:6\n#EXT-X-TARGETDURATION:6\n#EXT-X-PLAYLIST-TYPE:VOD\n#EXT-X-ENDLIST\n#EXTINF:6.0,\n../s.ts\n"}],"inventory": {"https://example.test/s.ts": {"sizeBytes": 100}}}with open("INPUT.json", "w", encoding="utf-8") as f:json.dump({"useDemo": False,"authorizedNonpersonalNonconfidentialData": True,"manifestBundleJson": json.dumps(bundle, ensure_ascii=False)}, f, ensure_ascii=False)
Only submit data you are authorized to process that is nonpersonal and nonconfidential. Do not include secrets, signed URLs, credentials, private labels, or personal data. The platform may store INPUT before execution. No PII or secret detection is provided. Output hashes are identifiers, not anonymization guarantees.
Supported checks and limits
This is a narrow RFC 8216 version 1–7 VOD metadata profile, not general HLS validation. Each media playlist requires both EXT-X-PLAYLIST-TYPE:VOD and EXT-X-ENDLIST. Supported declarations include variants/renditions, target duration, media/discontinuity sequences, segment durations, byte ranges, and initialization maps. Findings cover missing supplied playlist references, missing or empty inventory resources, out-of-bounds ranges, target durations, minimum versions, and selected rendition declaration consistency.
All playlist text and inventory are supplied by you. Nothing is fetched from their URIs; no media or keys are downloaded or decoded. Inventory existence and sizes are your declarations. The report does not verify actual bandwidth, codecs, resolution, playback, synchronization, DRM, ownership, or rights.
Live/event playlists, unproven VOD, encryption, LL-HLS, unsupported tags/attributes, and query/signed URLs are rejected. URI identities use the restricted unsigned HTTP/HTTPS profile: lowercase ASCII DNS-style hosts, no port, userinfo, query, or fragment. Relative references are resolved against the supplied playlist URI; identity remains exact after literal dot-segment resolution.
Limits include one master plus up to 15 media playlists, 10,000 segment occurrences, 10,000 map declarations, 256 variants, 256 rendition declarations, 10,016 inventory entries, 40,000 physical lines, and 30,000 findings. The native bundle is at most 2,097,152 UTF-8 bytes. The native report is at most 4,194,304 bytes; combined delivery bounds may be smaller: 4 + input bytes + report bytes must not exceed 4,500,000, and the full ASCII-escaped dataset POST must also fit 4,500,000 bytes. Overbound reports are rejected whole, never truncated. Durations have at most six fractional digits and use half-up rounding for target-duration checks.
Missing supplied playlists make the report incomplete and prevent delivery. Missing segment/map inventory entries are findings in an otherwise complete report. Error findings do not by themselves prevent a completed report.
Retrieve and extract the full report
Open the run's output link to its raw dataset items, or export the dataset as JSON with all fields and no projection or flattening. Save the resulting JSON array as items.json. One successful run produces one dataset item. The table preview may visually truncate long text; the full report is the JSON string in reportJson.
Run this self-contained Python extraction recipe. It checks the saved report bytes and hash before writing report.json:
import hashlibimport jsonfrom pathlib import Pathitems = json.loads(Path("items.json").read_text(encoding="utf-8"))if not isinstance(items, list) or len(items) != 1:raise ValueError("Expected exactly one full dataset item")item = items[0]if item.get("schemaVersion") != "bounded-report-delivery/1":raise ValueError("Unexpected dataset envelope")raw = item["reportJson"].encode("utf-8")if len(raw) != item["reportBytes"]:raise ValueError("Report byte count mismatch")if hashlib.sha256(raw).hexdigest() != item["reportSha256"]:raise ValueError("Report SHA-256 mismatch")report = json.loads(raw)if report.get("schemaVersion") != "n31-report/1":raise ValueError("Unexpected report schema")if report.get("status") != "complete" or report.get("eligibleForCompleteReport") is not True:raise ValueError("Report is not complete")Path("report.json").write_bytes(raw)print(json.dumps(report["summary"], indent=2))
These checks detect file damage or inconsistent extraction; they do not authenticate a source or validate actual media. Keep inputManifest, reportSha256, reportBytes, deliveryKey, and receipt alongside the report for traceability. Report sections are summary, playlists, references, segments, maps, findings, and limitations. Raw URIs, playlist text, and labels are omitted; rows use URI SHA-256 identifiers. Findings use a playlist index, physical line, optional segment ordinal, code, and severity.
The report's inherited charged and priceHypothesisUsd fields describe the offline report format, not your account's billing state. Likewise, the dataset receipt records an expected completion event and is not settlement proof. Use the run's platform billing record for actual charges.