U
    ¡ßÙjƒ"  ã                   @   sø   d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZmZmZ ddlmZ ddlmZ dddd	d
dddddddhZdd„ Zdd„ Zdd„ Zdd„ Zd$dd„Zdd„ Zdd „ Zd!d"„ Zed#krôeƒ  dS )%u¥   Hermes Football Link Manager V2: auditorÃ­a ESPN/EPG/M3U, sin cambios en producciÃ³n.
Python 3.8. No descarga ni reproduce streams. No imprime URLs ni credenciales.
é    N)ÚdatetimeÚtimezoneÚ	timedelta)ÚPath)ÚurlsplitZfcÚcfZscZafcZclubÚdeZtheÚ04ZvsZcontraÚsvZfkc                 C   s:   d  dd„ t dt| pdƒ ¡ ¡D ƒ¡} t dd| ¡ ¡ S )NÚ c                 s   s   | ]}t  |¡s|V  qd S ©N)ÚunicodedataÚ	combining)Ú.0Úc© r   ú9/var/www/html/NFL_ST/hermes_football_link_manager_v2_1.pyÚ	<genexpr>   s     
 znorm.<locals>.<genexpr>ZNFKDz
[^a-z0-9]+ú )Újoinr   Ú	normalizeÚstrÚlowerÚreÚsubÚstrip©Úsr   r   r   Únorm   s    (r   c                 C   s   t t| ƒ ¡ ƒt S r   )Úsetr   ÚsplitÚSTOPr   r   r   r   Útokens   s    r"   c                 C   s   t  | d¡ tj¡S )Nz%Y%m%d%H%M%S %z)r   ÚstrptimeÚ
astimezoner   Úutcr   r   r   r   Úepg_date   s    r&   c              	   C   sø   | sg S g }d}t | dddd��Î}|D ]Â}| ¡ }| d¡rB|}q&|r&| d¡s&|r&| dd	¡d
  ¡ }t d|tj¡}t d|tj¡}dt|ƒkrädt|ƒkrädt|ƒksÆdt|r¾| d	¡ndƒkrä| 	||rÚ| d	¡nddœ¡ d}q&W 5 Q R X |S )uI   Retorna nombres y tvg-id; intencionalmente descarta URL de reproducciÃ³n.r   Úrú	utf-8-sigÚreplace)ÚencodingÚerrorsú#EXTINFú#ú,é   éÿÿÿÿútvg-id="([^"]+)"úgroup-title="([^"]+)"ÚvixÚdeportesÚsling©ÚnameZtvg_id)
Úopenr   Ú
startswithÚrsplitr   ÚsearchÚIr   ÚgroupÚappend)ÚpathÚresultÚextÚfhÚliner7   Útvgr=   r   r   r   Úload_playlist    s"    
>rE   é  �c              	   C   sJ  |   d¡stdƒ‚t |d |  ¡ ¡ d¡}tjj| d| dddœd	�}tjj	|d
d��(}| 
|d ¡}t|ƒ|kr~tdƒ‚W 5 Q R X g }|jddd� ¡ D ]¦}	|	  d¡s®qž|	 dd¡d  ¡ }
t d|	tj¡}t d|	tj¡}dt|
ƒkrždt|
ƒkrždt|
ƒk�s$dt|�r| d¡ndƒkrž| |
|�r:| d¡nddœ¡ qž|S )zLConsulta O11 y conserva solo metadatos EXTINF; nunca guarda URLs de streams.)zhttp://zhttps://z$La URL del catalogo debe ser HTTP(S)ú:ÚasciizBasic z*/*z)Mozilla/5.0 (Hermes-Nexus; catalog-audit))ÚAuthorizationÚAcceptz
User-Agent)Úheadersé-   )Útimeoutr/   z"Playlist excede el limite de 25 MBr(   r)   )r+   r,   r.   r0   r1   r2   r3   r4   r5   r   r6   )r9   Ú
ValueErrorÚbase64Ú	b64encodeÚencodeÚdecodeÚurllibÚrequestÚRequestÚurlopenÚreadÚlenÚ
splitlinesr:   r   r   r;   r<   r   r=   r>   )ÚurlÚusernameÚpasswordÚlimitÚauthÚreqÚresponseÚpayloadr@   rC   r7   rD   r=   r   r   r   Údownload_catalog4   s4    
ý

 
ÿÿ"rb   c                 C   s:   t | ƒ}t d|¡}|r6d|kr$dndt| d¡ƒfS d S )Nz%vix\s*(?:premium\s*)?deportes\s*(\d+)ÚpremiumÚnormalr/   )r   r   r;   Úintr=   )ÚtextÚtÚmr   r   r   Úchannel_numM   s
    ri   c                 C   s<   t  dt| ƒ ¡ ¡}|r8| d¡r&dndt| d¡ƒfS d S )Nzvix(premium)?deportes(\d+)\.us$r/   rc   rd   é   )r   Úmatchr   r   r=   re   )Úcanalrh   r   r   r   Úepg_numT   s    rm   c                     sŠ  t jdd�} | jdddd� | jddd	� | jd
