
    Gj                         d 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
Z
ddlmZ ddlZ ej                  e      Z G d de      Zy)	zO
Base scraper class with shared HTTP logic, retry handling, and rate limiting.
    N)ABCabstractmethod)date)List)EPGEntryc            
           e Zd ZdZd Zedefd       Zedefd       Z	ededede
dee   fd	       Zde
dee   fd
ZdedefdZy)BaseScraperz%Abstract base class for EPG scrapers.c                     t        j                         | _        | j                  j                  j	                  t
        j                  dd       d| _        d| _        y )Nzapplication/json)z
User-AgentAcceptr   g      ?)	requestsSessionsessionheadersupdateconfig
USER_AGENT_last_request_time_min_request_intervalselfs    NC:\Users\Claud\Documents\Epg General Channel - Simple\scrapers\base_scraper.py__init__zBaseScraper.__init__   sM    '')## ++(%
 	 #$%("    returnc                      y)z:Return the provider name (e.g., 'rai', 'mediaset', 'sky').N r   s    r   get_provider_namezBaseScraper.get_provider_name        	r   c                      y)z*Return dict of channel_id -> display_name.Nr   r   s    r   get_channelszBaseScraper.get_channels#   r   r   
channel_idchannel_nametarget_datec                      y)z4Fetch schedule for a single channel on a given date.Nr   )r   r!   r"   r#   s       r   fetch_channel_schedulez"BaseScraper.fetch_channel_schedule(   s     	r   c                    g }| j                         }|j                         D ]`  \  }}	 | j                  |||      }|j                  |       t        j                  d| j                          d| dt        |       d       b |S # t        $ r6}t        j                  d| j                          d| d|        Y d}~d}~ww xY w)z1Fetch schedule for all channels of this provider.[z] : z programmi trovatiz] Errore per N)
r    itemsr%   extendloggerinfor   len	Exceptionerror)r   r#   all_entrieschannelsr!   r"   entrieses           r   fetch_all_channelszBaseScraper.fetch_all_channels.   s    $$&(0(8$J55k ""7+..01L>7|n$68 )9    ..01|nBqcR 	s   AB	C,CCurlc                    t        j                          | j                  z
  }|| j                  k  r"t        j                  | j                  |z
         d}t	        dt
        j                  dz         D ]h  }	 t        j                          | _        | j                  j                  |t
        j                        }|j                          |j                         c S  t-        d| j#                          dt
        j                   d| d|       # t        j                  j                  $ rV}|}t        j!                  d| j#                          dj$                   d| dt
        j                   d| 
       Y d}~nd}~wt        j                  j&                  $ rI}|}t        j!                  d| j#                          d	| dt
        j                   d|        Y d}~nXd}~wt(        $ rI}|}t        j!                  d| j#                          d
| dt
        j                   d|        Y d}~nd}~ww xY w|t
        j                  k  st        j                  t
        j*                  |z         )zt
        Make an HTTP GET request with retry logic and rate limiting.
        Returns parsed JSON response.
        N   )timeoutr'   z] HTTP z (tentativo /z): z] Errore di rete (tentativo z!] Errore parsing JSON (tentativo z
] Tutti i z tentativi falliti per r(   )timer   r   sleepranger   MAX_RETRIESr   getREQUEST_TIMEOUTraise_for_statusjsonr   
exceptions	HTTPErrorr+   warningr   status_codeRequestException
ValueErrorRETRY_DELAYConnectionError)r   r5   elapsed
last_errorattemptresponser3   s          r   _make_requestzBaseScraper._make_requestE   sG    ))+ 7 77T///JJt11G;<
Q 2 2Q 67G*.))+'<<++!7!7 ,  ))+}}& 8< &&()F4F4F3G H%%(EJ<9
 	
- &&00 
..019M9M8N O"")!F,>,>+?s3%I  &&77 
..01 2"")!F,>,>+?s1#G   
..01 2"")!F,>,>+?s1#G  +++

6--78s2   6A#DH7-AE>> H7?G""H7.?H22H7N)__name__
__module____qualname____doc__r   r   strr   dictr    r   r   r   r%   r4   rN   r   r   r   r	   r	      s    /) 3   d    C -16:8n 
d tH~ .,
 ,
 ,
r   r	   )rR   r:   loggingabcr   r   datetimer   typingr   r   modelsr   r   	getLoggerrO   r+   r	   r   r   r   <module>r[      sD      #     			8	$_
# _
r   