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…
- When someone searches for a podcast, permit them to enter a hostname. Let’s say they enter,
example.com
. - Perform a resolver query for type
TXT
. - Look through the record set returned for a data value that starts with
v=opd1
(that’s, vee-equals-oh-pee-dee-one-space) - The data in such a record should be a space-delimited list.
- Find the
url=…
pair in the list. - 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.) - 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. 🙂
ɕ