from fastapi import FastAPI, Query, HTTPException from fastapi.responses import JSONResponse, RedirectResponse from fastapi.staticfiles import StaticFiles from youtube_api import YouTubeAPI import uvicorn app = FastAPI() app.mount("/static", StaticFiles(directory="static"), name="static") yt_api = YouTubeAPI() @app.get("/") def root(): return RedirectResponse(url="/static/index.html") @app.get("/search") async def search(q: str = Query(..., description="Search query")): results = await yt_api.search(q, limit=10) # Only return relevant fields filtered = [ { "title": r["title"], "duration": r["duration"], "id": r["id"], "link": r["link"], "thumbnails": r["thumbnails"], } for r in results ] return JSONResponse(filtered) @app.get("/stream") async def stream(url: str = Query(..., description="YouTube video URL")): try: stream_url = await yt_api.get_stream_url(url, audio_only=True) return RedirectResponse(url=stream_url) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) if __name__ == "__main__": uvicorn.run("app:app", host="0.0.0.0", port=7860, reload=True)