U
    ·fÚ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
mZ ddlmZmZ ddlmZ ddlmZmZmZmZ dZdZed	ƒZd
Zdd„ Zdd„ ZdS )u´   Hermes V3D: propuestas de asignaciÃ³n desde tarjetas+EPG+Sling. Sin escritura en DB.
Solo muestra datos no sensibles al modelo. Las propuestas requieren aprobaciÃ³n independiente.
é    N)ÚPath)ÚdatetimeÚtimezone)Úurlsplit)ÚtokensÚepg_dateÚchannel_numÚepg_numz!/var/lib/hermes-nexus/football.dbz/var/lib/hermes-nexus/epg.dbz&/var/lib/hermes-nexus/football_pendingz15.204.47.5c               	   C   sd  t j d¡} t j d¡}| r |s(tdƒ‚t | d |  ¡ ¡ ¡ }tj	j
dd| ddœd	�}tj	j|d
d��}| d¡}W 5 Q R X t|ƒdkr–tdƒ‚i }d}|jddd� ¡ D ]®}| ¡ }| d¡rÜ| dd¡d  ¡ }q°| d¡r°|r°t|ƒ}	t|ƒ}
|
�rZ|	jdk�rZ|	jtk�rZ|	jdk�rZ|	j d¡�rZ|	j�sZ|	j�sZ| |
g ¡ ||dœ¡ d}q°|S )NZHERMES_O11_USERZHERMES_O11_PASSWORDzCredenciales O11 no cargadasú:z$http://15.204.47.5:1234/playlist.m3uzBasic z
Hermes-V3D)ZAuthorizationz
User-Agent)Zheadersé   )Ztimeouti �i  �u   M3U excede lÃ­miteÚ z	utf-8-sigÚreplace)Úerrorsz#EXTINFú,é   éÿÿÿÿZhttpiÒ  z/stream/sling/)ÚnombreÚurl)ÚosÚenvironÚgetÚRuntimeErrorÚbase64Z	b64encodeÚencodeÚdecodeÚurllibZrequestZRequestZurlopenÚreadÚlenÚ
ValueErrorÚ
splitlinesÚstripÚ
startswithÚrsplitr   r   ZschemeZhostnameÚHOSTZportÚpathZusernameÚpasswordÚ
setdefaultÚappend)Úuserr%   ZauthZreqZrespZcontentZchannelsÚnameÚlineÚpÚkey© r-   ú+/var/www/html/NFL_ST/hermes_football_v3d.pyÚ	_playlist   s.        
 Hr/   c                    sf  t | tƒrt d| ¡stdƒ‚tjdt d dd��r}tj|_	| 
d| f¡ ¡ }|shdd	iW  5 Q R £ S t|ƒ}| 
d
| f¡ ¡ }|r¢|d r¢ddiW  5 Q R £ S W 5 Q R X t |d  dd¡¡ tj¡}tjdt d dd��"}| 
d| d¡d f¡ ¡ }W 5 Q R X ddlm‰  dd„ ‰‡ ‡fdd„}g }|D ]Ä\}}	}
}||d |	ƒ}||d |	ƒ}t||ƒdk �rn�q2ztt|
ƒ|  ¡ d ƒ}W n  ttfk
�rª   Y �q2Y nX t|ƒdk�r¾�q2t|ƒ}|�r2| ||	|
|||| t|ƒd  dœ¡ �q2|�sd|d d  |d  d!œS t ƒ }g }|D ].}| !|d" g ¡}|�r&| ||d f¡ �q&|�sjd#t"|ƒd$œS |j#d%d&„ d'� |d \}}t$j%d(ddd)� t& 't$d(¡ t( )d*¡}| |d d  |d  |d+ |d, |d- |d. |d/ d0d0t *tj¡ +¡ d1œ
}t$|d2  }t,|d3d4d5��}t-j.||d6d7d8� W 5 Q R X t& '|d9¡ d:|| |d; |d+ |d. |d- d<d6d=d>d?œS )@Nz[a-zA-Z0-9_.:-]{5,100}u   ID de partido invÃ¡lidozfile:z?mode=roT)ZurizSELECT * FROM events WHERE id=?ÚestadoZEVENTO_NO_ENCONTRADOz6SELECT manual_url FROM football_links WHERE event_id=?r   ZENLACE_MANUAL_PROTEGIDOZ
starts_utcÚZz+00:00zœSELECT canal,titulo,inicio,fin FROM epg_programas WHERE fuente='sling' AND (canal LIKE 'vixpremiumdeportes%' OR canal LIKE 'vixdeportes%') AND inicio LIKE ?z%Y%m%dú%)ÚSequenceMatcherc                    sB   dd l ‰ d ‡ fdd„ˆ  dt| ƒ ¡ ¡D ƒ¡} t dd| ¡ ¡ S )Nr   r   c                 3   s   | ]}ˆ   |¡s|V  qd S )N)Z	combining)Ú.0Úc©Úunicodedatar-   r.   Ú	<genexpr>4   s     
 z<preparar_asignacion_futbol.<locals>.clean.<locals>.<genexpr>ZNFKDz
