diff --git a/server/app/api/album.py b/server/app/api/album.py index e80acc46..d2bd9c11 100644 --- a/server/app/api/album.py +++ b/server/app/api/album.py @@ -97,22 +97,17 @@ def get_album_bio(): @album_bp.route("/album/artists", methods=["POST"]) def get_albumartists(): - """Returns a list of artists featured in a given album.""" - data = request.get_json() + """ + Returns a list of artists featured in a given album. + """ + data = request.get_json() albumhash = data["hash"] tracks = instances.tracks_instance.find_tracks_by_hash(albumhash) tracks = [models.Track(t) for t in tracks] - artists = [] + artists = [a for t in tracks for a in t.artists] + artists = helpers.get_normalized_artists(artists) - for track in tracks: - for artist in track.artists: - artist = artist.lower() - if artist not in artists: - artists.append(artist) - - final_artists = [models.Artist(a) for a in artists] - - return {"artists": final_artists} + return {"artists": artists} diff --git a/server/app/helpers.py b/server/app/helpers.py index d85cc6ae..de40e019 100644 --- a/server/app/helpers.py +++ b/server/app/helpers.py @@ -180,3 +180,47 @@ class Ping: return True except (requests.exceptions.ConnectionError, requests.Timeout): return False + + +def get_normal_artist_name(artists: List[str]) -> str: + """ + Returns the artist name with most capital letters. + """ + if len(artists) == 1: + return artists[0] + + artists.sort() + return artists[0] + + +def get_artist_lists(artists: List[str]) -> List[str]: + """ + Takes in a list of artists and returns a list of lists of an artist's various name variations. + + Example: + >>> get_artist_lists(['Juice WRLD', 'Juice Wrld', 'XXXtentacion', 'XXXTENTACION']) + + >>> [['Juice WRLD', 'Juice Wrld'], ['XXXtentacion', 'XXXTENTACION']] + """ + artist_lists: List[List[str]] = [] + + for artist in artists: + for list in artist_lists: + if artist.lower() == list[0].lower(): + list.append(artist) + break + else: + artist_lists.append([artist]) + + return artist_lists + + +def get_normalized_artists(names: List[str]) -> List[models.Artist]: + """ + Takes in a list of artists and returns a list of models.Artist objects with normalized names. + """ + names = [n.strip() for n in names] + names = get_artist_lists(names) + names = [get_normal_artist_name(a) for a in names] + + return [models.Artist(a) for a in names] diff --git a/server/app/lib/playlistlib.py b/server/app/lib/playlistlib.py index 3cd896bf..dadfc0e7 100644 --- a/server/app/lib/playlistlib.py +++ b/server/app/lib/playlistlib.py @@ -11,7 +11,7 @@ from app import exceptions from app import instances from app import models from app import settings -from app.helpers import Get +from app.helpers import Get, get_normalized_artists from app.lib import trackslib from app.logger import get_logger from PIL import Image @@ -153,8 +153,5 @@ class GetPlaylistArtists: def __call__(self): artists = set() - for t in self.tracks: - for a in t.artists: - artists.add(a) - - return [models.Artist(a) for a in artists] + artists = [a for t in self.tracks for a in t.artists] + return get_normalized_artists(artists) diff --git a/server/app/lib/searchlib.py b/server/app/lib/searchlib.py index adf77b1e..d8b6b867 100644 --- a/server/app/lib/searchlib.py +++ b/server/app/lib/searchlib.py @@ -37,7 +37,6 @@ class Limit: class SearchTracks: - def __init__(self, tracks: List[models.Track], query: str) -> None: self.query = query self.tracks = tracks @@ -60,7 +59,6 @@ class SearchTracks: class SearchArtists: - def __init__(self, artists: set[str], query: str) -> None: self.query = query self.artists = artists @@ -78,19 +76,11 @@ class SearchArtists: limit=Limit.artists, ) - f_artists = [] - for artist in results: - aa = { - "name": artist[0], - "image": helpers.create_safe_name(artist[0]) + ".webp", - } - f_artists.append(aa) - - return f_artists + artists = [a[0] for a in results] + return helpers.get_normalized_artists(artists) class SearchAlbums: - def __init__(self, albums: List[models.Album], query: str) -> None: self.query = query self.albums = albums @@ -121,7 +111,6 @@ class SearchAlbums: class SearchPlaylists: - def __init__(self, playlists: List[models.Playlist], query: str) -> None: self.playlists = playlists self.query = query