dd	� | jddd� | jdddd� | jdtj dd¡dd� | jdddd� | jddd� |  ¡ }t |j	d¡ 
¡ }tjd|j d dd �}tjd|j d dd �}tj|_tj|_d!d"„ | d#|j	f¡D ƒ}t |tj ¡ ¡td$d%�  d&¡}t |tj ¡ ¡td'd%�  d&¡}d(d"„ | d)||f¡D ƒ}| ¡  | ¡  |j }	|j�r†g }
n¦|j�ršt|jƒ}
n’tj d*¡}|�sÊtj ¡ �sÀtd+ƒ‚t d,¡}zZzt |j!|j"|ƒ}
W n@ t#j$j%t&t'fk
�r  } ztd-t(|ƒj) ƒ‚W 5 d }~X Y nX W 5 d }X g }|D �]¬}t*| d.¡ƒ}t*| d/¡ƒ}z"t +|d0  ,d1d2¡¡ -t.j/¡}W n  t0t&t1fk
�r˜   d }Y nX g }|D �]Z}t*|d3 ƒ‰|�r¢|�r¢t2‡fd4d5„||fD ƒƒ�sà�q¢z*|�rt3t4|d6 ƒ|  5¡ d7 ƒnd }W n t&t0fk
�r(   d }Y nX |d k�s¢t6|ƒd8k�rF�q¢t7|d9 ƒ‰ ˆ �rj‡ fd:d"„|
D ƒng }| 8|d9 |d3 |d6 ||	�r”t9|ƒnd t9|ƒd$k�r°|d; d< nd t6|ƒd=k�rÄd>n0|	�ròt9|ƒd$k�rÜd?nt9|ƒd$k�rîd@ndAndBdCœ¡ �q¢i }|D ]>}|dD }||k�s<t6|dE ƒt6|| dE ƒk �r|||< �qt:| ;¡ ƒ}dFd"„ |D ƒ}t9|ƒd$k�r‚t9|ƒd$k�r‚dGnt9|ƒd$k�r”dHn|�sždIndJ}| 8| dK¡t<| d/¡ƒdL t<| d.¡ƒ | d0¡||dMœ¡ �q4dNdO|j	t9|ƒ|	t9|
ƒdP|dQœ}t=j>|dRd'dS�}|j?�r~t@|j?ƒ A¡ }| B¡ �r<tdTƒ‚|jC|dU dVdW� | DdX¡ tEdY|dZt9|ƒd[tFd\d5„ |D ƒƒƒ ntE|ƒ d S )]Nu<   Cruce de partidos EPG y catÃ¡logo Sling, sin escritura en DB)Údescriptionz--fechaTz#YYYY-MM-DD, fecha local de tarjetas)ÚrequiredÚhelpz
--footballz!/var/lib/hermes-nexus/football.db)Údefaultz--epgz/var/lib/hermes-nexus/epg.dbz
--playlistz-M3U local opcional; si se omite, descarga O11)rp   z	--o11-urlz$http://15.204.47.5:1234/playlist.m3uzURL del catalogo O11)rq   rp   z
--o11-userÚHERMES_O11_USERZadminzUsuario O11z	--sin-o11Ú
store_truezNo descargar catalogo)Úactionrp   z--salidau8   Ruta del informe JSON; no contiene URLs de reproducciÃ³nz%Y-%m-%dzfile:z?mode=ro)Úuric                 S   s   g | ]}t |ƒ‘qS r   ©Údict©r   Úxr   r   r   Ú
<listcomp>h   s     zmain.<locals>.<listcomp>z&SELECT * FROM events WHERE local_day=?r/   )Údaysz%Y%m%d%H%M%Srj   c                 S   s   g | ]}t |ƒ‘qS r   rv   rx   r   r   r   rz   l   s     z±SELECT canal,titulo,inicio,fin FROM epg_programas
      WHERE fuente='sling' AND (canal LIKE 'vixpremiumdeportes%' OR canal LIKE 'vixdeportes%')
      AND inicio < ? AND fin > ?ÚHERMES_O11_PASSWORDzEFalta HERMES_O11_PASSWORD (o ejecuta en terminal para ingresar clave)z Clave O11 Sling (no se guarda): z&No se pudo descargar el catalogo O11: ÚhomeÚawayÚ
