U
    #Mti                     @   s   d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZ ejeddd	Zejeeeeeeeeeeef  f d
ddZejeee ee f dddZdS )    N)TupleOptionalDictAny)get_access_token_for_alias)creator_can_post_now)video_duration_seconds_ffprobebuild_public_media_url)query_creator_infoupload_video_direct_postfetch_post_status)rowreturnc                 C   s4   d|   kr| d pd nd}|r,t|S | d S )u   
    Si el job tiene account_alias, resolvemos token desde token_store
    (con refresh automático). Si no, usamos el access_token guardado (legacy).
    account_alias access_token)keysstripr   )r   alias r   2/var/www/html/luxverbi-app/services/bulk_worker.pyresolve_access_token_for_job   s     r   )r   
upload_dirpublic_base_urlsigning_secretttl_secondsr   c                C   sJ  t | }| d }zt|}W n6 tk
rR } zdd| df W Y S d}~X Y nX t|\}	}
|	stdd|
 dfS |dpg }||krdd| d| dfS t| d	 }t| d
 }t| d }|ddkrd}|ddkrd}|ddkrd}| }| }| }| d }tj||}tj	|s4dS |d}t
|}t|tr|dkr|dkr||krdd| d| dfS t||||d}zDt|| d pd||||t| d t| d t| d d|d}W n8 tk
r } zdd| df W Y S d}~X Y nX |dp"i d }|s@dd!| |fS d||fS )"zm
    Returns:
      (ok, msg, init_resp)
        - if ok: msg=publish_id
        - if not ok: msg=reason
    privacy_levelFzcreator_info_failed: Nzcannot_post_now: privacy_level_optionszinvalid_privacy_level: z	 options=allow_comment
allow_duetallow_stitchcomment_disabledTduet_disabledstitch_disabledstored_filename)FZfile_not_found_on_serverNmax_video_post_duration_secr   zduration_exceeds_max: dur=z max=)r$   r   r   r   titler   brand_content_togglebrand_organic_toggleis_aigcPULL_FROM_URL)r   captionr   disable_commentdisable_duetdisable_stitchr'   r(   r)   mode	video_urlzdirect_post_failed: data
publish_idzmissing_publish_id init_resp=)r   r
   	Exceptionr   getboolospathjoinexistsr   
isinstanceintr	   r   )r   r   r   r   r   r   r   creator_infoecan_post_nowreasonoptionsr   r   r    r,   r-   r.   r$   
local_pathmax_durdurr0   	init_respr2   r   r   r   process_one_scheduled_job   st    &
*



&rE   c                 C   s>   | d }|sdS t | }t||}|d}|d}||fS )zI
    fetch_post_status() devuelve dict data de TikTok (no envuelto).
    r2   )NNstatusfail_reason)r   r   r4   )r   r2   r   r1   rF   rG   r   r   r   refresh_submitted_job_statusy   s    


rH   )r6   sqlite3typingr   r   r   r   services.authr   services.creatorr   services.mediar   r	   tiktok_clientr
   r   r   Rowstrr   r;   r5   rE   rH   r   r   r   r   <module>   s   ]