+
    5*jh                       ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHtH	t	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHtHt ^ R
IHt ^ RIHtHt ^ RIHtHtHt ^ RIH t H!t! Rt"]! ]#4      PI                  4       PJ                  t&]&R,          t'Rt(RPt)RQt*RRt+RSt,] ! R R4      4       t- ! R R]4      t.R R lt/R R lt0R R lt1R R lt2R R lt3RTR R  llt4R! R" lt5R# R$ lt6R% R& lt7R' R( lt8R) R* lt9R+ R, lt:R- R. lt;R/ R0 lt<RUR1 R2 llt=R3 R4 lt>R5 R6 lt?R7 R8 lt@R9 R: ltAR; R< ltBR= R> ltCR? R@ ltDRVRA RB lltERC RD ltFRE RF ltGRWRG RH lltHRXRI RJ lltI ! RK RL]4      tJRM RN ltK]LRO8X  d   ]M! ]K! 4       4      hR# )Y    )annotationsN)	dataclass)datetime	timedeltatimezone)parsedate_to_datetime)Path)unescape)
HTMLParser)BaseHTTPRequestHandlerThreadingHTTPServer)Iterable)	HTTPErrorURLError)	urlencodeurljoinurlparse)Requesturlopeni="  znoticias.jsonziMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126 Safari/537.36c                  ,    ] tR t^vt$ R]R&   R]R&   RtR# )Linkstrhreftext N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r        .\outputs\news_scraper_server.pyr   r   v   s    
I
Ir"   r   c                  R   a  ] tR t^|tR V 3R lltR R ltR R ltR R ltR	tV ;t	# )

LinkParserc                   V ^8  d   QhRR/#    returnNoner   )formats   "r#   __annotate__LinkParser.__annotate__}   s      $ r"   c                	j   < \         SV `  4        . V n        R V n        . V n        RV n        RV n        R # )N F)super__init__links_href_texttitle	_in_title)self	__class__s   &r#   r1   LinkParser.__init__}   s1    !#
!%
 "

r"   c               $    V ^8  d   QhRRRRRR/# )r(   tagr   attrszlist[tuple[str, str | None]]r)   r*   r   )r+   s   "r#   r,   r-      s#     " "3 "/K "PT "r"   c                	    VR 8X  d+   \        V4      pVP                  R4      V n        . V n        R# VR8X  d
   RV n        R# R# )ar   r5   TN)dictgetr3   r4   r6   )r7   r;   r<   
attrs_dicts   &&& r#   handle_starttagLinkParser.handle_starttag   s<    #:eJ#/DJDJG^!DN r"   c                    V ^8  d   QhRRRR/# )r(   r;   r   r)   r*   r   )r+   s   "r#   r,   r-      s     # # # #r"   c                	   VR 8X  dv   V P                   '       dd   \        RP                  V P                  4      4      pV P                  P                  \        V P                   V4      4       RV n         . V n        R# VR8X  d
   RV n        R# R# )r>    Nr5   F)r3   cleanjoinr4   r2   appendr   r6   )r7   r;   r   s   && r#   handle_endtagLinkParser.handle_endtag   sf    #:$***$**-.DJJd4::t45DJDJG^"DN r"   c                    V ^8  d   QhRRRR/# )r(   datar   r)   r*   r   )r+   s   "r#   r,   r-      s        r"   c                	    V P                   '       d   V P                  P                  V4       V P                  '       d   V ;P                  V,          un        R # R # N)r3   r4   rI   r6   r5   )r7   rM   s   &&r#   handle_dataLinkParser.handle_data   s9    :::JJd#>>>JJ$J r"   )r3   r6   r4   r2   r5   )
r   r   r   r   r1   rB   rJ   rP   r!   __classcell__)r8   s   @r#   r%   r%   |   s!     "# r"   r%   c                    V ^8  d   QhRRRR/# )r(   valuer   r)   r   )r+   s   "r#   r,   r,      s     . . . .r"   c                4   \         P                  ! R RV \         P                  R7      p \         P                  ! RRV \         P                  R7      p \         P                  ! RRV 4      p \        V 4      p \         P                  ! RRV 4      P	                  4       # )<script[\s\S]*?</script>rF   flags<style[\s\S]*?</style>z<[^>]+>z\s+)resubIr
   strip)rT   s   &r#   rG   rG      sk    FF.U"$$GEFF,c5EEFF:sE*EUOE66&#u%++--r"   c                    V ^8  d   QhRRRR/# )r(   r   r   r)   boolr   )r+   s   "r#   r,   r,      s     + + + +r"   c                   a R V R,          P                  4        R 2o\        V3R lR 4       4      p\        V3R lR 4       4      pW^,           8  # )rF   :Ni  Nc              3  8   <"   T F  qS9   g   K  ^x  K  	  R# 5i   Nr   .0wordsamples   & r#   	<genexpr> looks_english.<locals>.<genexpr>   s,       q  &^T  jp  bpqq  &^   
