
    lcif                         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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 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!ddZ"dS )u  
Obtención de enlaces de descarga por aplicación.

Cada función obtener_enlace_* devuelve la URL del instalador (o None) para una
aplicación concreta. obtener_enlace_descarga orquesta scraping genérico y
redirige a lógica específica (DigiKam, SourceForge /latest/download).
    N)unquoteurljoin)BeautifulSoup   )config)
http_utils)sourceforge)utilsc                 r   	 dt           j        d         i}d}d}	 t          j        ||d          }t	          |j        d          }d}d}|                    dd	
          D ]c}|d         }	t          j        ||	          }
|
rB|
	                    d          }|t          j        ||          dk    r|}t          ||	          }d|rt          j        d|            |S n.# t          $ r!}t          j        d|            Y d}~nd}~ww xY wd}	 t          j        ||d          }t	          |j        d          }g }|                    dd	
          D ]G}t          j        d|d                   }
|
r(|                    |
	                    d                     H|rt%          |d           }t          || d          }t          j        ||d          }t	          |j        d          }|                    dd	
          D ]N}t          j        d|d                   r1t          ||d                   }t          j        d|            |c S On.# t          $ r!}t          j        d|            Y d}~nd}~ww xY wdS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)zJResuelve la URL de descarga de digiKam (files.kde.org o download.kde.org).
User-Agentz'digiKam-(\d+\.\d+\.\d+)-Qt6-Win64\.exe$zhttps://files.kde.org/digikam/   headerstimeouthtml.parserNaThrefr   r   r   z%DigiKam encontrado en files.kde.org: z"Error accediendo a files.kde.org: z'http://download.kde.org/stable/digikam/^(\d+\.\d+\.\d+)/$c                 @    d |                      d          D             S )Nc                 ,    g | ]}t          |          S  int.0xs     </srv/repositorios/osluz/webnueva/scripts/descarga/enlaces.py
<listcomp>z<obtener_enlace_digikam.<locals>.<lambda>.<locals>.<listcomp>?   s    =[=[=[c!ff=[=[=[    .splitvs    r   <lambda>z(obtener_enlace_digikam.<locals>.<lambda>?   s     =[=[aggVYll=[=[=[ r    key/zdigiKam-.*-Qt6-Win64\.exe$zDigiKam encontrado en stable: z%Error accediendo a download.kde.org: z!Error en obtener_enlace_digikam: )r   DEFAULT_HEADERSrequestsgetr   contentfind_allresearchgroupr
   comparar_versionesr   logginginfo	Exceptionwarningappendmaxregistrar_error)url_baser   pattern_exe	files_urlrespsoupmejor_versionmejor_enlacer   r   matchversione
stable_url	versionesversion_mayorversion_urlresp2soup2full_urls                       r   obtener_enlace_digikamrK      sU   .!7!EF@4		F<	7BGGGD }==D ML]]3T]22 @ @y	+t44 @#kk!nnG$,0HR_0`0`cd0d0d(/'.y$'?'? $S\SSTTT##$  	F 	F 	FODDDEEEEEEEE	F>
	I<
GRHHHD }==DI]]3T]22 5 5	"76CC 5$$U[[^^444 	( #I3[3[ \ \ \%j]2E2E2EFF ['2NNN%em]CC$77 ( (Ay!>&	JJ (#*;&	#B#B%Ph%P%PQQQ'(  	I 	I 	IOGAGGHHHHHHHH	It   E!EEFFFtttttsr   J
 CC" !J
 "
D,DJ
 DJ
 EI I J
 
J$J ;J
  JJ
 

J6J11J6c                     	 d} ddd}t          j        | |d          }|                                 |                                }|                    dg           D ]O}|                    dd	          }d
|v r3|                    dd	          }|rt	          j        d|            |c S Pt	          j        d           dS # t          $ r"}t          j	        d|            Y d}~dS d}~ww xY w)zVObtiene el instalador de OBS Studio desde GitHub Releases (Windows-x64-Installer.exe).zBhttps://api.github.com/repos/obsproject/obs-studio/releases/latestMozilla/5.0application/vnd.github.v3+jsonr   Acceptr   r   assetsname zWindows-x64-Installer.exebrowser_download_urlz!OBS Studio encontrado en GitHub: uJ   No se encontró el instalador Windows x64 de OBS Studio en GitHub ReleasesNz*Error obteniendo OBS Studio desde GitHub: )
r+   r,   raise_for_statusjsonr3   r4   r6   r5   r
   r9   api_urlr   rdataassetrR   urlrC   s           r   obtener_enlace_obs_githubr]   U   s%   V!.:Z[[L'2>>>	vvxxXXh++ 	 	E99VR((D*d22ii 6;; L!JS!J!JKKKJJJdeeet   N1NNOOOttttts   B*C -C 
C0C++C0c           	      8   	 d|  d}ddd}t          j        ||d          }|                                 |                                }|                    dg           D ]e}|                    d	d
          }t	          j        ||          r8|                    dd
          }	|	r t          j        | d|  d|	            |	c S ft          j        d| d| d|             dS # t          $ r(}
