<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"
    xmlns:fh="http://purl.org/syndication/history/1.0"
    xmlns:at="http://purl.org/atompub/tombstones/1.0">

    <title>MecaGorp: Chorus</title>
    <subtitle><![CDATA[An open protocol for independent music streaming.]]></subtitle>
    <link href="https://mecagorp.com/chorus/feed" rel="self" />
    

    <link href="https://busybee.superfeedr.com" rel="hub" />
    
    
    <link href="https://mecagorp.com/chorus/" />
    <id>tag:mecagorp.com,2026-08-18:chorus</id>
    <updated>2026-08-17T14:38:47-07:00</updated>

    

    <entry>
        
        <title>About Chorus</title>
        <link href="https://mecagorp.com/chorus/about" rel="alternate" type="text/html" />
        <published>2026-08-17T14:38:47-07:00</published>
        <updated>2026-08-17T14:38:47-07:00</updated>
        <id>urn:uuid:bbce7acc-9459-492b-80c7-61f22c8794f3</id>
        
        <summary type="html"><![CDATA[<p>Chorus is a lightweight format for publishing music for streaming in a platform- and distribution-agnostic manner.</p>]]></summary>
        <content type="html"><![CDATA[

		

        <p>Chorus is a lightweight format for publishing music for streaming in a platform- and distribution-agnostic manner.</p>
        <h3 id="1_h3_1_Rationale">Rationale<a href="/chorus/about#1_h3_1_Rationale" class="toc-link"></a></h3><p>Music discovery, consumption, and streaming are locked down by large corporations that have made a mess of things. The streaming providers have to cater to the whims of the major record labels, and have created a two-tier system where neither discovery nor payments are even remotely fair. Independent musicians are hit hardest by this, as they have to pay money to play a game that is stacked against them, and what little listenership they get is largely divvied up to the major labels. The specific payment strategy that&rsquo;s used has also led to a glut of minimum-effort content and AI slop and bot-driven streaming that tries to game the system, hurting everyone, big and small alike.</p><p>There are several disparate attempts to build a better world for musicians, but many of them are built on protocols that were not designed for this use case in mind. ActivityPub and RSS were simply not designed with the specific needs of distribution and discovery of musical content, and most of the existing attempts are built on top of those.</p><p>The Chorus format is a lightweight, web-native protocol that enables an ecosystem of independent music streaming, directly connecting musicians with listeners and removing the entrenched music industry from the equation. This allows us to build a better future for independent music on the Internet while reducing the headache for musicians.</p><h3 id="1_h3_2_Major-components">Major components<a href="/chorus/about#1_h3_2_Major-components" class="toc-link"></a></h3><p>The pieces of the puzzle to fit together are:</p>
<ul>
<li><p>Publisher: someone providing music to the network. This can be a band, a record label, a distributor, basically anyone with a web presence. They provide their streamable catalog in <a href="/chorus/latest">Chorus format</a>.</p></li>
<li><p>Receiver: something that receives music from the network and makes it available to listeners; it can be further divided into:</p>
<ul>
<li>Collection: a bunch of music</li>
<li>Player: an application that can play the music in the collection</li>
</ul></li>
</ul>
<h3 id="1_h3_3_Who-s-involved">Who&rsquo;s involved?<a href="/chorus/about#1_h3_3_Who-s-involved" class="toc-link"></a></h3><p>Some of the key players in this effort:</p>
<ul>
<li><a href="https://beesbuzz.biz/">fluffy</a>, who is behind the band <a href="https://sockpuppet.band/">Sockpuppet</a></li>
<li><a href="https://fairplayer.band/">FairPlayer</a></li>
<li><a href="https://funmusic.place/">Fun Music Place</a>, the folks behind <a href="https://mirlo.space/">Mirlo</a></li>
</ul>

        

        

        ]]>



        </content>
        <category term="Chorus" label="Chorus" />
        
        

        

    </entry>
    <entry>
        
        <title>Frequently Asked Questions</title>
        <link href="https://mecagorp.com/chorus/10-Frequently-Asked-Questions" rel="alternate" type="text/html" />
        <published>2026-08-17T14:18:45-07:00</published>
        <updated>2026-08-17T14:18:45-07:00</updated>
        <id>urn:uuid:b49b1622-d11d-4196-9c8a-f763a3dd4ebe</id>
        
        <summary type="html"><![CDATA[<p>Answers to some of the questions people have about this project.</p>]]></summary>
        <content type="html"><![CDATA[

		

        <p>Answers to some of the questions people have about this project.</p>
        <h3 id="10_h3_1_Why-this-format">Why this format?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_1_Why-this-format" class="toc-link"></a></h3><p>While there are existing feed/collection formats out there, finding one that presents a collection of items in a structured manner that properly represents the world of music is difficult. Music can come in many different shapes, and most commonly it is in the form of collections of albums of songs, and the order of the songs within those albums matters.</p><p>Much of the metadata for the items <em>tends</em> to be consistent across an entire collection, but there are always exceptions that need to be captured in some way.</p><p>Most current formats also exist to present new content in a stream of ephemera, without much attention given to older items.</p><p>The Chorus format encapsulates a collection of music, which can be browsed, revisited, and categorized, while also taking advantage of the overall structure of an album as a sequential series of related songs, without necessarily being limited to that structure.</p><p>This format is intended to be easy to publish and to parse, without any guesswork about what anything actually means. Musicians shouldn&rsquo;t have to sign up for every new distributed platform that springs up, when those platforms could subscribe to a common format as one potential source for music. They should be able to just add it as a format to publish their music to the web in a way that is, hopefully, easy to adapt into other ecosystems.</p><h3 id="10_h3_2_Why-not-use-RSS-Atom">Why not use RSS/Atom?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_2_Why-not-use-RSS-Atom" class="toc-link"></a></h3><p>There are several reasons that RSS/Atom are not suitable protocols for this purpose. (Going forward I will refer to both protocols as simply &ldquo;RSS.&rdquo;)</p><p>Currently, RSS does support <a href="https://www.rssboard.org/rss-specification#ltenclosuregtSubelementOfLtitemgt">audio attachments</a>, but its usage is geared entirely towards podcasts. Every article represents a separate episode, and the metadata that applies to each one does a poor job of providing concepts like albums, multiple artists, and so forth.</p><p>Additionally, RSS feeds are generally paginated, meaning that they only provide the most recent content, rather than a full archive of all data. An RSS feed <em>can</em> provide full content, and there are <a href="https://datatracker.ietf.org/doc/html/rfc5005">extensions</a> to add pagination as well, but client support is pretty weak and so rare as to be practically nonexistent.</p><p>Finally, since RSS is also used for many other things, such as blogs and announcements and so on, there needs to be an additional set of information to distinguish feeds and/or feed entries as being music as opposed to serialized content, and this also requires added client/consumer support.</p><p>None of these issues are insurmountable, and if consensus can be built on an extension to RSS that addresses these issues, there is no reason not to support that instead. But RSS in its present form does not provide a standard mechanism for representing a collection of music, and clients need to be built on whatever emerges. Having an RSS enclosure does not magically make everything agree on how things should work, and the RSS specification is vague enough that there are <em>massive</em> compatibility problems between implementations even for basic things like blogs and podcasts.</p><h3 id="10_h3_3_Why-not-ActivityPub">Why not ActivityPub?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_3_Why-not-ActivityPub" class="toc-link"></a></h3><p>There are several ActivityPub-based music federation projects underway as well. ActivityPub is a great format for pushing out notifications of new content to be sure, and Chorus could indeed be implemented as a layer on top of ActivityPub. However, the promise of ActivityPub is having a universal client/server for realtime updates, and similarly to RSS, is not suitable for providing a browseable collection of specifically-structured data. Most ActivityPub implementations are also oriented towards the idea of two-way communication between client and server, and this is anathema to the notion of a collection being published to a static hosting provider or similar, and also requires a lot of active (and fragile) state to be maintained between the two.</p><p>Any implementation of a music collection on top of ActivityPub would still have to implement the collection itself, and maintain standards for how backfilling works and how the collection is shaped, so why not start with a clean implementation that only provides the parts that are important to a music collection to begin with?</p><p>ActivityPub itself also doesn&rsquo;t solve the issues of interoperability between different implementations; notably, existing ActivityPub implementations such as Bandwagon, Funkwhale, and PeerTube which all live in the same general problem domain still cannot meaningfully share data with one another, as they speak different vocabularies. Even different versions of the same ActivityPub implementation are not guaranteed to interoperate with one another.</p><h3 id="10_h3_4_What-about-OpenSubsonic">What about <a href="https://opensubsonic.netlify.app/">OpenSubsonic</a>?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_4_What-about-OpenSubsonic" class="toc-link"></a></h3><p>OpenSubsonic is a pretty good protocol for connecting players to collections! However, it is really built around there being a single collection that&rsquo;s being provided to a user&rsquo;s player, and most players do not support aggregating across multiple OpenSubsonic collections.</p><p>What makes a lot of sense is having a single OpenSubsonic collection server that aggregates other sources, including Chorus (acting as a receiver) and other OpenSubsonic implementations, providing a unified library to the user&rsquo;s endpoint.</p><p>In this world, Chorus connects collections to sources, and OpenSubsonic connects players to collections.</p><p>Basically, OpenSubsonic is solving a different part of the stack, and it absolutely complements Chorus. The two protocols can work together to form a greater whole.</p><h3 id="10_h3_5_Why-not-microformats">Why not microformats?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_5_Why-not-microformats" class="toc-link"></a></h3><p>While microformats are a very nice means of embedding metadata into HTML documents without requiring so-called &ldquo;sidecar&rdquo; formats, the unfortunate reality is that many content platforms these days are not serving up static HTML; instead they are built as app-style frontends which require Javascript to fetch the actual page content using frameworks like ReactJS and Vue, and while it would be really nice if we were still in a server-side-rendering-first web, that is no longer the case.</p><p>Additionally, parsing and presenting microformats can be a lot more complicated even in a pure-static HTML-based ecosystem, and it doesn&rsquo;t provide any greater efficiency than linking to a sidecar file or endpoint.</p><p>As such, while microformats are a very nice approach in theory, the practical concerns make it not very compelling for this use case.</p><p>Additionally, it presents multiple performance issues; since all of the data is embedded into the page which the data is about, you have to either embed a complte catalog into the root page of a website (which vastly increases the page retrieval overhead for everyone, including mobile web users), or clients need to do a full tree walk in order to find updates to items, and there is no clear mechanism for signifying whether a dependency has to be retrieved. This could be worked around by adding an optional content hash to every linked item, but that increases the complexity for both publishers and consumers.</p><p>Microformats also tend to make use of the page URL as the identifier, which adds difficulty to the process of reconciling URL changes. Microformats do support a <code>p-uid</code> property which can be used to reconcile this, but it isn&rsquo;t widely supported.</p><p>Also, since every entity is mapped to a URL, there is no standard way to present content that does not map to a specific webpage.</p><h3 id="10_h3_6_Why-not-JSON-LD">Why not JSON-LD?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_6_Why-not-JSON-LD" class="toc-link"></a></h3><p>JSON-LD is meant to work similarly to microformats, with a large JSON blob embedded into a webpage. While this works well for discovery, it has major performance issues for actual data ingestion, and implications for the performance of the website as a whole. The choices are either to embed a complete catalog into the webpage for the root entity (which slows down every single webpage retrieval unnecessarily), or requires linking the data across webpages per entity and having consumers do a full tree walk, which in turn requires retrieving basically every webpage on a site in order to get the latest information, as there is no standard mechanism for indicating whether a dependency has changed.</p><p>JSON-LD is also far less efficient than microformats, as the embedding structure is parallel to the webpage itself, and in many cases has significantly more overhead than the microformats markup.</p><p>Additionally, JSON-LD uses the entity&rsquo;s URL as its identifier, which vastly complicates things when it comes to changing the URL of an item, which can happen when a webpage gets reorganized or if an item changes its name.</p><h3 id="10_h3_7_What-about-missing-feature">What about [missing feature]?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_7_What-about-missing-feature" class="toc-link"></a></h3><p>The specification in its current form is certainly not the final word, and can and should be extended as use cases are uncovered. Every attempt has been made to keep it extensible and flexible, but of course there will be things that are missing as well.</p><h3 id="10_h3_8_Why-should-something-use-Chorus">Why should something use Chorus instead of anything else?<a href="/chorus/10-Frequently-Asked-Questions#10_h3_8_Why-should-something-use-Chorus" class="toc-link"></a></h3><p>It shouldn&rsquo;t! Different formats are good at different things. Chorus is meant to live alongside other protocols, and it purposefully excludes functionality other than publishing music. There is no intention to add any functionality like real-time status posts, blog entries, or podcasts, all of which are served better by social feed formats such as RSS and Atom.</p><p>It is also not meant to be an encyclopedic compendium of all music; this is not a replacement to MusicBrainz, for example, although the end-user&rsquo;s software interoperating with MusicBrainz as a source of ground truth for metadata is certainly desirable.</p><p>From a publisher&rsquo;s standpoint, Chorus is just another template to add to a website, to make it easier for music to be discovered and listened to.</p><p>From a receiver&rsquo;s standpoint, Chorus is just a means of obtaining a collection of music, which can work alongside other mechanisms.</p><p>Nothing about this is exclusive; it&rsquo;s just meant to be simpler to support on both sides, and flexible enough to provide real choices to both producers and consumers of music.</p><p>Don&rsquo;t think &ldquo;instead of,&rdquo; but &ldquo;in addition to.&rdquo;</p><h3 id="10_h3_9_What-about-access-control-paid-a">What about access control? (paid access, subscriptions, etc.)<a href="/chorus/10-Frequently-Asked-Questions#10_h3_9_What-about-access-control-paid-a" class="toc-link"></a></h3><p>Access control is generally better-served at a different level on a content delivery stack than the end format.</p><p>The intention is that a Chorus collection, by default, provides that which the musician wants to be listened to, at whatever quality level makes the most sense for what is essentially a free preview.</p><p>The hope is that there will eventually be a standard mechanism for allowing receivers to manage access tokens in order to fetch full-quality versions or bonus content and the like (with the same mechanism preventing someone from simply republishing the underlying media URLs unprotected). This can take many forms, such as <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Authentication">standard HTTP authentication</a> (particularly bearer tokens) or something OAuth-based, but the ideal long-term goal is that people would use this as a mechanism to find music to purchase and download into their own local collections.</p><p>That local collection could then be served up in turn as a private Chorus collection; there is some discussion about how that might work in the <a href="receiver.md#private">receiver document</a>.</p><p>The overall goal of this project is to turn listeners into collectors. The existence of music should not be contingent on the long-term durability of its hosting provider.</p>
        

        

        ]]>



        </content>
        <category term="Chorus" label="Chorus" />
        
        

        

    </entry>
    <entry>
        
        <title>Chorus v0.3.2</title>
        <link href="https://mecagorp.com/chorus/0.3.2" rel="alternate" type="text/html" />
        <published>2026-08-15T12:02:04-07:00</published>
        <updated>2026-08-15T12:02:04-07:00</updated>
        <id>urn:uuid:329a1faf-59fe-456d-a632-83e922656fca</id>
        
        <summary type="html"><![CDATA[<p>A Chorus collection is formatted as structured data, provided in a commonly-parseable format that provides nested key-value pairs and arrays of data. Every hierarchical layer represents a single entity, which may contain other entities.</p>]]></summary>
        <content type="html"><![CDATA[

		

        <p>A Chorus collection is formatted as structured data, provided in a commonly-parseable format that provides nested key-value pairs and arrays of data. Every hierarchical layer represents a single entity, which may contain other entities.</p>
        <p>JSON is likely the simplest to implement and to build validation tools for, as most current web frameworks and languages already have direct first-class support for JSON. However, other formats such as XML are also plausible and should be considered. The document <strong>MUST</strong> be encoded as UTF-8, unless the serialization format has a means of specifying an alternate encoding.</p><p>For the sake of this specification, the assumption will be that the data is serialized in JSON format.</p>
<blockquote>
<p>The key words &ldquo;<strong>MUST</strong>&rdquo;, &ldquo;<strong>MUST NOT</strong>&rdquo;, &ldquo;<strong>REQUIRED</strong>&rdquo;, &ldquo;<strong>SHALL</strong>&rdquo;, &ldquo;<strong>SHALL NOT</strong>&rdquo;, &ldquo;<strong>SHOULD</strong>&rdquo;, &ldquo;<strong>SHOULD NOT</strong>&rdquo;, &ldquo;<strong>RECOMMENDED</strong>&rdquo;,  &ldquo;<strong>MAY</strong>&rdquo;, and &ldquo;<strong>OPTIONAL</strong>&rdquo; in this document are to be interpreted as described in <a href="https://www.rfc-editor.org/info/rfc2119/">RFC 2119</a>.</p></blockquote>
<h2 id="5_h2_1_Version"><span id="version">Version</span><a href="/chorus/0.3.2#5_h2_1_Version" class="toc-link"></a></h2><p>The current version of the Chorus specification is <a href="https://github.com/PlaidWeb/Chorus/releases/tag/v0.3.2"><code>0.3.2</code></a>.</p><p>The version number follows the principles of <a href="https://semver.org/">semantic versioning</a>, namely, given a version number of <code>MAJOR.MINOR.PATCH</code>,</p>
<ul>
<li><code>MAJOR</code> increments when a change happens that is not backwards-compatible</li>
<li><code>MINOR</code> increments when new functionality is introduced in a backwards-compatible manner</li>
<li><code>PATCH</code> increments when existing functionality is fixed, refined, or clarified</li>
</ul>
<h2 id="5_h2_2_Discovery">Discovery<a href="/chorus/0.3.2#5_h2_2_Discovery" class="toc-link"></a></h2><p>In order for a Chorus document to be discoverable from a web resource, it <strong>SHOULD</strong> be advertised in the form of a relevant HTTP link.</p><p>From an HTML or XML document this will most likely be a <code>&lt;link&gt;</code> tag, for example:</p><figure class="blockcode"><pre class="highlight" data-language="html" data-line-numbers><span class="line" id="e5cb1L1"><a class="line-number" href="/chorus/0.3.2#e5cb1L1"></a><span class="line-content"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">"alternate"</span> <span class="na">type</span><span class="o">=</span><span class="s">"application/Chorus+json"</span> <span class="na">href</span><span class="o">=</span><span class="s">"/path/to/Chorus.json"</span><span class="p">&gt;</span></span></span>
</pre></figure><p>in the referring document&rsquo;s <code>&lt;head&gt;</code>.</p><p>It is also recommended to provide a <a href="https://www.w3.org/wiki/LinkHeader"><code>Link:</code> HTTP response header</a>, and for receivers to honor that response header in the event that <code>&lt;link&gt;</code> is not available or relevant.</p><h2 id="5_h2_3_Style-guide">Style guide<a href="/chorus/0.3.2#5_h2_3_Style-guide" class="toc-link"></a></h2><h3 id="5_h3_4_Attribute-names">Attribute names<a href="/chorus/0.3.2#5_h3_4_Attribute-names" class="toc-link"></a></h3><p>All attributes are <strong>OPTIONAL</strong> unless otherwise specified. Standard attribute names <strong>MUST</strong> be defined as appearing in <code>camelCase</code>.</p><p>Attributes starting with a <code>$</code> refer to things that are structural to the document, while attributes without this prefix are descriptive of the item itself.</p><p>Structural attribute names <strong>MUST NOT</strong> be reused by item attribute names; for example, an item <strong>MUST NOT</strong> define an attribute named <code>type</code>.</p><p>Attribute names are to be given in English and written in <code>camelCase</code> (first letter of the first word lowercase, no separator between words, additional words capitalized). Embedded acronyms are treated as single words; so for example a theoretical attribute of &ldquo;HTML AJAX Endpoint&rdquo; would appear as <code>htmlAjaxEndpoint</code>.</p><p>Attributes with a name of <code>$comment</code> are allowed anywhere for documentation purposes; attributes with this name <strong>MUST</strong> be ignored by receivers and <strong>MUST NOT</strong> be used in any future revisions to the specification.</p><h3 id="5_h3_5_Forward-compatibility">Forward compatibility<a href="/chorus/0.3.2#5_h3_5_Forward-compatibility" class="toc-link"></a></h3><p>As attributes may be added to the specification in the future, any unknown attribute <strong>MUST</strong> be discarded/ignored by any receivers, and validators <strong>MUST NOT</strong> fail validation based on unknown attributes for a document that are written to a newer version of the specification than the validator. However, validators <strong>MAY</strong> issue a compatibility warning for unknown attributes.</p><p>This concern also applies to semantic relationships, such as the <code>rel</code> of a link or a marker.</p><h2 id="5_h2_6_Data-type-definitions">Data type definitions<a href="/chorus/0.3.2#5_h2_6_Data-type-definitions" class="toc-link"></a></h2><h3 id="5_h3_7_Document"><span id="document">Document</span><a href="/chorus/0.3.2#5_h3_7_Document" class="toc-link"></a></h3><p>A document is represented by a serialized <a href="#entity">entity</a>, typically in JSON format.</p><p>The root entity will typically be of type <a href="#collection"><code>collection</code></a>.</p><h3 id="5_h3_8_Item"><span id="item">Item</span><a href="/chorus/0.3.2#5_h3_8_Item" class="toc-link"></a></h3><p>An &ldquo;item&rdquo; is a collection of key-value pairs (&ldquo;attributes&rdquo;). It corresponds to the following data types in various languages:</p>
<ul>
<li>JavaScript/JSON: <code>Object</code></li>
<li>Python: <code>dict</code></li>
<li>PHP: <code>array</code> (with named keys)</li>
<li>Perl: <code>hash</code></li>
</ul>
<h4 id="5_h4_9_Localization"><span id="localization">Localization</span><a href="/chorus/0.3.2#5_h4_9_Localization" class="toc-link"></a></h4><p>Localization follows the <a href="https://www.rfc-editor.org/info/bcp47">IETF BCP 47</a> standard.</p><p>Locale codes are defined by <a href="https://datatracker.ietf.org/doc/rfc5646/">RFC 5646</a> (e.g. <code>en</code> for English, <code>en-US</code> for specifically US English). The lists of language and region codes are given by <a href="https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes">ISO-639-1</a> and <a href="https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes">ISO-3166-1 alpha-2</a>, respectively.</p><p>Alternate localizations are given by appending <code>$code</code> to the attribute name; for example:</p><figure class="blockcode"><pre class="highlight" data-language="json" data-line-numbers><span class="line" id="e5cb2L1"><a class="line-number" href="/chorus/0.3.2#e5cb2L1"></a><span class="line-content"><span class="p">{</span></span></span>
<span class="line" id="e5cb2L2"><a class="line-number" href="/chorus/0.3.2#e5cb2L2"></a><span class="line-content"><span class="w">    </span><span class="nt">"$lang"</span><span class="p">:</span><span class="w"> </span><span class="s2">"en-US"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb2L3"><a class="line-number" href="/chorus/0.3.2#e5cb2L3"></a><span class="line-content"><span class="w">    </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"This is my name"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb2L4"><a class="line-number" href="/chorus/0.3.2#e5cb2L4"></a><span class="line-content"><span class="w">    </span><span class="nt">"name$es"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Este es mi nombre"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb2L5"><a class="line-number" href="/chorus/0.3.2#e5cb2L5"></a><span class="line-content"><span class="w">    </span><span class="nt">"name$jp"</span><span class="p">:</span><span class="w"> </span><span class="s2">"これが私の名前です"</span></span></span>
<span class="line" id="e5cb2L6"><a class="line-number" href="/chorus/0.3.2#e5cb2L6"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><p>Even if an attribute is fully localized, it <strong>MUST</strong> still provide a version without a locale suffix, as localization is considered optional.</p><p>Note that any descriptive (i.e. non-structrual) attribute may be localized, which also allows for multiple language and region support for images, media renditions, and so on. Structural attributes (ones that start with a <code>$</code>) <strong>MUST NOT</strong> be localized.</p><p>The lookup algorithm is defined by <a href="https://datatracker.ietf.org/doc/rfc4647/">RFC 4647</a>. Namely, localized strings must be looked up based on exact matches, from most specific to least; for example, if the attribute <code>name</code> is requested in locale <code>en-US</code>, then the attribute should be looked up as <code>name$en-US</code>, <code>name$en</code>, and then finally <code>name</code>. A locale of <code>en-US</code> shall never receive a string for <code>en-UK</code>.</p><p>For example, with the following strings:</p><figure class="blockcode"><pre class="highlight" data-language="json" data-line-numbers><span class="line" id="e5cb3L1"><a class="line-number" href="/chorus/0.3.2#e5cb3L1"></a><span class="line-content"><span class="p">{</span></span></span>
<span class="line" id="e5cb3L2"><a class="line-number" href="/chorus/0.3.2#e5cb3L2"></a><span class="line-content"><span class="w">    </span><span class="nt">"summary"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Default"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb3L3"><a class="line-number" href="/chorus/0.3.2#e5cb3L3"></a><span class="line-content"><span class="w">    </span><span class="nt">"summary$en-UK"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Colour"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb3L4"><a class="line-number" href="/chorus/0.3.2#e5cb3L4"></a><span class="line-content"><span class="w">    </span><span class="nt">"summary$en-US"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Color"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb3L5"><a class="line-number" href="/chorus/0.3.2#e5cb3L5"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><p>a lookup of the attribute <code>summary</code> in locale <code>en</code> or <code>en-AU</code> will return <code>&quot;Default&quot;</code>.</p><p>Sample implementations for attribute lookup are as below.</p><figure class="blockcode"><pre class="highlight" data-language="python" data-line-numbers><span class="line" id="e5cb4L1"><a class="line-number" href="/chorus/0.3.2#e5cb4L1"></a><span class="line-content"><span class="c1"># Python implementation</span></span></span>
<span class="line" id="e5cb4L2"><a class="line-number" href="/chorus/0.3.2#e5cb4L2"></a><span class="line-content"><span class="k">def</span><span class="w"> </span><span class="nf">get_attribute_localized</span><span class="p">(</span><span class="n">item</span><span class="p">:</span><span class="nb">dict</span><span class="p">,</span> <span class="n">attribute</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">locale</span><span class="p">:</span><span class="nb">str</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span></span></span>
<span class="line" id="e5cb4L3"><a class="line-number" href="/chorus/0.3.2#e5cb4L3"></a><span class="line-content">    <span class="k">if</span> <span class="n">locale</span><span class="p">:</span></span></span>
<span class="line" id="e5cb4L4"><a class="line-number" href="/chorus/0.3.2#e5cb4L4"></a><span class="line-content">        <span class="n">tags</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'-'</span><span class="p">)</span></span></span>
<span class="line" id="e5cb4L5"><a class="line-number" href="/chorus/0.3.2#e5cb4L5"></a><span class="line-content">        <span class="k">while</span> <span class="n">tags</span><span class="p">:</span></span></span>
<span class="line" id="e5cb4L6"><a class="line-number" href="/chorus/0.3.2#e5cb4L6"></a><span class="line-content">            <span class="n">key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">attribute</span><span class="si">}</span><span class="s2">$</span><span class="si">{</span><span class="s1">'-'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">tags</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span></span></span>
<span class="line" id="e5cb4L7"><a class="line-number" href="/chorus/0.3.2#e5cb4L7"></a><span class="line-content">            <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">item</span><span class="p">:</span></span></span>
<span class="line" id="e5cb4L8"><a class="line-number" href="/chorus/0.3.2#e5cb4L8"></a><span class="line-content">                <span class="k">return</span> <span class="n">item</span><span class="p">[</span><span class="n">key</span><span class="p">]</span></span></span>
<span class="line" id="e5cb4L9"><a class="line-number" href="/chorus/0.3.2#e5cb4L9"></a><span class="line-content">            <span class="n">tags</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span></span></span>
<span class="line" id="e5cb4L10"><a class="line-number" href="/chorus/0.3.2#e5cb4L10"></a><span class="line-content">    <span class="k">return</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">attribute</span><span class="p">)</span></span></span>
</pre></figure><figure class="blockcode"><pre class="highlight" data-language="js" data-line-numbers><span class="line" id="e5cb5L1"><a class="line-number" href="/chorus/0.3.2#e5cb5L1"></a><span class="line-content"><span class="c1">// JavaScript implementation</span></span></span>
<span class="line" id="e5cb5L2"><a class="line-number" href="/chorus/0.3.2#e5cb5L2"></a><span class="line-content"><span class="kd">function</span><span class="w"> </span><span class="nx">getAttributeLocalized</span><span class="p">(</span><span class="nx">item</span><span class="p">,</span><span class="w"> </span><span class="nx">attribute</span><span class="p">,</span><span class="w"> </span><span class="nx">locale</span><span class="p">)</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb5L3"><a class="line-number" href="/chorus/0.3.2#e5cb5L3"></a><span class="line-content"><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">locale</span><span class="p">)</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb5L4"><a class="line-number" href="/chorus/0.3.2#e5cb5L4"></a><span class="line-content"><span class="w">        </span><span class="kd">var</span><span class="w"> </span><span class="nx">tags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">locale</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">'-'</span><span class="p">)</span></span></span>
<span class="line" id="e5cb5L5"><a class="line-number" href="/chorus/0.3.2#e5cb5L5"></a><span class="line-content"><span class="w">        </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="nx">tags</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb5L6"><a class="line-number" href="/chorus/0.3.2#e5cb5L6"></a><span class="line-content"><span class="w">            </span><span class="kd">const</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sb">`</span><span class="si">${</span><span class="nx">attribute</span><span class="si">}</span><span class="sb">\$</span><span class="si">${</span><span class="nx">tags</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">'-'</span><span class="p">)</span><span class="si">}</span><span class="sb">`</span></span></span>
<span class="line" id="e5cb5L7"><a class="line-number" href="/chorus/0.3.2#e5cb5L7"></a><span class="line-content"><span class="w">            </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">item</span><span class="p">[</span><span class="nx">key</span><span class="p">])</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb5L8"><a class="line-number" href="/chorus/0.3.2#e5cb5L8"></a><span class="line-content"><span class="w">                </span><span class="k">return</span><span class="w"> </span><span class="nx">item</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span></span></span>
<span class="line" id="e5cb5L9"><a class="line-number" href="/chorus/0.3.2#e5cb5L9"></a><span class="line-content"><span class="w">            </span><span class="p">}</span></span></span>
<span class="line" id="e5cb5L10"><a class="line-number" href="/chorus/0.3.2#e5cb5L10"></a><span class="line-content"><span class="w">            </span><span class="nx">tags</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span></span></span>
<span class="line" id="e5cb5L11"><a class="line-number" href="/chorus/0.3.2#e5cb5L11"></a><span class="line-content"><span class="w">        </span><span class="p">}</span></span></span>
<span class="line" id="e5cb5L12"><a class="line-number" href="/chorus/0.3.2#e5cb5L12"></a><span class="line-content"><span class="w">    </span><span class="p">}</span></span></span>
<span class="line" id="e5cb5L13"><a class="line-number" href="/chorus/0.3.2#e5cb5L13"></a><span class="line-content"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="nx">item</span><span class="p">[</span><span class="nx">attribute</span><span class="p">]</span></span></span>
<span class="line" id="e5cb5L14"><a class="line-number" href="/chorus/0.3.2#e5cb5L14"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><h3 id="5_h3_10_Identifier"><span id="uid">Identifier</span><a href="/chorus/0.3.2#5_h3_10_Identifier" class="toc-link"></a></h3><p>An identifier uniquely and permanently refers to an entity within a collection. It is a textual string, and may include any printable character. It may or may not be human-readable, but the comparison between identifiers <strong>MUST</strong> be based on an exact match.</p><p>Identifier names <strong>MUST</strong> be limited to URI-safe characters: <code>[A-Za-z0-9:/?#\[\]@!$&#39;()*+,;=._~%-]</code></p><p>Identifiers <strong>MUST NOT</strong> change due to changes in the underlying entity&rsquo;s attributes. For that reason it is <strong>RECOMMENDED</strong> that an identifier be generated and permanently associated with an entity at the time of its creation. <a href="https://en.wikipedia.org/wiki/Universally_unique_identifier">UUID</a>s are a good choice in general, UUID-4 in particular.</p><h3 id="5_h3_11_Entity"><span id="entity">Entity</span><a href="/chorus/0.3.2#5_h3_11_Entity" class="toc-link"></a></h3><p>An &ldquo;entity&rdquo; is an <a href="#item">item</a> that represents a concrete object in the collection.</p><p>All entities support the following attributes:</p>
<ul>
<li><code>$type</code>: The type of entity being defined; <strong>REQUIRED</strong></li>
<li><code>$id</code>: An opaque, permanent string <a href="#uid">identifier</a> to uniquely identify this entity relative to this collection; <strong>REQUIRED</strong> (<em>except</em> on <code>collection</code> itself)</li>
<li><code>$items</code>: A list of items that are referenced by this entity; an item may be another entity, or an <a href="#entity-reference">entity reference</a></li>
<li><p><code>$lang</code>: The default <a href="#localization">localization</a> for display strings; defaults to the <code>$lang</code> of the containing entity</p><p>It is <strong>STRONGLY RECOMMENDED</strong> that entities provide a <code>$lang</code>, so that localization-aware clients will know what the default localization refers to. This is useful for things such as automatic translation or displaying metadata about the item&rsquo;s language of origin.</p><p>Because <code>$lang</code> is inherited from the containing entity, it is appropriate to set a collection-wide default by applying it only to the top-level entity.</p></li>
<li><p><code>url</code>: The canonical <a href="#url">URL</a> for an HTML representation of the current entity, e.g. the webpage for the label/artist/release/track</p></li>
<li><p><code>name</code>: The common name of the entity</p></li>
<li><p><code>lastModified</code>: The last-modified time of this entity, as a <a href="#datetime">datetime</a></p></li>
<li><p><code>images</code>: A collection of images that are relevant to the display of this entity. This is to be stored as a key-value dictionary, where the key is the type of image, and the value is an array of image descriptors.</p><p>Possible keys include (but are not limited to):</p>
<ul>
<li><code>thumb</code>: A representative icon for the item (such as a logo)</li>
<li><code>main</code>: Primary artwork to be displayed in a player (primarily relevant to a release or track, but can also be used as a band fallback for things without artwork, for example)</li>
<li><code>poster</code>: A larger photographic image representing the item (headshots, profile images, etc.)</li>
</ul>
<p>Each of the image descriptors is an <a href="#item">item</a> with the following attributes:</p>
<ul>
<li><code>src</code>: The <a href="#url">URL</a> to retrieve the image from; <strong>REQUIRED</strong></li>
<li><code>alt</code>: The accessibility alt-text of the image; <strong>STRONGLY RECOMMENDED</strong></li>
<li><code>width</code> and <code>height</code>: The nominal display sizes of the image; <strong>STRONGLY RECOMMENDED</strong></li>
<li><code>contentType</code>: The MIME content type of the image (e.g. <code>image/png</code>, <code>image/jpeg</code>, <code>image/webp</code>); <strong>STRONGLY RECOMMENDED</strong></li>
</ul>
<p>If there are multiple descriptors available, the client is free to select the one that is the closest fit for its own display purposes (for example, selecting the most appropriate resolution or aspect ratio).</p></li>
<li><p><code>summary</code>: A short description of the entity, a single line of plain text</p></li>
<li><p><code>description</code>: A detailed description of the entity, as <a href="#description-text">description text</a></p></li>
<li><p><code>related</code>: A list of entities which should be seen as related to this entity (for example, associated artists). These <strong>SHOULD</strong> include a <code>relationship</code> label.</p></li>
<li><p><code>relationship</code>: A brief explanation of how this entity is related to its containing entity</p><p>For example:</p><figure class="blockcode"><pre class="highlight" data-language="json" data-line-numbers><span class="line" id="e5cb6L1"><a class="line-number" href="/chorus/0.3.2#e5cb6L1"></a><span class="line-content"><span class="p">{</span></span></span>
<span class="line" id="e5cb6L2"><a class="line-number" href="/chorus/0.3.2#e5cb6L2"></a><span class="line-content"><span class="w">    </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist-fwiffo"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb6L3"><a class="line-number" href="/chorus/0.3.2#e5cb6L3"></a><span class="line-content"><span class="w">    </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb6L4"><a class="line-number" href="/chorus/0.3.2#e5cb6L4"></a><span class="line-content"><span class="w">    </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Fwiffo the Great"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb6L5"><a class="line-number" href="/chorus/0.3.2#e5cb6L5"></a><span class="line-content"><span class="w">    </span><span class="nt">"related"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span></span></span>
<span class="line" id="e5cb6L6"><a class="line-number" href="/chorus/0.3.2#e5cb6L6"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb6L7"><a class="line-number" href="/chorus/0.3.2#e5cb6L7"></a><span class="line-content"><span class="w">            </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist-zorniwoop"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb6L8"><a class="line-number" href="/chorus/0.3.2#e5cb6L8"></a><span class="line-content"><span class="w">            </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Zorniwoop the Lesser"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb6L9"><a class="line-number" href="/chorus/0.3.2#e5cb6L9"></a><span class="line-content"><span class="w">            </span><span class="nt">"relationship"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Former name"</span></span></span>
<span class="line" id="e5cb6L10"><a class="line-number" href="/chorus/0.3.2#e5cb6L10"></a><span class="line-content"><span class="w">        </span><span class="p">},</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb6L11"><a class="line-number" href="/chorus/0.3.2#e5cb6L11"></a><span class="line-content"><span class="w">            </span><span class="nt">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist-orangetheory"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb6L12"><a class="line-number" href="/chorus/0.3.2#e5cb6L12"></a><span class="line-content"><span class="w">            </span><span class="nt">"relationship"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Our old lead singer's new band"</span></span></span>
<span class="line" id="e5cb6L13"><a class="line-number" href="/chorus/0.3.2#e5cb6L13"></a><span class="line-content"><span class="w">        </span><span class="p">}</span></span></span>
<span class="line" id="e5cb6L14"><a class="line-number" href="/chorus/0.3.2#e5cb6L14"></a><span class="line-content"><span class="w">    </span><span class="p">]</span></span></span>
<span class="line" id="e5cb6L15"><a class="line-number" href="/chorus/0.3.2#e5cb6L15"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure></li>
<li><p><code>tags</code>: An array of items which contain descriptive tags for categorizing this entity, primarily to aid in content discovery and filtering. Each tag item has the following properties:</p>
<ul>
<li><code>name</code>: The display name of the tag; <strong>REQUIRED</strong></li>
<li><p><code>rel</code>: The relationship of the tag; tag relationships include, but are not limited to:</p>
<ul>
<li><code>genre</code>: Refers to a musical genre</li>
<li><code>location</code>: Refers to the locality in which the entity was recorded or operates</li>
<li><code>topic</code>: Refers to what the entity is about</li>
<li><code>instrument</code>: Refers to a featured instrument in the arrangemenet</li>
<li><code>mood</code>: A conscious state of mind or emotional state being conveyed</li>
</ul>
<p>Note that more tag relationships may be added in the future as additional needs are identified, and may be defined arbitrarily by the publisher; as such, a tag with an unknown <code>rel</code> should be collected as an &ldquo;other&rdquo; type.</p></li>
</ul></li>
<li><p><code>links</code>: Associated links; stored as an array of property dictionaries, each of which includes the following attributes:</p>
<ul>
<li><code>name</code>: The display name of the link; <strong>REQUIRED</strong></li>
<li><code>href</code>: The <a href="#url">URL</a> target of the link; <strong>REQUIRED</strong></li>
<li><code>contentType</code>: The content-type of the link (e.g. <code>text/html</code>, <code>application/rss+xml</code>, etc.)</li>
<li><p><code>rel</code>: The relationship of this link to the item. These include, but are not limited to:</p>
<ul>
<li><code>this</code>: An alternate URL that is also trusted to represent this entity</li>
<li><code>alternate</code>: A URL that represents an alternate version of this entity</li>
<li><code>support</code>: Indicates that this URL is where a listener may provide financial support to the artist</li>
<li><code>purchase</code>: Indicates that this URL is where a listener may obtain a copy of this content</li>
<li><code>video</code>: A place to see a music video for this content</li>
</ul>
<p>Note that more link relationships may be added in the future as additional needs are identified; as such, a link with an unknown <code>rel</code> should be either ignored or collected as an &ldquo;other&rdquo; type.</p></li>
</ul></li>
</ul>
<h3 id="5_h3_12_Entity-reference"><span id="entity-reference">Entity reference</span><a href="/chorus/0.3.2#5_h3_12_Entity-reference" class="toc-link"></a></h3><p>Some <a href="#entity">entities</a> need to appear multiple times in a collection. For example, artists with their own discographies may also appear in one or more tracks on compilation releases, or may be featured artists on another artist&rsquo;s releases. Similarly, one track may appear in multiple places, such as a label&rsquo;s compilation or in a playlist.</p><p>An entity reference is an item with a <code>$ref</code> that matches the <code>$id</code> of the original entity. It may also have the following additional attributes:</p>
<ul>
<li><code>name</code>: The display name in the referenced context</li>
<li><code>relationship</code>: An explanation of the reference relationship</li>
</ul>
<p>If a <code>$ref</code> appears, its corresponding <code>$id</code> <strong><em>MUST</em></strong> appear in the same Chorus document.</p><p>An entity reference is considered to have the same <code>$type</code> as the referenced entity, and should be validated accordingly.</p><p>A basic example follows:</p><figure class="blockcode"><pre class="highlight" data-language="json" data-line-numbers><span class="line" id="e5cb7L1"><a class="line-number" href="/chorus/0.3.2#e5cb7L1"></a><span class="line-content"><span class="p">{</span></span></span>
<span class="line" id="e5cb7L2"><a class="line-number" href="/chorus/0.3.2#e5cb7L2"></a><span class="line-content"><span class="w">    </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"collection"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L3"><a class="line-number" href="/chorus/0.3.2#e5cb7L3"></a><span class="line-content"><span class="w">    </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span></span></span>
<span class="line" id="e5cb7L4"><a class="line-number" href="/chorus/0.3.2#e5cb7L4"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb7L5"><a class="line-number" href="/chorus/0.3.2#e5cb7L5"></a><span class="line-content"><span class="w">            </span><span class="nt">"$comment"</span><span class="p">:</span><span class="w"> </span><span class="s2">"This is an artist being defined directly"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L6"><a class="line-number" href="/chorus/0.3.2#e5cb7L6"></a><span class="line-content"><span class="w">            </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L7"><a class="line-number" href="/chorus/0.3.2#e5cb7L7"></a><span class="line-content"><span class="w">            </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist-001"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L8"><a class="line-number" href="/chorus/0.3.2#e5cb7L8"></a><span class="line-content"><span class="w">            </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Artist Number 1"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L9"><a class="line-number" href="/chorus/0.3.2#e5cb7L9"></a><span class="line-content"><span class="w">            </span><span class="nt">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com/example-artist-1"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L10"><a class="line-number" href="/chorus/0.3.2#e5cb7L10"></a><span class="line-content"><span class="w">            </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb7L11"><a class="line-number" href="/chorus/0.3.2#e5cb7L11"></a><span class="line-content"><span class="w">                </span><span class="nt">"$comment"</span><span class="p">:</span><span class="w"> </span><span class="s2">"This is a one-track album with a single track, 'hit single'"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L12"><a class="line-number" href="/chorus/0.3.2#e5cb7L12"></a><span class="line-content"><span class="w">                </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"release"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L13"><a class="line-number" href="/chorus/0.3.2#e5cb7L13"></a><span class="line-content"><span class="w">                </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"debut-album"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L14"><a class="line-number" href="/chorus/0.3.2#e5cb7L14"></a><span class="line-content"><span class="w">                </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Debut Album"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L15"><a class="line-number" href="/chorus/0.3.2#e5cb7L15"></a><span class="line-content"><span class="w">                </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb7L16"><a class="line-number" href="/chorus/0.3.2#e5cb7L16"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"track"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L17"><a class="line-number" href="/chorus/0.3.2#e5cb7L17"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hit-single"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L18"><a class="line-number" href="/chorus/0.3.2#e5cb7L18"></a><span class="line-content"><span class="w">                    </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Hit Single"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L19"><a class="line-number" href="/chorus/0.3.2#e5cb7L19"></a><span class="line-content"><span class="w">                </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb7L20"><a class="line-number" href="/chorus/0.3.2#e5cb7L20"></a><span class="line-content"><span class="w">            </span><span class="p">},</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb7L21"><a class="line-number" href="/chorus/0.3.2#e5cb7L21"></a><span class="line-content"><span class="w">                </span><span class="nt">"$comment"</span><span class="p">:</span><span class="w"> </span><span class="s2">"This is a best-of collection which includes 'hit single' and a remix"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L22"><a class="line-number" href="/chorus/0.3.2#e5cb7L22"></a><span class="line-content"><span class="w">                </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"release"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L23"><a class="line-number" href="/chorus/0.3.2#e5cb7L23"></a><span class="line-content"><span class="w">                </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"best-of"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L24"><a class="line-number" href="/chorus/0.3.2#e5cb7L24"></a><span class="line-content"><span class="w">                </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Best-Of Collection"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L25"><a class="line-number" href="/chorus/0.3.2#e5cb7L25"></a><span class="line-content"><span class="w">                </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb7L26"><a class="line-number" href="/chorus/0.3.2#e5cb7L26"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$comment"</span><span class="p">:</span><span class="w"> </span><span class="s2">"This references the original version of 'hit single' but adds a subtitle"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L27"><a class="line-number" href="/chorus/0.3.2#e5cb7L27"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hit-single"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L28"><a class="line-number" href="/chorus/0.3.2#e5cb7L28"></a><span class="line-content"><span class="w">                    </span><span class="nt">"subtitle"</span><span class="p">:</span><span class="w"> </span><span class="s2">"original mix"</span></span></span>
<span class="line" id="e5cb7L29"><a class="line-number" href="/chorus/0.3.2#e5cb7L29"></a><span class="line-content"><span class="w">                </span><span class="p">},</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb7L30"><a class="line-number" href="/chorus/0.3.2#e5cb7L30"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$comment"</span><span class="p">:</span><span class="w"> </span><span class="s2">"This is a new remix of 'hit single' for this album"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L31"><a class="line-number" href="/chorus/0.3.2#e5cb7L31"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"track"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L32"><a class="line-number" href="/chorus/0.3.2#e5cb7L32"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hit-single-remix"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L33"><a class="line-number" href="/chorus/0.3.2#e5cb7L33"></a><span class="line-content"><span class="w">                    </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Hit Single"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L34"><a class="line-number" href="/chorus/0.3.2#e5cb7L34"></a><span class="line-content"><span class="w">                    </span><span class="nt">"subtitle"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Bayside Boys Mix"</span></span></span>
<span class="line" id="e5cb7L35"><a class="line-number" href="/chorus/0.3.2#e5cb7L35"></a><span class="line-content"><span class="w">                </span><span class="p">}],</span></span></span>
<span class="line" id="e5cb7L36"><a class="line-number" href="/chorus/0.3.2#e5cb7L36"></a><span class="line-content"><span class="w">                </span><span class="nt">"related"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb7L37"><a class="line-number" href="/chorus/0.3.2#e5cb7L37"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$comment"</span><span class="p">:</span><span class="w"> </span><span class="s2">"This provides a link back to the original release of 'hit single'"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L38"><a class="line-number" href="/chorus/0.3.2#e5cb7L38"></a><span class="line-content"><span class="w">                    </span><span class="nt">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"debut-album"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb7L39"><a class="line-number" href="/chorus/0.3.2#e5cb7L39"></a><span class="line-content"><span class="w">                    </span><span class="nt">"relationship"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Original release"</span></span></span>
<span class="line" id="e5cb7L40"><a class="line-number" href="/chorus/0.3.2#e5cb7L40"></a><span class="line-content"><span class="w">                </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb7L41"><a class="line-number" href="/chorus/0.3.2#e5cb7L41"></a><span class="line-content"><span class="w">            </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb7L42"><a class="line-number" href="/chorus/0.3.2#e5cb7L42"></a><span class="line-content"><span class="w">        </span><span class="p">}</span></span></span>
<span class="line" id="e5cb7L43"><a class="line-number" href="/chorus/0.3.2#e5cb7L43"></a><span class="line-content"><span class="w">    </span><span class="p">]</span></span></span>
<span class="line" id="e5cb7L44"><a class="line-number" href="/chorus/0.3.2#e5cb7L44"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><h3 id="5_h3_13_Structural-relationship"><span id="structure">Structural relationship</span><a href="/chorus/0.3.2#5_h3_13_Structural-relationship" class="toc-link"></a></h3><p>A Chorus document does not define a hierarchical tree that must be expanded fully; instead, it defines separate entities with a many-to-many relationship between them, and the containment structure is as a matter of convenience to the publisher in order to limit the amount of repeated information needed to express those relationships.</p><p>That is to say that an entity&rsquo;s <code>$items</code> <em>can</em> directly or indirectly contain an item that is a <code>$ref</code> back to itself, such as in the case of an <a href="#artist"><code>artist</code></a> containing a <a href="#release"><code>release</code></a> that contains a <a href="#track"><code>track</code></a> that has an <code>artist</code> that is a <code>$ref</code> back to the artist with an alternate display name.</p><p>For example, this document:</p><figure class="blockcode"><pre class="highlight" data-language="json" data-line-numbers><span class="line" id="e5cb8L1"><a class="line-number" href="/chorus/0.3.2#e5cb8L1"></a><span class="line-content"><span class="p">{</span></span></span>
<span class="line" id="e5cb8L2"><a class="line-number" href="/chorus/0.3.2#e5cb8L2"></a><span class="line-content"><span class="w">    </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"container"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb8L3"><a class="line-number" href="/chorus/0.3.2#e5cb8L3"></a><span class="line-content"><span class="w">    </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb8L4"><a class="line-number" href="/chorus/0.3.2#e5cb8L4"></a><span class="line-content"><span class="w">        </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb8L5"><a class="line-number" href="/chorus/0.3.2#e5cb8L5"></a><span class="line-content"><span class="w">        </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb8L6"><a class="line-number" href="/chorus/0.3.2#e5cb8L6"></a><span class="line-content"><span class="w">        </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb8L7"><a class="line-number" href="/chorus/0.3.2#e5cb8L7"></a><span class="line-content"><span class="w">            </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"release"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb8L8"><a class="line-number" href="/chorus/0.3.2#e5cb8L8"></a><span class="line-content"><span class="w">            </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-album"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb8L9"><a class="line-number" href="/chorus/0.3.2#e5cb8L9"></a><span class="line-content"><span class="w">            </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb8L10"><a class="line-number" href="/chorus/0.3.2#e5cb8L10"></a><span class="line-content"><span class="w">                </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"track"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb8L11"><a class="line-number" href="/chorus/0.3.2#e5cb8L11"></a><span class="line-content"><span class="w">                </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-track"</span></span></span>
<span class="line" id="e5cb8L12"><a class="line-number" href="/chorus/0.3.2#e5cb8L12"></a><span class="line-content"><span class="w">            </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb8L13"><a class="line-number" href="/chorus/0.3.2#e5cb8L13"></a><span class="line-content"><span class="w">        </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb8L14"><a class="line-number" href="/chorus/0.3.2#e5cb8L14"></a><span class="line-content"><span class="w">    </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb8L15"><a class="line-number" href="/chorus/0.3.2#e5cb8L15"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><p>is semantically-equivalent to this document:</p><figure class="blockcode"><pre class="highlight" data-language="json" data-line-numbers><span class="line" id="e5cb9L1"><a class="line-number" href="/chorus/0.3.2#e5cb9L1"></a><span class="line-content"><span class="p">{</span></span></span>
<span class="line" id="e5cb9L2"><a class="line-number" href="/chorus/0.3.2#e5cb9L2"></a><span class="line-content"><span class="w">    </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"container"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb9L3"><a class="line-number" href="/chorus/0.3.2#e5cb9L3"></a><span class="line-content"><span class="w">    </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb9L4"><a class="line-number" href="/chorus/0.3.2#e5cb9L4"></a><span class="line-content"><span class="w">        </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb9L5"><a class="line-number" href="/chorus/0.3.2#e5cb9L5"></a><span class="line-content"><span class="w">        </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb9L6"><a class="line-number" href="/chorus/0.3.2#e5cb9L6"></a><span class="line-content"><span class="w">        </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb9L7"><a class="line-number" href="/chorus/0.3.2#e5cb9L7"></a><span class="line-content"><span class="w">            </span><span class="nt">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-album"</span></span></span>
<span class="line" id="e5cb9L8"><a class="line-number" href="/chorus/0.3.2#e5cb9L8"></a><span class="line-content"><span class="w">        </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb9L9"><a class="line-number" href="/chorus/0.3.2#e5cb9L9"></a><span class="line-content"><span class="w">    </span><span class="p">},</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb9L10"><a class="line-number" href="/chorus/0.3.2#e5cb9L10"></a><span class="line-content"><span class="w">        </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"release"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb9L11"><a class="line-number" href="/chorus/0.3.2#e5cb9L11"></a><span class="line-content"><span class="w">        </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-album"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb9L12"><a class="line-number" href="/chorus/0.3.2#e5cb9L12"></a><span class="line-content"><span class="w">        </span><span class="nt">"$items"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb9L13"><a class="line-number" href="/chorus/0.3.2#e5cb9L13"></a><span class="line-content"><span class="w">            </span><span class="nt">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-track"</span></span></span>
<span class="line" id="e5cb9L14"><a class="line-number" href="/chorus/0.3.2#e5cb9L14"></a><span class="line-content"><span class="w">        </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb9L15"><a class="line-number" href="/chorus/0.3.2#e5cb9L15"></a><span class="line-content"><span class="w">    </span><span class="p">},</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb9L16"><a class="line-number" href="/chorus/0.3.2#e5cb9L16"></a><span class="line-content"><span class="w">        </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"track"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb9L17"><a class="line-number" href="/chorus/0.3.2#e5cb9L17"></a><span class="line-content"><span class="w">        </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"my-track"</span></span></span>
<span class="line" id="e5cb9L18"><a class="line-number" href="/chorus/0.3.2#e5cb9L18"></a><span class="line-content"><span class="w">    </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb9L19"><a class="line-number" href="/chorus/0.3.2#e5cb9L19"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure><p>Both define three elements: an <a href="#artist"><code>artist</code></a> with a single <a href="#release"><code>release</code></a> which contains a single <a href="#track"><code>track</code></a>. The serialized structure is different, but the meaning is the same.</p><h3 id="5_h3_14_Description-text"><span id="description-text">Description text</span><a href="/chorus/0.3.2#5_h3_14_Description-text" class="toc-link"></a></h3><p>Detailed descriptions are given as HTML text, which is to be sanitized by the receiver.</p><p>The recommended set of allowed HTML tags and attributes is:</p>
<ul>
<li>Headings; <code>&lt;h1&gt;</code>, <code>&lt;h2&gt;</code>, <code>&lt;h3&gt;</code>, <code>&lt;h4&gt;</code>, <code>&lt;h5&gt;</code>, <code>&lt;h6&gt;</code>, <code>&lt;hgroup&gt;</code></li>
<li><p>Paragraphs and line breaks; <code>&lt;p&gt;</code>, <code>&lt;br&gt;</code></p><p>As this text is specified as HTML, clients <strong>MUST</strong> support <code>&lt;br&gt;</code> as a self-closing tag; they <strong>SHOULD</strong> also support the XHTML version (<code>&lt;br/&gt;</code>).</p></li>
<li><p>Links; <code>&lt;a href&gt;</code></p><p>The <code>href</code> <strong>MUST</strong> be sanitized to remove anything other than a valid URL; in particular, JavaScript <strong>MUST NOT</strong> be permitted. It is also <strong>RECOMMENDED</strong> that any link activation not disrupt the operation of the client itself; for example, from an app-based client, this <strong>SHOULD</strong> open a separate WebView or browser, and from a web-based client, this <strong>SHOULD</strong> open the link in a new tab or window (with e.g. <code>target=&quot;_blank&quot;</code>)</p><p>A relative <code>href</code> <strong>MUST</strong> be interpreted as relative to the Chorus document&rsquo;s URL.</p></li>
<li><p>Lists; <code>&lt;ul&gt;</code>, <code>&lt;ol&gt;</code>, <code>&lt;li&gt;</code></p></li>
<li><p>Dictionaries; <code>&lt;dl&gt;</code>, <code>&lt;dt&gt;</code>, <code>&lt;dd&gt;</code></p></li>
<li><p>Emphasis; <code>&lt;em&gt;</code>, <code>&lt;strong&gt;</code></p></li>
<li><p>Visual markup; <code>&lt;b&gt;</code>, <code>&lt;i&gt;</code>, <code>&lt;sup&gt;</code>, <code>&lt;sub&gt;</code>, <code>&lt;tt&gt;</code>, <code>&lt;s&gt;</code></p></li>
<li><p>Quotations; <code>&lt;blockquote cite&gt;</code></p></li>
<li><p>Miscellaneous annotations; <code>&lt;code&gt;</code>, <code>&lt;cite&gt;</code>, <code>&lt;mark&gt;</code>, <code>&lt;del&gt;</code>, <code>&lt;ins&gt;</code></p></li>
</ul>
<p>It is allowed for a display client to limit the markup or presentation further, or to elide it entirely.</p><p>It is <strong>SUGGESTED</strong> that there be a reasonable length limit imposed by the client; in the event that such a limit is exceeded, the client <strong>MUST</strong> properly close any open tags as part of its sanitization process.</p><h3 id="5_h3_15_Lyric-Text"><span id="lyric-text">Lyric Text</span><a href="/chorus/0.3.2#5_h3_15_Lyric-Text" class="toc-link"></a></h3><p>In lyrics, the following Markdown-style markup types <strong>MAY</strong> be supported:</p>
<ul>
<li>Emphasis (e.g. <code>*italic*</code>, <code>**bold**</code>)</li>
<li>Monospace text (e.g. <code>`i am a robot bleep blorp`</code>)</li>
</ul>
<p>It is valid for an implementation to display lyric text as the raw string.</p><p>Raw HTML tags <strong><em>MUST NOT</em></strong> be supported; in contexts where the text display is being handled by an HTML renderer (such as in a browser or embedded WebView), entities <strong>MUST</strong> be escaped (for example, converting the text <code>&lt;hello&gt;</code> to the HTML <code>&amp;lt;hello&amp;gt;</code>).</p><h3 id="5_h3_16_Dates-and-times"><span id="datetime">Dates and times</span><a href="/chorus/0.3.2#5_h3_16_Dates-and-times" class="toc-link"></a></h3><p>Dates and times are represented as strings in <code>YYYY[-MM[-DD[Thh:mm[:ss][+ZZZZ]]]]</code> format. For example, <code>2026-06-14T14:42-0700</code> is equivalent to June 14, 2026 at 2:42 PM in UTC-0700 (e.g. Pacific Daylight Time). This format is similar to <a href="https://www.rfc-editor.org/info/rfc3339/">RFC 3339</a>, but allows the date to be precise only to a month or year, as is (unfortunately) common in a lot of music history.</p><p>If a given time lacks timezone information, it will be assumed to be UTC; <code>14:06:02</code> and <code>14:06:02+0000</code> are therefore equivalent.</p><p>A consumer <strong>SHOULD</strong> make use of all available precision, but it is not specified how it treats partial matches between two datetimes with differing levels of precision; for example:</p>
<ul>
<li>It is not specified how <code>2026-06-14T12:34</code>, <code>2026-06-14</code>, <code>2026-06</code>, and <code>2026</code> sort relative to one another</li>
<li><code>2026-06</code> must always come after <code>2026-05</code> and <code>2026-05-30</code></li>
</ul>
<p>Per the above, dates may be trivially sorted and filtered lexically, but fully-specified datetimes need to be timezone-aware.</p><h3 id="5_h3_17_Durations-and-time-offsets"><span id="duration">Durations</span> and <span id="time-offset">time offsets</span><a href="/chorus/0.3.2#5_h3_17_Durations-and-time-offsets" class="toc-link"></a></h3><p>Durations and time offsets are given numerically as seconds, and <strong>MUST</strong> be serialized as a number. So, for example, a duration of 1 hour, 23 minutes, and 45.6 seconds is serialized as the number <code>5025.6</code>.</p><p>A time offset is relative to the start time of the respective media.</p><h3 id="5_h3_18_URLs"><span id="url">URLs</span><a href="/chorus/0.3.2#5_h3_18_URLs" class="toc-link"></a></h3><p>A URL is a string that references an external resource.</p><p>URLs <strong>SHOULD</strong> be given as absolute by publishers; however, receivers <strong>MUST</strong> treat all URLs as potentially-relative to the originating document.</p><p>For example, if a document is at <code>https://example.com/chorus.json</code>, then a URL of <code>/foo.mp3</code> <strong>MUST</strong> be interpreted as <code>https://example.com/foo.mp3</code>, and a URL of <code>//cdn.example.com/bar.ogg</code> <strong>MUST</strong> be interpreted as <code>https://cdn.example.com/bar.ogg</code>.</p><p>Example implementations of URL resolution in various languages:</p>
<ul>
<li>JavaScript (including Node): <a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/URL"><code>URL()</code> constructor</a></li>
<li>Python: <a href="https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urljoin"><code>urllib.parse.urljoin</code></a></li>
<li>PHP: <a href="https://github.com/fluffy-critter/php-urljoin"><code>php-urljoin</code></a></li>
</ul>
<h2 id="5_h2_19_Entity-types">Entity types<a href="/chorus/0.3.2#5_h2_19_Entity-types" class="toc-link"></a></h2><p>These are the types of <a href="#entity">entities</a> known to the collection format.</p><h3 id="5_h3_20_Collection"><span id="collection">Collection</span><a href="/chorus/0.3.2#5_h3_20_Collection" class="toc-link"></a></h3><p>The top-level entity <strong>SHOULD</strong> have a type of <code>collection</code>. A <code>collection</code> entity cannot be contained by other entities.</p><p>The <code>collection</code> entity can contain the following additional attributes:</p>
<ul>
<li><code>$protocol</code>: Refers to the protocol of the file, i.e. <code>&quot;Chorus&quot;</code></li>
<li><code>$version</code>: Refers to the base Chorus specification <a href="#version">version</a> in effect</li>
<li><code>$schema</code>: A URL to a JSON Schema reflective of the version of the protocol in use</li>
<li><p><code>$deleted</code>: Items that have been previously published but are now removed from the collection, given as a list of <code>$id</code> values</p><p>These entities <strong>MUST NOT</strong> appear anywhere else in the document, and furthermore <strong>SHOULD</strong> only appear if an item was previously published but is to be revoked.</p><p>Any <a href="#entity-reference">entity references</a> that refer to the original item are also to be removed.</p></li>
</ul>
<p>A collection supports the following additional link types, with the <code>rel</code> value set accordingly:</p>
<ul>
<li><code>websub</code>: A link to a <a href="https://en.wikipedia.org/wiki/WebSub">WebSub</a> hub, where a receiver can subscribe to immediate updates to this collection</li>
</ul>
<p>All entity types are valid <code>$items</code> aside from <code>collection</code>.</p><h3 id="5_h3_21_Label"><span id="label">Label</span><a href="/chorus/0.3.2#5_h3_21_Label" class="toc-link"></a></h3><p>An entity of type <code>label</code> refers to a record label.</p><p>Valid <code>$items</code> types:</p>
<ul>
<li><a href="#release"><code>release</code></a></li>
<li><a href="#track"><code>track</code></a></li>
<li><a href="#artist"><code>artist</code></a></li>
</ul>
<h3 id="5_h3_22_Artist"><span id="artist">Artist</span><a href="/chorus/0.3.2#5_h3_22_Artist" class="toc-link"></a></h3><p>An entity of type <code>artist</code> is a releasing artist. The <code>name</code> attribute refers to the primary name under which the artist releases.</p><p>Valid <code>$items</code> types:</p>
<ul>
<li><a href="#release"><code>release</code></a></li>
<li><a href="#track"><code>track</code></a></li>
</ul>
<h3 id="5_h3_23_Release"><span id="release">Release</span><a href="/chorus/0.3.2#5_h3_23_Release" class="toc-link"></a></h3><p>An entity of type <code>release</code> indicates a released item, typically an album containing one or more <a href="#track"><code>track</code></a>s. The <code>name</code> attribute refers to the title of the release. It contains the following additional properties:</p>
<ul>
<li><code>releaseDate</code>: The original release date, as a <a href="#datetime">datetime</a></li>
<li><code>label</code>: The <a href="#label"><code>label</code></a> that owns/manages this release. If not specified, it uses any <a href="#label"><code>label</code></a> associated with the <a href="#artist"><code>artist</code></a>.</li>
<li><code>artist</code>: The primary <a href="#artist"><code>artist</code></a> that owns/manages this release (also known as &ldquo;album artist&rdquo;). If not specified, it uses the <a href="#artist"><code>artist</code></a> that contains this <code>release</code>, if any.</li>
<li><code>subtitle</code>: The subtitle of the release</li>
<li><code>copyright</code>: The base copyright information of the release (e.g. <code>&quot;℗2025 MecaGorp Ultd; ©2025 Jennifer Example&quot;</code>)</li>
<li><code>license</code>: Additional license information, e.g. <code>&quot;CC by-nc-sa&quot;</code></li>
<li><code>licenseUrl</code>: A link to the additional license information, e.g. <code>&quot;https://creativecommons.org/licenses/by-nc-sa/4.0/&quot;</code></li>
<li><p><code>genre</code>: An arbitrary descriptive string of plain text that may indicate vaguely what sorts of people might like this release.</p><p>Note that this is for end-user display purposes, and not for categorization and content filtering; that should be performed using the entity&rsquo;s <code>tags</code> properties. Both attributes serve different purposes.</p><p>If no <code>genre</code> is specified, then a user-facing client <strong>MAY</strong> form a display string from the entity&rsquo;s <code>tags</code> with a <code>rel</code> of <code>genre</code>.</p></li>
<li><p><code>featuring</code>: An array of additional featured <a href="#artist"><code>artist</code></a>s, to indicate collaborations; these artists may also have additional properties such as:</p>
<ul>
<li><code>role</code>: The role this artist played in the release</li>
</ul></li>
</ul>
<p>Note that a <code>release</code> does not necessarily have to be contained by (or have) an <code>artist</code> entity. In this case, it is up to the consumer to decide how to display this.</p><p>Valid <code>$items</code> types:</p>
<ul>
<li><a href="#artist"><code>artist</code></a></li>
<li><a href="#track"><code>track</code></a></li>
</ul>
<h3 id="5_h3_24_Track"><span id="track">Track</span><a href="/chorus/0.3.2#5_h3_24_Track" class="toc-link"></a></h3><p>An entity of type <code>track</code> refers to a playable track. If it is contained by a <a href="#release"><code>release</code></a>, then it is given a playback order based on its position in the release&rsquo;s <code>$items</code>; otherwise it may be assumed to be a single.</p><p>It is <strong>RECOMMENDED</strong> (but not required) that released singles be a <a href="#release"><code>release</code></a> containing a single <code>track</code>, and that any <code>track</code>s that are not contained by a <a href="#release"><code>release</code></a> still appear in the relevant <a href="#artist"><code>artist</code></a>&rsquo;s discography.</p><p>Also note that standalone tracks <strong>MUST NOT</strong> have a <a href="#label"><code>label</code></a>; to assign a label to a track it must be part of a <a href="#release"><code>release</code></a>.</p><p>It has the following additional properties:</p>
<ul>
<li><code>subtitle</code>: The subtitle of the track, if any</li>
<li><code>artist</code>: The primary <a href="#artist"><code>artist</code></a> that owns/manages this track. If not specified, it uses the <a href="#artist"><code>artist</code></a> of any containing <a href="#release"><code>release</code></a>.</li>
<li><code>featuring</code>: An array of additional featured <a href="#artist"><code>artist</code></a>s, to indicate collaborations; these artists may also have additional properties such as:

<ul>
<li><code>role</code>: The role this artist played in the track</li>
</ul></li>
<li><code>composer</code>: The composer(s) of the track&rsquo;s music</li>
<li><code>lyricist</code>: The author(s) of the track&rsquo;s lyrics</li>
<li><code>originalArtist</code>: The original performing artist, if this song is a cover</li>
<li><code>duration</code>: The canonical length of the track, in seconds</li>
<li><code>discNum</code>: The physical disc that the track appeared on, in the case of a multi-disc album</li>
<li><p><code>trackNum</code>: The physical track number for the track on its disc</p><p>Note that <code>discNum</code> and <code>trackNum</code> are purely for display purposes, and do not affect the natural playback order of the track, which is given by the order of the <code>track</code> items within the containing <a href="#release"><code>release</code></a>&rsquo;s <code>$items</code>.</p></li>
<li><p><code>copyright</code>: The copyright information of the track (defaults to the containing <a href="#release"><code>release</code></a>&rsquo;s)</p></li>
<li><p><code>license</code>: Any additional license information, e.g. <code>&quot;CC by-nc-sa&quot;</code> (defaults to the containing <a href="#release"><code>release</code></a>&rsquo;s)</p></li>
<li><p><code>licenseUrl</code>: A link to the additional license information, e.g. <code>&quot;https://creativecommons.org/licenses/by-nc-sa/4.0/&quot;</code> (defaults to the containing <a href="#release"><code>release</code></a>&rsquo;s)</p></li>
<li><p><code>lyrics</code>: The human-readable, non-synchronized lyrics of the track, if any; this should be provided as plain text with a single <code>\n</code> between lines, and <code>\n\n</code> between verses. <a href="#lyric-text">Limited Markdown</a> (such as <code>*emphasis*</code> and <code>**boldface**</code>) <strong>MAY</strong> be supported at the discretion of the consumer.</p></li>
<li><p><code>synchronizedLyrics</code>: Synchronized lyrics, given as a list of items with the following properties:</p>
<ul>
<li><code>startTime</code>: The starting <a href="#time-offset">time offset</a> of the lyric; <strong>REQUIRED</strong></li>
<li><p><code>duration</code>: The <a href="#duration">duration</a> of the lyric, in seconds; <strong>STRONGLY RECOMMENDED</strong></p><p>Note that lyrics may overlap (such as in the case of duets or staggered multi-part vocals), so if <code>duration</code> is not specified it must be inferred by the length of the text, <em>not</em> by the start time of the next lyric.</p></li>
<li><p><code>voice</code>: The name of the voice that is singing/stating the lyric; if provided, this <strong>SHOULD</strong> be human-readable, and <strong>MUST</strong> be consistent throughout the track</p></li>
<li><p><code>text</code>: The representative text of the lyric, in <a href="#lyric-text">limited Markdown</a>; <strong>REQUIRED</strong></p></li>
</ul></li>
<li><p><code>genre</code>: An arbitrary descriptive string of plain text that may indicate vaguely what sorts of people might like this track (defaults to the containing <code>release</code>&rsquo;s if unspecified).</p><p>If no <code>genre</code> is specified, then a user-facing client <strong>MAY</strong> form a display string from the entity&rsquo;s <code>tags</code> with a <code>rel</code> of <code>genre</code>.</p></li>
<li><p><code>markers</code>: An array of marker items to indicate different sections of a track, such as movements, chapters, or other similar metadata. Each array item contains the following properties:</p>
<ul>
<li><code>startTime</code>: The <a href="#time-offset">time offset</a> where the marker appears; <strong>REQUIRED</strong></li>
<li><code>text</code>: The text label of the marker; <strong>REQUIRED</strong></li>
<li><code>rel</code>: The type of marker, for example, <code>movement</code>, <code>section</code>, <code>chapter</code>, <code>index</code>, etc.</li>
</ul></li>
<li><p><code>credits</code>: An array of detailed credits for the production of the track, containing the following properties:</p>
<ul>
<li><code>name</code>: The name of the person</li>
<li><code>roles</code>: An array of production roles (e.g. vocals, instruments, production, coffee, etc.)</li>
</ul></li>
<li><p><code>media</code>: A list of descriptors providing streamable/listenable renditions of the track. This <strong>SHOULD</strong> contain at least one descriptor entity with a <code>contentType</code> of <code>audio/mp3</code> for maximum compatibility. Each descriptor contains the following properties:</p>
<ul>
<li><code>contentType</code>: The content-type of the media (e.g. <code>audio/mp3</code>, <code>audio/flac</code>, <code>video/mp4</code>, <code>application/x-mpegURL</code>, etc.); <strong>STRONGLY RECOMMENDED</strong></li>
<li><code>src</code>: The URL at which the media can be played; <strong>REQUIRED</strong></li>
<li><code>size</code>: The size of the content file, in bytes; <strong>STRONGLY RECOMMENDED</strong></li>
<li><code>description</code>: A descriptive label for this rendition</li>
</ul>
<p>There can be multiple media with the same type, differentiated by <code>size</code> to indicate different quality levels/bitrates, so that player applications can choose the appropriate quality level based on bandwidth availability.</p><p>This is not suitable for different versions of a song, however; those should be given either with <code>related</code> or <code>links</code> as appropriate. That is to say, each of these <strong>MUST</strong> be the same underlying recording.</p></li>
</ul>
<p>An example track might look like:</p><figure class="blockcode"><pre class="highlight" data-language="json" data-line-numbers><span class="line" id="e5cb10L1"><a class="line-number" href="/chorus/0.3.2#e5cb10L1"></a><span class="line-content"><span class="p">{</span></span></span>
<span class="line" id="e5cb10L2"><a class="line-number" href="/chorus/0.3.2#e5cb10L2"></a><span class="line-content"><span class="w">    </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"track"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L3"><a class="line-number" href="/chorus/0.3.2#e5cb10L3"></a><span class="line-content"><span class="w">    </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"13a93b29-4e4b-4967-a077-cbe8491767ec"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L4"><a class="line-number" href="/chorus/0.3.2#e5cb10L4"></a><span class="line-content"></span></span>
<span class="line" id="e5cb10L5"><a class="line-number" href="/chorus/0.3.2#e5cb10L5"></a><span class="line-content"><span class="w">    </span><span class="nt">"artist"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L6"><a class="line-number" href="/chorus/0.3.2#e5cb10L6"></a><span class="line-content"><span class="w">        </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L7"><a class="line-number" href="/chorus/0.3.2#e5cb10L7"></a><span class="line-content"><span class="w">        </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"5ee2099f-8d04-48c8-bc3d-832d3b0b58cc"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L8"><a class="line-number" href="/chorus/0.3.2#e5cb10L8"></a><span class="line-content"><span class="w">        </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"The Example Band"</span></span></span>
<span class="line" id="e5cb10L9"><a class="line-number" href="/chorus/0.3.2#e5cb10L9"></a><span class="line-content"><span class="w">    </span><span class="p">},</span></span></span>
<span class="line" id="e5cb10L10"><a class="line-number" href="/chorus/0.3.2#e5cb10L10"></a><span class="line-content"><span class="w">    </span><span class="nt">"featuring"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span></span></span>
<span class="line" id="e5cb10L11"><a class="line-number" href="/chorus/0.3.2#e5cb10L11"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L12"><a class="line-number" href="/chorus/0.3.2#e5cb10L12"></a><span class="line-content"><span class="w">            </span><span class="nt">"$type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"artist"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L13"><a class="line-number" href="/chorus/0.3.2#e5cb10L13"></a><span class="line-content"><span class="w">            </span><span class="nt">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"b96b4398-1845-43b4-89e8-76b8409f1fbf"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L14"><a class="line-number" href="/chorus/0.3.2#e5cb10L14"></a><span class="line-content"><span class="w">            </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Another Band"</span></span></span>
<span class="line" id="e5cb10L15"><a class="line-number" href="/chorus/0.3.2#e5cb10L15"></a><span class="line-content"><span class="w">        </span><span class="p">},{</span></span></span>
<span class="line" id="e5cb10L16"><a class="line-number" href="/chorus/0.3.2#e5cb10L16"></a><span class="line-content"><span class="w">            </span><span class="nt">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"yet-another-band"</span></span></span>
<span class="line" id="e5cb10L17"><a class="line-number" href="/chorus/0.3.2#e5cb10L17"></a><span class="line-content"><span class="w">        </span><span class="p">}</span></span></span>
<span class="line" id="e5cb10L18"><a class="line-number" href="/chorus/0.3.2#e5cb10L18"></a><span class="line-content"><span class="w">    </span><span class="p">],</span></span></span>
<span class="line" id="e5cb10L19"><a class="line-number" href="/chorus/0.3.2#e5cb10L19"></a><span class="line-content"><span class="w">    </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Introduction"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L20"><a class="line-number" href="/chorus/0.3.2#e5cb10L20"></a><span class="line-content"><span class="w">    </span><span class="nt">"subtitle"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Radio Edit"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L21"><a class="line-number" href="/chorus/0.3.2#e5cb10L21"></a><span class="line-content"><span class="w">    </span><span class="nt">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com/band/releases/introduction.html"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L22"><a class="line-number" href="/chorus/0.3.2#e5cb10L22"></a><span class="line-content"><span class="w">    </span><span class="nt">"duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">45</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L23"><a class="line-number" href="/chorus/0.3.2#e5cb10L23"></a><span class="line-content"><span class="w">    </span><span class="nt">"disc"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L24"><a class="line-number" href="/chorus/0.3.2#e5cb10L24"></a><span class="line-content"><span class="w">    </span><span class="nt">"track"</span><span class="p">:</span><span class="w"> </span><span class="mi">17</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L25"><a class="line-number" href="/chorus/0.3.2#e5cb10L25"></a><span class="line-content"><span class="w">    </span><span class="nt">"media"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span></span></span>
<span class="line" id="e5cb10L26"><a class="line-number" href="/chorus/0.3.2#e5cb10L26"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L27"><a class="line-number" href="/chorus/0.3.2#e5cb10L27"></a><span class="line-content"><span class="w">            </span><span class="nt">"contentType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/mp3"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L28"><a class="line-number" href="/chorus/0.3.2#e5cb10L28"></a><span class="line-content"><span class="w">            </span><span class="nt">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.example.com/artist/album/01 the introductory track.mp3"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L29"><a class="line-number" href="/chorus/0.3.2#e5cb10L29"></a><span class="line-content"><span class="w">            </span><span class="nt">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">737280</span></span></span>
<span class="line" id="e5cb10L30"><a class="line-number" href="/chorus/0.3.2#e5cb10L30"></a><span class="line-content"><span class="w">        </span><span class="p">},</span></span></span>
<span class="line" id="e5cb10L31"><a class="line-number" href="/chorus/0.3.2#e5cb10L31"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L32"><a class="line-number" href="/chorus/0.3.2#e5cb10L32"></a><span class="line-content"><span class="w">            </span><span class="nt">"contentType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/mp3"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L33"><a class="line-number" href="/chorus/0.3.2#e5cb10L33"></a><span class="line-content"><span class="w">            </span><span class="nt">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.example.com/artist/album/01 the introductory track.hq.mp3"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L34"><a class="line-number" href="/chorus/0.3.2#e5cb10L34"></a><span class="line-content"><span class="w">            </span><span class="nt">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1105920</span></span></span>
<span class="line" id="e5cb10L35"><a class="line-number" href="/chorus/0.3.2#e5cb10L35"></a><span class="line-content"><span class="w">        </span><span class="p">},</span></span></span>
<span class="line" id="e5cb10L36"><a class="line-number" href="/chorus/0.3.2#e5cb10L36"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L37"><a class="line-number" href="/chorus/0.3.2#e5cb10L37"></a><span class="line-content"><span class="w">            </span><span class="nt">"contentType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"audio/flac"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L38"><a class="line-number" href="/chorus/0.3.2#e5cb10L38"></a><span class="line-content"><span class="w">            </span><span class="nt">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.example.com/artist/album/01 the introductory track.flac"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L39"><a class="line-number" href="/chorus/0.3.2#e5cb10L39"></a><span class="line-content"><span class="w">            </span><span class="nt">"size"</span><span class="p">:</span><span class="w"> </span><span class="mi">1843200</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L40"><a class="line-number" href="/chorus/0.3.2#e5cb10L40"></a><span class="line-content"><span class="w">            </span><span class="nt">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"lossless version"</span></span></span>
<span class="line" id="e5cb10L41"><a class="line-number" href="/chorus/0.3.2#e5cb10L41"></a><span class="line-content"><span class="w">        </span><span class="p">}</span></span></span>
<span class="line" id="e5cb10L42"><a class="line-number" href="/chorus/0.3.2#e5cb10L42"></a><span class="line-content"><span class="w">    </span><span class="p">],</span></span></span>
<span class="line" id="e5cb10L43"><a class="line-number" href="/chorus/0.3.2#e5cb10L43"></a><span class="line-content"><span class="w">    </span><span class="nt">"markers"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span></span></span>
<span class="line" id="e5cb10L44"><a class="line-number" href="/chorus/0.3.2#e5cb10L44"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L45"><a class="line-number" href="/chorus/0.3.2#e5cb10L45"></a><span class="line-content"><span class="w">            </span><span class="nt">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L46"><a class="line-number" href="/chorus/0.3.2#e5cb10L46"></a><span class="line-content"><span class="w">            </span><span class="nt">"rel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"movement"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L47"><a class="line-number" href="/chorus/0.3.2#e5cb10L47"></a><span class="line-content"><span class="w">            </span><span class="nt">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Adagio"</span></span></span>
<span class="line" id="e5cb10L48"><a class="line-number" href="/chorus/0.3.2#e5cb10L48"></a><span class="line-content"><span class="w">        </span><span class="p">},</span></span></span>
<span class="line" id="e5cb10L49"><a class="line-number" href="/chorus/0.3.2#e5cb10L49"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L50"><a class="line-number" href="/chorus/0.3.2#e5cb10L50"></a><span class="line-content"><span class="w">            </span><span class="nt">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">15</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L51"><a class="line-number" href="/chorus/0.3.2#e5cb10L51"></a><span class="line-content"><span class="w">            </span><span class="nt">"rel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"movement"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L52"><a class="line-number" href="/chorus/0.3.2#e5cb10L52"></a><span class="line-content"><span class="w">            </span><span class="nt">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Rondo - Vivace"</span></span></span>
<span class="line" id="e5cb10L53"><a class="line-number" href="/chorus/0.3.2#e5cb10L53"></a><span class="line-content"><span class="w">        </span><span class="p">},</span></span></span>
<span class="line" id="e5cb10L54"><a class="line-number" href="/chorus/0.3.2#e5cb10L54"></a><span class="line-content"><span class="w">        </span><span class="p">{</span></span></span>
<span class="line" id="e5cb10L55"><a class="line-number" href="/chorus/0.3.2#e5cb10L55"></a><span class="line-content"><span class="w">            </span><span class="nt">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mf">30.7</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L56"><a class="line-number" href="/chorus/0.3.2#e5cb10L56"></a><span class="line-content"><span class="w">            </span><span class="nt">"rel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"movement"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L57"><a class="line-number" href="/chorus/0.3.2#e5cb10L57"></a><span class="line-content"><span class="w">            </span><span class="nt">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Larghetto i risoluzione"</span></span></span>
<span class="line" id="e5cb10L58"><a class="line-number" href="/chorus/0.3.2#e5cb10L58"></a><span class="line-content"><span class="w">        </span><span class="p">}</span></span></span>
<span class="line" id="e5cb10L59"><a class="line-number" href="/chorus/0.3.2#e5cb10L59"></a><span class="line-content"><span class="w">    </span><span class="p">],</span></span></span>
<span class="line" id="e5cb10L60"><a class="line-number" href="/chorus/0.3.2#e5cb10L60"></a><span class="line-content"><span class="w">    </span><span class="nt">"links"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span></span></span>
<span class="line" id="e5cb10L61"><a class="line-number" href="/chorus/0.3.2#e5cb10L61"></a><span class="line-content"><span class="w">        </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Music video"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L62"><a class="line-number" href="/chorus/0.3.2#e5cb10L62"></a><span class="line-content"><span class="w">        </span><span class="nt">"contentType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video/mp4"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L63"><a class="line-number" href="/chorus/0.3.2#e5cb10L63"></a><span class="line-content"><span class="w">        </span><span class="nt">"href"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.example.com/artist/videos/the introductory track.mp4"</span><span class="p">,</span></span></span>
<span class="line" id="e5cb10L64"><a class="line-number" href="/chorus/0.3.2#e5cb10L64"></a><span class="line-content"><span class="w">        </span><span class="nt">"rel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video"</span></span></span>
<span class="line" id="e5cb10L65"><a class="line-number" href="/chorus/0.3.2#e5cb10L65"></a><span class="line-content"><span class="w">    </span><span class="p">}]</span></span></span>
<span class="line" id="e5cb10L66"><a class="line-number" href="/chorus/0.3.2#e5cb10L66"></a><span class="line-content"><span class="p">}</span></span></span>
</pre></figure>
        

        
        <a rel="tag" href="https://mecagorp.com/chorus/?id=5&amp;tag=chorus">#chorus</a>
        

        ]]>



        </content>
        <category term="Chorus" label="Chorus" />
        
        
        <category term="Chorus" label="chorus" />
        

        

    </entry>
    

    
</feed>