Remotely updating iTunes and MPD at the same time

Published: June 05, 2015

Like many other people, I enjoy listening to music. I have aggregated a reasonably large (~90 GB) library of digital music over the years, and, of course, my favorite way to listen to it is MPD.

Right now, I'm running MPD on my "media center" computer hellboy2, which (surprisingly?) is a MacBook running OSX Yosemite connected to an HDTV. Before I switched to MPD again (this is actually my second switch to MPD; I used it around 8 years ago on my first Linux systems), I used iTunes to manage my music library. One advantage of iTunes (and the main reason why I cannot stop using it) is that iTunes on a Mac is probably the most dependable way of syncing music to an iPod. This is the sole reason why I still want all of my music to be indexed by iTunes.

Up until recently, if I wanted to import music into my library, I would drag-and-drop the files into iTunes to make sure they end up in the right place. After that, I would run a quick mpc update to update my MPD library (which, of course, points to my "iTunes Media" folder).

This was a rather dirty approach to adding music to my library, and I cannot recommend it to anyone (Especially since it involves using GUI programs…). Fortunately, I stumbled upon this interesting post on StackExchange today. The user patrix explains that there exists a "magic" directory for iTunes that automatically imports its contents to the iTunes library. This is perfect! Using this "magic" folder, I can add add files to my iTunes by simply moving them into the folder ~/Music/iTunes/iTunes\ Media/Automatically\ Add\ to\ iTunes!

Naturally, I had to write a script that automates the process of adding music to my library. I usually write scripts in bash, but since this is really just a small wrapper around scp, I figured that I could whip up a fish-shell function instead. This is it:

function add-music --description 'Copy music files to a remote Mac, add them to iTunes, update mpd DB'
  # the remote computer
  set -l REMOTEHOST "hellboy2"
  set -l REMOTEUSER "trx"
  set -l REMOTEDIR "/Volumes/Data/Users/trx/Music/iTunes/iTunes\ Media/Automatically\ Add\ to\ iTunes"
  set -l REMOTE "$REMOTEUSER@$REMOTEHOST"
  # only do this if we have files to send
  if test (count $argv) = "0"
    echo "No files specified. Aborting."
    return -1
  end
  # now, test whether we can even speak to the remote
  if not ping $REMOTEHOST -c 1 -W 1 >/dev/null ^/dev/null
    echo "Can't reach remote host $REMOTEHOST. Aborting."
    return -1
  end
  # check whether SSH login works
  if not ssh $REMOTE "true" >/dev/null ^/dev/null
    echo "Can't establish SSH connection to remote host $REMOTEHOST (ip: "(dig +short $REMOTEHOST)"). Aborting"
    return -1
  end
  # now check whether iTunes is running on the remote
  if not ssh "$REMOTE" "ps aux | grep -q iTunes"
    echo "iTunes is not running on $REMOTE, you have to start iTunes first!"
    return -1
  end
  # if we reach this point, we're ready to send the files
  echo "Transferring music to $REMOTE..."
  scp $argv "$REMOTE":"$REMOTEDIR"
  echo "Updating music database..."
  ssh "$REMOTE" "mpc update"
end

This function can be used from any computer on the same network as the media center computer. So, for example, I can now take some MP3s on my main machine, ava, edit the ID3 tags to my liking using puddletag, and then place them in my library on hellboy2 using the above script. In the script, I am first making sure that scp can be used, then I copy all of the music files to the "magic" iTunes directory, and then I update the MPD library.

Quite elementary, but still cool. I did not expect iTunes to have a feature like this.

Hope everyone is enjoying the great music this summer,

Dennis