o
    n›Xj’  ã                   @  sx   d dl mZ d dlZd dlmZ d dlZd dlZeG dd„ dƒƒZg d¢Zg d¢Z	G dd	„ d	ƒZ
ddd„Zddd„ZdS )é    )ÚannotationsN)Ú	dataclassc                   @  s:   e Zd ZU ded< ded< ded< ded< dZded< d	S )
ÚNewsItemÚstrÚtitleÚsummaryÚlinkÚsourcer   ÚintÚscoreN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © r   r   ú>/home/esfera/Documents/content_generation/src/services/news.pyr   
   s   
 r   ))zOpenAI Blogzhttps://openai.com/blog/rss.xml)zGoogle AI Blogz&https://blog.google/technology/ai/rss/)ÚDeepMindz$https://deepmind.google/blog/rss.xml)zHugging Face Blogz$https://huggingface.co/blog/feed.xml)zTechCrunch AIz=https://techcrunch.com/category/artificial-intelligence/feed/)zVentureBeat AIz)https://venturebeat.com/category/ai/feed/)zThe Verge AIzAhttps://www.theverge.com/rss/ai-artificial-intelligence/index.xml)zMIT Tech Reviewz&https://www.technologyreview.com/feed/)zArs Technicaz8https://feeds.arstechnica.com/arstechnica/technology-lab)zTechCrunch Startupsz.https://techcrunch.com/category/startups/feed/)Ú
TechCrunchzhttps://techcrunch.com/feed/)zKrebs on Securityz!https://krebsonsecurity.com/feed/)zThe Hacker Newsz+https://feeds.feedburner.com/TheHackersNews)ÚBleepingComputerz&https://www.bleepingcomputer.com/feed/)zGitHub Blogzhttps://github.blog/feed/)zDev.tozhttps://dev.to/feed)ÚInfoQzhttps://feed.infoq.com/)zAWS Newsz7https://aws.amazon.com/about-aws/whats-new/recent/feed/)z	The Vergez&https://www.theverge.com/rss/index.xml)ÚWiredzhttps://www.wired.com/feed/rss)zNVIDIA Blogzhttps://blogs.nvidia.com/feed/)6Úaizartificial intelligenceÚllmÚgptÚclaudeÚgeminiÚopenaiÚmodelÚagentÚgenaizmachine learningÚneuralÚresearchÚpaperÚstartupÚfundingÚseriesÚraisedÚ	valuationÚacquisitionÚipoÚlaunchÚcyberÚsecurityÚbreachÚhackÚvulnerabilityÚcveÚ
ransomwareÚpatchÚ	developerÚdevopsÚapiÚsdkÚgithubzopen sourceÚ	frameworkÚreleaseÚcloudÚawsÚazureÚ
kubernetesÚsaasÚnvidiaÚchipÚgpuÚsemiconductorÚhardwareÚrobotÚroboticsÚ
automationÚannounceÚbreakthroughÚproductc                   @  s.   e Zd Zdddd„Zdddd„Zddd„ZdS )ÚNewsServiceNé   Úfeedsúlist[tuple[str, str]] | NoneÚtimeoutr
   c                 C  s   |pt | _|| _d S ©N)ÚDEFAULT_FEEDSrL   rN   )ÚselfrL   rN   r   r   r   Ú__init__>   s   

zNewsService.__init__é   Ú	max_itemsÚreturnúlist[NewsItem]c              	   C  sd  g }t ƒ }d}| jD ]�\}}ztj|| jddid�}| ¡  t |j¡}W n	 t	y.   Y q
w d}	|j
D ]V}
t|
ddƒp=d ¡ }|rH| ¡ |v rIq4t|
ddƒpVt|
d	dƒpVd}t|ƒd d
… }t|
ddƒpfd}t||||d�}t|ƒ|_| | ¡ ¡ | |¡ |	d7 }	|	|krŠ nq4q
|jdd„ d� dd„ |D ƒ}t|ƒ|kr£|n|dd„ |D ƒ }|d |… S )Né   z
User-Agentz)ContentPipeline/2.0 (+premium media cron))rN   Úheadersr   r   Ú r   Údescriptioni�  r   )r   r   r   r	   é   c                 S  s   | j  | j| j ¡ fS rO   )r   r	   r   Úlower)Úxr   r   r   Ú<lambda>c   s    z#NewsService.fetch.<locals>.<lambda>)Úkeyc                 S  s   g | ]	}|j d kr|‘qS ©r   ©r   ©Ú.0r]   r   r   r   Ú
<listcomp>d   ó    z%NewsService.fetch.<locals>.<listcomp>c                 S  s   g | ]	}|j d kr|‘qS r`   ra   rb   r   r   r   rd   e   re   )ÚsetrL   ÚrequestsÚgetrN   Úraise_for_statusÚ
feedparserÚparseÚcontentÚ	ExceptionÚentriesÚgetattrÚstripr\   Ú_strip_htmlr   Ú_relevance_scorer   ÚaddÚappendÚsortÚlen)rQ   rT   ÚpoolÚseenÚper_feed_capr	   ÚurlÚrespÚparsedÚtakenÚentryr   r   r   ÚitemÚstrongÚchosenr   r   r   ÚfetchB   sH   ýÿ


ÿ€"zNewsService.fetchÚitemsr   c                 C  s`   |sdS g }t |dƒD ]\}}| |› d|j› d|j› d|j› d|j› d|j› �¡ qd |¡S )	NuL   (No news fetched â€” use only verifiable recent AI/tech/startup/cyber news.)r[   z. [z] score=z
   TITLE: z
   SUMMARY: z	
   URL: Ú
)Ú	enumeratert   r	   r   r   r   r   Újoin)rQ   rƒ   ÚlinesÚiÚitr   r   r   Úas_prompt_blockh   s   ÿþýÿ
zNewsService.as_prompt_block)NrK   )rL   rM   rN   r
   )rS   )rT   r
   rU   rV   )rƒ   rV   rU   r   )r   r   r   rR   r‚   rŠ   r   r   r   r   rJ   =   s    &rJ   r   rU   r
   c                   sj   ˆ j › dˆ j› � ¡ }d}h d£}tD ]}||v r#|||v r dnd7 }qt‡ fdd„dD ƒƒr3|d	7 }|S )
NÚ r   >   r   r0   r   r   r   rD   r-   r   r*   r?   r   r$   r9   r#   é   é   c                 3  s   � | ]
}|ˆ j  ¡ v V  qd S rO   )r	   r\   rb   ©r   r   r   Ú	<genexpr>€   s   € z#_relevance_score.<locals>.<genexpr>)ÚcrunchÚkrebsr.   r7   r   r?   é   )r   r   r\   ÚKEYWORDSÚany)r   Útextr   ÚhotÚkwr   rŽ   r   rr   v   s   €rr   Úhtmlr   c                 C  s$   t  dd| ¡}t  dd|¡}| ¡ S )Nz<[^>]+>r‹   z\s+)ÚreÚsubrp   )r˜   r•   r   r   r   rq   …   s   rq   )r   r   rU   r
   )r˜   r   rU   r   )Ú
__future__r   r™   Údataclassesr   rj   rg   r   rP   r“   rJ   rr   rq   r   r   r   r   Ú<module>   s    
9