t          j        d| d|  d|
            Y d}
~
dS d}
~
ww xY w)uQ   Obtiene un asset de la última release de un repo GitHub (regex sobre el nombre).zhttps://api.github.com/repos/z/releases/latestrM   rN   rO   r   r   rQ   rR   rS   rT   z encontrado en GitHub (z): u   No se encontró asset 'z' para z en GitHub NzError obteniendo z desde GitHub (r+   r,   rU   rV   r/   r0   r3   r4   r6   r5   r
   r9   )repoasset_patternnombrerX   r   rY   rZ   r[   rR   r\   rC   s              r   obtener_enlace_github_releaserc   k   sp   H$HHH!.:Z[[L'2>>>	vvxxXXh++ 	 	E99VR((Dy-- ii 6;; LF!Q!Q4!Q!QC!Q!QRRRJJJa-aaaa[_aabbbt   U&UUUURSUUVVVttttts   CC' C' '
D1DDc                     	 d} t           j                                        }t          j        | |d          }t          |j        d          }|                    dd          D ]J}|d         }t          j	        d	|          r+t          | |          }t          j        d
|            |c S Kt          j        d           dS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)u8   Enlace de descarga de 7-Zip (página oficial, .exe x64).z#https://www.7-zip.org/download.htmlr   r   r   r   Tr   r   z7z\d+-x64\.exe$z7-Zip encontrado: u.   No se encontró el enlace de descarga de 7-ZipNz"Error obteniendo enlace de 7-Zip: r   r*   copyr+   r,   r   r-   r.   r/   r0   r   r3   r4   r6   r5   r
   r9   r\   r   rY   r>   r   r   rJ   rC   s           r   obtener_enlace_7ziprh      s   3(--//Lgr:::QY66s.. 	  	 AV9Dy+T22  "3--<(<<===  	HIIIt   F1FFGGGttttt   B,C /C 
C2C--C2c                     	 d} t           j                                        }t          j        | |d          }t          |j        d          }d}|                    dd          D ]1}|d	         }t          j	        d
|          rt          | |          } n2|st          j        d           dS t          j        ||d          }t          |j        d          }|                    dd          D ]:}|d	         }t          j	        d|          rt          j        d|            |c S ;t          j	        d|          }	|	rg|	                    d          }
d                    |
                    d          dd                   }d| d|
 d}t          j        d|            |S t          j        d           dS # t"          $ r"}t%          j        d|            Y d}~dS d}~ww xY w)uH   Enlace del MSI de Blender para Windows x64 (página principal + mirror).z!https://www.blender.org/download/r   r   r   Nr   Tr   r   zblender-[\d.]+-windows-x64\.msiu0   No se encontró el enlace de descarga de Blenderz blender-[\d.]+-windows-x64\.msi$zBlender encontrado (mirror): z!blender-([\d.]+)-windows-x64\.msir   r!      z,https://download.blender.org/release/Blenderz	/blender-z-windows-x64.msizBlender fallback URL: u5   No se encontró el enlace real de descarga de Blenderz$Error obteniendo enlace de Blender: )r   r*   rf   r+   r,   r   r-   r.   r/   r0   r   r3   r6   r4   r1   joinr#   r5   r
   r9   )r\   r   rY   r>   landing_urlr   r   r2rI   rA   rB   major_minor
