A short review of the Huffduffer podcast feed service

Recently, I posted some ideas about podcast subscription lists/listening lists, and one of my readers (John Johnston) suggested I look at the Huffduffer podcast feed service. I found out that I already had an account – amazing! Must have forgotten!

I tried it this evening. After I logged in, I clicked on the “Huffduff it!” button at the top of the page. This took me to another page which had text boxes for the audio URL, title, description, and tags. I filled in the fields and saw a file added to the previous file that I had “huffduffed”. I then took the feed URL, and was able to subscribe to it to PocketCasts, and to listen to one of the files. Bing!

This service provides the basic functionality of creating a feed from audio files, and also hosts the feed, so the user does not have to provide any hosting. Nice! In the next few days, I will review some other services that I discovered after Huffduffer. Many thanks to John Johnston for mentioning the Huffduffer service.

Musing about podcast subscription/listening lists

What is a podcast subscription/listening list? Well, let’s start with talking about subscription lists. For most, if not all podcast clients, OPML files containing a list of the podcast feeds being monitored have been the defacto standard for import/export of podcast feed lists. Prior to use in podcast clients, OPML files have been used as a defacto standard for import/export of feed lists for feed aggregator apps.

As far back as 2012, Dave Winer was pushing for the use of OPML subscription lists within podcast apps. In this context, he wanted podcast apps to be able to subscribe to an OPML file with a URL, so that people could automatically get any updates to the OPML, and subsequently, anything new would be added to their podcast app.

In the fall of 2024, Dave Winer brought up this idea several times and later created a page describing this idea in more detail, and calling it “listening lists”. Dave Winer created a Github issue to collect feedback on this idea, and Dom Christie suggested the following:

I have been wondering if the episodes from curated lists could be published in their own RSS feed? That way, users (and not just podcasters) could created their own feeds, listenable in any app.

That same day, Dave Winer linked to a page describing a RSS feed made up of first episodes of fiction podcasts. An overview page lists the podcast episodes and also provides audio players for them – neat! From the looks of it, this is a made-by-hand page, although there could be some tool or tooling involved.

This suggests several ideas to me:

  • App to create a podcast feed which merges a list of other podcast feeds
  • App to allow users to create a podcast feed of podcast episodes that they select (it could include the ability to host the created feed)

I did some experiments over the holidays with Dave Winer’s RSS NPM module to create a podcast feed of some audio files that were not organized as a podcast. However, the experiment shows how this type of feed can be created. I am going to start working on this concept. If anyone reading this is interested in collaborating, let me know!

Followup on creating WordPress podcast feeds

In November 2024, I wrote a post about an issue I discovered in trying to create a WordPress category feed for a set of audio posts. The category feed had issues in being recognized by a podcast app. I found that when I set the post type/format as “Audio” in the WordPress editor, the category feed could be recognized by a podcast app.

Last month, I noticed a tweet by Ken Smith that some WordPress themes do not have the support in the editor interface for the post type/format. He linked to a video (shown at the end of this post) showing how to modify WordPress files to add this feature to a theme if not present. I checked some of my older WordPress websites, and found that several of them had this issue. I appreciate Ken bringing this to a wider attention.

Experimenting with manually creating podcast feeds

Earlier this year, Dave Winer began an experiment to create a podcast feed with shownotes for the Morning Coffee Notes podcasts that he created at the beginnings of podcasting in 2004. He created a Node.js app (podcastBuilder) to create the feed and the shownotes, which were in an OPML outline (both data for the feed and the shownotes). The feed is available through Apple Podcasts and, of course, Scripting News.

I was interested in trying this out, but I did not want to fire up the Drummer outliner app to create an OPML file for this app. I then remembered that Dave Winer had another Node package (rss) to create RSS feeds based on JSON data input. After some experimentation, I was able to add elements to the rss package example to create a feed with enclosures and other podcast information like the podcastBuilder app was creating. My manually created feed is hosted here, and three people have managed to load this in a podcast app and listen to the files (audio from Ken Smith’s essays for Michiana Chronicles). If you would like to try it, I have created a Github repo with the Javascript file I used for creating the feed, the output feed from the app, and some simple instructions. Enjoy!

Making your own media

A few days ago, Dave Winer talked about “making your own media”, meaning that individuals could create lists of sources and distribute them. Dave called for Democratic podcasts, but he has a podcast “river of news” site with multiple podcasts. I thought – why not create a river of news site for some other list of sources as an example?

I recently became aware of a blogging challenge called Blaugust (during the month of August, natch!). On their media page, they had a link to an OPML file of all the participants. I copied that file, added it to my River5 subscription list, and created a river of news site for that list of bloggers. I have instructions on how to do this for yourself – so get busy!

For the record, I have added a link to my OPML feed list in the Links section of my navigation bar (My Blogroll/Feed List). However, I had to add a Links block in my list of widgets before I could see it – grrr!

Updating my River5 install

