podtunes logo

Podcasting 2.0 support

podtunes is a browser-based music player built entirely on the open Podcasting 2.0 ecosystem. Our catalogue comes exclusively from music feeds indexed on PodcastIndex.org. We never re-host audio: every play streams the enclosure URL straight from the artist's feed. This page documents which tags from the Podcasting 2.0 namespace podtunes reads and how they show up in the app.

Medium(podcast:medium)

Our crawler pulls feeds from the Podcast Index API by medium (/podcasts/bymedium, medium=music). Only feeds tagged music enter the catalogue. A lightweight classifier additionally hides talk shows about music that ended up in the music bucket.

<podcast:medium>music</podcast:medium>

Search runs over the podtunes catalogue, which is built entirely from Podcast Index data. Results cover artists, releases and tracks.

Person(podcast:person)

Featured and guest artists are read from podcast:person tags. A feed-level podcast:person with an img attribute is used as the circular artist portrait.

<podcast:person role="artist" group="cast"
                img="https://artist.example/portrait.jpg"
                href="https://artist.example">Jane Doe</podcast:person>

Publisher(remoteItem medium="publisher")

When a release feed points to a publisher feed via podcast:remoteItem with medium="publisher", podtunes reads that publisher feed for the artist bio and the publisher's role (rel="artist|label|producer|network"), and shows it on the artist page. A publisher that declares itself only as label, producer or network never overwrites the artist's bio or portrait.

<podcast:remoteItem medium="publisher"
                    feedGuid="…"
                    feedUrl="https://label.example/feed.xml"
                    rel="label" />

Remote Item(podcast:remoteItem)

Publisher feeds list an artist's releases as podcast:remoteItem entries. podtunes uses them to detect new releases quickly and to group releases under the right artist.

<podcast:remoteItem medium="music"
                    feedGuid="…"
                    feedUrl="https://artist.example/album.xml" />

Episode(podcast:episode)

Album track order follows the artist's intent: podcast:episode (or itunes:episode) numbers come first. Without them, single-drop albums use feed order, and rolling singles feeds use publish date.

<item>
  <title>Second Track</title>
  <podcast:episode>2</podcast:episode>
  <itunes:episode>2</itunes:episode>
</item>

GUID(podcast:guid)

Each feed's podcast:guid is stored as its stable identifier, so a release keeps its identity when the feed URL changes. Other apps can deep-link into podtunes by GUID, see the developer section below.

<channel>
  <title>Album Title</title>
  <podcast:guid>…</podcast:guid>
</channel>

Value(podcast:value)

podtunes reads the value block and its recipients, including splits, from every track. Boosts are paid directly wallet-to-artist via Lightning keysend, using Nostr Wallet Connect (NWC) or a WebLN browser extension. Recipients given as Lightning addresses are paid via LNURL invoices. podtunes never holds funds.

<podcast:value type="lightning" method="keysend" suggested="0.00000055">
  <podcast:valueRecipient name="Jane Doe" type="node"
                          address="03a2c…" split="90" />
  <podcast:valueRecipient name="Label" type="email"
                          address="payout@label.example" split="10" />
</podcast:value>

Boostagrams

Every boost carries the standard Podcasting 2.0 TLV record (7629169) with sender name, message, episode title and episode GUID, so it shows up in the artist's boostagram inbox. Listeners can optionally also post their boost on Nostr. Release pages show public boosts from Nostr under „Boosts on Nostr".

// custom record 7629169 on the keysend payment
{
  "podcast": "Album Title",
  "episode": "Track Title",
  "guid": "…",
  "episode_guid": "…",
  "action": "boost",
  "app_name": "podtunes",
  "app_url": "https://podtunes.app",
  "value_msat_total": 10000,
  "sender_name": "Jane",
  "message": "Lovely album!\n\nSent via podtunes.app"
}

Funding(podcast:funding)

When a feed declares podcast:funding, release and artist pages show a Donate button linking to the given URL. The feed's own funding message is shown as the button's tooltip.

<podcast:funding url="https://artist.example/donate">
  Buy me a coffee
</podcast:funding>

Podping

podtunes listens to Podping on the Hive blockchain. Every minute a job reads new blocks and immediately refreshes the feeds that announced an update, so new releases appear within minutes instead of waiting for the next scheduled crawl.

OP3

For feeds that route their enclosures through the Open Podcast Prefix Project (op3.dev), podtunes shows the public 30-day download count as an OP3 badge linking to the show's OP3 page. These public download counts are also one of the signals in the weekly podtunes chart.

<enclosure url="https://op3.dev/e/https://artist.example/album.mp3"
           type="audio/mpeg" length="…" />

Txt(podcast:txt)

podtunes reads podcast:txt with purpose="ai", "ai-disclosure" or "ai-transparency" as an explicit AI disclosure and marks the release with an „AI" badge. Listeners can hide AI releases in listings and charts.

<podcast:txt purpose="ai">
  Vocals and drums on this release were generated with AI assistance.
</podcast:txt>

For developers

Open a release by its feed GUID, or jump straight to one track:

https://podtunes.app/g/{feedGuid}
https://podtunes.app/g/{feedGuid}/{itemGuid}

The resolve API answers the same lookup as JSON. itemGuid is optional, andfeedUrl can be sent along to disambiguate feeds that share a GUID:

GET https://podtunes.app/api/public/resolve?feedGuid=…&itemGuid=…

The response carries the podtunes page plus the release and track metadata:

{
  "found": true,
  "url": "https://podtunes.app/releases/<releaseId>?t=<track-slug>",
  "releaseId": "…",
  "track": "<track-slug>",
  "title": "Track Title",
  "artist": "Artist Name",
  "image": "https://…/cover.jpg"
}

Missing a tag you'd like us to support? Let us know via the feedback form.