direct_urlrC   s                 r   obtener_enlace_blenderrq      s2    1(--//Lgr:::QY66s.. 	 	AV9Dy;TBB %c400  	ONOOO4\+wCCCbj-88$// 	 	AV9Dy<dCC CTCCDDD 	>LL 	kk!nnG((7==#5#5bqb#9::Kwww^ewwwJL>*>>???OPPPt   HQHHIIIttttts,   B-G 1A<G .A>G -G 
G/G**G/c                     	 d} t           j                                        }t          j        | |d          }t          |j        d          }g }|                    dd          D ]G}t          j	        d|d	                   }|r(|
                    |                    d
                     H|st          j        d           dS t          |d           }d| d| d}t          j        ||dd          }	|	j        dk    rt          j        d|            |S t          j        d|            dS # t$          $ r"}
t'          j        d|
            Y d}
~
dS d}
~
ww xY w)zHMSI de LibreOffice Windows x86_64 (listado estable Document Foundation).zChttps://download.documentfoundation.org/libreoffice/stable/?C=M;O=Dr   r   r   r   Tr   r   r   r   z*No se encontraron versiones de LibreOfficeNc                 @    d |                      d          D             S )Nc                 ,    g | ]}t          |          S r   r   r   s     r   r   z@obtener_enlace_libreoffice.<locals>.<lambda>.<locals>.<listcomp>   s    5S5S5Sc!ff5S5S5Sr    r!   r"   r$   s    r   r&   z,obtener_enlace_libreoffice.<locals>.<lambda>   s    5S5Saggcll5S5S5S r    r'   z;https://download.documentfoundation.org/libreoffice/stable/z/win/x86_64/LibreOffice_z_Win_x86-64.msir   r   allow_redirects   zLibreOffice encontrado: z"LibreOffice MSI no encontrado en: z(Error obteniendo enlace de LibreOffice: )r   r*   rf   r+   r,   r   r-   r.   r/   r0   r7   r1   r3   r6   r8   headstatus_coder4   r5   r
   r9   )r\   r   rY   r>   rE   r   rA   rF   msi_urlcheckrC   s              r   obtener_enlace_libreofficer|      s   S(--//Lgr:::QY66	s.. 	1 	1AI3QvY??E 1  Q000 	OHIII4I+S+STTT VP]  V  V  xE  V  V  VgwTXYYY##L=G==>>>NFWFFGGGt   LLLMMMttttts%   CD7 AD7 D7 7
E#EE#c                     	 d} t           j                                        }t          j        | |d          }t          |j        d          }|                    dd          D ]J}|d         }t          j	        d	|          r+t          | |          }t          j        d
|            |c S Kt          j        d           dS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)z0Enlace de descarga de R para Windows desde CRAN.z,https://cran.r-project.org/bin/windows/base/r   r   r   r   Tr   r   zR-[\d.]+-win\.exe$zR encontrado: u*   No se encontró el enlace de descarga de RNzError obteniendo enlace de R: re   rg   s           r   obtener_enlace_rr~      s   <(--//Lgr:::QY66s.. 	  	 AV9Dy.55  "3--8h88999  	DEEEt   BqBBCCCtttttri   c                     	 d} t           j                                        }t          j        | |d          }t          |j        d          }|                    dd          D ]P}|d         }t          j	        d	|          r1d
|
                                v rt          j        d|            |c S Qt          j        d           dS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)z2Enlace de RStudio Desktop para Windows (posit.co).z*https://posit.co/download/rstudio-desktop/r   r   r   r   Tr   r   zRStudio-.*\.exe$windowszRStudio encontrado: u0   No se encontró el enlace de descarga de RStudioNz$Error obteniendo enlace de RStudio: )r   r*   rf   r+   r,   r   r-   r.   r/   r0   lowerr3   r4   r6   r5   r
   r9   r\   r   rY   r>   r   r   rC   s          r   obtener_enlace_rstudior      s   :(--//Lgr:::QY66s.. 	 	AV9Dy,d33 	TZZ\\8Q8Q:D::;;;JKKKt   HQHHIIIttttts   B2C 5C 
C8C33C8c                     	 d} t           j                                        }t          j        | |d          }t          |j        d          }g d}g }|                    dd          D ]}t          j	        
                    |d	                             d
                    }|D ]P}t          j        ||t          j                  }	|	r,|                    |	                    d          |f            nQ|st#          j        d           dS t'          |d           \  }
}t)          | |          }t#          j        d|            |S # t,          $ r"}t/          j        d|            Y d}~dS d}~ww xY w)zKGNU Octave para Windows x64 (ftpmirror.gnu.org, varios patrones de nombre).z-https://ftpmirror.gnu.org/gnu/octave/windows/r   r   r   )z$^octave-([\d.]+)-w64-installer\.exe$z'^octave-([\d.]+)-w64-64-installer\.exe$z^octave-([\d.]+)-.*w64.*\.exe$r   Tr   r   r)   r   z(No se encontraron instaladores de OctaveNc                 p    d t          j        | d                                       d          D             S )Nc                 T    g | ]%}|                                 t          |          &S r   isdigitr   r   s     r   r   z;obtener_enlace_octave.<locals>.<lambda>.<locals>.<listcomp>  s0    aaaaUVU^U^U`U`a3q66aaar    r   r!   )r
   limpiar_versionr#   )ts    r   r&   z'obtener_enlace_octave.<locals>.<lambda>  s2    aa5+@1+F+F+L+LS+Q+Qaaa r    r'   zOctave encontrado: z#Error obteniendo enlace de Octave: )r   r*   rf   r+   r,   r   textr.   ospathbasenamerstripr/   rA   
