def new_album(self, track, tags): album_artist = track_artist = finders.tag_finder(track, tags["album_artist"]) if album_artist == "Unkown": album_artist = track_artist = finders.tag_finder(track, tags["artist"]) album_name = finders.tag_finder(track, tags["album"]) album_year = finders.tag_finder(track, tags["year"]) album_genre = finders.tag_finder(track, tags["genre"]) album_type = "Unkown" # TODO: implement this album_in_database = models.Albums.query.filter_by(name=album_name, album_artist=album_artist).first() if album_in_database == None: album_db = models.Albums(album_name, album_year, album_type, album_artist, 0, album_genre) db.session.add(album_db) db.session.commit() return album_db else: # print "read %s" %(album_in_database) return album_in_database
def full_rescan(self, use_cache=True): if use_cache == False: simple_cache_tracks = [time.time()] elif use_cache == True: try: simple_cache_tracks = cache.tracks(simple_cache_tracks) except NameError: simple_cache_tracks = [time.time()] global simple_cache_tracks music_count = 0 cache_hit = 0 tracks_added = 0 path_updated = 0 db.create_all() mp3_tags = {'artist':'TPE1', 'album':'TALB', 'title':'TIT2', 'number':'TRCK', 'year':'TDOR', 'genre':'TCON', 'album_artist':'TPE2'} cover_names = ['folder', 'cover', 'album', 'front'] start = time.time() for root, dirs, files in os.walk(musicfolder): for file in files: if file.endswith('.mp3'): tags = mp3_tags if not file.endswith('.mp3'): continue music_count += 1 file_location = os.path.abspath(os.path.join(root, file)).decode('ISO-8859-1') track_cache_id = (file_location) if track_cache_id in simple_cache_tracks: cache_hit += 1 continue try: track = File(os.path.abspath(os.path.join(root, file))) except EOFError: simple_cache_tracks.append(track_cache_id) continue track_artist = finders.tag_finder(track, tags['artist']) track_artist = finders.tag_finder(track, tags['artist']) track_title = finders.tag_finder(track, tags['title']) if track_title == 'Unkown': track_title = file.split(".")[:-1][0] if file.endswith('.mp3'): track_length = int(MP3(os.path.abspath(os.path.join(root, file))).info.length) track_format = u'mp3' track_number = finders.tag_finder(track, tags['number']) track_year = finders.tag_finder(track, tags['year']) track_genre = finders.tag_finder(track, tags['genre']) date_added = datetime.datetime.today() track_album = query.write.new_album(track, tags) track_hash = hashlib.md5() track_hash.update(track_title+track_artist+str(track_length)+str(track_album)) track_id = unicode(track_hash.hexdigest()) if track_cache_id not in simple_cache_tracks: simple_cache_tracks.append(track_cache_id) database_query = models.Tracks.query.get(track_id) if database_query != None: if database_query.file_location == file_location: continue else: try: simple_cache_tracks.remove(database_query.file_location) except ValueError: pass if track_id == database_query.id: path_updated += 1 print file_location print database_query.file_location database_query.file_location = file_location continue else: db.session.flush() data_artwork = 'none' data_artwork_file = 'none' for cover_name in cover_names: cases = {1:switchcase.upper, 2:switchcase.lower, 3:switchcase.to_str, 4:switchcase.title} for case in cases: cover_name_in_use = cases[case](cover_name) for extension in ['jpg', 'jpe', 'jpeg', 'png', 'bmp']: if os.path.exists(os.path.join(root, cover_name_in_use+'.'+extension)): external_artwork = True artwork = unicode(os.path.abspath(os.path.join(root, cover_name_in_use+'.'+extension))) data_artwork = "found" continue if data_artwork != "found": try: external_artwork = True artwork_data = track.tags['APIC:'].data except KeyError: artwork = 'none' external_artwork = False else: mimetype = mimetypes.guess_extension(track.tags['APIC:'].mime, strict=False) if mimetype == None: mimetype = 'jpg' with open('artwork/' + str(track_id) + mimetype, 'wb') as img: img.write(artwork_data) artwork = unicode('artwork/' + str(track_id) + mimetype) track_db = models.Tracks(track_id, track_title, track_album, track_artist, track_year, track_genre, track_format, track_length, date_added, file_location, external_artwork, artwork) db.session.add(track_db) tracks_added += 1 db.session.commit() db.session.commit() return 'Library refreshed, scanned ' + str(music_count) + ' tracks, we hit the cache ' + str(cache_hit) + ' times. It took ' + str(time.time() - start) + ' seconds. In total ' + str(tracks_added) + ' tracks were added. We updated the path for ' + str(path_updated) + ' file(s)'