c              3  8   <"   T F  qS9   g   K  ^x  K  	  R# 5irb   r   rd   s   & r#   rh   ri      s,       f  &ST  _e  Weqq  &Srj   )z the z and z for z with z from z this z that z will z has z have z users z	 company )z el z la z los z las z de z que z para z con z una z
 usuarios u    compañía )lowersum)r   english_hitsspanish_hitsrg   s   &  @r#   looks_englishrp      sg    e""$%Q'F  q  &^  q  qL  f  &S  f  fL***r"   c                    V ^8  d   QhRRRR/# r(   r   r   r)   r   )r+   s   "r#   r,   r,      s      s s r"   c                    T p\          F,  w  r#\        P                  ! W#V\        P                  R 7      pK.  	  \	        V4      # )rW   )TRANSLATIONSrZ   r[   r\   rG   )r   
translatedpatternreplacements   &   r#   translate_to_spanishrx      s5    J ,VVG*BDDI
 !-r"   c                    V ^8  d   QhRRRR/# rr   r   )r+   s   "r#   r,   r,      s     . . . .r"   c                   V '       g   V # . pR p\         P                  ! RV 4       FU  p\        V4      \        V4      ,           R8  d   V'       d   VP                  V4       TpK@  V RV 2P	                  4       pKW  	  V'       d   VP                  V4       . pV F  p\        RRRRRR	R
RRV/4      pRV 2p\        V^R7      w  r\        P                  ! V4      p
VP                  R P                  R V
^ ,           4       4      4       \        P                  ! R4       K  	  \        RP                  V4      4      # )r/   (?<=[.!?])\s+ih  rF   clientgtxslentlesdttqz4https://translate.googleapis.com/translate_a/single?timeoutc              3  h   "   T F(  q'       g   K  V^ ,          '       g   K  V^ ,          x  K*  	  R# 5i)r   Nr   )re   parts   & r#   rh   (translate_with_google.<locals>.<genexpr>   s(     (YWTQUVWQXQXaWs   	222皙?)rZ   splitlenrI   r]   r   fetchjsonloadsrH   timesleeprG   )r   chunkscurrentsentencetranslated_chunkschunkparamsurlraw_rM   s   &          r#   translate_with_googler      s!   FGHH-t4w<#h-'$.7MM'"G 	8*-335G 5 g#%%ddcU
 EVHMsA&zz#  (YT!W(Y!YZ

3  +,--r"   c                    V ^8  d   QhRRRR/# )r(   r   r   r)   ztuple[str, bool]r   )r+   s   "r#   r,   r,      s      s '7 r"   c                    \        V 4      '       d    \        V 4      pWV 8g  3# V R 3#   \         d    \        T 4      p L"i ; i)F)rp   r   	Exceptionrx   )r   ru   s   & r#   translate_if_englishr      sQ    T	4.t4J ---;  	4-d3J	4s   ( A Ac               $    V ^8  d   QhRRRRRR/# )r(   r   r   r   intr)   ztuple[str, str]r   )r+   s   "r#   r,   r,      s!     = =s =S = =r"   c                @   \        V R \        RR/R7      p\        W!R7      ;_uu_ 4       pVP                  4       pVP                  P                  4       ;'       g    RpVP                  R4      pRRR4       XP                  XRR	7      X3#   + '       g   i     L%; i)
z
User-AgentAcceptztext/html,application/xhtml+xml)headersr   utf-8i Nreplace)errors)r   
USER_AGENTr   geturlr   get_content_charsetreaddecode)r   r   reqresponse	final_urlcharsetrM   s   &&     r#   r   r      s    
#j(Def
gC		&	&(OO%	""668CCG}}W% 
' ;;wy;19<<	 
'	&s   ABB	c               $    V ^8  d   QhRRRRRR/# )r(   base_urlr   r   r)   r_   r   )r+   s   "r#   r,   r,      s&     E E E3 E4 Er"   c                    \        V 4      P                  ;'       g    R p\        V4      P                  ;'       g    R pVP                  RR 4      VP                  RR 4      8H  # )r/   www.)r   hostnamer   )r   r   	base_hosthosts   &&  r#   	same_siter      sT    "++11rID>""((bD<<#y'8'8'DDDr"   c               $    V ^8  d   QhRRRRRR/# )r(   r   r   r   r)   
str | Noner   )r+   s   "r#   r,   r,      s!     	% 	%S 	% 	%
 	%r"   c                2   V'       d   VP                  R4      '       d   R# \        W4      p\        V4      pVP                  R9  d   R# VP                  P                  4       P                  \        4      '       d   R# VP                  R^4      ^ ,          # )mailto:#N)r   zjavascript:r   )httphttps)	