IGNORECASEr7   r1   r3   r6   r8   r   r4   r5   r
   r9   )r\   r   rY   r>   patterns
candidatosr   fnamepatmr?   mejor_fnamerJ   rC   s                 r   obtener_enlace_octaver     s   =(--//Lgr:::QV]33
 
 

 
s.. 	 	AG$$QvY%5%5c%:%:;;E  HS%77 %%qwwqzz5&9:::E  	OFGGG4%(aa&
 &
 &
"{ 3,,5855666   GAGGHHHttttts   DE =E 
E;E66E;c                  T   	 d} t           j        d         dd}t          j        d           t	          j        | |d          }|                                 |                                }t          |t                    rt          |          dk    rt          j        d	           d
S d |D             }|st          j        d           d
S |                    d d           |d         }|                    dd          }|                    dg           }|st          j        d| d           d
S |D ]}|                    dd          }	|                    dd          }
|	                                                    d          r5d|	                                v rt          j        d|
 d| d           |
c S |D ]t}|                    dd          }	|                    dd          }
|	                                                    d          rt          j        d|
 d| d           |
c S u|r;|d                             dd          }
|
rt          j        d|
 d| d           |
S t          j        d|            d
S # t          j        $ r"}t!          j        d|            Y d
}~d
S d
}~wt          j        t&          t(          f$ r"}t!          j        d|            Y d
}~d
S d
}~wt*          $ r"}t!          j        d |            Y d
}~d
S d
}~ww xY w)!uG   PDFCreator: API de updates pdfforge.org (versión estable + sourceUrl).z.https://update.pdfforge.org/pdfcreator/updatesr   zapplication/jsonrO   z)PDFCreator: Consultando API de updates...r   r   r   u.   PDFCreator: La API no devolvió datos válidosNc                 >    g | ]}|                     d d          |S )isStableF)r,   )r   r%   s     r   r   z-obtener_enlace_pdfcreator.<locals>.<listcomp>4  s+    JJJAz51I1IJaJJJr    z:PDFCreator: No se encontraron versiones estables en la APIc                     d t          j        |                     dd                                        d          D             S )Nc                 T    g | ]%}|                                 t          |          &S r   r   r   s     r   r   z?obtener_enlace_pdfcreator.<locals>.<lambda>.<locals>.<listcomp>9  s@       [\[d[d[f[fA  r    rB   0r!   )r
   r   r,   r#   r$   s    r   r&   z+obtener_enlace_pdfcreator.<locals>.<lambda>9  sH       % 5aeeIs6K6K L L R RSV W W   r    T)r(   reverserB   rS   	downloadsu   PDFCreator: La versión z no tiene descargas disponiblesfilename	sourceUrlz.exesetupzPDFCreator encontrado en API: z (v)z)PDFCreator encontrado en API (fallback): uE   PDFCreator: No se encontró URL de descarga válida para la versión z*Error obteniendo PDFCreator desde la API: z3Error parseando respuesta de la API de PDFCreator: z'Error obteniendo enlace de PDFCreator: )r   r*   r3   r4   r+   r,   rU   rV   
