o
    Gj                     @   sv   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eZG dd deZdS )	zO
Base scraper class with shared HTTP logic, retry handling, and rate limiting.
    N)ABCabstractmethod)date)List)EPGEntryc                
   @   s   e Zd ZdZdd ZedefddZedefddZ	ed	ed
ede
dee fddZde
dee fddZdedefddZdS )BaseScraperz%Abstract base class for EPG scrapers.c                 C   s0   t  | _| jjtjdd d| _d| _d S )Nzapplication/json)z
User-AgentAcceptr   g      ?)	requestsSessionsessionheadersupdateconfig
USER_AGENT_last_request_time_min_request_intervalself r   E/var/www/addictedbytheproject.nl/epg_general/scrapers/base_scraper.py__init__   s   

zBaseScraper.__init__returnc                 C      dS )z:Return the provider name (e.g., 'rai', 'mediaset', 'sky').Nr   r   r   r   r   get_provider_name      zBaseScraper.get_provider_namec                 C   r   )z*Return dict of channel_id -> display_name.Nr   r   r   r   r   get_channels#   r   zBaseScraper.get_channels
channel_idchannel_nametarget_datec                 C   r   )z4Fetch schedule for a single channel on a given date.Nr   )r   r   r   r   r   r   r   fetch_channel_schedule(   s   z"BaseScraper.fetch_channel_schedulec                 C   s   g }|   }| D ]G\}}z!| |||}|| td|   d| dt| d W q
 tyQ } zt	d|   d| d|  W Y d}~q
d}~ww |S )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er   r   r   fetch_all_channels.   s*   
zBaseScraper.fetch_all_channelsurlc                 C   s  t   | j }|| jk rt | j|  d}tdtjd D ]}zt   | _| jj|tj	d}|
  | W   S  tjjyg } z |}td|   d|j d| dtj d| 
 W Y d}~nUd}~w tjjy } z|}td|   d	| dtj d|  W Y d}~n,d}~w ty } z|}td|   d
| dtj d|  W Y d}~nd}~ww |tjk rt tj|  qtd|   dtj d| d| )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   r.   elapsed
last_errorattemptresponser,   r   r   r   _make_requestE   sv   


zBaseScraper._make_requestN)__name__
__module____qualname____doc__r   r   strr   dictr   r   r   r   r   r-   rF   r   r   r   r   r      s    	
r   )rJ   r2   loggingabcr   r   datetimer   typingr   r	   modelsr   r   	getLoggerrG   r$   r   r   r   r   r   <module>   s    
