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