isinstancelistlenr6   sortr   endswithRequestExceptionr
   r9   JSONDecodeErrorKeyError
ValueErrorr5   )rX   r   rY   rZ   versiones_establesr?   version_numr   downloadr   
source_urlrC   s               r   obtener_enlace_pdfcreatorr   %  s   8B 0>(
 
 	@AAAL'2>>>	vvxx$%% 	TaOLMMM4JJJJJ! 	OXYYY4  	 	  	
 	
 	
 +1-#''	266!%%k266	 	Oc{cccddd4! 	" 	"H||J33H!k266J~~((00 "W@P@P5P5P[j[[[[[[\\\!!!!! 	" 	"H||J33H!k266J~~((00 "[j[[[[[[\\\!!!!"  	""1))+r::J "fffXcfffggg!!m`kmmnnnt$   N1NNOOOttttt (J7   WTUWWXXXttttt   KKKLLLtttttsW   B&J *"J A&J 6BJ A6J 9=J 7J L'J<<L'K88L'L""L'c                     	 d} t           j                                        }t          j        | |d          }t          j        d|j                  }d |D             }|sd}t          j        ||d          }t          |j	        d          }|
                    dd	          D ]N}|d
         }	t          j        d|	          r/d|	v r+t          ||	          }
t          j        d|
            |
c S Ot          j        d           dS t!          t#          d |D                       d           }t          j        dt          j        |           d|j                  }|r<t          | |                    d                    }
t          j        d|
            |
S dS # t(          $ r"}t+          j        d|            Y d}~dS d}~ww xY w)z4QGIS para Windows: MSI estable (excluye 3.99.x dev).zhttps://qgis.org/downloads/r   r   z"(QGIS-OSGeo4W-([\d.]+)-(\d+)\.msi)c                 H    g | ]}|d                               d          | S )r   z3.99)
startswithr   r   s     r   r   z'obtener_enlace_qgis.<locals>.<listcomp>i  s-    HHHA!0G0GHaHHHr    r   r   Tr   r   z\.msi$QGISzQGIS encontrado: u-   No se encontró el enlace de descarga de QGISNc              3   &   K   | ]}|d          V  dS )r   Nr   r   s     r   	<genexpr>z&obtener_enlace_qgis.<locals>.<genexpr>w  s&      ))!))))))r    c                 @    d |                      d          D             S )Nc                 ,    g | ]}t          |          S r   r   r   s     r   r   z9obtener_enlace_qgis.<locals>.<lambda>.<locals>.<listcomp>x  s    888a3q66888r    r!   r"   r$   s    r   r&   z%obtener_enlace_qgis.<locals>.<lambda>x  s    881773<<888 r    r'   zQGIS-OSGeo4W-z	-\d+\.msir   z!Error obteniendo enlace de QGIS: )r   r*   rf   r+   r,   r/   findallr   r   r-   r.   r0   r   r3   r4   r6   r8   setescaper1   r5   r
   r9   )r\   r   rY   all_msi
