Tell me more…

The global, distributed directory I’m talking about is—of course—our beloved, ubiquitous, Domain Name System (DNS).

When we built the web

No one required you to register your web site at a centrally-controlled directory. There is no centrally controlled web site directory. If you know a web site’s hostname, www.example.com or openpodcastdirectory.org, you can use your favorite web browser to go directly to the web site.

Wait. How does that actually work anyway?

The “web” is built on top of a directory that already existed. The Internet already had a distributed directory; no one controls the entire thing. We each add to this global directory when we register a new domain name. One by one, we are all writing the global, distributed directory. This directory already contains lots of information beyond just the location of web sites; it includes how to deliver email, anti-spam information, and much more.

The idea of the OPD is simply to use that same directory to tell everyone where our podcast feeds are located. In effect, we’re building a “podweb” on top of the existing directory.

OPD in players and platforms

Applications already contain resolver libraries, right? They can find a podcast show’s feed file given a valid URL. So supporting OPD in a pod player is as simple as…

  1. When someone searches for a podcast, permit them to enter a hostname. Let’s say they enter, example.com.
  2. Perform a resolver query for type TXT.
  3. Look through the record set returned for a data value that starts with v=opd1 (that’s, vee-equals-oh-pee-dee-one-space)
  4. The data in such a record should be a space-delimited list.
  5. Find the url=… pair in the list.
  6. The URL is the feed for the show.
    (There’s been some discussion about what multiple OPD records should mean. But, probably, this should mean different data feeds for a single show; For example: MP3 vs AAC encoded audio feeds, or both OPML and RSS layouts.)
  7. Continue as you would if you’d gotten a URL from some centrally controlled directory.

For example…

Craigs-iMac:~ craig$ dig txt openpodcastdirectory.org

; <<>> DiG 9.10.6 <<>> txt openpodcastdirectory.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60972
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;openpodcastdirectory.org.	IN	TXT

;; ANSWER SECTION:
openpodcastdirectory.org. 14400	IN	TXT	"v=opd1 url=http://example.com/fake/podcast/url/demo"
openpodcastdirectory.org. 14400	IN	TXT	"v=spf1 a mx ptr include:bluehost.com ?all"

;; Query time: 63 msec
;; SERVER: 192.168.156.1#53(192.168.156.1)
;; WHEN: Sat Mar 28 17:00:39 EDT 2020
;; MSG SIZE  rcvd: 171

Technical spec

This is modeled on SPF records. Those are defined in RFC 4408, and clarified by RFC 7208—but we’ll soon have an RFC for the OPD records too. 🙂

Want to discuss?

ɕ