I have had some problems recently in getting the web reader feature in my River5 RSS reader install to work. Since I recently revised my main subscription list to create a blogroll OPML file, I decided it would be good to perform a clean install and start fresh with a smaller set of feed lists. I am recording the following steps to document my work.

  • Completed backup of current river5 folder from server
  • Saved my latest feed list as readinglist.txt
  • Found post about River5 callbacks, could not find my callback script
  • Looked at artcasting site, saw how I used a modified form of riverbrowser.js to display the pictures
  • Deleted river5 install on server
  • Uploaded clean River5 install from Github to river5 folder on server
  • Updated package.json to recent changes (allowing latest Node.js version)
  • Updated config.json to current content (removing initial tab setup from Github, setting max number of items in a river, setting podast download flag to FALSE
  • Updated lists folder
  • Added exampleRiver4Callback.js from C:\NodeApps\Rivers to callbacks\addToRiver folder on server
  • Did npm install, no issues
  • Did forever stop river5.js (had to, since server would not allow me to run new app)
  • Did node river5.js, watched startup in Putty, saw web view of lists
  • Did forever run river5.js
  • Checked my reading list app, saw new river file, all is well!

Using ChatGPT to convert a list of feed URLs to OPML

After seeing the interest in blogrolls by Dave Winer, I decided to spend some time updating my RSS subscription list and learning about using ChatGPT as a programmers’ assistant at the same time. I use the River5 feed reader, along with a single page web app to display my feeds. River5 supports having a feed list as a text file with one feed URL per line. I wanted to see how well ChatGPT could create an OPML subscription list from this text file.

Here was my first prompt:

Create a Javascript program to run under Node.js. The program should take as input a text file that contains one URL on each line. The program should output an OPML file with the URLs added to the outline such that the file can be uploaded to a feed reader that uses OPML as an input source for subscriptions. In addition, create a package.json file for this program.

This created an app which ran without an error, and created a basic OPML file. Each element had the type attribute set to “rss”. However, the text and xmlUrl attributes were both set to the feed URL. I decided to experiment to see how much further ChatGPT could go.

Here was my second prompt:

Create a Javascript program to run under Node.js. The program should take as input a text file that contains one URL on each line. The program should output an OPML file with the URLs added to the outline such that the file can be uploaded to a feed reader that uses OPML as an input source for subscriptions. The program should also fetch a copy of each URL, and if a feed is available, get the value of the <title> element within the <channel> element and set the text attribute of each entry in the OPML file to the <title> element for that feed/URL. If the feed is not available, set the text attribute of each entry in the OPML file to the URL value. In addition, create a package.json file for this program.

I was more specific here, asking that each feed URL be read to try to get the title of the feed and set the text attribute to the feed title. This version had a small programming error, but I easily fixed it, and the script was able to run without a problem. The output OPML file was able to fill in a lot of the titles, but some feeds still had problems (in particular, Blogspot blogs and other blogs using Atom instead of RSS). Also, this version created a separate “_attributes” element within the outline element, which did not have the same look as an example OPML file I reviewed.

Based on my review, I created a third prompt:

Create a Javascript program to run under Node.js. The program should take as input a text file that contains one URL on each line. The program should output an OPML file with the URLs added to the outline such that the file can be uploaded to a feed reader that uses OPML as an input source for subscriptions. The program should also fetch a copy of each URL, and if a RSS feed is available, get the value of the <title> element within the <channel> element and set the text attribute of the entry in the OPML file to the <title> element for that feed/URL. If an Atom feed is available, get the value of the <title> element and set the text attribute for that entry in the OPML file to the <title> element for that feed/URL. If the feed is not available, set the text attribute of the entry in the OPML file to the URL value. Each <outline> element should contain the following attributes: type = rss, htmlUrl = URL of the feed, xmlUrl = URL of the feed, text = value of the <title> element within the <channel> element if the feed is in RSS format, or the value of the <title> element if the feed is in Atom format. In addition, create a package.json file for this program.

This version went back to creating elements within the OPML file as single XML elements with all the attributes contained within the element. I tried some further refinements of this prompt, but had some issues with the generated code, so I then began manually iterating on the code generated by the third prompt. I had a WordPress feed which was redirecting to google.com, so I added some error checking if the data read from the feed was undefined. I also did some experimenting with the Blogspot feeds to find the correct HTML element to get the title of the feed and the site URL. Finally, I did an overall cleanup of feed URLs in the input file during my script troubleshooting.

Eventually, I was able to get all the data for the Blogspot feeds read correctly. The remaining Atom feeds were all generated from custom code, so there was too much variation to be able to easily get the title and the site URL from those feeds. I then hand-edited the output OPML file to add the remaining data I wanted.

Lessons learned:

  • It was easy to experiment with different prompts
  • Adding more detailed would refine the code generated by ChatGPT
  • For my app, there was a point of diminishing returns (got harder to specify the desired behavior – but could be due to lack of experience)

I have uploaded the app to this Github repo – give it a try!

Call for Twitter-like systems based on feeds

Dave Winer again calls for “a twitter-like system built with feeds, with all their limits”. In May 2023, I created My Status Tool (Github repo) using Node.js that provides the basic posting and reading functionality within Twitter, but using RSS and rssCloud as the enabling technologies. Colin Walker also created a PHP implementation (Github repo), and our two versions were able to interop. Dave also called for this back in December 2023 (my response), but from what I heard, Dave had some other ideas besides working with MyStatusTool. I don’t think that FeedLand is the system he was talking about, and I don’t think that Blogroll Social is the system either. Anyone interested in working on this?