# 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()