
    lci&                         d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ d Zd Zd ZdS )u6  
Orquestación: procesar cada entrada del catálogo (SourceForge API o estándar).

- procesar_descarga_sourceforge: flujo para apps que usan solo la API de SF.
- procesar_descarga_estandar: flujo para enlace directo, scraping o GitHub.
- main: recorre DESCARGAS, elige procesador y escribe encabezado de log.
    N)unquoteurljoin   )config)download)enlaces)
http_utils)repo)sourceforge)utilsc                 L   | d         }| d         }| d         }| d         }| d         }t          j        d|          }|st          j        | d|            dS |                    d	          }t          j        ||          }|st          j        | d
           d| d}	t          j
                                        }
t          j        |	|||
          }d}d}|D ]$\  }}|t          j        ||          dk    r|}|}%|rst          |	|          }t          j                            |                    d                              dd                    }t          j        | d| d|            n)t          j        | d           dS |d         }|d         }|rh|                                                    |                                          s.t          j        | d| d| d           d| d}	t          j
                                        }
t          j        |	|||
          }|rd}d}|D ]$\  }}|t          j        ||          dk    r|}|}%|rst          |	|          }t          j                            |                    d                              dd                    }t          j        | d| d|            n4t          j        | d           dS t          j        | d|            dS t          j        ||          }|st          j        | d|            dS t          j        |          }t          j        | d|            t3          j        ||          }|sdS |                                 d| | }t          j         | }t9          j        |||          rFt3          j        ||||           t3          j        |||           t          j        | d           dS t          j        | d            dS )!u   
    Gestiona una descarga alojada en SourceForge: API best_release, fallback
    por scraping si la extensión no coincide, luego descarga y actualización.
    urlnombrepattern	extensionhtmlz!sourceforge\.net/projects/([^/]+)z8: No se pudo extraer el proyecto SourceForge de la URL: Fr   uM   : API de SourceForge no devolvió datos, intentando scraping como fallback...z!https://sourceforge.net/projects/z/files/Nr   /z	/download u   : Fallback scraping encontró: z -> u0   : No se pudo obtener información de SourceForgefilenamez!: El archivo de SourceForge API (u#   ) no tiene la extensión esperada (z'). Intentando scraping como fallback...u8   : Scraping fallback tampoco encontró instalador válidou9   : No se encontró instalador válido en SourceForge para u*   : No se pudo determinar la versión desde u   : Versión detectada: T_z%: OK: Proceso completado exitosamenteu!   : ERROR: Descarga con wget falló) researchr   registrar_errorgroupr   obtener_info_sourceforgeloggingwarningr   DEFAULT_HEADERScopybuscar_mejor_enlace_sourceforgecomparar_versionesr   ospathbasenamerstripreplaceinfolowerendswithobtener_versionlimpiar_versionr
   buscar_archivo_a_reemplazarREPO_DIRr   descargar_con_wgetmodificar_htmlsgestionar_archivo_antiguo)descargar   r   r   r   htmlsmproyectosf_info	files_urlheaders