startswithr   r   schemepathrl   endswithBLOCKED_EXTENSIONSr   )r   r   absoluteparseds   &&  r#   normalize_linkr      ss    4??#BCCx&HhF}}--{{##$677>>#q!!$$r"   c               $    V ^8  d   QhRRRRRR/# )r(   r   r   r   r)   r_   r   )r+   s   "r#   r,   r,      s&     B BC Bs Bt Br"   c                  aa R V P                  4        R VP                  4        R 2o\        V 4      P                  P                  4       oSR9   d   R# \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      p\        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      pT;'       g"    T;'       d    \        \        V4      4      ^8  # )rF   Fc              3  ,   <"   T F	  qS9   x  K  	  R # 5irO   r   )re   r   r   s   & r#   rh   %looks_like_article.<locals>.<genexpr>   s       E  5DD4<  5D   Tc              3  ,   <"   T F	  qS9   x  K  	  R # 5irO   r   )re   termhaystacks   & r#   rh   r      s     7hd!hr   )r/   //newsz/blogz	/discoverz/blog/community)z/news/z/blog/z/story/z	/article/z/2026/z
/discover/z/posts/)rl   r   r   anyAI_TERMSr   rG   )r   r   has_article_pathhas_air   r   s   &&  @@r#   looks_like_articler      s    399;-qa0HC=##%DJJs  E  5D  Esss  E  5D  E  ES7h7SSS7h77FAA @ @3uT{+;b+@Ar"   c               $    V ^8  d   QhRRRRRR/# )r(   r   r   fallbackr   r)   r   )r+   s   "r#   r,   r,     s!     + +s +h +3 +r"   c                   V P                  4       p\        P                  ! R V4      pV'       d   \        VP	                  ^4      4      pVP	                  ^4      pVP                  R4      '       d   \        VR7      M\        VR7      pW,
          P                  4       P                  4       # RV9   g   RV9   d0   V\        ^R7      ,
          P                  4       P                  4       # \         F  p\        P                  ! Wp\        P                  R7      pV'       g   K3  VP	                  ^ 4      p	R	 FI  p
 \        P                  ! V	P                  RR4      V
4      P                  4       P                  4       u u # 	  K  	   \        V 4      P                  4       P                  4       #   \         d     K  i ; i  \          d"    TP                  4       P                  4       u # i ; i)
z4\b(?:about\s+)?(\d+)\s+(hour|hours|day|days)\s+ago\bhour)hoursdays	yesterdayayerrW   .r/   )z%Y-%m-%dz	%B %d, %Yz	%b %d, %Yz%d %B %Yz%d %b %Y)rl   rZ   searchr   groupr   r   date	isoformatDATE_PATTERNSr\   r   strptimer   
ValueErrorr   r   )r   r   rl   relativeamountunitdeltarv   matchr   fmts   &&         r#   extract_dater     sz   JJLEyyPRWXHX^^A&'~~a +/??6+B+B	'	W]H^ &&(2244ev9!,,224>>@@ 		'rtt4kk!nQC((S")=sCHHJTTVV R !+$T*//1;;==    +}}((**+s%   ;AF0	&G 0F?>F?)G.-G.c                    V ^8  d   QhRRRR/# )r(   r5   r   r)   set[str]r   )r+   s   "r#   r,   r,     s     8 8s 8x 8r"   c                    \         P                  ! R V P                  4       4      p0 RmpV Uu0 uF  q3V9  g   K  VkK  	  up# u upi )u'   [A-Za-zÁÉÍÓÚáéíóúÑñ0-9]{4,}>   comoestaestefromnewsparathatthiswithdesdesobrestoryarticle)rZ   findallrl   )r5   wordsstoprf   s   &   r#   title_termsr    sA    JJA5;;=QED #7UT$&6DDU777s
   AAc                    V ^8  d   QhRRRR/# )r(   htmlr   r)   r   )r+   s   "r#   r,   r,   1  s      C C r"   c                6   \         P                  ! R RV \         P                  R7      p\         P                  ! RRV\         P                  R7      p\         P                  ! RRV\         P                  R7      p\         P                  ! RRV\         P                  R7      p\         P                  ! RRV\         P                  R7      p\         P                  ! RRV\         P                  R7      p\         P                  ! RRV\         P                  R7      pV# )	rV   rF   rW   rY   z<nav[\s\S]*?</nav>z<footer[\s\S]*?</footer>z<aside[\s\S]*?</aside>z^<section[^>]*(related|recommend|latest|popular|newsletter|signup|more)[^>]*>[\s\S]*?</section>zV<div[^>]*(related|recommend|latest|popular|newsletter|signup|more)[^>]*>[\s\S]*?</div>)rZ   r[   r\   )r  cleaneds   & r#   remove_unrelated_sectionsr  1  s    ff0#t244HGff.WBDDIGff*CEGff0#wbddKGff.WBDDIGffidd	G ffadd	G Nr"   c                    V ^8  d   QhRRRR/# )r(   r  r   r)   z	list[str]r   )r+   s   "r#   r,   r,   F  s     "] "] "] "]r"   c                  a \        V 4      p . pR F  p\        P                  ! W \        P                  R7       F  p\	        VP                  ^4      4      pVP                  4       o\        V4      ^-8  d   K?  \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       d   K  \        \        P                  ! RV4      4      ^8  d   K  VP                  V4       K  	  K  	  V'       d   V# \	        V 4      p\        P                  ! RV4       Uu. uF  p\        V4      ^<8  g   K  VNK  	  up# u upi )	<p\b[^>]*>([\s\S]*?)</p>rW   c              3  .   <"   T F
  pVS9   x  K  	  R # 5irO   r   )re   phraserl   s   & r#   rh   )extract_content_blocks.<locals>.<genexpr>O  s       F %s   TFzhttps?://|www\.r{   )r
  z<li\b[^>]*>([\s\S]*?)</li>)zsign up	subscribezrelated storieszrelated articlesz	more fromz	read morezall rights reservedcookiezprivacy policyzterms of serviceadvertisement	sponsored
