Spaces:
Building
Building
import os | |
import requests | |
def get_best_video_file(video_files, min_width=1920, min_height=1080): | |
""" | |
Selecciona el mejor archivo de video basado en resolución y calidad. | |
Prioriza videos HD (1920x1080) o mejor, y evita formatos móviles. | |
""" | |
# Filtrar archivos que cumplan con los requisitos mínimos | |
suitable_files = [ | |
f for f in video_files | |
if f.get("width", 0) >= min_width | |
and f.get("height", 0) >= min_height | |
and f.get("width", 0) / f.get("height", 0) >= 1.6 # Aproximadamente 16:9 | |
] | |
if not suitable_files: | |
# Si no hay archivos que cumplan los requisitos, buscar el más grande disponible | |
suitable_files = video_files | |
# Ordenar por resolución (área total de pixels) | |
suitable_files.sort( | |
key=lambda x: (x.get("width", 0) * x.get("height", 0), x.get("quality", "")), | |
reverse=True | |
) | |
return suitable_files[0] if suitable_files else None | |
def search_pexels(query, num_results=5): | |
""" | |
Busca videos en Pexels y retorna los enlaces de mejor calidad. | |
Args: | |
query (str): Término de búsqueda | |
num_results (int): Número de videos a retornar | |
Returns: | |
list: Lista de URLs de videos | |
""" | |
api_key = os.getenv("PEXELS_API_KEY") | |
if not api_key: | |
raise ValueError("La variable de entorno PEXELS_API_KEY no está configurada.") | |
if not query.strip(): | |
raise ValueError("La consulta no puede estar vacía.") | |
url = "https://api.pexels.com/videos/search" | |
headers = {"Authorization": api_key} | |
# Solicitar más videos de los necesarios para tener margen de filtrado | |
params = { | |
"query": query, | |
"per_page": min(num_results * 2, 15), # Pedir el doble, máximo 15 | |
"size": "large" # Preferir videos grandes | |
} | |
response = requests.get(url, headers=headers, params=params) | |
if response.status_code != 200: | |
raise Exception(f"Error al buscar en Pexels: {response.status_code} - {response.text}") | |
data = response.json() | |
if "videos" not in data or not data["videos"]: | |
raise Exception(f"No se encontraron videos relevantes para la consulta: {query}") | |
# Filtrar y obtener los mejores videos | |
video_urls = [] | |
for video in data["videos"]: | |
best_file = get_best_video_file(video["video_files"]) | |
if best_file and best_file.get("link"): | |
video_urls.append({ | |
"url": best_file["link"], | |
"width": best_file.get("width", 0), | |
"height": best_file.get("height", 0), | |
"duration": video.get("duration", 0) | |
}) | |
if not video_urls: | |
raise Exception(f"No se encontraron videos de calidad adecuada para: {query}") | |
# Ordenar por calidad y tomar los mejores | |
video_urls.sort(key=lambda x: (x["width"] * x["height"]), reverse=True) | |
return [v["url"] for v in video_urls[:num_results]] |