saludo_api / app.py
JairoDanielMT's picture
mejoras
f36f70b
import re
import os
import unicodedata
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from pydantic import BaseModel
from pytube import YouTube
from urllib.parse import unquote
app = FastAPI()
# carpeta temp
TEMP_FOLDER = "temp"
if not os.path.exists(TEMP_FOLDER):
os.makedirs(TEMP_FOLDER)
temp_path = os.path.join(os.getcwd(), TEMP_FOLDER)
# middleware CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
def limpiar_temp():
for file in os.listdir(temp_path):
os.remove(os.path.join(temp_path, file))
def change_song_name(titulo):
titulo_normalizado = unicodedata.normalize("NFKD", titulo)
# Limpiar el título para usarlo como nombre de archivo
caracteres_no_permitidos = r"[\"\'/\\:*?<>|,]"
titulo_limpio = re.sub(caracteres_no_permitidos, "", titulo_normalizado)
# Codificar y decodificar para manejar la codificación Unicode
titulo_limpio = titulo_limpio.encode("ascii", errors="ignore").decode("ascii")
# print(titulo_limpio)
return titulo_limpio
class Item(BaseModel):
url: str
def download_song(url: str):
try:
limpiar_temp()
yt = YouTube(url)
titulo = yt.title
titulo_limpio = change_song_name(titulo)
stream = yt.streams.filter(only_audio=True).first()
if stream:
stream.download(temp_path)
else:
raise HTTPException(
status_code=500, detail="No se pudo obtener el stream de audio"
)
# print("Archivos en temp después de la descarga:", os.listdir(temp_path))
for file in os.listdir(temp_path):
if file.endswith(".mp4"):
src_path = os.path.join(temp_path, file)
dst_path = os.path.join(temp_path, f"{titulo_limpio}.mp3")
os.rename(src_path, dst_path)
# print("Archivos en temp después del cambio de nombre:", os.listdir(temp_path))
return FileResponse(
path=f"{temp_path}/{titulo_limpio}.mp3",
filename=f"{titulo_limpio}.mp3",
media_type="audio/mpeg",
)
except Exception as e:
print(f"Error durante la descarga: {e}")
raise HTTPException(status_code=500, detail="Error interno del servidor")
@app.post("/download")
async def download_song_post(item: Item):
return download_song(item.url)
@app.get("/download")
def download_info():
return {
"message": "La api de descargas se llama /download y recibe un json con la str(url) de youtube"
}
@app.get("/")
def saludo():
return {"message": "Hola mundo"}