2025-07-30 21:52:43 +03:00

46 lines
1.6 KiB
Python

from fastapi import FastAPI, Query, HTTPException
from fastapi.responses import JSONResponse, FileResponse
from fastapi.staticfiles import StaticFiles
import uvicorn
import os
from downloader import download_song
from config import settings
from utils.song_list import add_song_to_list, get_song_list
app = FastAPI(
title="Tunedrop",
description="🎵 Search and download songs using yt-dlp. Automatically updates Navidrome library.",
version="1.0.0"
)
# Serve /songs/filename.mp3
app.mount("/songs", StaticFiles(directory=settings.MUSIC_DIR), name="songs")
@app.get("/download")
def download(query: str = Query(..., description="Song name or YouTube search term")):
try:
result = download_song(query)
if result["downloaded_files"]:
saved_path = os.path.join(settings.MUSIC_DIR, result["downloaded_files"][0])
add_song_to_list(saved_path, query)
return JSONResponse(content=result)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/songs")
def list_songs():
try:
return get_song_list()
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/music/{filename}")
def serve_song(filename: str):
file_path = os.path.join(settings.MUSIC_DIR, filename)
if not os.path.isfile(file_path):
raise HTTPException(status_code=404, detail="File not found")
return FileResponse(file_path, media_type="audio/mpeg")
if __name__ == "__main__":
uvicorn.run("main:app", host=settings.host, port=settings.port, reload=settings.reload)