Skip to content

RSS Atom Extensions

kickscondor edited this page May 12, 2020 · 16 revisions

The XML Namespaces URI [W3C.REC-xml-names-19990114] for the XML elements and attributes described in this specification is: http://fraidyc.at/ext/1.0

In this document, the namespace prefix "fc:" is used for the above Namespace URI. Note that the choice of namespace prefix is arbitrary and not semantically significant.

The 'status' Extension Element

The status element contains an ephemeral notice, indicating the current activity at this resource. The element MAY contain a type attribute identifying the intent of the status. So, in the case of a blog feed, a status can contain a pinned post, an Instagram-style story or a livestream status.

A status contains the same elements normally found in an Atom entry. (Used for normal feed items - blog posts and such.) However, to avoid having existing feed readers treat these items as incoming entries, a separate fc:status element has been created, very similar to the existing atom:entry tag.

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:fc="http://fraidyc.at/ext/1.0">
  <fc:status type="pinned">
    <id>https://twitter.com/alienmelon/status/1126982065725902848</id>
    <link href="https://twitter.com/alienmelon/status/1126982065725902848"/>
    <summary>It's out! The Electric Zine Maker (public beta)</summary>
    <published>2020-03-01T17:28:01+00:00</published>
    <updated>2020-05-10T22:47:17+00:00</updated>
  </fc:status>
</feed>

This is an example of how a pinned tweet (on Twitter) would be encoded as an Atom Status.

A feed MAY contain many statuses, in no particular order.

Valid type attributes are:

  • "info" (default): If no type is supplied, this is the default.
  • "pinned": Indicates a status that is also a normal feed entry. This can help prevent duplicates and also expects the link tag to be present. This is also expected to be a permanent URL - whereas the other types here can be transitory.
  • "live": The author of this content is currently livestreaming at the URL supplied by the link tag. (As opposed to pinned posts, this is likely an external URL. Though there is no restriction on either.) This should only be used when actually streaming - to advertise the upcoming stream, the above 'info' and 'pinned' types work well.
  • "urgent": A sitewide alert. These (like 'info' statuses) often have an expires tag as well. If not, it is expected that the status will notify readers of a important permanent change, such as the site's closing or of migration to a new platform.

Statuses also MAY have an optional label attribute. This can contain a Unicode character which can act as the icon for this status. (Feed readers may choose to limit this label to a single

<fc:status type="live" label="☂️">
  <id>tag:kickscondor.com,2020:live</id>
  <link href="https://twitch.tv/kickscondor"/>
  <title>.: FRAIDYCATS FUNTIMES :.</title>
  <published>2020-03-27T20:28+00:00</published>
  <updated>2020-03-27T20:28+00:00</updated>
</fc:status>

(In Fraidycat, the RED CIRCLE 🔴 acts as the default label for 'live' statuses.)

Expiring Statuses

If you need a status to disappear at an exact time, you should use the age:expires or age:max-age tags.

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:fc="http://fraidyc.at/ext/1.0"
  xmlns:age="http://purl.org/atompub/age/1.0">
  <fc:status type="pinned">
    <id>tag:doingthings.daily,2020:pin</id>
    <title>I'll be at Panera Bread until noon.</title>
    <published>2020-05-01T10:28:01Z</published>
    <age:expires>2020-05-01T12:20:00Z</age:expires>
  </fc:status>
</feed>

Embedding Streams

If you have a direct link to the video stream, you can supply that using a media:content tag.

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:fc="http://fraidyc.at/ext/1.0"
  xmlns:media="http://search.yahoo.com/mrss/">
  <fc:status type="live">
    <id>https://live.drewdevault.com</id>
    <link href="https://live.drewdevault.com"/>
    <title>Drew DeVault codes live</title>
    <published>2020-03-27T20:28+00:00</published>
    <updated>2020-03-27T20:28+00:00</updated>
    <media:content medium="video" type="application/dash+xml"
      url="https://live.drewdevault.com/dash/broadcast.mpd"/>
  </fc:status>
</feed>

This technique can also be used to post a series of Instagram-style 'stories' - by leaving off the live type and embedding the video segments.

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:fc="http://fraidyc.at/ext/1.0"
  xmlns:media="http://search.yahoo.com/mrss/">
  <fc:status>
    <id>https://kickscondor.com/stories/1</id>
    <published>2020-03-27T20:28+00:00</published>
    <updated>2020-03-27T20:28+00:00</updated>
    <media:content medium="video" type="video/mp4"
      url="https://stories.kickscondor.com/1.mp4" duration="12"/>
  </fc:status>
  <fc:status>
    <id>https://kickscondor.com/stories/2</id>
    <published>2020-03-27T20:29+00:00</published>
    <updated>2020-03-27T20:29+00:00</updated>
    <media:content medium="video" type="video/mp4"
      url="https://stories.kickscondor.com/2.mp4" duration="20"/>
  </fc:status>
</feed>

It's useful to include the duration in these cases, to allow a overall timeline to be shown.

RSS and JSON Feed

This same tag can also be used in RSS feeds. However, you will need to use the appropriate elements found in an RSS item. (For example, using pubDate instead of published.)

<fc:status type="live" label="☂️">
  <link>https://twitch.tv/kickscondor</link>
  <title>.: FRAIDYCATS FUNTIMES :.</title>
  <pubDate>2020-03-27T20:28+00:00</pubDate>
</fc:status>

In JSON Feed, the _status extension is used.

"_status": [{
  "id": "live-id",
  "url": "https://twitch.tv/kickscondor",
  "title": ".: FRAIDYCATS FUNTIMES :.",
  "date_published": "2020-03-27T18:21:46.122Z",
  "date_modified": "2020-03-27T18:21:46.122Z"
}]

RELAX NG Compact Schema

This appendix is informative.

status =
   element fc:status {
     atomCommonAttributes,
     type,
     label?,
     (atomAuthor*
     & atomCategory*
     & atomContent?
     & atomContributor*
     & atomId
     & atomLink*
     & atomPublished?
     & atomRights?
     & atomSource?
     & atomSummary?
     & atomTitle
     & atomUpdated
     & extensionElement*)
   }

type = attribute type { "info" | "pinned" | "urgent" | "live" }?