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"])
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}
+44
View File
@@ -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]
+3 -6
View File
@@ -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)
+2 -13
View File
@@ -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