DEV Community

Cover image for Convertir YouTube a MP3 online con FastAPI, yt-dlp y FFmpeg
Mario
Mario

Posted on

Convertir YouTube a MP3 online con FastAPI, yt-dlp y FFmpeg

Convertir YouTube a MP3 online con FastAPI, yt-dlp y FFmpeg

Muchos servicios ofrecen convertir YouTube a MP3 online, pero pocos muestran qué hay detrás técnicamente.

En este artículo quiero compartir cómo monté mi aplicación, que tiene una arquitectura un poco inusual pero muy funcional:

  • Backend en Python con FastAPI y servidor Uvicorn.
  • Todo desplegado en un hosting compartido con cPanel, no en un VPS dedicado.
  • Expuesto a Internet mediante Apache actuando como proxy inverso hacia el proceso Uvicorn.
  • Vistas renderizadas con Jinja2 para SEO (cada ruta devuelve HTML optimizado).

El resultado es una aplicación ligera, escalable y, lo más importante, con un flujo robusto para convertir videos de YouTube a MP3 online.


🎬 Descargando el video de YouTube con yt-dlp

El primer paso es obtener el contenido de YouTube. Para esto uso yt-dlp, un fork moderno de youtube-dl que soporta los cambios constantes en la plataforma.

Ejemplo básico en Python:

import subprocess
from pathlib import Path

def descargar_video(url: str, destino: Path):
    command = [
        "yt-dlp",
        "-f", "bestaudio/best",  # mejor calidad disponible
        "-o", str(destino),      # archivo de salida
        url
    ]
    subprocess.run(command, check=True)
Enter fullscreen mode Exit fullscreen mode

Esto genera un archivo de audio en formato original (puede ser webm o m4a, según lo que sirva YouTube).

Paso 2. Convertir el audio a MP3 con ffmpeg

Luego paso ese archivo a MP3 con ffmpeg.
Aquí está el comando en Python usando subprocess:

import subprocess
from pathlib import Path

def convertir_a_mp3(input_file: Path, bitrate="128k") -> Path:
    output_file = input_file.with_suffix(".mp3")
    command = [
        "ffmpeg",
        "-y",                # sobrescribir
        "-i", str(input_file),
        "-vn",               # sin vídeo
        "-c:a", "libmp3lame",
        "-b:a", bitrate,     # 64k, 128k, 192k
        str(output_file)
    ]
    subprocess.run(command, check=True)
    return output_file
Enter fullscreen mode Exit fullscreen mode

🔹 Endpoint en FastAPI

Integrando todo en un endpoint de FastAPI:

from fastapi import FastAPI, Form, HTTPException
from pathlib import Path
import uuid

app = FastAPI()

@app.post("/convertir-youtube")
async def convertir_youtube(url: str = Form(...), calidad: str = Form("128k")):
    try:
        unique_id = uuid.uuid4().hex
        temp_file = Path(f"/tmp/{unique_id}.webm")

        # 1. Descargar audio
        descargar_audio(url, str(temp_file))

        # 2. Convertir a MP3
        mp3_file = convertir_a_mp3(temp_file, bitrate=calidad)

        return {
            "status": "ok",
            "download_url": f"/descargas/{mp3_file.name}"
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error en conversión: {e}")
Enter fullscreen mode Exit fullscreen mode

🔹 Script de arranque con Uvicorn en cPanel

Sí, todo esto corre en cPanel (donde normalmente no esperas nada más que PHP).
Para arrancar mi servidor tengo un pequeño start.sh:

PROJECT_DIR="/home/usuario/public_html"
VENV="$PROJECT_DIR/venv/bin/activate"
PID_FILE="$PROJECT_DIR/uvicorn.pid"

cd "$PROJECT_DIR" || exit 1
source "$VENV"

nohup uvicorn app.main:app \
  --host 127.0.0.1 \
  --port 8000 \
  --proxy-headers \
  --forwarded-allow-ips="127.0.0.1" \
  > uvicorn.log 2>&1 &
echo $! > "$PID_FILE"
Enter fullscreen mode Exit fullscreen mode

🔹 Resultado final

Con esta arquitectura logré montar un servicio que:

  • Funciona en un hosting cPanel con Apache como proxy.

  • Permite a cualquier usuario pegar un enlace de YouTube y obtener su MP3.

  • Usa herramientas open-source (yt-dlp + FFmpeg) para manejar todo el proceso.

  • Está pensado para ser ligero, rápido y seguro.

👉 Puedes probarlo en mi proyecto:

Convertir YouTube a MP3 online

✅ Conclusión:

Aunque la infraestructura pueda parecer poco común (FastAPI en cPanel con Apache), es totalmente viable y demuestra que Python + FastAPI se puede adaptar incluso a entornos tradicionales.
Y si necesitas un conversor de YouTube a MP3, no olvides que lo tienes gratis y online 😉.

Top comments (0)