Ë
    #Mti“  ã                   ó  — 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 dej$                  defd	„Zdej$                  d
ededededeeeeeeef      f   fd„Zdej$                  deee   ee   f   fd„Zy)é    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                 ó|   — d| j                  «       v r| d   xs dj                  «       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   Úaliass     ú2/var/www/html/luxverbi-app/services/bulk_worker.pyÚresolve_access_token_for_jobr      sF   € ð
 5DÀsÇxÁxÃzÑ4QˆS�Ñ!Ò' R×.Ñ.Ô0ÐWY€EÙÜ)¨%Ó0Ð0Øˆ~ÑÐó    Ú
upload_dirÚpublic_base_urlÚsigning_secretÚttl_secondsc                ó,  — t        | «      }| d   }	 t        |«      }t        |«      \  }	}
|	sdd|
› �dfS |j	                  d«      xs g }||vrdd|› d|› �dfS t        | d	   «      }t        | d
   «      }t        | d   «      }|j	                  d«      du rd}|j	                  d«      du rd}|j	                  d«      du rd}| }| }| }| d   }t        j                  j                  ||«      }t        j                  j                  |«      sy|j	                  d«      }t        |«      }t        |t        «      r|dkD  r|dkD  r||kD  rdd|› d|› �dfS t        ||||¬«      }	 t        || d   xs d||||t        | d   «      t        | d   «      t        | d   «      d|¬«      }|j	                  d«      xs i j	                  d «      }|sdd!|› �|fS d||fS # t        $ r}dd|› �dfcY d}~S d}~ww xY w# t        $ r}dd|› �dfcY d}~S d}~ww xY w)"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)FÚ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#   r0   r1   r2   r'   Ú
local_pathÚmax_durÚdurr4   Ú	init_respr6   s                            r   Úprocess_one_scheduled_jobrI      s¦  € ô 0°Ó4€LØ˜Ñ(€Mð8Ü)¨,Ó7ˆô 0°Ó=Ñ€L�&ÙØÐ)¨&¨Ð2°DÐ8Ð8ð ×ÑÐ6Ó7Ò=¸2€GØ˜GÑ#ØÐ/°¨¸iÈÀyÐQÐSWÐWÐWô ˜˜_Ñ-Ó.€MÜ�c˜,Ñ'Ó(€JÜ˜˜NÑ+Ó,€Là×ÑÐ*Ó+¨tÑ3ØˆØ×Ñ˜Ó(¨DÑ0Øˆ
Ø×ÑÐ)Ó*¨dÑ2Øˆà'Ð'€OØ!�>€LØ%Ð%€NàÐ+Ñ,€OÜ—‘—‘˜j¨/Ó:€JÜ�7‰7�>‰>˜*Ô%Ø6ð ×ÑÐ<Ó=€GÜ
(¨Ó
4€CÜ�'œ3Ô G¨a¢K°C¸!²GÀÀgÂØÐ2°3°%°u¸W¸IÐFÈÐLÐLô
 'Ø'Ø'Ø%Øô	€Ið7Ü,Ø%Ø˜‘LÒ& BØ'Ø+Ø%Ø)Ü!% cÐ*@Ñ&AÓ!BÜ!% cÐ*@Ñ&AÓ!BÜ˜˜Y™Ó(Ø Øô
ˆ	ð  —-‘- Ó'Ò-¨2×2Ñ2°<Ó@€JÙØÐ5°i°[ÐAÀ9ÐLÐLà�˜YÐ&Ð&øôM ò 8ØÐ-¨a¨SÐ1°4Ð7Õ7ûð8ûô~ ò 7ØÐ,¨Q¨CÐ0°$Ð6Õ6ûð7ús<   ’G Å&AG8 Ç	G5Ç#G0Ç*G5Ç0G5Ç8	HÈHÈHÈHc                 óŒ   — | d   }|syt        | «      }t        ||«      }|j                  d«      }|j                  d«      }||fS )zI
    fetch_post_status() devuelve dict data de TikTok (no envuelto).
    r6   )NNÚstatusÚfail_reason)r   r   r8   )r   r6   r   r5   rK   rL   s         r   Úrefresh_submitted_job_statusrM   y   sQ   € ð �\Ñ"€JÙØä/°Ó4€LÜ˜\¨:Ó6€DØ�X‰X�hÓ€FØ—(‘(˜=Ó)€KØ�;ÐÐr   )r:   Úsqlite3Útypingr   r   r   r   Úservices.authr   Úservices.creatorr   Úservices.mediar	   r
   Útiktok_clientr   r   r   ÚRowÚstrr   r?   r9   rI   rM   © r   r   ú<module>rW      sÉ   ðã 	Û ß -Ó -å 4Ý 1ß Q÷ñ ð g§k¡kð °có ðZ'Ø	�‰ðZ'ð ðZ'ð ð	Z'ð
 ðZ'ð ðZ'ð ˆ4��h˜t C¨ H™~Ñ.Ð.Ñ/óZ'ðz g§k¡kð °e¸HÀS¹MÈ8ÐTWÉ=Ð<XÑ6Yô r   