From 8bb582148df4a928e665ccd928468969bf3c2818 Mon Sep 17 00:00:00 2001 From: Leonardo Segala Date: Fri, 1 Aug 2025 19:16:20 +0200 Subject: [PATCH] Add song fetch test --- backend/Dockerfile | 4 +++ backend/requirements.txt | 2 ++ backend/src/app.py | 12 ++++---- backend/src/room.py | 2 +- backend/src/song.py | 2 +- backend/src/song_fetch.py | 63 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 backend/src/song_fetch.py diff --git a/backend/Dockerfile b/backend/Dockerfile index 56023cb..dc8f66f 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -2,6 +2,10 @@ FROM python:3.13.5-alpine WORKDIR /app +RUN apk update && apk add git + +RUN git clone --depth 1 'https://github.com/yt-dlp/yt-dlp.git' /yt-dlp + COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt diff --git a/backend/requirements.txt b/backend/requirements.txt index 4b83363..7623d9f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,2 +1,4 @@ Flask==3.1.0 flask-cors +dotenv +requests \ No newline at end of file diff --git a/backend/src/app.py b/backend/src/app.py index 665603a..3fadaf6 100644 --- a/backend/src/app.py +++ b/backend/src/app.py @@ -1,15 +1,13 @@ from flask import Flask, Response, jsonify, request from flask_cors import CORS -<<<<<<< HEAD -import dotenv -from .classes import Room -# from . import song_fetch +import dotenv +from .room import Room + +from . import song_fetch dotenv.load_dotenv() -======= -from room import Room ->>>>>>> refs/remotes/origin/main + app = Flask(__name__) CORS(app) diff --git a/backend/src/room.py b/backend/src/room.py index bdf4026..996a5a1 100644 --- a/backend/src/room.py +++ b/backend/src/room.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from song import Song +from .song import Song type UserScoredSong = tuple[Song, int] diff --git a/backend/src/song.py b/backend/src/song.py index 2260838..8570033 100644 --- a/backend/src/song.py +++ b/backend/src/song.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from connect import get_connection +from .connect import get_connection def init_db(): diff --git a/backend/src/song_fetch.py b/backend/src/song_fetch.py new file mode 100644 index 0000000..96288e9 --- /dev/null +++ b/backend/src/song_fetch.py @@ -0,0 +1,63 @@ +import requests +import urllib.parse +import os.path +import os +import sys + +sys.path.append("/yt-dlp") +import yt_dlp + + +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"]}, + ) + + assert response.status_code == 200 + + track_info = response.json()["results"]["trackmatches"]["track"][0] + + 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 ) + response = requests.get( + url="https://ws.audioscrobbler.com/2.0/?method=track.getInfo&format=json", + params={ + "track": name, + "artist": artist, + "api_key": os.environ["LASTFM_API_KEY"], + }, + ) + + track_info = response.json()["track"] + + image_url = urllib.parse.urlparse(track_info["album"]["image"][0]["#text"]) + + return ( + track_info["mbid"], + [t["name"] for t in track_info["toptags"]["tag"]], + os.path.splitext(os.path.basename(image_url.path))[0], + ) + + +print(yt_dlp, flush=True) + +# # def get_yt_mp3link(name: str, artist: str) -> str: ... +# # os.popen("/yt-dlp ") + +# # /yt-dlp/yt-dlp.sh "ytsearch1:Never gonna give you up" --get-url -f "ba" + +# import json + +# print(json.dumps(lastfm_getinfo(*lastfm_search("money")), indent=2)) +# exit(1) + + +# # def + + +# ## query ==> lastfm ==> list of songs ==> take first ==> request song info ==> get YT link ==> save in DB ==>