diff --git a/DataBase.py b/DataBase.py index 5eabc68..3132b7b 100644 --- a/DataBase.py +++ b/DataBase.py @@ -4,6 +4,13 @@ import os data_dir = 'prefetched' +class SongTags: + def __init__(self, title='', artist='', album=''): + self.artist = artist + self.title = title + self.album = album + + def get_data(name): file_path = os.path.join(data_dir, f"{name}.json") try: diff --git a/LinkerPatternGenerator.py b/LinkerPatternGenerator.py index e81a423..bb16839 100644 --- a/LinkerPatternGenerator.py +++ b/LinkerPatternGenerator.py @@ -2,6 +2,7 @@ from DataBase import * from SpotifyWebAPI import find_song, update_access_token from fuzzywuzzy import fuzz +from tqdm import tqdm def spotify_pattern_generator(): @@ -11,7 +12,6 @@ def spotify_pattern_generator(): spotify_library = get_data("tracks") def find_local_songs_on_spotify(local_lib): - from tqdm import tqdm total = len(local_library) found_tracks_map = {} with tqdm(total=total, desc='Searching local songs on spotify') as pbar: @@ -60,7 +60,6 @@ def fuzzy_pattern_generator(): return sorted_results def resolve_tracks(s_patterns, t_patterns): - from tqdm import tqdm pattern_map = {} @@ -89,9 +88,43 @@ def fuzzy_pattern_generator(): save_data(fuzzy_pattern, "link_pattern_fuzzy") +def fuzzy_tag_pattern_generator(): + local_library = get_data("local_library") + spotify_library = get_data("tracks") + mappings = {} + + def fuzzy_tags_ratio(first: SongTags, second: SongTags): + title_ratio = fuzz.ratio(first.title, second.title) / 100 + artist_ratio = fuzz.ratio(first.artist, second.artist) / 100 + album_ratio = fuzz.ratio(first.album, second.album) / 100 + return sum([title_ratio, artist_ratio, album_ratio]) / 3 + + with tqdm(total=len(local_library), desc='Searching local songs on spotify') as pbar: + for local_track_id, local_track in local_library.items(): + mapping = mappings.get(local_track_id, {"score": 1.0, "items": []}) + ratios = [] + for remote_track in spotify_library: + track = remote_track['track'] + + tag1 = SongTags(local_track['name'], local_track['artist'], local_track['album']) + tag2 = SongTags(track['name'], get_artists_str(track['artists']), track['album']['name']) + + ratios.append((fuzzy_tags_ratio(tag1, tag2), track['id'])) + + ratios.sort(reverse=True, key=lambda x: x[0]) + if ratios[0][0] > 0.8: + mapping['items'] = [ratios[0][1]] + + mappings[local_track_id] = mapping + pbar.update(1) + + save_data(mappings, "link_pattern_tags") + + def run_pattern_generators(): #fuzzy_pattern_generator() - spotify_pattern_generator() + #spotify_pattern_generator() + fuzzy_tag_pattern_generator() if __name__ == "__main__": diff --git a/main.py b/main.py index b1b1c79..339152f 100644 --- a/main.py +++ b/main.py @@ -12,9 +12,12 @@ def get_playlist_names(pl): return [name for name, items in pl.items()] -def print_playlist_tracks(name): +def print_playlist_tracks(pl_id: int): + pls = list(playlists) + name = pls[pl_id] + pl = playlists[name] print(name) - for track in playlists[name]: + for track in pl: track_data = track['track'] track_name = track_data['name'] artists = get_artists_str(track_data['artists']) @@ -46,9 +49,11 @@ def print_stats(): def print_tracks(): + track_idx = 0 for trackItem in user_tracks: track = trackItem['track'] - print(f" '{track['name']}' - {get_artists_str(track['artists'])}") + print(f" {track_idx}: '{track['name']}' by '{get_artists_str(track['artists'])}'") + track_idx += 1 class Interpreter(cmd.Cmd): @@ -57,13 +62,16 @@ class Interpreter(cmd.Cmd): def do_playlists(self, arg): """prints user playlists""" - print("\n".join(get_playlist_names(playlists))) + pl_id = 0 + for pl in get_playlist_names(playlists): + print(f"{pl_id} - {pl}") + pl_id += 1 def do_playlist_tracks(self, arg): """prints playlist [name]""" try: - name = arg.split()[0] - print_playlist_tracks(name) + pl_id = int(arg.split()[0]) + print_playlist_tracks(pl_id) except IndexError: print("Invalid input")