stable_msiurl2rn   r>   r   r   rJ   r?   	msi_matchrC   s                 r   obtener_enlace_qgisr   b  s
   +(--//Lgr:::*BAFKKHHHHH
 	0DdGR@@@B ];;D]]3T]22 $ $y9Y-- $&D..&tT22HL!?X!?!?@@@#OOOOKLLL4))j)))))88
 
 
 IRry/G/GRRRTUTZ[[	 	sIOOA$6$677HL7X77888Ot   E!EEFFFttttts%   C1F$ 4F$ BF$ $
G.GGc                     	 d} t           j                                        }t          j        | |d          }t          |j        d          }|                    dd          D ]:}|d         }t          j	        d	|          rt          j        d
|            |c S ;t          j        d           dS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)z)VirtualBox para Windows (wiki Downloads).z)https://www.virtualbox.org/wiki/Downloadsr   r   r   r   Tr   r   zVirtualBox-.*-Win\.exe$zVirtualBox encontrado: u3   No se encontró el enlace de descarga de VirtualBoxNz'Error obteniendo enlace de VirtualBox: )r   r*   rf   r+   r,   r   r-   r.   r/   r0   r3   r4   r6   r5   r
   r9   r   s          r   obtener_enlace_virtualboxr     s	   9(--//Lgr:::QY66s.. 	 	AV9Dy3T:: =t==>>> 	MNNNt   KKKLLLttttts   BB6 B6 6
C" CC"c                  P   	 d} t           j                                        }t          j        | |d          }d}t          j        ||j                  }|sQd}t          j        ||dd          }|j	        r.|j	        |k    r#t          j        d|j	                    |j	        S d	S d	}d	}|D ]$\  }	}
|t          j        |
|          d
k    r|
}|	}%|r"| |z   }t          j        d| d| d           |S d	S # t          $ r"}t          j        d|            Y d	}~d	S d	}~ww xY w)zGLinphone Windows x64 (listado de releases o redirect latest_app_win64).z.https://www.linphone.org/releases/windows/app/r   r   z'(Linphone-([\d.]+)-win64\.exe)(?!\.sha)z:https://www.linphone.org/releases/windows/latest_app_win64Tru   z Linphone encontrado (redirect): Nr   zLinphone encontrado: z
 (version r   z%Error obteniendo enlace de Linphone: )r   r*   rf   r+   r,   r/   r   r   rx   r\   r3   r4   r
   r2   r5   r9   )r\   r   rY   patternmatches	redir_urlrn   r?   mejor_filenamer   rB   rJ   rC   s                r   obtener_enlace_linphoner     s~   >(--//Lgr:::<*Waf-- 	TIy'2W[\\\Bv "&I--HHHIIIv4!( 	* 	*Hg$(@-(X(X[\(\(\ '!) 	^+HLUUU]UUUVVVOt   IaIIJJJttttts   B#C9 (AC9 9
D%D  D%c                     	 d} ddd}t          j        | |d          }|                                 |                                }|                    dg           D ]`}|                    dd	          }t	          j        d
|          r3|                    dd	          }|rt          j        d|            |c S at          j        d           dS # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)z/Notepad++ instalador x64 desde GitHub Releases.zPhttps://api.github.com/repos/notepad-plus-plus/notepad-plus-plus/releases/latestrM   rN   rO   r   r   rQ   rR   rS   z!npp\.[\d.]+\.Installer\.x64\.exe$rT   z Notepad++ encontrado en GitHub: uA   No se encontró el instalador x64 de Notepad++ en GitHub ReleasesNz)Error obteniendo Notepad++ desde GitHub: r_   rW   s           r   obtener_enlace_notepadppr     s/   d!.:Z[[L'2>>>	vvxxXXh++ 	 	E99VR((Dy=tDD ii 6;; L!IC!I!IJJJJJJ[\\\t   M!MMNNNttttts   B;C >C 
DC<<Dc                    | sdS t          j        d|           }|st          j        d|           }|r||                    d          |                    d          g}|                    d          r(|                    |                    d                     d                    |          S dS d |D             }|rd                    |d	                   S d                    |d	         dd                   S )
u   
    Extrae versión X.Y o X.Y.Z de un texto (nombre de asset, release name, tag).
    Prefiere X.Y.Z si hay varias. Retorna None si no hay match.
    Nz\b(\d+)\.(\d+)(?:\.(\d+))?\bz(\d+)[_.](\d+)(?:[_.](\d+))?r   rk      r!   c                 H    g | ]}t          |          d k    |d         | S )r   rk   )r   r   s     r   r   z-_extraer_version_inkscape.<locals>.<listcomp>  s+    <<<qs1vv{{qt{{{{r    r   )r/   r   r0   r1   r7   rl   )textor   r   partes	con_patchs        r   _extraer_version_inkscaper     s    
  tj8%@@G I5u== 	$ggajj!''!**-Fwwqzz *aggajj)))88F###t<<G<<<I &xx	!%%%88GAJrrN###r    c                  t   	 dt           j        d         i} d}	 d}t          j        || d          }|                                 |                                }|r|d                             dd          }t          j        d	|          }|r|                    d
          |                    d          g}|                    d          r(|	                    |                    d                     d
                    |          }t          j        d|            n.# t          $ r!}t          j        d|            Y d}~nd}~ww xY w|st          j        d           dS d| d}	t          j        d| d|	            |	S # t          $ r"}t          j        d|            Y d}~dS d}~ww xY w)u4  
    Inkscape Windows x64: obtiene la versión desde la API de GitLab y devuelve
    la URL de descarga directa del instalador .exe para que wget la resuelva.

    inkscape.org devuelve 403 a peticiones Python, por eso se evita scrapear
    esa web. La URL construida es resuelta correctamente por wget.
    r   Nz?https://gitlab.com/api/v4/projects/inkscape%2Finkscape/releasesr   r   r   tag_namerS   zINKSCAPE_(\d+)_(\d+)(?:_(\d+))?r   rk   r   r!   u*   Inkscape: versión obtenida desde GitLab: u2   Inkscape: error obteniendo versión desde GitLab: u5   Inkscape: no se pudo obtener la versión desde GitLabz&https://inkscape.org/release/inkscape-z/windows/64-bit/dl/exe/z	Inkscape z: enlace construido: z%Error obteniendo enlace de Inkscape: )r   r*   r+   r,   rU   rV   r/   r0   r1   r7   rl   r3   r4   r5   r6   r
   r9   )
r   rB   rX   rY   releasestagr   r   rC   download_urls
             r   obtener_enlace_inkscaper     s   #!7!EF	VWGWgrBBBA   vvxxH 	Yqkooj"55I@#FF Yggajj!''!**5Fwwqzz 2aggajj111!hhv..GL!Wg!W!WXXX 	V 	V 	VOTQRTTUUUUUUUU	V  	!"YZZZ4 a```MMM|MMNNN   IaIIJJJtttttsG   F D	D# "F #
