IRIS RSS Media Extension · v1.0

IRIS Distributed Media Feed Namespace

Namespace URI: https://rss.iris.a2d.tv/ns/distribution/1.0/

Overview

This namespace defines IRIS-specific elements that extend RSS 2.0 (optionally alongside Media RSS) for publishing distributed media files (subtitles and video) with storage metadata.

Feeds include atom:link pagination links (rel="self", rel="prev", rel="next") at the channel level, and order items by most-recent update. Updated items will bump their pubDate.

The machine-readable schema for this namespace is published alongside this page at schema.xsd.

Feed Endpoints

Two feed shapes serve this namespace. Both return Content-Type: application/rss+xml.

Endpoint Authentication Scope
https://api.iris.a2d.tv/rss/distribution/{operator}/media HTTP Basic (per-operator credentials, issued separately) Per-operator feed. The channel title/description are suffixed with the operator name, e.g. Distributed Media Feed (Tele2).
https://api.iris.a2d.tv/rss/distribution/media Bearer token (Authorization: Bearer <api-key>) General feed. Accepts an optional clientId query parameter to filter by delivery destination; valid client IDs are issued separately.

Query parameters

Pagination & Updates

Pagination model

The feed is paginated at the channel level using atom:link elements:

Pagination parameters are conveyed via query string, using limit and offset:

.../rss/distribution/tele2/media?limit=50&offset=0   
.../rss/distribution/tele2/media?limit=50&offset=50  

Ordering

Items are ordered by most-recent update first. When a file is distributed or re-distributed, it appears (or moves) to the top of page 1.

Updates & deduplication

Incremental reading with iris:seq

?sinceSeq=<n> returns only items whose iris:seq is greater than n, ordered by seq ascending — oldest change first. limit and offset work as usual and the atom:link pagination links preserve the parameter.

Persist two values: the highest seq you have processed (your cursor W), and the iris:feedEpoch you last saw. Compare the epoch on every poll; if it changed, discard W and restart from 0. Then:

  1. Request ?sinceSeq=W&limit=200.
  2. Process the items. A guid you have seen before is an update — replace your prior state for that file.
  3. Set W to the highest seq on the page and persist it.
  4. Repeat until you receive an empty page.

Bootstrap with sinceSeq=0 to stream the whole current state oldest-first, or read page 1 of the default feed once and start from the highest iris:seq you see.

What the cursor does not cover. It is exact for additions and re-distributions, but the feed is add/update-only: there are no tombstones. A file removed from the feed's underlying data simply stops appearing, and a renamed file retires its old guid without minting anything for it — so a cursor-only consumer accumulates stale entries. Do a full default-feed re-read periodically and drop any guid it does not contain.

Do not offset-page through a fixed sinceSeq as a substitute for advancing the cursor. Under seq-ascending ordering a re-mint moves an item to the end of the result set and shifts every later item left by one, so a sweep with a fixed W and increasing offset can skip an item entirely.

Filenames

Distributed files are named after the product external reference: <iris:programExternalReference>.mp4 for video and <iris:programExternalReference>_<LANG>.ttml for subtitles, language upper-cased. The name is the storage object key, so it is also the last path segment of iris:objectKey and of the iris:mediaUrl download URL — nothing needs renaming on your side.

Read the name from iris:objectKey; never recompose it from iris:programExternalReference. The key is fixed when the file is distributed, from the work order as it stood then, while iris:programExternalReference is read live on every request. If a work order gains or changes its reference afterwards, the two will not match.

Both namings coexist

Files whose work order carried no usable reference are named <iris:materialId> instead, and a file is only renamed when its material is next re-distributed. Files that are never re-distributed keep their material-id names indefinitely, and one programme can carry a reference-named video beside a material-id-named subtitle, because subtitles are only re-emitted on a subtitle event. Do not expect the naming to be uniform.

The filename is not unique, and is not an identity

A programme can have more than one media, and they share one filename, so a later distribution supersedes an earlier one at that key. iris:objectKey is a storage location; iris:materialId still identifies the individual material and is the only field that does.

Element Reference

Channel

