#!/usr/bin/env python3.12 import importlib from fastapi import FastAPI from pydantic import BaseModel class ValidArtistSearchRequest(BaseModel): """ - **a**: artist name """ a: str class LastFM(FastAPI): """Last.FM Endpoints""" def __init__(self, app: FastAPI, util, constants): # pylint: disable=super-init-not-called self.app = app self.util = util self.constants = constants self.lastfm = importlib.import_module("lastfm_wrapper").LastFM() self.endpoints = { "get_artist_by_name": self.artist_by_name_handler, "get_artist_albums": self.artist_album_handler, #tbd } for endpoint, handler in self.endpoints.items(): app.add_api_route(f"/{endpoint}/", handler, methods=["POST"]) async def artist_by_name_handler(self, data: ValidArtistSearchRequest): """ Get artist info """ artist = data.a.strip() if not artist: return { 'err': True, 'errorText': 'No artist specified' } artist_result = await self.lastfm.search_artist(artist=artist) if not artist_result or "err" in artist_result.keys(): return { 'err': True, 'errorText': 'Search failed (no results?)' } return { 'success': True, 'result': artist_result } async def artist_album_handler(self, data: ValidArtistSearchRequest): """ Get artist's albums/releases """ artist = data.a.strip() if not artist: return { 'err': True, 'errorText': 'No artist specified' } album_result = await self.lastfm.get_artist_albums(artist=artist) album_result_out = [] seen_release_titles = [] for release in album_result: release_title = release.get('title') if release_title.lower() in seen_release_titles: continue seen_release_titles.append(release_title.lower()) album_result_out.append(release) return { 'success': True, 'result': album_result_out }