Record KUVO R&B Jukebox Stream Macro (v9.0.4)

One of my favorite live radio programs is the R&B Jukebox on Denver's KUVO Radio, delivering music of the

Golden Era of Rhythm & Blues, from the early 1940s through the late 1960s

While I don't live anywhere near Denver, I can get it via their live stream. Since it is at a time that is typically not convenient for live listening, I have set up a process to record the stream at the time it is on (Saturday night at 6 PM MST) and save the resulting mp3 file to iTunes.

The attached KM script

  1. Starts up at the time the show starts
  2. Uses streamripper to record the stream in real-time to disk as an MP3
  3. Imports the resulting audio file into iTunes for later listening

The star of the show (and prerequisite) is Streamripper which handles connecting to the stream and converting it to an MP3 file. This is a command-line program that is NOT included with macOS. If you use Homebrew, installation is as easy as

  1. brew install streamripper
  2. brew install faad2 libmad. These are listed separately as I found out after starting the stream rip that they are required to decode this particular stream. Other streams may need additional libraries.

Once Streamripper is installed, one simply has to wait for 8 PM on Saturdays (Please adjust from EST to your timezone) for the macro to start. After 2 hours, you will see a new audio file in iTunes that celebrates real R&B music.

This is obviously a very niche macro (unless you like old music), but may be helpful for others to record a different stream. I hope you find it useful.

I am by no means a KM expert, so this is probably a ham-handed attempt. If you have suggestions for improvement, I'd love to hear them!

Record KUVO R&B Jukebox.kmmacros (13 KB)

1 Like

Very interesting. I use Audio Hijack for something very similar. It works wonders for recording at a specific time, for example Accidental Tech Podcast (ATP) Live on Wednesdays at 9pm US/Eastern.

I could see someone adapting this to record ATP without needing Audio Hijack.

Also, AH is not as easy to automate as its predecessor, Audio Hijack Pro, was. I might be able to use this to record other live shows which are not quite as precise/reliable as ATP, such as Relay.fm’s shows.

All of which is to say: thank you! Your exact use case may be niche, but the idea is definitely not, and this is useful as a starting point.

@tjluoma I'm glad you can find a use for this! I would recommend checking the man page for stream ripper, as there are lots of goodies in there:

Streamripper records shoutcast and icecast compatible streams, in their native format. The following formats are supported: mp3, nsv, aac,
and ogg. The meta data within the stream are interpreted to determine the beginning and end of each song, and stores the songs on your hard
disk as individual files. In addition, streamripper includes a relay server for listening to the station while you are recording.

I use the -a option to write the entire 2-hour block to a single file but, without -a, stream ripper will detect silence in the stream and create individual tracks, naming the files with their metadata and including the metadata within each track. If the streamiest includes the metadata, you can get songs that are populated with artist and title!

Also of note is the -r option to create a relay server. This allows you record and re-stream the audio, which means you can listen over your local network as you record. If memory serves me correctly, you, like I, are one of those digital have-nots as far as unlimited data goes.

Curious. So it doesn’t seem to stop trying to reconnect when the stream is turned off, so you really need tell it how long to record. This isn’t particularly great with Relay.fm or ATP livestreams because they are not a set length, but the silence detection might be helpful at least.

Will definitely play around with it. Doesn’t look like the tool is regularly maintained, but maybe it just works well enough now that it doesn’t need too much tinkering with.

I was for a long time, when we were behind a satellite connection, but we moved to NY state about 2 years ago and now have a “regular” Internet connection via Charter/Spectrum. Which people love to complain about, but for me it has been such a much better experience and the reliability has been great. Not having to worry about a quota any more is life-changing. I hope that you get there someday too :slight_smile:

@tjluoma this option may be helpful

-c
Don't auto-reconnect
Normally streamripper will be very aggressive and try to re-connect to a dropped
stream. This option disables this behavior.

Also, you might want to turn on --debug to see if there any hints as to other options.

Thanks! I realized that streamripper hasn’t been updated in awhile, which led me to look for other ways of doing this, and I learned that ffmpeg can also do this, so I’ve been toying with that.

The problem with ffmpeg is that it has a gabillion options and the instructions are written by ĂĽbernerds.

The benefit of ffmpeg is that it has a gazillion users, so chances are good you can find a web page or forum post explaining how to do whatever it is you want to do.

Ah, interesting choice @tjluoma. I had no idea ffmpeg would read from a stream. I'm sure I missed that in its voluminous option list!

I know, right?

The crazy thing is that it's dead simple, too:

ffmpeg -i "$URL" "$FILENAME"

e.g.

ffmpeg -i 'http://stream.relay.fm:8000/stream' "$HOME/Music/Relay-fm-live.mp3"

or

ffmpeg -i 'http://marco.org:8001/listen' "$HOME/Music/ATP-live.mp3"

I used it to record ATP last night, and it seemed to work great. Much easier than trying to script Audio Hijack.

I'm glad that worked out for you! ffmpeg is indeed a Swiss Army Knife. I used it in a project a while back, using a Python script to wrap ffmpeg calls. I took a video and

  1. split it into its constituent frames
  2. did some image processing on each of the frames in another process
  3. combined all the frames back into a video

Figuring out the proper incantations was non-trivial, but it looked so simple once it was done. Kinda like AppleScript :rofl:

1 Like