
    lci                     t    d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
 ddl	mZ d Zd	 Zd
 ZddZdS )u  
Integración con SourceForge: API best_release y scraping recursivo de archivos.

- obtener_info_sourceforge: última versión estable vía API.
- buscar_mejor_enlace_sourceforge: búsqueda recursiva en la sección de archivos
  cuando la API no devuelve el instalador esperado.
    N)urljoin)BeautifulSoup   )config)utilsc                     d|  | }t           j                            |          }t          j        | d|            t          j        | d|            |||dS )zEConstruye el dict con url, filename y filepath para un release de SF.z*https://downloads.sourceforge.net/project/z (SourceForge API): Archivo -> z (SourceForge API): URL -> )urlfilenamefilepath)ospathbasenamelogginginfo)proyectonombrer
   	clean_urlr   s        @/srv/repositorios/osluz/webnueva/scripts/descarga/sourceforge.py_construir_info_sourceforger      su    QXQxQQIw))HLFEE8EEFFFLFBByBBCCC(III    c                    	 d|  d}t           j        d         dd}t          j        | d           t	          j        ||d          }|                                 |                                }|                    d	i                               d
          }|r)|                    dd          }|rt          | ||          S |                    di           }|r@|                    dd          }|r(t          j	        | d           t          | ||          S t          j	        | d           dS # t          $ r%}	t          j        d| d|	            Y d}	~	dS d}	~	ww xY w)u   
    Obtiene la última versión estable desde la API best_release.json de SourceForge.
    Prioriza la release para Windows si existe.

    Returns:
        dict con 'url', 'filename', 'filepath' o None.
    z!https://sourceforge.net/projects/z/best_release.json
User-Agentzapplication/json)r   Acceptz4 (SourceForge): Consultando API best_release.json...   headerstimeoutplatform_releaseswindowsr
    releaseuB    (SourceForge API): No release Windows específica, usando defaultu;    (SourceForge API): No se encontró ningún release válidoNzError obteniendo info de z desde SourceForge API: )r   DEFAULT_HEADERSr   r   requestsgetraise_for_statusjsonr   warning	Exceptionr   registrar_error)
r   r   api_urlr   rdatawindows_releaser
   r!   es
             r   obtener_info_sourceforger/      s   RhRRR 0>(
 
 	TTTUUUL'2>>>	vvxx((#6;;??	JJ 	O&**:r::H O28VXNNN((9b)) 	O{{:r22H Oaaa   38VXNNN6^^^___t   ]&]]Z[]]^^^ttttts%   CD8 AD8 D8 8
E'E""E'c                    |sdS t          j        ||           }|rh|                                r|                    d          n|                    d          }|                    dd                              dd          S dS )u6   Extrae la versión de un href y normaliza separadores.Nr   r   _.-)researchgroupsgroupreplace)hrefpatternvmatchversions       r   _extraer_version_de_enlacer=   E   s{     tYw%%F ;%+]]__I&,,q///&,,q//sC((00c:::4r      c           	         	 t          j        | |d          }t          |j        d          }g }|                    dd          D ]N}	|	d         t          j        d          r/|r|v r)t          |          }
|                    |
pd	f           O|r|S |                    dd          D ]j}	|	d         |r^|v rZ	                    d
          sE	                    d          sdz   n}t          |          }
|                    |
pd	|f           k|r|S ||k     rg d}|                    dd          D ]}	|	d         	                    d
          rs
                    d          s^
                    d
          sIt          fd|D                       ret          |           }t          |||||dz   |          }|r|c S g S # t          $ r#}t          j        d|            g cY d}~S d}~ww xY w)u   
    Scraping recursivo en la sección de archivos de SourceForge para encontrar
    el mejor candidato de descarga (por extensión y patrón de versión).

    Returns:
        Lista de tuplas (version, url).
    r   r   zhtml.parseraT)r9   r9   z
/download$r    /z	/download)docsrcsourceoldtestexamplesamplez..c              3   D   K   | ]}|                                 v V  d S )N)lower).0xr9   s     r   	<genexpr>z2buscar_mejor_enlace_sourceforge.<locals>.<genexpr>p   s0      DD1

,DDDDDDr   r   z)Error en scraping recursivo SourceForge: N)r#   r$   r   contentfind_allr4   r5   r=   appendendswith
startswithanyr   buscar_mejor_enlace_sourceforger(   r   r)   )	files_url	extensionr:   r   profundidadmax_profundidadrespsoup
candidatosr@   r<   download_hrefdirs_a_saltarsub_urlsub_candidatosr.   r9   s                   @r   rT   rT   P   s   #|IwCCCT\=99
s.. 	9 	9AV9Dy-- 9y 9IQUDUDU4T7CC!!7=b$"7888 	s.. 	B 	BAV9D BY$..t}}S7I7I.:>--:T:T ^{ 2 2Z^4T7CC!!7=b-"@AAA 	((XXXM]]3T]22 
. 
.y==%% .dood.C.C .DOO\_L`L` .DDDDmDDDDD ! %i66G%DGWkAo& &N & .----	   M!MMNNN						s2   BG BG !B2G G 
H!G?9H?H)r   r>   )__doc__r   r   r4   urllib.parser   r#   bs4r   r    r   r   r   r/   r=   rT    r   r   <module>rd      s      				 				                               J J J# # #L  + + + + + +r   