newsletter)r  rZ   finditerr\   rG   r   rl   r   r   r   rI   r   )r  blocksrv   r   r   r   rl   s   &     @r#   extract_content_blocksr  F  s   $T*DFO[[bdd;EQ(DJJLE4y2~s sss   $ 2::0$781<MM$5 < P8 ;D%'XX.>%E\%EXY[I[HH%E\\\s   )E	 E	c               (    V ^8  d   QhRRRRRRRR/# )r(   blockr   termsr   positionr   r)   r   )r+   s   "r#   r,   r,   k  s(     	 	s 	8 	s 	s 	r"   c                   a R V P                  4        R 2o^ pV\        V3R lV 4       4      ,          pV\        V3R l\         4       4      ,          pV^8  d
   V^,          p\        V 4      R8  d
   V^,          pV# )rF   c              3  8   <"   T F  qS9   g   K  ^x  K  	  R# 5i)   Nr   re   r   rl   s   & r#   rh   score_block.<locals>.<genexpr>n  s     6uturj   c              3  h   <"   T F'  qP                  4       '       g   K  VS9   g   K#  ^x  K)  	  R# 5i)r(   N)r]   r  s   & r#   rh   r  o  s!     Jxt::<DEMxs   22
2i  )rl   rm   r   r   )r  r  r  scorerl   s   &&& @r#   score_blockr!  k  sp    a EE	S6u666E	SJxJJJE!|

5zC
Lr"   c               (    V ^8  d   QhRRRRRRRR/# )r(   r  r   r5   targetr   r)   r   )r+   s   "r#   r,   r,   w  s(       C   r"   c                4   \        V 4      p\        V4      p\        V4       UUu. uF  w  rVWV\        WdV4      3NK  	  pppV UUUu. uF  w  rVq^ 8  g   K  WV3NK  	  p	ppp\	        V	4      ^8  d!   VR,           UUU
u. uF	  w  rVqV3NK  	  p	ppp
\        V	R R7      p	. pV	 F  w  r\        RP                  W.,           4      4      p\	        V4      V^,           8  d   K?  VP                  V4       \	        \        RP                  V4      4      4      V^x,
          8  g   K   M	  \        RP                  V4      4      p\	        V4      V^x,           8  d+   VRV^x,            P                  R^4      ^ ,          R,           pV# u uppi u upppi u up
ppi )r   :N   Nc                    V ^ ,          # )r   r   items   &r#   <lambda>'build_article_summary.<locals>.<lambda>  s    ar"   keyrF   N...)
r  r  	enumerater!  r   sortedrG   rH   rI   rsplit)r  r5   r#  r  r  indexr  rankedr   relevantr   selected	candidatesummarys   &&&           r#   build_article_summaryr7  w  so   #D)FE &f--LE 
{578-   ;AN&#65AI&HN
8}q:@*E*uQEN*Eh$89HH#((8g#567	y>FSL(uSXXh'()Vc\9  CHHX&'G
7|fsl".FSL)00a8;eCN+ OEs   FFF?Fc          
     ,    V ^8  d   QhRRRRRRRRRR/# )r(   r  r   r5   sourcer   r)   r   )r+   s   "r#   r,   r,     s/      C  S   r"   c                    \        WR 4      pV'       g
   RV RV R2pRV RV R2p\        V V 24      p\        V4      R8  d(   VR,          P                  R^4      ^ ,          R	,           pV# )
  zNoticia detectada desde : r   u!    Fecha estimada de publicación: z
. Fuente: ir  :Nio  NrF   r-  )r7  rG   r   r0  )r  r5   r9  r   basesuffixr6  s   &&&&   r#   	summarizer?    s}     d3D)&E7!<0jJFtfVH%&G
7|d%.''Q/2U:Nr"   c                    V ^8  d   QhRRRR/# )r(   r   r   r)   r   )r+   s   "r#   r,   r,     s     8 8 8 8r"   c                    \        V 4      P                  ;'       g    R pVP                  RR4      pVP                  R4      ^ ,          P                  RR4      P	                  4       # )Fuenter   r/   r   -rF   )r   r   r   r   r5   )r   r   s   & r#   source_from_urlrD    sR    C=!!--XD<<#D::c?1%%c3/5577r"   c                    V ^8  d   QhRRRR/# )r(   r   r   r)   zdict[str, str]r   )r+   s   "r#   r,   r,     s      s ~ r"   c                   \         P                  ! \        P                  4      p\	        V 4      w  r#\        4       pVP                  V4       \        V4      p\        VP                  4      ;'       g    Tp\        VR ,          V4      p\        W&WW4      p\        V4      w  ri\        V4      w  rV	'       g	   V
'       d   V R2pRVR,          RVRVRRRVR	VR
RRR/# )Ni8 NR    Traducción automática al español aplicada desde la fuente original en inglés.r5   N   Nr9  r   topiczNoticia manualr   detailmanualT	refreshed)r   nowr   utcr   r%   feedrD  rG   r5   r   r?  r   )r   rO  r  r   parserr9  r5   r   rL  title_translateddetail_translateds   &          r#   scrape_single_articlerU    s    
,,x||
$CCjOD\F
KKY'F&,,))6EWs+DtF1F259E 4V <F,8mnt&!y&$T	 	r"   c                    V ^8  d   QhRRRR/# r(   itemsIterable[dict[str, str]]r)   list[dict[str, str]]r   )r+   s   "r#   r,   r,     s      . 3G r"   c                v    . p\        V ^R7       F%  w  r#\        V4      pW$R&   VP                  V4       K'  	  V# )rc   )startid)r.  r?   rI   )rX  numberedr1  r(  copys   &    r#   
assign_idsr`    s=    %'H a0DzT
 1 Or"   c                    V ^8  d   QhRRRR/# rW  r   )r+   s   "r#   r,   r,     s      2 7K r"   c                    \        V 4      pR \        P                  ! \        P                  4      P                  4       R\        V4      RV/p\        P                  \        P                  ! VR^R7      RR7       V# )	updatedAtcountrX  F)ensure_asciiindentr   encoding)r`  r   rO  r   rP  r   r   	NEWS_JSON
