diff --git a/backend/Dockerfile b/backend/Dockerfile index dc8f66f..c6a1412 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -2,7 +2,7 @@ FROM python:3.13.5-alpine WORKDIR /app -RUN apk update && apk add git +RUN apk update && apk add git ffmpeg RUN git clone --depth 1 'https://github.com/yt-dlp/yt-dlp.git' /yt-dlp diff --git a/backend/src/app.py b/backend/src/app.py index 2df573d..2b636c3 100644 --- a/backend/src/app.py +++ b/backend/src/app.py @@ -1,12 +1,10 @@ +import dotenv from flask import Flask, Response, jsonify, request from flask_cors import CORS -import dotenv from .room import Room from .song import init_db -from . import song_fetch - dotenv.load_dotenv() diff --git a/backend/src/song_fetch.py b/backend/src/song_fetch.py index 96288e9..7a1cad4 100644 --- a/backend/src/song_fetch.py +++ b/backend/src/song_fetch.py @@ -21,9 +21,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, 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={ @@ -44,20 +42,23 @@ def lastfm_getinfo( ) -print(yt_dlp, flush=True) +def download_song_mp3(name: str, artist: str) -> tuple[str, str] | None: # ( id, audio ) + ydl_opts = { + "format": "bestaudio", + "default_search": "ytsearch1", + "outtmpl": "%(title)s.%(ext)s", + "skip_download": True, + } -# # def get_yt_mp3link(name: str, artist: str) -> str: ... -# # os.popen("/yt-dlp ") + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + info = ydl.extract_info(f"{name!r} - {artist!r}", download=False) -# # /yt-dlp/yt-dlp.sh "ytsearch1:Never gonna give you up" --get-url -f "ba" + first_entry = info["entries"][0] -# import json + video_id = first_entry["id"] -# print(json.dumps(lastfm_getinfo(*lastfm_search("money")), indent=2)) -# exit(1) + for fmt in first_entry["formats"]: + if "acodec" in fmt and fmt["acodec"] != "none": + return video_id, fmt["url"] - -# # def - - -# ## query ==> lastfm ==> list of songs ==> take first ==> request song info ==> get YT link ==> save in DB ==> + return None diff --git a/frontend/src/lib/components/QueueSlider.svelte b/frontend/src/lib/components/QueueSlider.svelte new file mode 100644 index 0000000..ca36495 --- /dev/null +++ b/frontend/src/lib/components/QueueSlider.svelte @@ -0,0 +1,29 @@ + + +
{text}
+
+
+
+ TypeScript-first schema validation with static type inference
+
+ by @colinhacks
+