Пример #1
0
 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
Пример #2
0
    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)'