From b86461cf2dd8da17c36cff9558b588e97199ca33 Mon Sep 17 00:00:00 2001 From: Leonardo Segala Date: Fri, 1 Aug 2025 23:21:21 +0200 Subject: [PATCH] Add song fetch final function --- backend/src/song_fetch.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/backend/src/song_fetch.py b/backend/src/song_fetch.py index 7a1cad4..561e18d 100644 --- a/backend/src/song_fetch.py +++ b/backend/src/song_fetch.py @@ -3,12 +3,21 @@ import urllib.parse import os.path import os import sys +from dataclasses import dataclass sys.path.append("/yt-dlp") import yt_dlp -def lastfm_search(query: str) -> tuple[str, str]: +@dataclass +class SongInfo: + artist: str + title: str + img_id: str + tags: list[str] + + +def _lastfm_search(query: str) -> tuple[str, str]: response = requests.get( url="https://ws.audioscrobbler.com/2.0/?method=track.search&format=json", params={"limit": 5, "track": query, "api_key": os.environ["LASTFM_API_KEY"]}, @@ -21,7 +30,7 @@ def lastfm_search(query: str) -> tuple[str, str]: return track_info["name"], track_info["artist"] -def lastfm_getinfo(name: str, artist: str) -> tuple[str, str, str, str, list[str]]: # ( id, image_id, tags ) +def _lastfm_getinfo(name: str, artist: str) -> tuple[str, list[str]]: # ( image_id, tags ) response = requests.get( url="https://ws.audioscrobbler.com/2.0/?method=track.getInfo&format=json", params={ @@ -36,12 +45,20 @@ def lastfm_getinfo(name: str, artist: str) -> tuple[str, str, str, str, list[str image_url = urllib.parse.urlparse(track_info["album"]["image"][0]["#text"]) return ( - track_info["mbid"], - [t["name"] for t in track_info["toptags"]["tag"]], + # track_info["mbid"], os.path.splitext(os.path.basename(image_url.path))[0], + [t["name"] for t in track_info["toptags"]["tag"]], ) +def lastfm_query_search(query: str) -> SongInfo: + name, artist = _lastfm_search(query) + + img_id, tags = _lastfm_getinfo(name, artist) + + return SongInfo(artist=artist, title=name, img_id=img_id, tags=tags) + + def download_song_mp3(name: str, artist: str) -> tuple[str, str] | None: # ( id, audio ) ydl_opts = { "format": "bestaudio",