Ë
    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°¸|¸nÈBÈqÈcÐ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}~n¼d}~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×/Ñ/Ò/Ü�J‰J�t×1Ñ1°GÑ;Ô<àˆ
Ü˜Q¤× 2Ñ 2°QÑ 6Ö7ˆGðÜ*.¯)©)«+�Ô'ØŸ<™<×+Ñ+Ø¤×!7Ñ!7ð ,ó �ð ×)Ñ)Ô+Ø—}‘}“Ò&ð 8ô< Ø�×&Ñ&Ó(Ð)¨´F×4FÑ4FÐ3Gð H%Ø%( E¨¨J¨<ð9ó
ð 	
øô- ×&Ñ&×0Ñ0ò Ø�
Ü—‘Ø˜×.Ñ.Ó0Ð1°¸×9MÑ9MÐ8Nð O"Ø") ¨!¬F×,>Ñ,>Ð+?¸sÀ3À%ðI÷ñ ûô ×&Ñ&×7Ñ7ò Ø�
Ü—‘Ø˜×.Ñ.Ó0Ð1ð 2"Ø") ¨!¬F×,>Ñ,>Ð+?¸sÀ1À#ðG÷ñ ûô ò Ø�
Ü—‘Ø˜×.Ñ.Ó0Ð1ð 2"Ø") ¨!¬F×,>Ñ,>Ð+?¸sÀ1À#ð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:¸8±nòó ðð
¨dð °t¸H±~ó ð.,
 ð ,
¨ô ,
r   r	   )rR   r:   ÚloggingÚabcr   r   Údatetimer   Útypingr   r   Úmodelsr   r   Ú	getLoggerrO   r+   r	   r   r   r   Ú<module>r[      sD   ðñó Û ß #Ý Ý ã å Û à	ˆ×	Ñ	˜8Ó	$€ô_
�#õ _
r   