E-E	F 	EF )!F 
F7F22F7c                 L   |                      d          rd| z   S |                      d          rc|                    d          d         dz   |                    d          d                             d          d         z   }t          ||           S t          |dz   |           S )z5Convierte href relativo o incompleto en URL absoluta.z//zhttps:r)   r   r   )r   r#   r   )r   url_originalurl_responsebase_urls       r   _normalizar_hrefr     s    t $s '%%d++A.58J8J48P8PQR8S8Y8YZ]8^8^_`8aax&&&<#%t,,,r    c                 D   t          j        d|           }|sdS |                    d          }d| d}t          j        ||||          }d}d}	|D ]$\  }
}|t          j        |
|          dk    r|
}|}	%|	rt          ||	          S t          j	        d|             dS )zKManeja URLs SourceForge que terminan en /latest/download (scraping files/).z>https://sourceforge.net/projects/([^/]+)/files/latest/downloadNr   z!https://sourceforge.net/projects/z/files/r   u?   No se encontró enlace de descarga válido en SourceForge para )
r/   rA   r1   r	   buscar_mejor_enlace_sourceforger
   r2   r   r3   r6   )r\   	extensionr   r   r   proyector<   r   r?   
mejor_hrefrB   r   s               r   "_obtener_enlace_sourceforge_latestr   #  s    
RTWXXA twwqzzHEHEEEI<9gw J MJ#   E$<Wm$T$TWX$X$X#MJ .y*---O[VY[[\\\4r    c                 "   t           j                                        }|r'|                                dk    rt	          |           S |sd| vr| S 	 d| v r'|                     d          rt          | |||          S t          j        | |d          }t          j
        d| d|j         dt          |j                   d	           t          |j        d
          }|r |j        di |nd}|rt!          |d         | |j                  S d| v rh|                    dd          D ]P}	t'          j        d|	d                   r3t'          j        d|	d                   rt+          | |	d                   c S Q|                    dd          }
