So I wasn’t content with just one way of creating M3U playlists out of iTunes. I went and wrote another. There’s more than one way to do it, as I learned writing Perl programs.
Pity I’m writing in Python.
Anyway, this method only works on a Mac, because it uses Applescript. Actually, it uses appscript, an event bridge that lets you do what Applescript does, only in a real language like Python. It’s called iTunesm3u.py, and requires that you install py-appscript first. To use it, have iTunes open. Select a playlist. Then run the script (or double-click the script if you turn it into an app with py2app) and it’ll create an .m3u file in the same directory as the script.
#!/usr/bin/env python
# Using the appscript Python-to-applescript bridge, convert an iTunes
# playlist into m3u format.
#
# Author: Stephen Granade
# Date: 2 January 2009
import math, re, sys, os
from appscript import *
# Search-and-replace strings to adjust the mp3's locations if necessary.
sandrStrs = { "/Volumes": "smb://sargent" }
# For more information about what classes etc. are available from iTunes
# via appscript, see
# http://appscript.sourceforge.net/objc-appscript/iTunes-objc/index.html
# Get ahold of iTunes
iTunes = app('iTunes')
# The browser window's view is the currently-selected playlist
try:
playlist=iTunes.browser_windows[1].view()
except CommandError, detail:
if detail.errornumber == -1731:
print "There is no current playlist."
sys.stdout.write('\a')
sys.stdout.flush()
sys.exit()
else:
raise CommandError, detail
# Use the playlist's name as that of the m3u file
outfn = os.path.abspath(__file__)
outfn = os.path.join(os.path.dirname(outfn),playlist.name()+".m3u")
outf = open(outfn, "w")
outf.write("#EXTM3U\n")
for track in playlist.tracks():
# Skip any files whose locations aren't currently available
# If the file doesn't exist on disk, then trying to access the
# location will throw an AttributeError exception.
try:
fileloc = track.location().path
if not os.path.isfile(fileloc):
throw(AttributeError)
# Perform search-and-replace on the file location
for old, new in sandrStrs.iteritems():
fileloc = fileloc.replace(old, new)
durstr = "%d" % math.floor(track.duration())
outf.write("#EXTINF:"+durstr+","+track.name()+"\n")
outf.write(fileloc+"\n")
except AttributeError:
print "\""+track.name()+"\" isn't available on disk. Skipping."