Spaces:
Building
Building
File size: 3,005 Bytes
6ee213f b407d3c 6ee213f b407d3c 6ee213f b407d3c 0f6c7d5 b407d3c 6ee213f b407d3c 6ee213f b407d3c 0f6c7d5 b407d3c 0f6c7d5 b407d3c 0f6c7d5 b407d3c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
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]] |