def parse_itunes(fname): itunes_fname = SAVE_ITUNES_DB_FNAME if itunes_fname==None: itunes_fname = 'itunes.db' parser = xml.sax.make_parser() handler = ITunesHandler() parser.setContentHandler(handler) parser.parse(fname) parsed_artists = [] #strings of artist names parsed_artists_lower = [] #lowercase strings of all artist name strings added to parsed_artists parsed_tracks = [] for track in handler.tracks: parsed_tracks.append(track) if type(track.artist) != type(None): # otherwise blank artist field causes error if unicode.lower(track.artist) not in parsed_artists_lower: parsed_artists.append(track.artist) parsed_artists_lower.append(unicode.lower(track.artist)) for i in range(len(parsed_artists)): parsed_artists[i] = Itunes_Artist(parsed_artists[i]) #convert strings into Itunes_Artist objects count = 0 total_count = len(parsed_artists) report_at = [10,20,30,40,50,60,70,80,90,99,1000] #1000 included just in case for artist in parsed_artists: #itunes_artist objects for track in parsed_tracks: #itunes_track objects if type(track.artist) != type(None) and type(artist.name) != type(None) and type(track.track) != type(None): if unicode.lower(track.artist) == unicode.lower(artist.name) and unicode.lower(track.track) not in artist.track_names_lower: artist.track_names_lower.append(string.lower(track.track)) artist.tracks.append(track) elif unicode.lower(track.artist) == unicode.lower(artist.name) and unicode.lower(track.track) in artist.track_names_lower: artist.duplicate_track_names.append(unicode.lower(track.track)) count += 1 progress = int((float(count) / total_count) * 100) if progress >= report_at[0]: print 'Progress: %3d' % (progress),'%' report_at.remove(report_at[0]) print 'Processing duplicate tracks...' for artist in parsed_artists: [artist.duplicate_tracks.append(track) for track in artist.tracks if string.lower(track.track) in artist.duplicate_track_names] print 'Creating library file...' library = Itunes_Library(parsed_artists) print 'Complete! Library being saved as \'%s\''%(itunes_fname) datamgmt.save(library,itunes_fname)
def process_info(fname='incompleteartists.db',v=False): #get playcount info for all artists, returns a new list of artists """Gets all playcount info for all artist objects. v=verbose""" global artists import random artists = datamgmt.load(fname) fname = 'artists.db' random.shuffle(artists) newartists =[] artist_count = len(artists) print 'Getting info for each track by %d artists. This could take a very long time (approximately 1 minute per hundred tracks).' % artist_count for i in range(artist_count): print '%d/%d' % (i,artist_count) try: processed_artist = process_artist(artists[i],v) except: try: processed_artist = process_artist(artists[i],v) except: print 'Errors processing',unicode(artists[i]) newartists.append(processed_artist) artists = newartists print 'calculating ratios...' calculate_ratios() try: datamgmt.save(artists,fname) print 'saved successfully' except: try: NETWORK.disable_caching() datamgmt.save(artists,fname) print 'data saved successfully' NETWORK.enable_caching() except: global errors errors = newartists print 'Error during save. Artists stored as var: errors'
def get_lfm_info(itunes_library): """ Gets info from last.fm for each Itunes_Artist object in the artists field of an itunes_library object. Saves a list of Hybrid_Track files""" tracks = [] #list of all tracks of all artists #create list of all tracks print 'creating list of all tracks' for artist in itunes_library.artists: for track in artist.tracks: tracks.append(track) print 'list created, %d tracks to parse'%(len(tracks)) report_at = [5,10,20,30,40,50,60,70,80,90,1000] total_count = len(tracks) #lists for fail/success tracks fails = [] no_fail=[] #make each Itunes_Track in tracks into a Hybrid_Track for count in range(total_count): try: try: tracks[count] = Hybrid_Track(tracks[count]) no_fail.append(tracks[count]) except pylast.WSError: print 'error with', unicode(tracks[count]) fails.append(tracks[count]) except: print 'ascii error on track',count #this except statement SHOULD be unneccessary now, with the track printed in unicode fails.append(tracks[count]) # print 'xml error on:',tracks[count] progress = int((float(count)/total_count)*100) if progress >= report_at[0]: print 'Progress %3d' % (progress),'%' report_at.remove(report_at[0]) print 'Progress: 100 %' print 'Total failed tracks: %d' % (len(fails)) #TEST-CODE: checksum = len(no_fail)+len(fails) if checksum != len(tracks): print 'ERROR HAPPEN FFFFFF' tracks = no_fail #save list of Itunes_Artist objects containing Hybrid_Track objects within their tracks field. #10/12/09: currently saves list of Hybrid_Track objects try: artists = [] artistnames=[] for track in tracks: if track.get_artist().get_name() not in artistnames: artists.append(track.get_artist()) artistnames.append(track.get_artist().get_name()) for artist in artists: artist.tracks = [] for track in tracks: if track.get_artist() == artist: artist.tracks.append(track) artist.trackcount=len(artist.tracks) except: return tracks print 'saving!' datamgmt.save(artists,'incompleteartists.db') datamgmt.save(fails,'failedtracks.db') if debug==True: return artists,fails