write_textr   dumps)rX  r^  payloads   &  r#   save_news_jsonrm    sd    % HX\\(,,/99;XG
 G%JU\]Or"   c                   V ^8  d   QhRR/# )r(   r)   r?   r   )r+   s   "r#   r,   r,     s     = = =r"   c                     \         P                  4       '       g	   R RR^ R. /# \        P                  ! \         P	                  RR7      4      # )rc  Nrd  rX  r   rg  )ri  existsr   r   	read_textr   r"   r#   load_news_jsonrr    sA    T7Aw;;::i))7);<<r"   c                    V ^8  d   QhRRRR/# )r(   scraped_itemsrY  r)   rZ  r   )r+   s   "r#   r,   r,     s      /G L` r"   c           	     Z   \        4       P                  R . 4      pV Uu/ uF.  pVP                  R4      '       g   K  VP                  R4      VbK0  	  ppV Uu/ uFF  pVP                  R4      '       g   K  \        VP                  RR4      4      P                  4       VbKH  	  pp. p\	        4       pV  F  pVP                  R4      p\        VP                  RR4      4      P                  4       p	VP                  V4      ;'       g    VP                  V	4      p
\        T
;'       g    T4      pVP                  R4      ;'       g*    \        VP                  RR4      4      P                  4       pW9   d   K  VP                  V4       VP                  V4       K  	  V# u upi u upi )rX  r   r5   r/   )rr  r@   rG   rl   setr?   addrI   )rt  existing_itemsr(  existing_by_urlexisting_by_titlemergedseenscrapedr   	title_keystoredr,  s   &           r#   merge_refresh_with_existingr    sy   #%))'26N #"D88E? 	"   #"D88G 	3dhhw#$**,d2"  
 $&FUD kk% '++gr2399;	 $$S)MM->-B-B9-MF%%g&hhuoEEtxx'<!=!C!C!E;d ! M-
