ASPN ActiveState Programmer Network  
ActiveState, a division of Sophos
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups
Submit Recipe
My Recipes

All Recipes
All Cookbooks


View by Category

Title: Scripting iTunes (for Windows) with Python
Submitter: Fabien C. (other recipes)
Last Updated: 2006/11/03
Version no: 1.0
Category:

 

5 stars 2 vote(s)


Description:

Here are two examples showing how to script iTunes for Windows with Python.
See below under "Discussion" for additional comments and explainations.

Source: Text Source

import win32com.client

def removeDeletedTracks():
  """This function will remove every song that is not currently accessible from your iTunes library"""
  #First, we create an instance of the iTunes Application
  itunes= win32com.client.Dispatch("iTunes.Application")
  
  #The ITTrackKindFile value will be use to check if a track is a physical file
  ITTrackKindFile=1
  
  #The tracks list object is obtained from the iTunes instance  with the following expression:
  #itunes.LibraryPlaylist.Tracks
  #this tracks list object has two fields/methods of interest:
  # The Count field contain the total number of tracks in your library
  # The Item(numTrack) method will return the track with number numTrack
  #     (Be aware that the numbering of the tracks start at 1, NOT at 0)
  mainLibrary = itunes.LibraryPlaylist
  tracks = mainLibrary.Tracks
  numTracks = tracks.Count
  deletedTracks=0
  
  #(optional)We can create a log file in which the names of the deleted songs are written
  #log=open("deletedTracks.txt","w")
  
  while numTracks  !=0:
    currTrack=tracks.Item(numTracks)
    if currTrack.Kind == ITTrackKindFile:
      if currTrack.Location == "":
        #Uncomment the lines below if you want to have the name of the deleted files saved in the log file
        #name_artist=currTrack.Artist
        #name_song=currTrack.Name
        #log.write("[%s] [%s]\n"%(name_artist.encode("utf-8"),name_song.encode("utf-8")))
        currTrack.Delete()
        deletedTracks+=1
    numTracks-=1
  
  
  if deletedTracks > 0:
    if deletedTracks == 1:
      print "Removed 1 dead track."
    else:
      print "Removed " + str(deletedTracks) + " dead tracks."
  else:
    print "No dead tracks were found."


    
def updateLyricsAndCreatePlaylist():
  """The aim of this function is to automatically add lyrics to the songs in your library.
  Additionally, a playlist named "SongsWithLyrics" is created, which will contain all the songs to 
  which lyrics have been added (so that you can find them easily if you feel like Karaokeing)
  Please note that it use a (non-provided) getLyrics function that, given an artist and a song name, 
  return the lyrics of the song or the None object if the lyrics are not available.
  """
  
  #We do the usual "initialisation" stuff, like in the removeDeadTracks function
  itunes= win32com.client.Dispatch("iTunes.Application")
  ITTrackKindFile=1
  mainLibrary = itunes.LibraryPlaylist
  tracks = mainLibrary.Tracks
  nbTracks = tracks.Count
  
  #We create a playlist named "SongsWithLyrics", which will contain all the updated songs
  playlist=itunes.CreatePlayList("SongsWithLyrics")
  
  for numTrack in range(1,nbTracks+1):
    currTrack = tracks.Item(numTrack)
    #Trying to access the lyrics field of WAV files seemed to raise an exception. Hence the following condition.
    if currTrack.Kind == ITTrackKindFile and currTrack.KindAsString!=u"WAV audio file":
      name_artist=currTrack.Artist
      name_song=currTrack.Name
      lyrics=currTrack.Lyrics
      #We update only songs which do not already have a lyrics
      if len(lyrics)==0:
        #The getLyrics function return the lyrics of a song (as a unicode string). I do not provide example sources for this function (see below)
        obtainedLyrics=getLyrics(name_artist,name_song)
        if obtainedLyrics!=None:
          #if we obtained the lyrics, we add the current track to our playlist...
          playlist.AddTrack(currTrack)
          #... and we update the lyrics field of the track
          currTrack.Lyrics=obtainedLyrics

Discussion:

Since most of the script for iTunes you can find of the web are written in AppleScript, I was wondering how I could script iTunes for Windows.
Then I discovered that iTunes for Windows had a COM API. Python having a very nice interface to COM (thanks to the win32com module), that make it very easy to script iTunes with Python.

There is nothing very sophisticated here, but there may be some others "Python and iTunes users" that are not aware of this possibility (as I was just a month ago). So I thought I would write a small recipe (my first so far) for that.
Additionaly, It makes for a simple introduction to COM programming with python.

You can download a documentation of the iTunes COM interface at the following address:
http://developer.apple.com/sdk/itunescomsdk.html
The doc is bundled with some C header, but don't worry, you do not need them. You only need the win32com module (which is already bundled with ActivePython)

I give two example scripts.
The first one is used for removing the songs of your library whose files you have deleted outside python. (Very useful, if like me, you don't let iTunes manage your library). It is actually a simple port of a javascript example provided in the iTunes COM documentation.

The second one is a script I used to automatically add lyrics to the songs in my library. This script is of course not very useful in itself without the getLyrics function that provide the lyrics text. But it is a good example of how to create playlist and modify the fields of a song.
I happened to have a small database of lyrics, so that was useful for me. If you are really interested in obtaining lyrics for your songs, look for lyrics website that provide a web API.



Add comment

No comments.



Highest rated recipes:

1. A simple XML-RPC server

2. Web service accessible ...

3. a friendly mkdir()

4. SOLVING THE METACLASS ...

5. Povray for python

6. Changing return value ...

7. Implementation of sets ...

8. bag collection class

9. deque collection class

10. Floating Point Simulator




Privacy Policy | Email Opt-out | Feedback | Syndication
© 2006 ActiveState Software Inc. All rights reserved.