""" This library contains all the functions related to the search functionality. """ from typing import List from rapidfuzz import fuzz, process from unidecode import unidecode from app import models ratio = fuzz.ratio wratio = fuzz.WRatio class Cutoff: """ Holds all the default cutoff values. """ tracks: int = 90 albums: int = 90 artists: int = 90 playlists: int = 90 class Limit: """ Holds all the default limit values. """ tracks: int = 150 albums: int = 150 artists: int = 150 playlists: int = 150 class SearchTracks: def __init__(self, tracks: List[models.Track], query: str) -> None: self.query = query self.tracks = tracks def __call__(self) -> List[models.Track]: """ Gets all songs with a given title. """ tracks = [unidecode(track.og_title).lower() for track in self.tracks] results = process.extract( self.query, tracks, scorer=fuzz.WRatio, score_cutoff=Cutoff.tracks, limit=Limit.tracks, ) return [self.tracks[i[2]] for i in results] class SearchArtists: def __init__(self, artists: list[models.Artist], query: str) -> None: self.query = query self.artists = artists def __call__(self) -> list: """ Gets all artists with a given name. """ artists = [unidecode(a.name).lower() for a in self.artists] results = process.extract( self.query, artists, scorer=fuzz.WRatio, score_cutoff=Cutoff.artists, limit=Limit.artists, ) artists = [a[0] for a in results] return [self.artists[i[2]] for i in results] class SearchAlbums: def __init__(self, albums: List[models.Album], query: str) -> None: self.query = query self.albums = albums def __call__(self) -> List[models.Album]: """ Gets all albums with a given title. """ albums = [unidecode(a.title).lower() for a in self.albums] results = process.extract( self.query, albums, scorer=fuzz.WRatio, score_cutoff=Cutoff.albums, limit=Limit.albums, ) return [self.albums[i[2]] for i in results] # get all artists that matched the query # for get all albums from the artists # get all albums that matched the query # return [**artist_albums **albums] # recheck next and previous artist on play next or add to playlist class SearchPlaylists: def __init__(self, playlists: List[models.Playlist], query: str) -> None: self.playlists = playlists self.query = query def __call__(self) -> List[models.Playlist]: playlists = [p.name for p in self.playlists] results = process.extract( self.query, playlists, scorer=fuzz.WRatio, score_cutoff=Cutoff.playlists, limit=Limit.playlists, ) return [self.playlists[i[2]] for i in results]