t          j        d| dt          |
           dd |
dd         D                         dS # t          j        t0          t2          f$ r%}t5          j        d|  d|            Y d}~dS d}~ww xY w)u   
    Orquesta la obtención del enlace: DigiKam, SourceForge /latest/download o
    scraping genérico de la página con filtros BeautifulSoup.
    digikamzsourceforge.netz/latest/downloadr   r   z	Scraping z: HTTP z, Content-Length: z bytesr   r   Nr   Tr   z
/download$z\du'   No se encontró enlace con filtro para z. Total enlaces: z. Primeros hrefs: c                 .    g | ]}|d          dd         S )r   NP   r   )r   r   s     r   r   z+obtener_enlace_descarga.<locals>.<listcomp>U  s$    FFF1&	#2#FFFr       z,Error al obtener el enlace de descarga para z: )r   )r   r*   rf   r   rK   r   r   r+   r,   r3   r4   ry   r   r-   r   findr   r\   r.   r/   r0   r   r6   r   r   r   r
   r9   )r\   filtror   r   rb   r   responser>   linkr   	all_linksrC   s               r   obtener_enlace_descargar   9  s   
 $))++G +&,,..I--%c*** 's22
##5G(H(H#5c9gwWWW<WbAAAlllx';llsS[ScOdOdlll	
 	
 	
 X-}==+1;yty'''''t 	E#DL#x|DDD##]]3T]22 3 39]AfI66 329UAfI;V;V 3"3&	22222MM#DM11	If I IsS\~~ I IFF	"1"FFFI I	
 	
 	
 t%z8<   WSWWTUWWXXXttttts-   *G <BG A*G 7AG H)H		H)NNN)#__doc__rV   r3   r   r/   urllib.parser   r   r+   bs4r   rS   r   r   r	   r
   rK   r]   rc   rh   rq   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   <module>r      s      				 				 ) ) ) ) ) ) ) )                               0 0 0p  ,  6  (" " "J  8  (  &     F: : :z     F  &  >  ,$ $ $2+ + +f- - -  ,! ! ! ! ! !r    