starts_utcÚZz+00:00Útituloc                 3   s,   | ]$}t |ˆ @ ƒtd t |ƒd  ƒkV  qdS )r/   N)rX   Úmax)r   Úteam)Úwordsr   r   r   ‰   s     zmain.<locals>.<genexpr>Úinicioé<   éZ   rl   c                    s    g | ]}t |d  ƒˆ kr|‘qS )r7   )ri   rx   )Únumr   r   rz   �   s      r   r7   é   ZHORARIO_REVISARÚCATALOGO_UNICOZCATALOGO_AMBIGUOZSIN_CANAL_M3UZEPG_PROPUESTO)Ú	epg_canalÚ
epg_tituloZ
epg_inicioÚdiferencia_minutosZcatalogo_coincidenciasÚcatalogo_nombreÚestador‹   r�   c                 S   s   g | ]}|d  dkr|‘qS )r�   rŠ   r   rx   r   r   r   rz   ›   s      ÚPROPUESTA_PARA_REVISIONÚAMBIGUOZSIN_COINCIDENCIAÚ	PENDIENTEÚidz contra )r“   ÚpartidoZinicio_espnr�   ÚcoincidenciaszV2.1ZSOLO_LECTURAuW   No verifica reproducciÃ³n ni derechos; ninguna URL de transmisiÃ³n se guarda o publica.)ÚversionZmodoÚfechaZtotal_eventosZcatalogo_consultadoZcanales_sling_m3uZnotaÚ
resultadosF)Úensure_asciiÚindentz&La salida ya existe: no se sobrescribeÚ
zutf-8)r*   i€  zInforme guardado:z
| eventos:z| propuestas:c                 s   s   | ]}|d  dkV  qdS )r�   r�   Nr   rx   r   r   r   r   ª   s     )GÚargparseÚArgumentParserÚadd_argumentÚosÚenvironÚgetÚ
parse_argsr   r#   r—   ÚdateÚsqlite3ÚconnectÚfootballÚepgÚRowÚrow_factoryÚexecuteÚcombineÚminÚtimer   ÚstrftimeÚcloseZsin_o11ZplaylistrE   ÚsysÚstdinÚisattyÚ
SystemExitÚgetpassrb   Zo11_urlZo11_userrS   ÚerrorÚURLErrorrN   ÚOSErrorÚtypeÚ__name__r"   Úfromisoformatr)   r$   r   r%   Ú	TypeErrorÚAttributeErrorÚallÚroundr&   Útotal_secondsÚabsrm   r>   rX   ÚlistÚvaluesr   ÚjsonÚdumpsZsalidar   Ú
expanduserÚexistsÚ
write_textÚchmodÚprintÚsum)ÚpÚargsÚdayr¦   r§   ÚeventsÚstartÚendZprogramsZcatalog_usedÚchannelsr\   ÚexcÚoutputÚeventr}   r~   Zevent_dtÚfoundÚprÚdeltaÚcatalogÚuniquery   ÚkÚmatchesZeligibleÚstateZreportÚrenderedÚdestr   )rˆ   r„   r   ÚmainX   sÀ    ""þ 
(
  " 

( * 
  Bü(  ÿ*  ÿ ý
 
&rß   Ú__main__)rF   )Ú__doc__rœ   rO   r´   rŸ   r°   Úurllib.requestrS   Úurllib.errorrÃ   r   r¤   r   r   r   r   Úpathlibr   Úurllib.parser   r!   r   r"   r&   rE   rb   ri   rm   rß   r¹   r   r   r   r   Ú<module>   s2   
U 