# Requires Python 2.3 and pywin32 import os, sys, pythoncom, win32com.client, pywintypes, sets def main(): iTunes = win32com.client.gencache.EnsureDispatch("iTunes.Application") # Delete the old deselected albums playlist try: deselected_albums_playlist = iTunes.LibrarySource.Playlists.ItemByName('Deselected Albums') deselected_albums_playlist.Delete() except AttributeError: # Hopefully, this means that the playlist doesn't exist. Hopefully. ;-) pass # Build album to track(s) mapping, and sets of albums with selected and # de-selected tracks tracks_by_album = dict() albums_with_selected = sets.Set() albums_with_deselected = sets.Set() library = iTunes.LibraryPlaylist tracks = library.Tracks track_count = tracks.Count for track_index in range(1, track_count+1): track = tracks.Item(track_index) tracks_by_album.setdefault((track.Artist, track.Album), list()).append(track) if track.Enabled: albums_with_selected.add((track.Artist, track.Album)) else: albums_with_deselected.add((track.Artist, track.Album)) # Build set of fully deselected albums, i.e. albums with deselected tracks # and no selected tracks. deselected_albums = albums_with_deselected.difference(albums_with_selected) # Create and populate playlist deselected_albums_playlist = iTunes.CreatePlaylist('Deselected Albums') deselected_albums_playlist = win32com.client.CastTo(deselected_albums_playlist, 'IITUserPlaylist') for deselected_album in deselected_albums: for track in tracks_by_album[deselected_album]: deselected_albums_playlist.AddTrack(track) if __name__ == '__main__': main()