import gradio as gr
import pandas as pd
import requests
import base64
import os
from weasyprint import HTML
def obtener_url_hd(url):
"""
Transforma la URL para saltarse la compresión de 400x0 píxeles
y obtener el archivo maestro original directo de Amazon S3.
"""
if "filters:format(webp)/" in str(url):
raw_s3 = str(url).split("filters:format(webp)/")[1]
if not raw_s3.startswith("http"):
raw_s3 = "https://" + raw_s3
return raw_s3
# Alternativa por si el formato cambia: pedir tamaño grande de 1200px
return str(url).replace("400x0", "1200x0")
def generar_catalogo(file_obj):
if file_obj is None:
return "Por favor, sube un archivo CSV válido.", None
try:
# 1. Leer el archivo CSV cargado por el usuario
df = pd.read_csv(file_obj.name)
# Verificar que tenga las columnas necesarias
columnas_requeridas = ['name', 'price', 'image_url']
for col in columnas_requeridas:
if col not in df.columns:
return f"Falta la columna obligatoria '{col}' en tu archivo CSV.", None
# 2. Construir la cabecera del HTML con diseño elegante estilo joyería
html_content = """
Catálogo de Joyería Exclusiva
Generado Automáticamente en Alta Definición (Ultra-HD)
"""
# 3. Descargar imágenes limpiando la URL para forzar ALTA DEFINICIÓN
for _, row in df.iterrows():
name = str(row['name'])
price = str(row['price'])
url_original = str(row['image_url'])
# ¡AQUÍ SE PRODUCE LA MAGIA HD! Transformamos la URL comprimida a la URL maestra
url_hd = obtener_url_hd(url_original)
clean_name = name.replace("Unisex6mm", "").replace("Unisex4mm", "").replace("Male10mm", "").replace("Male6MM", "").replace("Male11mm", "").replace("Male8MM", "").strip()
gender_badge = "Unisex" if "Unisex" in name else "Hombre" if "Male" in name else "Exclusivo"
img_src = url_hd # Fallback por si acaso
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
r = requests.get(url_hd, headers=headers, timeout=20)
if r.status_code == 200:
encoded_img = base64.b64encode(r.content).decode('utf-8')
# Identificar formato real del archivo HD
mime_type = "image/jpeg"
if "png" in url_hd.lower():
mime_type = "image/png"
elif "webp" in url_hd.lower():
mime_type = "image/webp"
img_src = f"data:{mime_type};base64,{encoded_img}"
except Exception as e:
print(f"No se pudo incrustar directamente la imagen HD {url_hd}: {e}")
img_src = url_hd
# Agregar tarjeta de producto al catálogo HTML con el botón de compra corregido
html_content += f"""
{gender_badge}
{clean_name}
{price}
"""
html_content += """
"""
# 4. Compilar el HTML a PDF usando WeasyPrint con las imágenes en alta fidelidad
output_pdf = "catalogo_ultra_hd.pdf"
HTML(string=html_content).write_pdf(output_pdf)
return "¡Catálogo procesado con éxito! Se ha generado el catálogo con los botones de compra directo.", output_pdf
except Exception as e:
return f"Ocurrió un error inesperado al procesar el archivo: {str(e)}", None
# 5. Diseñar la interfaz gráfica en Gradio
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# 💎 Generador de Catálogos Joyeros en Ultra-HD (Versión Enlaces Directos)")
gr.Markdown("Esta versión genera el catálogo eliminando el atributo que provocaba el mensaje de advertencia del lector de PDF.")
with gr.Row():
with gr.Column():
archivo_input = gr.File(label="Sube tu archivo CSV (products.csv)", file_types=[".csv"])
btn_procesar = gr.Button("✨ Generar PDF con Botón de Compra Directo", variant="primary")
with gr.Column():
estado_output = gr.Textbox(label="Estado del Proceso", placeholder="Esperando archivo...")
archivo_output = gr.File(label="Descarga tu PDF Aquí")
btn_procesar.click(
fn=generar_catalogo,
inputs=archivo_input,
outputs=[estado_output, archivo_output]
)
if __name__ == "__main__":
demo.launch()