o
    o›Xjƒ  ã                   @  sÚ   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ G dd„ dƒZ dS )é    )ÚannotationsN)Údatetime)ÚPath)ÚSettings)ÚImageGenerator)ÚAssetProducer)ÚVisualRenderer)ÚTelegramNotifier)Ú
create_llm)ÚCreativeDirector)Úgenerate_ideas)ÚKnowledgeService)ÚNewsService)ÚDriveUploader)Úsetup_logging)Úslugifyc                   @  s*   e Zd Zddd„Zddd„Zddd„ZdS )ÚContentPipelineÚsettingsr   c                 C  sd  || _ t|jƒ| _t|j|j|j|j|j	d�| _
| j d|j¡ tƒ | _t|j|jƒ| _tttƒ ¡ jd d d ƒ| _t|j|j|j|jttƒ ¡ jd d d d�| _d }|jrl|jrft|j|j d	�}n| j !d
¡ d }|j"r‰|j# $d¡r‰|jr‰ddl%m&} ||j|j'dd�}t(| j|||j"|j#t)dt*d|j+ƒƒ|j|j,d�| _-| j d|j |j#|j'|j,¡ d S )N)ÚproviderÚanthropic_keyÚclaude_modelÚ
openai_keyÚopenai_modelzLLM provider: %sé   Ústoragezcreative_history.jsonÚdataÚfonts)Ú
brand_nameÚprimaryÚaccentÚbgÚ	fonts_dir)ÚmodeluP   ENABLE_AI_IMAGES=true but OPENAI_API_KEY missing â€” using template/news visualsÚsorar   )ÚSoraVideoGeneratorÚ12)r"   Údefault_secondsé   é   )Úimage_generatorÚsora_generatorÚenable_videoÚvideo_engineÚvideo_max_secondsÚenable_ai_imagesÚenable_audioz>Assets: image_model=%s video_engine=%s video_model=%s audio=%s).Úsr   Ústorage_logsÚlogr
   Úllm_providerÚanthropic_api_keyr   Úopenai_api_keyr   ÚllmÚinfor   Únewsr   Údata_profilesÚdata_erpÚ	knowledger   r   Ú__file__ÚresolveÚparentsÚcreativer   r   Úbrand_primaryÚbrand_accentÚbrand_bgÚrendererr.   r   Úopenai_image_modelÚwarningr+   r,   Ú
startswithÚsrc.generators.sora_videor$   Úopenai_video_modelr   ÚminÚmaxr-   r/   Úproducer)Úselfr   Úimg_genÚsora_genr$   © rO   ú9/home/esfera/Documents/content_generation/src/pipeline.pyÚ__init__   sh   ûÿûýø
ûzContentPipeline.__init__ÚreturnÚdictc              
   C  s  t  ¡  d¡}| jjd|› � }|jddd� | j d|| jj¡ | j	j
