Spaces:
Paused
Paused
| 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() | |
| def root(): | |
| return RedirectResponse(url="/static/index.html") | |
| 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) | |
| 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) |