[^a-z0-9]+ú )r7   ÚjoinZ	normalizeÚstrÚcasefoldÚreZsubr    )Útextr-   r6   r.   Úclean2   s    (z)preparar_asignacion_futbol.<locals>.cleanc                    sV   ˆ| ƒ}ˆ|ƒ  ¡ ‰ |rˆ s dS |ˆ|ƒkr0dS |g|  ¡  }t‡‡ fdd„|D ƒƒS )Ng        g      ð?c                 3   s4   | ],}ˆD ]"}t |ƒd kr
ˆ d||ƒ ¡ V  q
qdS )é   N)r   Zratio)r4   ÚxÚw)r3   Úwordsr-   r.   r8   ;   s
        zApreparar_asignacion_futbol.<locals>.score_team.<locals>.<genexpr>)ÚsplitÚmax)ZteamÚtitleÚtZvariants©r3   r?   )rC   r.   Ú
score_team6   s       z.preparar_asignacion_futbol.<locals>.score_teamÚhomeZawaygö(\�Âõà?é<   éx   i,  )ÚcanalÚtituloÚinicioÚdeltar,   ÚscoreZSIN_COINCIDENCIA_EPGz vs )r0   Úpartidor,   ZSIN_CANAL_EN_CATALOGO)r0   Zcoincidencias_epgc                 S   s   | d d  t | d d ƒfS )Nr   rQ   rP   )Úabs)Úmr-   r-   r.   Ú<lambda>N   ó    z,preparar_asignacion_futbol.<locals>.<lambda>)r,   iÀ  )ÚmodeZparentsÚexist_oké   rM   rN   rP   r   r   r   )
Úevent_idrR   Z	epg_canalZ
epg_tituloÚdiferencia_minutosZcatalogo_nombrer   Zfuente_publicaZverificado_porZcreated_utcz.jsonrA   zutf-8)ÚencodingFr@   )Zensure_asciiZindenti€  ZPROPUESTA_PENDIENTErR   Z	PENDIENTEZNO_COMPROBADOuS   Revisar fuente pÃºblica independiente y autorizar fuera de Gemini antes de guardar.)r0   ÚticketrZ   rR   Z	canal_epgZcanal_catalogor[   Zverificacion_publicaZguardadoZonlineZinstruccion)/Ú
isinstancer;   r=   Z	fullmatchr   Úsqlite3ZconnectÚDBZRowZrow_factoryZexecuteZfetchoneÚdictr   Zfromisoformatr   Z
astimezoner   ZutcÚEPGÚstrftimeZfetchallZdifflibr3   ÚminÚroundr   Ztotal_secondsÚ	TypeErrorrS   r	   r'   r/   r   r   ÚsortÚPENDINGÚmkdirr   ÚchmodÚsecretsZ	token_hexZnowZ	isoformatÚopenÚjsonÚdump)rZ   ZdbZeventZexistingZwhenZrowsrI   Z
candidatesrM   rN   rO   ZfinÚhÚarP   r,   ZcatalogZmatchesr5   ÚentriesÚentryr]   ZproposalÚfileZfhr-   rH   r.   Úpreparar_asignacion_futbol#   sŒ      &     ,   
    ý     ürt   )Ú__doc__r   r=   r   r_   Zurllib.requestr   rm   rk   ZhashlibÚpathlibr   r   r   Zurllib.parser   Z!hermes_football_link_manager_v2_1r   r   r   r	   r`   rb   rh   r#   r/   rt   r-   r-   r-   r.   Ú<module>   s   @