|
|
from fastapi import FastAPI, HTTPException |
|
|
from fastapi.responses import JSONResponse |
|
|
import yt_dlp |
|
|
|
|
|
app = FastAPI() |
|
|
|
|
|
def get_m4a_url(video_url: str) -> str: |
|
|
""" |
|
|
Extracts the best m4a audio stream URL from a YouTube video using yt_dlp with cookies. |
|
|
""" |
|
|
ydl_opts = { |
|
|
'format': 'bestaudio[ext=m4a]/best', |
|
|
'quiet': True, |
|
|
'skip_download': True, |
|
|
'cookies_from_browser': 'chrome', |
|
|
'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...', |
|
|
} |
|
|
|
|
|
try: |
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl: |
|
|
info = ydl.extract_info(video_url, download=False) |
|
|
|
|
|
|
|
|
for fmt in info.get('formats', []): |
|
|
if fmt.get('ext') == 'm4a' and fmt.get('url'): |
|
|
return fmt.get('url') |
|
|
|
|
|
|
|
|
return info.get('url') if info.get('url') else None |
|
|
|
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=f"Failed to extract audio: {str(e)}") |
|
|
|
|
|
@app.get("/{video_id}") |
|
|
def get_audio_url(video_id: str): |
|
|
""" |
|
|
FastAPI endpoint to return the m4a audio stream URL in JSON format. |
|
|
""" |
|
|
youtube_url = f"https://www.youtube.com/watch?v={video_id}" |
|
|
m4a_url = get_m4a_url(youtube_url) |
|
|
|
|
|
if not m4a_url: |
|
|
raise HTTPException(status_code=404, detail="m4a audio stream not found") |
|
|
|
|
|
return JSONResponse(content={"m4a_url": m4a_url}) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
import uvicorn |
|
|
|
|
|
uvicorn.run(app, host="0.0.0.0", port=7860) |
|
|
|