Element Description Type Card. Example
title Human-readable title for the feed. Operator feeds are suffixed with the operator name. xsd:string 1..1 Distributed Media Feed (Tele2)
description Short description of the feed's content. xsd:string 1..1 Latest distributed media files for Tele2
link Canonical URL of the feed. Operator feeds emit the feed's own URL. xsd:anyURI 1..1 https://api.iris.a2d.tv/rss/distribution/tele2/media
lastBuildDate Most recent item pubDate on this page (RFC-822/RFC-1123). xsd:string (RFC-822 date) 0..1 Wed, 19 Aug 2026 09:09:52 GMT
iris:feedEpoch Token identifying the current sequence generation. Persist it alongside any sinceSeq cursor and compare it on every poll. If it changes, your cursor is invalid: discard it and restart from sinceSeq=0. It carries no ordering and is not a version number. xsd:string 0..1 3f9a1c84-2d1e-4b77-9f0a-6c2b5e8d4471
atom:link [rel="self"] Canonical URL of this page of the feed. xsd:anyURI 1..1 https://api.iris.a2d.tv/rss/distribution/tele2/media?limit=50&offset=0
atom:link [rel="prev"] URL of the previous page (omitted when offset=0). xsd:anyURI 0..1 https://api.iris.a2d.tv/rss/distribution/tele2/media?limit=50&offset=0
atom:link [rel="next"] URL of the next page (omitted on last page). xsd:anyURI 0..1 https://api.iris.a2d.tv/rss/distribution/tele2/media?limit=50&offset=50

Item

Elements are listed in the order they appear in the feed. Treat every optional element and attribute as optional in practice — older items predate later additions and simply omit them.

Element Description Type Card. Example
guid [isPermaLink="false"] Stable identifier for the item, used for deduplication. A UUID derived deterministically from iris:bucketName and iris:objectKey; it is not a resolvable URL, hence isPermaLink="false". See Updates & deduplication above. xsd:string (UUID) 1..1 d7eb4ae1-9a6a-b5a6-d099-faf39b44443b
title Human-readable title for the media item. Falls back to the material ID when no composed title is available. xsd:string 1..1 Other Bennet Sister, The I 7 "Chapter Seven" (S01E07)
link Canonical S3 URI of the distributed object. This URI is not publicly retrievable — use iris:mediaUrl to download the file. xsd:anyURI 0..1 https…/12305144312800.mp4
description Short description of the item. Video for <materialId> for video, or Subtitle <language> for <materialId> for subtitles. xsd:string 0..1 Subtitle sv for M0665262
pubDate Publication/update time for this item (RFC-822/RFC-1123). xsd:string (RFC-822 date) 0..1 Wed, 19 Aug 2026 09:09:52 GMT
media:content Media RSS content element pointing at the S3 URI. Like link, that URI is not publicly retrievable — download via iris:mediaUrl. The optional fileSize attribute (bytes) may be present on any file type. The optional duration attribute (seconds, rounded) is video-only — it comes from the mezzanine result, which only describes the video asset. May contain an optional <media:hash> child element (see next row). Element (attrs: url, type, fileSize, duration) 0..n url="https…/12305144312800.mp4" type="video/mp4" fileSize="1686218954" duration="1771"
media:hash SHA-256 of the distributed object's bytes, lowercase hex (64 chars). Equivalent to running sha256sum on the downloaded file — partners can verify integrity directly without any S3-specific tooling. Element child of media:content (attr: algo="sha256") 0..1 <media:hash algo="sha256">174a932a…5aa296fe</media:hash>
iris:language Language of the file, as a two-letter ISO 639-1 code. Always emitted. Files that carry no language — video in particular — use the literal sentinel n/a, which is not a language tag and must be handled explicitly by consumers. Current possible values: sv, fi, no, da, en, nl, n/a. xsd:string 1..1 sv
iris:video Indicates if the item is a video (vs. subtitle, etc.). xsd:boolean 1..1 false
iris:materialId Unique identifier of the source material or program. xsd:string 1..1 M0665262
iris:bucketName Backing storage bucket name (distribution outbox). xsd:string 1..1 tv4-irisdistribution-general-irisprod1-outbox
iris:objectKey Object key / path within the bucket. xsd:string 1..1 12305034612900_SV.ttml
iris:lastAccessDate Availability timestamp carried on the distributed-file record, in RFC-822/RFC-1123 UTC form (not ISO-8601). In current production data this is dated ahead of the item's pubDate and tracks the expiry of the signed iris:mediaUrl. Parse it as a date string, not as xsd:dateTime. xsd:string (RFC-822 date) 1..1 Fri, 18 Sep 2026 09:00:00 GMT
iris:seq Change sequence number, strictly increasing across the whole feed — each distribution or re-distribution is assigned a value higher than every one before it. Use it with the sinceSeq query parameter to read incrementally. Never assume gapless numbering, and do not compare it to wall-clock time. Absent on the rare item written before sequencing existed, and on files distributed by a task draining during a rolling deploy — such an item is invisible to sinceSeq at every cursor value, so a periodic full re-read remains necessary. xsd:unsignedLong 0..1 21680
iris:mediaUrl The download URL. A signed CloudFront URL for the distributed object, wrapped in CDATA (the query string contains characters that would otherwise need escaping). Signed once when the file is distributed — it is not re-signed per feed request, so the remaining validity shrinks as the item ages. The expiry is carried in the Expires query parameter. Omitted when URL signing is unavailable for the file; consumers must tolerate its absence. xsd:anyURI 0..1 https://media.distribution.iris.a2d.tv/12305034612900_SV.ttml?Expires=1789721961&Key-Pair-Id=…&Signature=…
iris:wonMediaAssetSequenceId WON media asset sequence identifier for the delivered asset. Empty when the source record carries no value. xsd:string 0..1 12305034775927
iris:wonProductCode WON product code for the delivered asset. Always emitted; empty when the source record carries no value. xsd:string 1..1 500835323
iris:programExternalReference The product-level external reference — the key the Mercury Metadata and VOD APIs are queried by (references.external_reference / product_external_reference), so use it to join a distributed file to its editorial and rights metadata. A work order carries three external references (product, media and segmentation); this is the one that resolves against /metadata/programs, and it is strictly 1:1 with iris:wonProductCode. It identifies a programme, not a file: one programme can have several media, so this value is not unique across the feed. Omitted for the rare item whose work order carries no product external reference. xsd:string 0..1 12304453349498
iris:wonMediaId WON media identifier of the delivery request this file belongs to. Frequently equal to iris:materialId, but a distinct field — do not assume they match. xsd:string 0..1 M0665262