s   F#F#F(7.F(c               $    V ^8  d   QhRRRRRR/# )r(   news_id
int | Noner   r   r)   rZ  r   )r+   s   "r#   r,   r,     s"     
% 
%j 
%j 
%L` 
%r"   c                   \        4       pVP                  R . 4      p. pV FZ  pV e#   \        VP                  RR4      4      V 8X  d   K)  V'       d   VP                  R4      V8X  d   KI  VP                  V4       K\  	  \	        V4      # )rX  r]  r   )rr  r@   r   rI   rm  )r  r   rl  rX  	remainingr(  s   &&    r#   delete_news_itemr    sy    GKK$EI3txxb'9#:g#E488E?c)  )$$r"   c                    V ^8  d   QhRRRR/# r(   r(  r?   r)   rZ  r   )r+   s   "r#   r,   r,     s     	! 	!T 	!&: 	!r"   c                T   \        4       pVP                  R . 4      pV P                  R4      pV Uu. uF  qDP                  R4      V8w  g   K  VNK  	  ppRV R&   RV R&   \        \        P                  ! 4       R,          4      V R&   VP	                  ^ V 4       \        V4      # u upi )rX  r   TrM  rN  i  manualPinnedAt)rr  r@   r   r   insertrm  )r(  rl  rX  r   existings   &    r#   upsert_manual_newsr    s    GKK$E
((5/C&+Je(||E/Bc/IXXeEJDND t!34D		LLD%   Ks   B%B%c                    V ^8  d   QhRRRR/# r  r   )r+   s   "r#   r,   r,   
  s     ! !4 !$8 !r"   c                   \        4       pVP                  R . 4      pV P                  R4      pV P                  R4      pRp\        V4       Ft  w  rgVRJ;'       d(    \        VP                  RR4      4      \        V4      8H  pT;'       d    VP                  R4      V8H  p	V'       g   V	'       g   Kh  / VCV Cp
WV&   Rp M	  V'       g   VP	                  ^ V 4       \        V4      # )rX  r]  r   FNTr  )rr  r@   r.  r   r  rm  )r(  rl  rX  r  r   updatedr1  r  same_idsame_urlr{  s   &          r#   update_news_itemr  
  s    GKK$EhhtnG
((5/CG$U+%UU#hll4.D*EW*U558<<.#5hh))D)F!%LG , Q%  r"   c               (    V ^8  d   QhRRRRRRRR/# )	r(   r  r  r   r   lockedr_   r)   rZ  r   )r+   s   "r#   r,   r,     s*     	! 	!Z 	!Z 	!PT 	!au 	!r"   c                2   \        4       pVP                  R . 4      pV Fk  pV RJ;'       d    \        VP                  RR4      4      V 8H  pT;'       d    VP                  R4      V8H  pV'       g   V'       g   K]  \        V4      VR&    M	  \	        V4      # )rX  Nr]  r   r  r  )rr  r@   r   r_   rm  )r  r   r  rl  rX  r(  r  r  s   &&&     r#   set_news_lockedr    s    GKK$E%LL#dhhtR.@*AW*L11488E?c1hh!&\DN  %  r"   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r(   namer   r   	days_backr   max_articlesr)   rZ  r   )r+   s   "r#   r,   r,   )  s0     < < <# <# <S <Qe <r"   c                   R V9   p\         P                  ! 4       V'       d   ^M^,           p\        P                  ! \        P
                  4      pV\        VR7      ,
          p\        V4      w  r\        4       p
V
P                  V4       . p\        4       pV
P                   F  p\        WP                  4      pV'       d   W9   g   \        W4      '       g   K9  \        WP                   4      '       d.   VP#                  WP                   34       VP%                  V4       \'        V4      V'       d   ^M^8  g   K   M	  V'       d   VP)                  R R7       . pV EF  w  pp\         P                  ! 4       V8  d    V#  \        V4      w  pp\        4       pVP                  V4       \+        VP,                  4      ;'       g    \+        V4      p\/        V RVR,           2V4      p\        P0                  ! V4      P3                  \        P
                  R7      pVV8  g   VV\        ^R7      ,           8  d   K  \5        VVV V4      p\7        V4      w  pp\7        V4      w  ppV'       g	   V'       d   V R2pVP#                  RVR	,          R
\8        P:                  ! RRV 4      RVRRRVRVRR/4       \         P>                  ! R4       \'        T4      T8  g   EK   T# 	  V#   \<         d     EK  i ; i)zhuggingface.co/blogr   c                p    \         P                  ! R V ^,          \         P                  4      '       d   ^ # ^# )zL\b(?:about\s+)?\d+\s+(hour|hours|day|days)\s+ago\b|June\s+\d{1,2},\s+20\d{2})rZ   r   r\   r'  s   &r#   r)  scrape_source.<locals>.<lambda>>  s6    yyhjnopjqsuswswxx  r"   r+  rF   rG  )tzinforH  r5   rI  r9  z News$| AI$r/   r   rK  u   Búsqueda refrescadar   rL  rN  Tr   ) r   	monotonicr   rO  r   rP  r   r   r%   rQ  rv  r2   r   r   r   r   r   rI   rw  r   sortrG   r5   r   fromisoformatr   r?  r   rZ   r[   r   r   )r  r   r  r  is_huggingfacedeadlinerO  cutoffr  r   rR  
candidatesr|  linkr   resultsarticle_url	link_textarticle_htmlarticle_finalarticle_parserr5   r   	publishedrL  rS  rT  s   &&&&                       r#   scrape_sourcer  )  s   *c1N~~2R@H
,,x||
$C9),,FCjOD\F
KK(*JUDi3t|9Y+E+EdII..tYY/0HHTNz?^r;   	 	
 %'G",Y>>h&> N=	*/*<'L-'\N-.../CC53CE9+Q|G/D.E FLD ..t4<<HLL<QI6!Yya7H1H%H|UD$?F&:5&A#E#(<V(D%F%#4"8#uvNNU4[bff^R>D3=f
 	

3w<<'NC #-B N  		s    B<K19K1 AK11L Lc                  F    ] tR tRtR R ltR R ltR R ltR R	 ltR
tR# )Handlerih  c               $    V ^8  d   QhRRRRRR/# )r(   statusr   rl  r?   r)   r*   r   )r+   s   "r#   r,   Handler.__annotate__i  s!     	 	C 	$ 	4 	r"   c                	   \         P                  ! VR R7      P                  R4      pV P                  V4       V P	                  RR4       V P	                  RR4       V P	                  RR4       V P	                  R	R4       V P	                  R
\        \        V4      4      4       V P                  4        V P                  P                  V4       R# )F)re  r   zContent-Typezapplication/json; charset=utf-8zAccess-Control-Allow-Origin*zAccess-Control-Allow-MethodszGET, POST, OPTIONSzAccess-Control-Allow-HeadersContent-LengthN)
r   rk  encodesend_responsesend_headerr   r   end_headerswfilewrite)r7   r  rl  bodys   &&& r#   _sendHandler._sendi  s    zz'6==gF6")JK6<79MN7H)3s4y>:

r"   c                   V ^8  d   QhRR/# r'   r   )r+   s   "r#   r,   r  t  s     & &D &r"   c                	.    V P                  ^RR/4       R# )   okTN)r  r7   s   &r#   
do_OPTIONSHandler.do_OPTIONSt  s    

3t%r"   c                   V ^8  d   QhRR/# r'   r   )r+   s   "r#   r,   r  w  s     A A Ar"   c                	    V P                   R 8X  d   V P                  ^RRRR/4       R
# V P                   R8X  d!   V P                  ^RR/\        4       C4       R
# V P                  RRRRR	/4       R
# )z/healthr  Tserviceznews-scraperr     Ferror	not foundN)r   r  rr  r  s   &r#   do_GETHandler.do_GETw  sc    99	!JJsT4NCDYY'!JJsT4<>+;<=JJsT5';?@r"   c                   V ^8  d   QhRR/# r'   r   )r+   s   "r#   r,   r    s     T> T> T>r"   c                	   V P                   R 8X  d    \        V P                  P                  RR4      4      p\        P
                  ! V P                  P                  V4      P                  R4      4      pVP                  RR4      pV'       g   V P                  RRRR	R
/4       R# V P                  ^RRR\        V4      /4       R# V P                   R8X  d    \        V P                  P                  RR4      4      p\        P
                  ! V P                  P                  V4      P                  R4      4      pVP                  R4      pVP                  R4      p\        Ve   \        V4      MRV4      pV P                  ^RRRVR\        V4      /4       R# V P                   R8X  d    \        V P                  P                  RR4      4      p\        P
                  ! V P                  P                  V4      P                  R4      4      pVP                  R4      '       d/   VP                  R4      '       d   VP                  R4      '       g   V P                  RRRR	R/4       R# \        V4      pV P                  ^RRRVR\        V4      R\        \         4      /4       R# V P                   R8X  d    \        V P                  P                  RR4      4      p\        P
                  ! V P                  P                  V4      P                  R4      4      pVP                  R4      '       d/   VP                  R4      '       d   VP                  R4      '       g   V P                  RRRR	R/4       R# \#        V4      pV P                  ^RRRVR\        V4      R\        \         4      /4       R# V P                   R8X  d    \        V P                  P                  RR4      4      p\        P
                  ! V P                  P                  V4      P                  R4      4      pVP                  R4      pVP                  R4      p\%        VP                  R4      4      p\'        Ve   \        V4      MRW84      pV P                  ^RRRVR\        V4      /4       R# V P                   R8w  d   V P                  RRRR	R/4       R#  \        V P                  P                  RR4      4      p\        P
                  ! V P                  P                  V4      P                  R4      4      pVP                  R. 4      p	\)        ^\+        \        VP                  R^4      4      ^<4      4      p
. p. pV	 Fw  pVP                  R 4      ;'       g    R!pVP                  R4      ;'       g    Rp \-        WV
4      pVP/                  V4       VP1                  V R"\        V4       R#24       Ky  	  \9        \;        V4      4      pV P                  ^RRRVR'VR\        \         4      /4       R#   \         d+   pT P                  RRRR	\        T4      /4        Rp?R# Rp?ii ; i  \         d+   pT P                  RRRR	\        T4      /4        Rp?R# Rp?ii ; i  \         d+   pT P                  RRRR	\        T4      /4        Rp?R# Rp?ii ; i  \         d+   pT P                  RRRR	\        T4      /4        Rp?R# Rp?ii ; i  \         d+   pT P                  RRRR	\        T4      /4        Rp?R# Rp?ii ; i  \2        \4        \6        3 d$   pTP1                  T R$T R%24        Rp?EK  Rp?i\         d$   pTP1                  T R&T R%24        Rp?EK0  Rp?ii ; i  \         d+   pT P                  RRRR	\        T4      /4        Rp?R# Rp?ii ; i)(z/scrape_oner  0r   r   r/   i  r  Fr  zmissing urlNTr(  i  z/delete_newsr]  rX  rd  z/save_manual_newsr5   rL  z"title, url and detail are requiredr   z/update_newsz
/lock_newsr  z/refreshr  r  sourcesdaysBackr  rB  r<  z# noticias encontradas por scraping.z: no se pudo leer (z).z: error de scraping (logs)r   r   r   r@   r   r   rfiler   r   r  rU  r   r   r  r   r  ri  r  r_   r  maxminr  extendrI   r   r   TimeoutErrorrm  r  )r7   lengthrl  r   excr  savedr(  r  r  r  all_resultsr  r9  r  r  s   &               r#   do_POSTHandler.do_POST  s   99%	BT\\--.>DE**TZZ__V%<%C%CG%LMkk%,JJsT5'=$IJ

3tV5J35O PQ 99&BT\\--.>DE**TZZ__V%<%C%CG%LM!++d+kk%((9LWRVX[\

3tWeWc%j QR 99++	BT\\--.>DEzz$**//&"9"@"@"IJxx((txxPXGYGYJJsT5';_$`a*40