candidatosmejor_version
mejor_hrefversionhrefsf_urlsf_filenameversion_descargadaarchivo_a_reemplazarnombre_completoruta_destinos                         ?/srv/repositorios/osluz/webnueva/scripts/descarga/procesador.pyprocesar_descarga_sourceforgerD      s   
 5/ChFy!G%IVE
	6<<A ffadffggguwwqzzH28VDDG  ddd	
 	
 	
 JIII	(--// @y'7
 

 
' 	" 	"MGT$(@-(X(X[\(\(\ '!
 	Y
33F'**6==+=+=+E+EkSU+V+VWWKLF\\;\\TZ\\]]]]!V"]"]"]^^^5j) **,,55ioo6G6GHH  L L L L"L L L	
 	
 	
 JIII	(--// @y'7
 

  	 MJ!+ & & (E,DWm,\,\_`,`,`$+M!%J  J77 g..MM#&&..{B??  ``{``X^``aaaa%&i&i&ijjju!^^T\^^   5.wDD ``S^``aaau./ABBLFFF2DFFGGG;<NPVWW tII*<IiIIOo888L"6<@@ UO5GPPP&';_fUUUEEEFFFt	VFFFGGG5    c                 8   | d         }| d         }| d         }| d         }| d         }| d         }|                      d          }|r |            }n|                      d          r#t          j        | d         | d	         |          }nY|                      d
          r,|                                dk    rt          j                    }nt          j        |||||          }|s3t          j        d| d|            t          j	        | d           dS t          j
        d| d|            |                      dd          p)|                      d          p|                      d
          }		 t          j        |t          |                    }
|}|
st          j        |          \  }}}||k    rt          j
        d| d|            |}|	s"|r d|v rt          j	        d| d|            dS t          j        |t          |                    }
|
s|rt          j        ||          }
|
st          j	        d|            dS t          j        |
          }
t          j
        d| d|
            t#          j        |
|          }|sdS |                                 d|
 | }t&          j         | }|	rt+          j        |||          }nt+          j        |||          }|s/|	s-t          j        | d           t+          j        |||          }|rFt#          j        |||
|           t#          j        |||           t          j
        d|            dS dS # t4          $ r%}t          j	        d| d|            Y d}~dS d}~ww xY w)u   
    Gestiona una descarga estándar: obtiene enlace (custom_fn, GitHub o scraping),
    resuelve URL si hace falta, comprueba versión, descarga y actualiza HTML/repo.
    r   r   filtror   r   r   	custom_fngithub_repogithub_assetgithub	obsstudiou+   No se encontró el enlace de descarga para u    en la página u'   : No se encontró el enlace de descargaFz#Enlace de descarga encontrado para : 	usar_wgetzURL resuelta para z	text/htmlu*   Se recibió HTML en lugar de binario para z. URL: u;   Descarga cancelada: No se pudo determinar la versión para u   Versión detectada para Tr   z#: Reintentando descarga con wget...zDescarga completada para zError al procesar N)getr   obtener_enlace_github_releaser(   obtener_enlace_obs_githubobtener_enlace_descargar   r   r   r   r'   r*   r   r	   resolver_url_descargaobtener_version_headerr+   r
   r,   r   r-   r   r.   descargar_con_requestsr/   r0   	Exception)r1   r   r   rG   r   r   r2   rH   enlace_descargarN   r?   url_realurl_real_rescontent_typeresp_headersr@   rA   rB   exitoes                       rC   procesar_descarga_estandarr^   v   sl   
 5/ChFhFy!G%IVE[))I 
#)++	m	$	$ 	
!?]#Xn%=v
 
 
h		 
FLLNNk$A$A!;==!9)V
 
  bfbb]`bbcccPPPQQQuLRvRRRRSSS[%(( 	"<<&&	"<<!! 
+"27GO<T<TUU"! 	Y7A7W8 84L, ..J&JJLJJKKK'  +2M2M%ZZZPXZZ   u!&!6w@Q@Q!R!R% Y, Y%*%A'<%X%X"! 	!"h`f"h"hiii5"23EFFNNN:LNNOOO#?@RTZ[[# 	4#\\^^MM.@M)MM /<?<< 	T/vVVEE3HlFSSE 	WY 	WOvJJJKKK/vVVE 	 9KVTTT*+?RXYYYL=V==>>>4u   @6@@Q@@AAAuuuuus.   4BM* 8AM* AM* CM* *
N4NNc            	         ddl m}  t          j                     t          j                     | j        D ]}	 |d         }t          j        d| d           d|d         v r:|                    d          s%|                    d	          st          |           nt          |           nY# t          $ rL}t          j        d
|                    dd           d|            Y d}~t          j        d           d}~ww xY wt          j        d           # t          j        d           w xY wt          j        d           dS )u   
    Punto de entrada: configura logging, escribe encabezado y procesa cada
    entrada del catálogo (SourceForge API o estándar). Los errores en una
    app no detienen el resto.
    r   )catalogor   zProcesando z...zsourceforge.net/projects/r   rH   rI   u   Error crítico procesando desconocidorM   N   u   Fin de la ejecución)r   r`   r   configurar_loggingescribir_encabezado_ejecucion	DESCARGASr   r'   rO   rD   r^   rV   r   r   timesleep)r`   r1   r   r]   s       rC   mainrh      st    

(***&  	h'FL2v222333+x>> [11 ? ]33 ? .h7777*8444 	 	 	!YX\\(M-R-RYYVWYY   HHHJqMMMM	 JqMMMMDJqMMMML'(((((s0   A3B+*D+
D5.C<#D<DDD/)__doc__r   r"   r   rf   urllib.parser   r   r   r   r   r   r	   r
   r   r   rD   r^   rh    rE   rC   <module>rl      s
     				 				  ) ) ) ) ) ) ) )                                          Z Z ZzM M M`) ) ) ) )rE   