add a get_normal_artist_name function to try and normalize artist name variations

- add a get_artist_lists function to group artist name variants into a list
- add a get_normalized_artists function to return normalized artist objects
- use the above functions in:
    - searching artists
    - album artists
    - playlist artists
This commit is contained in:
geoffrey45
2022-07-16 16:40:38 +03:00
parent 3882317cb6
commit 0bdc109082
4 changed files with 56 additions and 31 deletions
+7 -12
View File
@@ -97,22 +97,17 @@ def get_album_bio():
@album_bp.route("/album/artists", methods=["POST"]) @album_bp.route("/album/artists", methods=["POST"])
def get_albumartists(): 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"] albumhash = data["hash"]
tracks = instances.tracks_instance.find_tracks_by_hash(albumhash) tracks = instances.tracks_instance.find_tracks_by_hash(albumhash)
tracks = [models.Track(t) for t in tracks] 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: return {"artists": artists}
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}
+44
View File
@@ -180,3 +180,47 @@ class Ping:
return True return True
except (requests.exceptions.ConnectionError, requests.Timeout): except (requests.exceptions.ConnectionError, requests.Timeout):
return False 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]
+3 -6
View File
@@ -11,7 +11,7 @@ from app import exceptions
from app import instances from app import instances
from app import models from app import models
from app import settings from app import settings
from app.helpers import Get from app.helpers import Get, get_normalized_artists
from app.lib import trackslib from app.lib import trackslib
from app.logger import get_logger from app.logger import get_logger
from PIL import Image from PIL import Image
@@ -153,8 +153,5 @@ class GetPlaylistArtists:
def __call__(self): def __call__(self):
artists = set() artists = set()
for t in self.tracks: artists = [a for t in self.tracks for a in t.artists]
for a in t.artists: return get_normalized_artists(artists)
artists.add(a)
return [models.Artist(a) for a in artists]
+2 -13
View File
@@ -37,7 +37,6 @@ class Limit:
class SearchTracks: class SearchTracks:
def __init__(self, tracks: List[models.Track], query: str) -> None: def __init__(self, tracks: List[models.Track], query: str) -> None:
self.query = query self.query = query
self.tracks = tracks self.tracks = tracks
@@ -60,7 +59,6 @@ class SearchTracks:
class SearchArtists: class SearchArtists:
def __init__(self, artists: set[str], query: str) -> None: def __init__(self, artists: set[str], query: str) -> None:
self.query = query self.query = query
self.artists = artists self.artists = artists
@@ -78,19 +76,11 @@ class SearchArtists:
limit=Limit.artists, limit=Limit.artists,
) )
f_artists = [] artists = [a[0] for a in results]
for artist in results: return helpers.get_normalized_artists(artists)
aa = {
"name": artist[0],
"image": helpers.create_safe_name(artist[0]) + ".webp",
}
f_artists.append(aa)
return f_artists
class SearchAlbums: class SearchAlbums:
def __init__(self, albums: List[models.Album], query: str) -> None: def __init__(self, albums: List[models.Album], query: str) -> None:
self.query = query self.query = query
self.albums = albums self.albums = albums
@@ -121,7 +111,6 @@ class SearchAlbums:
class SearchPlaylists: class SearchPlaylists:
def __init__(self, playlists: List[models.Playlist], query: str) -> None: def __init__(self, playlists: List[models.Playlist], query: str) -> None:
self.playlists = playlists self.playlists = playlists
self.query = query self.query = query