3tWeWc%jRXZ]^gZh ij 99&	BT\\--.>DEzz$**//&"9"@"@"IJxx((txxPXGYGYJJsT5';_$`a(.

3tWeWc%jRXZ]^gZh ij 99$	BT\\--.>DE**TZZ__V%<%C%CG%LM!++d+kk%(gkk(34'8KGQUWZc

3tWeWc%j QR 99
"JJsT5';?@	>))*:C@AFjj!8!?!?!HIGkk)R0GAs3w{{:q'A#BBGHI02K D!zz&)55Xjj'--2G+DyAG&&w/KK4&3w<.8[ \] " ##>{#KLEJJsT4%vsS\~^_Q  B

3ugs3x @AAB  B

3ugs3x @AAB  B

3ugs3x @AAB  B

3ugs3x @AAB  B

3ugs3x @AAB( "8\: EKK4&(;C5 CDD  GKK4&(=cU" EFFG  	>JJsT5'3s8<==	>s  BX7 (X7 CY/ 0BZ' Z' Z' 0;Z' ?B[ [ '[ ?;[ C\ C^7 ^7 5^7 9=]6?^7 7Y,Y''Y,/Z$:ZZ$'[2[[\*\\]"]]^4%^<^7 ^4^4^/(^7 /^44^7 7_,_''_,r   N)	r   r   r   r   r  r  r  r  r!   r   r"   r#   r  r  h  s    	&AT> T>r"   r  c                   V ^8  d   QhRR/# )r(   r)   r   r   )r+   s   "r#   r,   r,     s      c r"   c                 v    \        R \        3\        4      p \        R\         24       V P	                  4        ^ # )z	127.0.0.1z0Servidor de noticias activo en http://127.0.0.1:)r   PORTr  printserve_forever)servers    r#   mainr    s2     +t!4g>F	<TF
CD
r"   __main__)z ai zartificial intelligenceinteligencia artificialzmachine learningopenai	anthropicdeepmindgeminichatgptclaudellm)z.zipz.pdfz.pngz.jpgz.jpegz.gifz.svgz.webpz.mp4z.movz.cssz.js)z20\d{2}-\d{2}-\d{2}zU\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?\s+\d{1,2},\s+20\d{2}\bzT\b\d{1,2}\s+(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?\s+20\d{2}\b)7)z\bartificial intelligence\br  )z\bAI\bIA)z\bmachine learning\bu   aprendizaje automático)z\bdeep learning\bzaprendizaje profundo)z\blarge language model[s]?\bzmodelos de lenguaje grandes)z\blanguage model[s]?\bzmodelos de lenguaje)z\bmodel[s]?\bmodelos)z\bchatbot[s]?\bchatbots)z\bagent[s]?\bagentes)z\bstartup[s]?\bzempresas emergentes)z\bcompany\bu
   compañía)z\bcompanies\bu   compañías)z\bresearch\bu   investigación)z\bresearcher[s]?\binvestigadores)z\bscientist[s]?\bu   científicos)z\bdeveloper[s]?\bdesarrolladores)z\buser[s]?\busuarios)z\bcustomer[s]?\bclientes)z\btool[s]?\bherramientas)z\bproduct[s]?\b	productos)z\bfeature[s]?\b	funciones)z\blaunch(?:es|ed)?\blanza)z\brelease(?:s|d)?\bpublica)z\bannounce(?:s|d)?\banuncia)z\bintroduce(?:s|d)?\bpresenta)z\bbuild(?:s|ing)?\b
