o
    j4/                     @   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
m
Z
mZ ddlmZ eejdrAejjdd eejdrNejjdd dZd	Zd
d
ddddZeejd Zeejd Zeejd Zejejdejeddeejgd eeZ g dZ!de"de"fddZ#de$de$fddZ%de$de&e$e'f fddZ(de)e" fdd Z*d!e"de$fd"d#Z+d3d$e
dB dedB fd%d&Z,de$e)B d'e"fd(d)Z-d4d+e'fd,d-Z.d.d/ Z/d0d1 Z0ed2kre0  dS dS )5z
DAZN EPG Downloader
Scarica la guida programmi (EPG) di DAZN Italia per la data corrente.
Si aggiorna automaticamente ogni giorno a mezzanotte.
    N)datetime	timedelta)Pathreconfigureutf-8encodingz8https://epg.discovery.indazn.com/eu/v5/epgWithDatesRangezqhttps://image.discovery.indazn.com/eu/v3/eu/none/{image_id}/fill/none/top/none/100/1280/720/webp/image?brand=daznittrue120dazn)countrylanguageCode
openBrowsetimeZoneOffsetbrandepg_datazdazn_epg.logzproxydaznepg.txtz'%(asctime)s [%(levelname)s] %(message)s)levelformathandlers)ImageBackgroundImage
PromoImage	LogoImagePortraitImage	HeroImageimage_idreturnc                 C   s   t j| dS )z?Costruisce l'URL completo dell'immagine DAZN a partire dall'ID.r   )IMAGE_URL_TEMPLATEr   r    r    0/var/www/addictedbytheproject.nl/epg/dazn_epg.pybuild_image_url=   s   r"   img_objc                 C   s,   | rt | tr| drt| d | d< | S )zu
    Converte un oggetto immagine: sostituisce il campo 'Id'
    con il campo 'Url' contenente il link completo.
    IdUrl)
isinstancedictgetr"   )r#   r    r    r!   convert_image_objectB   s   r)   datac                 C   s0  d}|  dg }|D ]}tD ]}| |}|r)t|tr)| dr)t| |d7 }qdD ]2}| |}|r^t|tr^| dg }t|tr^|D ]}|r]t|tr]| dr]t| |d7 }qGq,| d}	|	rt|	tr|	D ]%}
t|
trtD ]}|
 |}|rt|tr| drt| |d7 }qvqmq
| |fS )a  
    Scorre tutti i Tiles dell'EPG e sostituisce gli ID immagine
    con gli URL completi. Gestisce:
    - Campi immagine singoli (Image, BackgroundImage, ecc.)
    - Liste di immagini dentro Competition, Sport, ecc.

    Restituisce (data_modificato, numero_sostituzioni).
    r   Tilesr$      )CompetitionSportTournamentCalendarImagesLinearSchedule)r(   SINGLE_IMAGE_FIELDSr&   r'   r)   list)r*   counttilestilefieldimg
nested_keynestedimages_listlinearitemr    r    r!   replace_image_idsL   s<   	





r>   c                  C   s   t  stdt   g S g } tt ddd}|D ]}| }|r,|ds,| | qW d   n1 s7w   Y  tdt	|  dt j
  | S )	a  
    Carica la lista dei proxy dal file proxydaznepg.txt.
    Ogni riga deve contenere un proxy nel formato:
      ip:porta
      http://ip:porta
      https://ip:porta
      socks5://ip:porta
    Le righe vuote e quelle che iniziano con # vengono ignorate.
    z [PROXY] File proxy non trovato: rr   r   #Nz[PROXY] Caricati z
 proxy da )
PROXY_FILEexistsloggerwarningopenstrip
startswithappendinfolenname)proxiesfliner    r    r!   load_proxiesy   s   

rO   	proxy_strc                 C   st   d| vr5|  d}t|dkr$|\}}}}d| d| d| d| } nt|dkr0d|  } nd|  } | | dS )z
    Costruisce il dizionario proxy per requests.
    Supporta i formati:
      - host:porta
      - host:porta:username:password
      - http://host:porta
      - http://user:pass@host:porta
    z://:   zhttp://@   )httphttps)splitrJ   )rP   partshostportuserpasswordr    r    r!   _build_proxy_dict   s   	

r]   target_datec              
   C   s<  | du rt  } | d}| tdd }|d}i t||d}td| d t }|s7td dS t	
