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]]