dd�}| j dt|ƒ|r:|d	 jd d
… nd¡ | j ¡ }| j | jj¡}| j dd dd„ |D ƒ¡¡ t| j| jj|| j	 |¡| jj| jj|| j ¡ d�}| j dt|ƒ¡ | j |¡ g }|D ](}||j› dt|jp“|jƒ› � }	| j d|j|j¡ | j  ||	¡}
| !|
¡ q†|t  ¡ j"dd�| jj|t|ƒdœ}|d j#t$j%|ddd�dd� d }| jj�sF| jj&�rF| j d¡ t'| jj&| jj(| jj)| jj*rô| jj+nd | jj*d�}|d d… › d |dd!… › d |d!d"… › �}d|d#d … › �}|j,|||d$�}|d% |d& |d' |d( |d) d*œ|d+< |d j#t$j%|ddd�dd� n| jj�sQ| j -d,¡ | jj�st| jj.�rt| j d-¡ t/| jj.| jj0ƒ}| 1|  2||¡¡ n| jj�s| j -d.¡ | j d/|¡ |S )0Nz%Y%m%d_%H%M%SÚbatch_T)r>   Úexist_okzStarting batch %s (dry_run=%s)é   )Ú	max_itemsz%Fetched %d AI/IT news items (top: %s)r   éP   ÚnonezCreative briefs: %sz, c                 s  s"   � | ]}|j › d |j› �V  qdS )ú/N)ÚlayoutÚpalette_name)Ú.0ÚbrO   rO   rP   Ú	<genexpr>`   s   €  z&ContentPipeline.run.<locals>.<genexpr>)r   ÚprofilesÚ
news_blockÚ
batch_sizer+   Úcreative_briefsÚrecent_styleszGenerated %d ideasÚ_zProducing %s (%s)Úseconds)Útimespec)Úbatch_idÚ
created_atÚbrandÚideasÚ
news_countzmanifest.jsonFé   )Úensure_asciiÚindentzutf-8)Úencodingu   Uploading to Google Driveâ€¦)Úoauth_client_secretsÚoauth_token_fileÚservice_account_fileÚuse_shared_driver(   ú-é   é   é	   )Údate_folderÚbatch_folderÚ	folder_idÚ
folder_urlry   Údate_folder_urlrz   )r{   r|   ry   r}   rz   Údrivez6Skipping Drive upload (GOOGLE_DRIVE_FOLDER_ID not set)u    Sending Telegram notificationâ€¦z'Skipping Telegram (credentials missing)zBatch complete: %s)3r   ÚnowÚstrftimer0   Ú
output_dirÚmkdirr2   r7   Údry_runr8   ÚfetchÚlenÚtitler;   Úprofiles_textr?   Úassign_batchrb   Újoinr   r6   r   Úas_prompt_blockr+   Úrecent_summaryÚrecordÚidr   ÚtopicÚhookÚformatrK   ÚproduceÚappendÚ	isoformatÚ
write_textÚjsonÚdumpsÚgoogle_drive_folder_idr   Úgoogle_oauth_client_secretsÚgoogle_oauth_token_fileÚgoogle_use_shared_driveÚgoogle_service_account_fileÚupload_treerE   Útelegram_bot_tokenr	   Útelegram_chat_idÚsendÚ_telegram_message)rL   ÚtsÚ	batch_dirÚ
news_itemsr`   Úbriefsrk   ÚresultsÚideaÚfolderÚmetaÚmanifestÚ
drive_infoÚuploaderry   rz   ÚnotifierrO   rO   rP   ÚrunO   s¢   ý
þ
ø
 ûÿ
ÿù,
ý
ûÿ

zContentPipeline.runr©   rª   údict | NoneÚstrc                 C  sæ   d| j j› �d|d › �dt| dg ¡ƒ› �dg}| dg ¡D ](}| d¡p*| d¡}| d	| d
¡› d|› �¡ | d¡p?i }|rG| d¡ q|rc|dd| d¡› d| d¡› �d|d › �g7 }n|dd|d › �g7 }d |¡S )Nu   âœ… Content batch ready â€” zBatch: rh   zItems: rk   Ú r�   rŽ   u   â€¢ [r�   z] Ú	platformsu1     ðŸ“± LinkedIn Â· IG Â· X Â· Threads Â· Facebooku   ðŸ“� ry   rZ   rz   zDrive: r|   zLocal: storage/runs/batch_Ú
)r0   r   r…   Úgetr’   r‰   )rL   r©   rª   Úlinesr¦   r�   ÚplatsrO   rO   rP   r    ­   s(   ü
€ý
z!ContentPipeline._telegram_messageN)r   r   )rR   rS   )r©   rS   rª   r®   rR   r¯   )Ú__name__Ú
__module__Ú__qualname__rQ   r­   r    rO   rO   rO   rP   r      s    

8^r   )!Ú
__future__r   r•   r   Úpathlibr   Ú
src.configr   Úsrc.generators.ai_imager   Úsrc.generators.assetsr   Úsrc.generators.visualsr   Úsrc.notify.telegramr	   Úsrc.services.llmr
   Úsrc.services.creativer   Úsrc.services.ideationr   Úsrc.services.knowledger   Úsrc.services.newsr   Úsrc.storage.driver   Úsrc.util.logging_setupr   Úsrc.util.textr   r   rO   rO   rO   rP   Ú<module>   s$    