Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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'
Ejemplo n.º 3
0
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