desarrolla)z\bcreate(?:s|d)?\bcrea)z\bgenerate(?:s|d)?\bgenera)z\btrain(?:s|ed|ing)?\bentrena)z\bimprove(?:s|d)?\bmejora)z\bupdate(?:s|d)?\b	actualiza)z
\bsafety\b	seguridad)z\bsecurity\br  )z\bprivacy\b
privacidad)z\bgovernance\b
gobernanza)z\brisk[s]?\briesgos)z\bbenchmark[s]?\bzpruebas de referencia)z\bopen source\bu   código abierto)z	\bcloud\bnube)z\bdata center[s]?\bzcentros de datos)z\bchip[s]?\bchips)z\bcompute\bu   cómputo)z\benterprise\bempresa)z\bbusiness\bnegocio)z
\bmarket\bmercado)z\bwork\btrabajo)z\bjob[s]?\bempleos)z
\bhealth\bsalud)z\bscience\bciencia)z\bsoftware\bsoftware)z\bcode\bu   código)z\bnew\bnuevo)z\bmore\bu   más)z	\bfirst\bprimer)z	\bmajor\b
importante)r  )r;  )NN)NNF)   )N
__future__r   r   rZ   sysr   dataclassesr   r   r   r   email.utilsr   pathlibr	   r  r
   html.parserr   http.serverr   r   typingr   urllib.errorr   r   urllib.parser   r   r   urllib.requestr   r   r  __file__resolveparentBASE_DIRri  r   r   r   r   rt   r   r%   rG   rp   rx   r   r   r   r   r   r   r   r  r  r  r!  r7  r?  rD  rU  r`  rm  rr  r  r  r  r  r  r  r  r  r   
SystemExitr   r"   r#   <module>r)     sq   "  	 
  ! 2 2 -   " C  , 5 5 + >!!#**&	F  
8v   
 B.+.B=E	%B+48(*"]J	682=6
%	!!&	!<~k>$ k>\ z
TV
 r"   