Full XML Example

A two-item response from the Tele2 operator feed. The Key-Pair-Id and Signature values in iris:mediaUrl are abbreviated here; live feeds carry them in full.

<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
  xmlns:iris="https://rss.iris.a2d.tv/ns/distribution/1.0/"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Distributed Media Feed (Tele2)</title>
    <description>Latest distributed media files for Tele2</description>
    <link>https://api.iris.a2d.tv/rss/distribution/tele2/media</link>
    <lastBuildDate>Wed, 19 Aug 2026 09:09:52 GMT</lastBuildDate>
    <iris:feedEpoch>3f9a1c84-2d1e-4b77-9f0a-6c2b5e8d4471</iris:feedEpoch>
    <atom:link rel="self" href="https://api.iris.a2d.tv/rss/distribution/tele2/media?limit=50&amp;offset=0"></atom:link>
    <atom:link rel="next" href="https://api.iris.a2d.tv/rss/distribution/tele2/media?limit=50&amp;offset=50"></atom:link>

    <item>
      <guid isPermaLink="false">d7eb4ae1-9a6a-b5a6-d099-faf39b44443b</guid>
      <title>Other Bennet Sister, The I 7 &quot;Chapter Seven&quot; (S01E07)</title>
      <link>https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305144312800.mp4</link>
      <description>Video for M0671323</description>
      <pubDate>Wed, 19 Aug 2026 09:09:52 GMT</pubDate>
      <media:content url="https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305144312800.mp4" type="video/mp4" fileSize="1686218954" duration="1771">
        <media:hash algo="sha256">174a932a150eebd7ff0e8f027fce1032bc7b36d25b7ab13f1ca9e0b65aa296fe</media:hash>
      </media:content>
      <iris:language>n/a</iris:language>
      <iris:video>true</iris:video>
      <iris:materialId>M0671323</iris:materialId>
      <iris:bucketName>tv4-irisdistribution-general-irisprod1-outbox</iris:bucketName>
      <iris:objectKey>12305144312800.mp4</iris:objectKey>
      <iris:lastAccessDate>Fri, 18 Sep 2026 09:00:00 GMT</iris:lastAccessDate>
      <iris:seq>21680</iris:seq>
      <iris:mediaUrl>
        <![CDATA[https://media.distribution.iris.a2d.tv/12305144312800.mp4?Expires=1789722618&Key-Pair-Id=K2PK...PM8V&Signature=ZBzQuocpzT0q...PER8HA__]]>
      </iris:mediaUrl>
      <iris:wonMediaAssetSequenceId>12305144498506</iris:wonMediaAssetSequenceId>
      <iris:wonProductCode>500841194</iris:wonProductCode>
      <iris:programExternalReference>12305144312800</iris:programExternalReference>
      <iris:wonMediaId>M0671323</iris:wonMediaId>
    </item>

    <item>
      <guid isPermaLink="false">4fadf53d-b887-8b21-916a-b5e6fc30cb8a</guid>
      <title>Home and Away XXXV 8 (7893) (S35E08)</title>
      <link>https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305034612900_SV.ttml</link>
      <description>Subtitle sv for M0665262</description>
      <pubDate>Wed, 19 Aug 2026 08:59:05 GMT</pubDate>
      <media:content url="https://tv4-irisdistribution-general-irisprod1-outbox.s3.amazonaws.com/12305034612900_SV.ttml" type="text/ttml">
        <media:hash algo="sha256">9f114583e6ff4382dfb7251d4f89838dc0bef493b2f7e28ead9d23c85d53d174</media:hash>
      </media:content>
      <iris:language>sv</iris:language>
      <iris:video>false</iris:video>
      <iris:materialId>M0665262</iris:materialId>
      <iris:bucketName>tv4-irisdistribution-general-irisprod1-outbox</iris:bucketName>
      <iris:objectKey>12305034612900_SV.ttml</iris:objectKey>
      <iris:lastAccessDate>Fri, 18 Sep 2026 08:00:00 GMT</iris:lastAccessDate>
      <iris:seq>21675</iris:seq>
      <iris:mediaUrl>
        <![CDATA[https://media.distribution.iris.a2d.tv/12305034612900_SV.ttml?Expires=1789721961&Key-Pair-Id=K2PK...PM8V&Signature=pqITYRIaqnPp...uFLg__]]>
      </iris:mediaUrl>
      <iris:wonMediaAssetSequenceId>12305034775927</iris:wonMediaAssetSequenceId>
      <iris:wonProductCode>500835323</iris:wonProductCode>
      <iris:programExternalReference>12305034612900</iris:programExternalReference>
      <iris:wonMediaId>M0665262</iris:wonMediaId>
    </item>
  </channel>
</rss>

Schema

The authoritative schema is published at schema.xsd, alongside this page. It is reproduced below for convenience.

Show schema.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="https://rss.iris.a2d.tv/ns/distribution/1.0/"
            xmlns="https://rss.iris.a2d.tv/ns/distribution/1.0/"
            elementFormDefault="qualified">

  <!-- iris:language -->
  <xsd:element name="language" type="xsd:string"/>

  <!-- iris:video -->
  <xsd:element name="video" type="xsd:boolean"/>

  <!-- iris:materialId -->
  <xsd:element name="materialId" type="xsd:string"/>

  <!-- iris:bucketName -->
  <xsd:element name="bucketName" type="xsd:string"/>

  <!-- iris:objectKey -->
  <xsd:element name="objectKey" type="xsd:string"/>

  <!-- iris:lastAccessDate (RFC-822 / RFC-1123 date string) -->
  <xsd:element name="lastAccessDate" type="xsd:string"/>

  <!-- iris:wonMediaAssetSequenceId -->
  <xsd:element name="wonMediaAssetSequenceId" type="xsd:string"/>

  <!-- iris:wonProductCode -->
  <xsd:element name="wonProductCode" type="xsd:string"/>

  <!-- iris:wonMediaId -->
  <xsd:element name="wonMediaId" type="xsd:string"/>

  <!-- iris:mediaUrl -->
  <xsd:element name="mediaUrl" type="xsd:anyURI"/>

  <!-- iris:programExternalReference (programme-level Mercury reference) -->
  <xsd:element name="programExternalReference" type="xsd:string"/>

  <!-- iris:seq (change sequence number; strictly increasing, may have gaps) -->
  <xsd:element name="seq" type="xsd:unsignedLong"/>

  <!-- iris:feedEpoch (channel-level; invalidates a sinceSeq cursor when it changes) -->
  <xsd:element name="feedEpoch" type="xsd:string"/>

</xsd:schema>