From f6caee41a87b7977809f9ea1e1e086477e82974d Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Tue, 21 May 2024 15:52:41 +0200 Subject: [PATCH] feat: finished searching genious --- music_kraken/pages/genius.py | 106 ++++++++++++++++++++++++++++------- 1 file changed, 87 insertions(+), 19 deletions(-) diff --git a/music_kraken/pages/genius.py b/music_kraken/pages/genius.py index 7a609c8..1ff2eda 100644 --- a/music_kraken/pages/genius.py +++ b/music_kraken/pages/genius.py @@ -51,6 +51,90 @@ class Genius(Page): return super().get_source_type(source) + def add_to_artwork(self, artwork: Artwork, url: str): + if url is None: + return + + url_frags = url.split(".") + if len(url_frags) < 2: + artwork.append(url=url) + return + + dimensions = url_frags[-2].split("x") + if len(dimensions) < 2: + artwork.append(url=url) + return + + if len(dimensions) == 3: + dimensions = dimensions[:-1] + + try: + artwork.append(url=url, width=int(dimensions[0]), height=int(dimensions[1])) + except ValueError: + artwork.append(url=url) + + def parse_api_object(self, data: dict) -> Optional[DatabaseObject]: + object_type = data.get("_type") + + artwork = Artwork() + self.add_to_artwork(artwork, data.get("header_image_url")) + self.add_to_artwork(artwork, data.get("image_url")) + + source: Source = Source(self.SOURCE_TYPE, data.get("url"), additional_data={ + "id": data.get("id"), + "slug": data.get("slug"), + "api_path": data.get("api_path"), + }) + + if source.url is None: + return None + + if object_type == "artist": + return Artist( + name=data.get("name"), + source_list=[source], + artwork=artwork, + ) + + if object_type == "album": + self.add_to_artwork(artwork, data.get("cover_art_thumbnail_url")) + self.add_to_artwork(artwork, data.get("cover_art_url")) + + return Album( + title=data.get("name"), + source_list=[source], + artist_list=[self.parse_api_object(data.get("artist"))], + artwork=artwork, + date=ID3Timestamp(**data.get("release_date_components", {})), + ) + + if object_type == "song": + self.add_to_artwork(artwork, data.get("song_art_image_thumbnail_url")) + self.add_to_artwork(artwork, data.get("song_art_image_url")) + + main_artist_list = [] + featured_artist_list = [] + + _artist_name = None + primary_artist = self.parse_api_object(data.get("primary_artist")) + if primary_artist is not None: + _artist_name = primary_artist.name + main_artist_list.append(primary_artist) + for feature_artist in data.get("featured_artists", []): + artist = self.parse_api_object(feature_artist) + if artist is not None: + featured_artist_list.append(artist) + + return Song( + title=clean_song_title(data.get("title"), artist_name=_artist_name), + source_list=[source], + artwork=artwork, + feature_artist_list=featured_artist_list, + artist_list=main_artist_list, + ) + + return None + def general_search(self, search_query: str, **kwargs) -> List[DatabaseObject]: results = [] @@ -68,25 +152,9 @@ class Genius(Page): for elements in traverse_json_path(data, "response.sections", default=[]): hits = elements.get("hits", []) for hit in hits: - result = hit.get("result", {}) - hit_type = hit.get("type", result.get("_type")) - - name = result.get("name") - if name is None: - continue - source = Source(self.SOURCE_TYPE, result.get("url"), additional_data={ - "id": result.get("id"), - }) - if source.url is None: - continue - image_url = result.get("header_image_url") - - if hit_type == "artist": - results.append(Artist( - name=name, - source_list=[source] - )) - continue + parsed = self.parse_api_object(hit.get("result")) + if parsed is not None: + results.append(parsed) return results