| d	}	 ||t|  }t|}|d7 }|dkre|t| dkret	
| td td| d|  zptjt||dd}	|	  |	 }
t|
\}
}td| d tjd
d
d d| d}t| }t|ddd}tj|
|ddd W d   n1 sw   Y  | jd }td| d|dd| d  t|
| |W S  tjjy } ztd!| d"|  W Y d}~nd}~w tjjy } ztd#| d"|  W Y d}~nhd}~w tjjy1   td$|  Y nQ tjjyP } ztd%| d"|  W Y d}~n6d}~w tjj yo } ztd&| d"|  W Y d}~nd}~w tj!y   td'|  Y nw t"d(|t| d  d}td)| d* t#$| q?)+a]  
    Scarica l'EPG di DAZN per la data specificata (default: oggi).
    Usa i proxy dal file proxydaznepg.txt, ruotando tra di essi.
    Se il download fallisce, riprova con un altro proxy finche' non riesce.
    Salva il risultato in un file JSON nella cartella epg_data/.
    Restituisce il percorso del file salvato o None in caso di errore.
    N%Y-%m-%dr,   days)	startDateendDatez[>] Scaricamento EPG per z ...zM[ERRORE] Nessun proxy disponibile in proxydaznepg.txt. Impossibile scaricare.r   TzC[PROXY] Completato un giro di tutti i proxy, rimescolo e riprovo...z[PROXY] Tentativo #z con proxy:    )paramsrL   timeoutz[IMG] Sostituite z immagini con URL completi)parentsexist_ok	dazn_epg_z.jsonwr   r   FrT   )ensure_asciiindenti   z[OK] EPG salvato: z (z.1fz KB) [proxy: ]z[RETRY] HTTP error con proxy z: z&[RETRY] Connessione fallita con proxy z[RETRY] Timeout con proxy z[RETRY] Errore proxy z#[RETRY] Errore richiesta con proxy z+[RETRY] Risposta non JSON valida con proxy    z[RETRY] Attesa z!s prima del prossimo tentativo...)%r   nowstrftimer   PARAMS_TEMPLATErC   rI   rO   errorrandomshufflerJ   r]   requestsr(   BASE_URLraise_for_statusjsonr>   
OUTPUT_DIRmkdirrE   dumpstatst_sizeprint_summary
exceptions	HTTPErrorrD   ConnectionErrorTimeout
ProxyErrorRequestExceptionJSONDecodeErrormintimesleep)r^   date_strend_dateend_date_strre   
proxy_listattemptrP   
proxy_dictresponser*   	img_countfilenamefilepathrM   file_size_kbe	wait_timer    r    r!   download_epg   s   





 
""""
r   r   c              
   C   sR  t dd  t d|  t d  t| tr| d| d| dg }t|trt dt|  t|dd	 D ]6\}}|d
pU|dpU|dpU|dpUd}|dpa|dpad}t d|d dd| d|  q<t|d	krt dt|d	  d nt dt|    nt| trt dt|   t d d dS )z0Stampa un riepilogo dei contenuti EPG scaricati.
z<============================================================z  DAZN EPG - entriesr*   eventsz  Totale eventi/voci: N
   titlerK   	eventNamelabel-rb   start z  r,   z>3z. z  ... e altri z eventiz  Chiavi nel JSON: z  Totale elementi: )printr&   r'   r(   r3   rJ   	enumeratekeys)r*   r   r   ientryr   r   r    r    r!   r~   	  s4   



"
r~      	keep_daysc              
   C   s   t  sdS t t| d }d}t dD ]1}z$|jdd}t|d}||k r;|	  |d7 }t
d	|j  W q ttfyG   Y qw |rUt
d
| d dS dS )z3Rimuove i file EPG piu' vecchi di keep_days giorni.Nr`   r   zdazn_epg_*.jsonri   r   r_   r,   z [PULIZIA] Rimosso file vecchio: z[PULIZIA] Completata: z file rimossi)ry   rB   r   ro   r   globstemreplacestrptimeunlinkrC   rI   rK   
ValueErrorOSError)r   cutoffremovedrM   	date_part	file_dater    r    r!   cleanup_old_files(  s&   r   c                   C   s(   t d t  tdd t d dS )z5Job giornaliero: scarica EPG e pulisce i file vecchi.z [TIMER] Avvio job giornaliero...r   r   z#[TIMER] Job giornaliero completato.N)rC   rI   r   r   r    r    r    r!   	daily_job@  s   

r   c                   C   s   t d t d t d t d t d t d t d td t  tdd t jd		t
 td
 td z	 t  td q@ tyX   td Y d S w )Nr   z&  ====================================z     DAZN EPG Downloader - Italiaz$    Scarica automaticamente la guidaz    programmi ogni giornoz[AVVIO] Primo download...r   r   z00:05z/[SCHEDULE] Aggiornamento giornaliero alle 00:05z [INFO] Premi Ctrl+C per uscire.
T<   z,
[STOP] Arresto richiesto dall'utente. Ciao!)r   rC   rI   r   r   scheduleeverydayatdor   run_pendingr   r   KeyboardInterruptr    r    r    r!   mainH  s*   




r   __main__)N)r   )1__doc__sysioru   rx   osr   loggingrs   r   r   r   pathlibr   hasattrstdoutr   stderrrv   r   rq   __file__parentry   LOG_FILErA   basicConfigINFOFileHandlerStreamHandler	getLogger__name__rC   r2   strr"   r'   r)   tupleintr>   r3   rO   r]   r   r~   r   r   r   r    r    r    r!   <module>   sd    


-]
