Ë
    ¤õÆi’  ã                   óv  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZmZ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 dlmZmZ d d	l m!Z!m"Z" d d
l#m$Z$m%Z%m&Z&  ede'«      Z(dZ)h d£Z*de+fd„Z,de-ddfd„Z.dej^                  de-fd„Z0dej^                  de1ddfd„Z2de+fd„Z3d„ Z4de-fd„Z5de-de+fd„Z6de-fd„Z7de-fd„Z8de-de-fd„Z9d ejt                  fd!„Z;d"„ Z<d#„ Z=de-fd$„Z>e(j                  d%d&¬'«      d(„ «       Z@e(j                  d)d*¬'«      d+„ «       ZAe(j                  d,d-¬'«      d.„ «       ZBe(j                  d/d0¬'«      d1„ «       ZCe(j                  d2d3¬'«      d4„ «       ZDe(j                  d5d6d7gd8¬9«      d:„ «       ZEe(j                  d;d7gd<¬9«      d=„ «       ZFe(j�                  d>d?¬'«      d@„ «       ZHe(j“                  dAdB¬'«      dCe-fdD„«       ZJe(j“                  dEdF¬'«      dCe-fdG„«       ZKe(j“                  dHdI¬'«      dJ„ «       ZLe(j                  dKd7gdL¬9«      dM„ «       ZMe(j                  dNd6gdO¬9«      dPe-fdQ„«       ZNe(j                  dRd6gdS¬9«      dPe-fdT„«       ZOe(j                  dUd7gdV¬9«      dPe-fdW„«       ZPe(j                  dXd7gdY¬9«      dPe-fdZ„«       ZQe(j                  d[d6gd\¬9«      dPe-fd]„«       ZRe(j                  d^d6gd_¬9«      dPe-fd`„«       ZSe(j�                  dadb¬'«      dPe-fdc„«       ZTe(j�                  ddde¬'«      dCe-fdf„«       ZUe(j�                  dgdh¬'«      dCe-fdi„«       ZVy)jé    N)Údatetime)
Ú	BlueprintÚcurrent_appÚrender_templateÚrequestÚredirectÚurl_forÚflashÚ	send_fileÚjsonifyÚsession)Úbulk_db)Úrequire_login_access_token)Ú
save_draftÚ
load_draft)Úsafe_filenameÚvideo_duration_seconds_ffprobeÚbuild_public_media_url)Úcreator_can_post_nowÚparse_publish_at_iso_to_ts)Ú
load_tokenÚ
save_token)Úquery_creator_infoÚupload_video_direct_postÚfetch_post_statusÚuiÚadmin_authenticated>   ÚfailedÚcompleteÚ	cancelledÚreturnc                  ó0   — t        j                  d«      d uS )NÚtiktok_token)r   Úget© ó    ú//var/www/html/luxverbi-app/app/blueprints/ui.pyÚ_is_connectedr(   %   s   € Ü�;‰;�~Ó&¨dÐ2Ð2r&   Úaliasc                 ó²   — | xs dj                  «       }|sy	 t        |«      s%t        j                  d«      }|rt	        ||«       yyy# t
        $ r Y yw xY w)u‘   
    Defensa extra para el caso en que ya existan sesiones antiguas donde
    oauth_alias estaba seteado pero token_store no lo tenÃ­a aÃºn.
    Ú Nr#   )Ústripr   r   r$   r   Ú	Exception)r)   ÚaÚtoks      r'   Ú_ensure_alias_token_persistedr0   )   sa   € ð
 
Š�"×ÑÓ€AÙØðÜ˜!Œ}Ü—+‘+˜nÓ-ˆCÙÜ˜1˜cÕ"ð ð øô ò áðús   ™.A
 Á
	AÁAÚconnÚ
table_namec                 óî   — | j                  «       }|j                  d|› d�«       g }|j                  «       D ]  }	 |j                  |d   «       Œ |S # t        $ r |j                  |d   «       Y Œ;w xY w)NzPRAGMA table_info(ú)Únameé   )ÚcursorÚexecuteÚfetchallÚappendr-   )r1   r2   ÚcurÚcolsÚrows        r'   Ú_table_columnsr>   ;   sz   € Ø
�+‰+‹-€CØ‡K�KÐ$ Z L°Ð2Ô3Ø€DØ�|‰|‹~ò  ˆð	 Ø�K‰K˜˜F™Õ$ð ð
 €Køô ò 	 Ø�K‰K˜˜A™Öð	 ús   ¼AÁA4Á3A4Újobc                 ód  — t        | d«      }|j                  «       D ��ci c]  \  }}|t        |«      v sŒ||“Œ }}}dj                  |j	                  «       «      }dj                  dgt        |«      z  «      }| j                  d|› d|› d�t        |j                  «       «      «       y c c}}w )NÚ	bulk_jobsú, ú?úINSERT INTO bulk_jobs (ú
) VALUES (r4   )	r>   ÚitemsÚsetÚjoinÚkeysÚlenr8   ÚtupleÚvalues)r1   r?   r<   ÚkÚvÚfilteredÚcolnamesÚplaceholderss           r'   Ú_insert_bulk_jobrR   G   sš   € Ü˜$ Ó,€DØ!$§¡£×?™˜˜A°´S¸³Y²��1‘Ð?€HÑ?Ø�y‰y˜Ÿ™›Ó)€HØ—9‘9˜c˜U¤S¨£]Ñ2Ó3€LØ‡L�LÐ*¨8¨*°J¸|¸nÈAÐNÔPUÐV^×VeÑVeÓVgÓPhÕiùó @s
    B,¶B,c                  ó8   — t        j                  t        «      du S )NT)r   r$   ÚADMIN_SESSION_KEYr%   r&   r'   Ú_is_admin_authenticatedrU   O   s   € Ü�;‰;Ô(Ó)¨TÐ1Ð1r&   c                  ó¤   — t        «       ry t        j                  rt        j                  nt        j                  } t        t        d| ¬«      «      S )Núui.admin_login)Únext)rU   r   Úquery_stringÚ	full_pathÚpathr   r	   ©Únext_urls    r'   Ú_admin_guardr^   S   s7   € ÜÔ ØÜ$+×$8Ò$8Œw× Ò ¼g¿l¹l€HÜ”GÐ,°8Ô<Ó=Ð=r&   Ústored_filenamec                 óª   — | xs dj                  «       }|rd|v sd|v sd|v ry t        j                  j                  t        j
                  d   |«      S )Nr+   ú/ú\z..Ú
UPLOAD_DIR)r,   Úosr[   rH   r   Úconfig)r_   Úfilenames     r'   Ú_job_file_pathrg   Z   sO   € ØÒ% 2×,Ñ,Ó.€HÙ�s˜h‘¨$°(Ñ*:¸dÀhÑ>NØÜ�7‰7�<‰<œ×*Ñ*¨<Ñ8¸(ÓCÐCr&   c                 óp   — t        | «      }t        |xr t        j                  j	                  |«      «      S )N)rg   Úboolrd   r[   Úisfile)r_   r[   s     r'   Ú_job_has_filerk   a   s)   € Ü˜/Ó*€DÜ�Ò-œŸ™Ÿ™¨Ó-Ó.Ð.r&   c                 óœ   — | dv ry	 t        j                  t        | «      «      j                  d«      S # t        $ r t        | «      cY S w xY w)N©Nr+   ú-z%Y-%m-%d %H:%M:%S)r   ÚfromtimestampÚintÚstrftimer-   Ústr)Útss    r'   Ú
_format_tsrt   f   sK   € Ø	ˆZÑØðÜ×%Ñ%¤c¨"£gÓ.×7Ñ7Ð8KÓLÐLøÜò Ü�2‹wŠðús   ‡,4 ´AÁ
Ac                 ó¤   — | dv ryg d¢}t        | «      }|d   }|D ]  }|dk  s||d   k(  r n|dz  }Œ |dk7  r|d	›d
|› �S t        |«      › d
|› �S )Nrm   rn   )ÚBÚKBÚMBÚGBr   i   éÿÿÿÿg      �@rv   z.1fú )Úfloatrp   )ÚsizeÚunitsÚvalueÚunits       r'   Ú_format_bytesr�   o   s€   € ØˆzÑØÚ#€EÜ�$‹K€EØ�‰8€DØò ˆØ�4Š<˜4 5¨¡9Ò,ÙØ�‰‰ðð %)¨C¢Kˆe�Cˆ[˜˜$˜Ð ÐK¼¸E»
°|À1ÀTÀFÐ5KÐKr&   Ústatusc                 óv   — | xs dj                  «       j                  «       }|dk(  ry|dk(  ry|dk(  ry|dv ryy	)
Nr+   r   Úokr   Úerrr    Úwarn¾   Ú	submittedÚ
submittingÚinfo)r,   Úlower)r‚   Ústs     r'   Ú_status_toner�   |   sL   € Ø
Š,�B×	Ñ	Ó	×	%Ñ	%Ó	'€BØ	ˆZÒØØ	ˆX‚~ØØ	ˆ[ÒØØ	Ð(Ñ(ØØr&   r=   c                 ó¼  — t        | «      }|j                  d«      xs dj                  «       j                  «       }|t        v |d<   t        |«      |d<   t        |j                  d«      xs d«      |d<   t        |j                  d«      «      |d<   t        |j                  d	«      «      |d
<   t        |j                  d«      «      |d<   t        |j                  d«      «      |d<   |d   rBt        |j                  d«      xs d«      }	 t        j                  j                  |«      |d<   nd |d<   t        |d   «      |d<   |S # t        $ r d |d<   Y Œ#w xY w)Nr‚   r+   Úis_terminalÚstatus_toner_   Úhas_fileÚcreated_at_tsÚcreated_at_labelÚpublish_at_tsÚpublish_at_labelÚnext_attempt_tsÚnext_attempt_labelÚupdated_at_tsÚupdated_at_labelÚfile_size_bytesÚfile_size_label)Údictr$   r,   r‹   ÚTERMINAL_JOB_STATUSESr�   rk   rt   rg   rd   r[   ÚgetsizeÚOSErrorr�   )r=   r?   r‚   Ú	file_paths       r'   Ú_job_for_adminr¡   ‰   sR  € Ü
ˆs‹)€CØ�g‰g�hÓÒ% 2×,Ñ,Ó.×4Ñ4Ó6€FØÔ#8Ð8€CˆÑÜ% fÓ-€CˆÑÜ# C§G¡GÐ,=Ó$>Ò$DÀ"ÓE€Cˆ
�OÜ(¨¯©°Ó)AÓB€CÐÑÜ(¨¯©°Ó)AÓB€CÐÑÜ *¨3¯7©7Ð3DÓ+EÓ F€CÐÑÜ(¨¯©°Ó)AÓB€CÐÑà
ˆ:‚Ü" 3§7¡7Ð+<Ó#=Ò#CÀÓDˆ	ð	*Ü%'§W¡W§_¡_°YÓ%?ˆCÐ!Ò"ð "&ˆÐÑÜ*¨3Ð/@Ñ+AÓB€CÐÑà€Jøô ò 	*Ø%)ˆCÐ!Ó"ð	*ús   Ä"E
 Å
EÅEc                  óJ  — t        t        j                  d   «      } t        j                  | _        | j                  «       }|j                  d«       |j                  «       }| j                  «        g }|D ])  }t        |«      }|d   r|d   sŒ|j                  |«       Œ+ |S )NÚBULK_DB_PATHzð
        SELECT * FROM bulk_jobs
        ORDER BY
          CASE
            WHEN status IN ('scheduled', 'submitting', 'submitted') THEN 0
            ELSE 1
          END,
          publish_at_ts ASC,
          updated_at_ts DESC
        r�   r‘   )r   r   re   Úsqlite3ÚRowÚrow_factoryr7   r8   r9   Úcloser¡   r:   )r1   r;   ÚrowsÚjobsr=   r?   s         r'   Ú_load_admin_jobsrª   ¡   s—   € Ü”;×%Ñ% nÑ5Ó6€DÜ—{‘{€DÔØ
�+‰+‹-€CØ‡K�Kð		ôð �<‰<‹>€DØ‡J�J„Là€DØò ˆÜ˜SÓ!ˆØˆ}Ò c¨*¢oØØ�‰�CÕð	ð
 €Kr&   c                 ó®  — t         j                  d   }i }| D ]I  }|j                  d«      xs dj                  «       }|sŒ)|j	                  |g «      j                  |«       ŒK g }t        j                  |«      D ]Ä  }|j                  «       sŒ|j                  «       }|j                  |j                  g «      }|j                  |j                  |j                  t        |j                  «      t        t        |j                  «      «      t!        |«      t#        d„ |D «       «      t#        d„ |D «       «      dœ«       ŒÆ |j%                  d„ ¬«       |S )	Nrc   r_   r+   c              3   ó.   K  — | ]  }|d    rdnd–— Œ y­w)r�   r   r6   Nr%   ©Ú.0Újs     r'   ú	<genexpr>z)_load_upload_inventory.<locals>.<genexpr>Ô   s   è ø€ Ò([È!¨a°Ò.>©ÀAÓ)EÑ([ùó   ‚c              3   ó.   K  — | ]  }|d    rdnd–— Œ y­w)r�   r6   r   Nr%   r­   s     r'   r°   z)_load_upload_inventory.<locals>.<genexpr>Õ   s   è ø€ Ò*]ÈA°°-Ò0@©1ÀaÓ+GÑ*]ùr±   )r_   Ú
size_bytesÚ
size_labelÚmodified_at_labelÚlinked_jobs_countÚactive_jobs_countÚterminal_jobs_countc                 óB   — | d   dk(  | d    | d   j                  «       fS )Nr·   r   r¶   r_   )r‹   )Úitems    r'   ú<lambda>z(_load_upload_inventory.<locals>.<lambda>Ú   s5   € ØÐ$Ñ%¨Ñ*ØÐ%Ñ&Ð&ØÐ"Ñ#×)Ñ)Ó+ð
€ r&   )Úkey)r   re   r$   r,   Ú
setdefaultr:   rd   ÚscandirÚis_fileÚstatr5   Úst_sizer�   rt   rp   Úst_mtimerJ   ÚsumÚsort)	r©   Ú
upload_dirÚ	job_linksr?   r_   ÚfilesÚentryrÀ   Úlinked_jobss	            r'   Ú_load_upload_inventoryrÊ   ½   s.  € Ü×#Ñ# LÑ1€JØ€IØò >ˆØŸ7™7Ð#4Ó5Ò;¸×BÑBÓDˆÙØØ×Ñ˜_¨bÓ1×8Ñ8¸Õ=ð	>ð €EÜ—‘˜JÓ'ò 
ˆØ�}‰}ŒØà�z‰z‹|ˆØ—m‘m E§J¡J°Ó3ˆØ�‰à#(§:¡:Ø"Ÿl™lÜ+¨D¯L©LÓ9Ü%/´°D·M±MÓ0BÓ%CÜ%(¨Ó%5Ü%(Ñ([È{Ô([Ó%[Ü'*Ñ*]ÐQ\Ô*]Ó']ñõ
	
ð
ð$ 
‡J�Jñ
ð ô ð €Lr&   c                 ó˜  — t        t        j                  d   «      }t        j                  |_        |j                  «       }|j                  d| f«       |j                  «       }|j                  «        d}d}|D ]J  }t        |d   xs d«      }|d   xs dj                  «       j                  «       t        v r||z  }ŒF||z  }ŒL ||fS )Nr£   z�
        SELECT status, COUNT(*) AS total
        FROM bulk_jobs
        WHERE stored_filename=?
        GROUP BY status
        r   Útotalr‚   r+   )r   r   re   r¤   r¥   r¦   r7   r8   r9   r§   rp   r,   r‹   r�   )r_   r1   r;   r¨   ÚactiveÚterminalr=   rÌ   s           r'   Ú_count_jobs_for_filerÏ   ã   sÍ   € Ü”;×%Ñ% nÑ5Ó6€DÜ—{‘{€DÔØ
�+‰+‹-€CØ‡K�Kð	ð 
Ðôð �<‰<‹>€DØ‡J�J„Là€FØ€HØò ˆÜ�C˜‘LÒ% AÓ&ˆØ�‰MÒ˜R×&Ñ&Ó(×.Ñ.Ó0Ô4IÑIØ˜Ñ‰Hà�e‰O‰Fðð �8ÐÐr&   ra   Úlanding)Úendpointc                  ó,   — t        dt        «       ¬«      S )Nzlanding.html©Úis_connected©r   r(   r%   r&   r'   rÐ   rÐ     ó   € ä˜>¼»ÔHÐHr&   ú/appÚapp_homec                  ó,   — t        dt        «       ¬«      S )Nz
index.htmlrÓ   rÕ   r%   r&   r'   rØ   rØ     s   € ä˜<´m³oÔFÐFr&   z/contactÚcontactc                  ó,   — t        dt        «       ¬«      S )Nzcontact.htmlrÓ   rÕ   r%   r&   r'   rÚ   rÚ     rÖ   r&   z/tosÚtosc                  ó   — t        d«      S )Nztos.html©r   r%   r&   r'   rÜ   rÜ     s   € ä˜:Ó&Ð&r&   z/privacyÚprivacyc                  ó   — t        d«      S )Nzprivacy.htmlrÞ   r%   r&   r'   rß   rß     s   € ä˜>Ó*Ð*r&   z/admin/loginÚGETÚPOSTÚadmin_login)ÚmethodsrÑ   c                  ó°  — t        «       rt        t        d«      «      S t        j                  j                  d«      xs# t        j                  j                  d«      xs dj                  «       } t        j                  dk(  rÇt        j                  j                  d«      xs d}t        t        j                  j                  d«      xs d«      }|rjt        j                  ||«      rTdt        t        <   dt        _        t#        dd	«       | j%                  d
«      rt        | «      S t        t        d«      «      S t#        dd«       t'        d| ¬«      S )Núui.admin_jobsrX   r+   râ   ÚpasswordÚADMIN_PASSWORDTzAcceso admin concedido.Úsuccessra   u   ContraseÃ±a admin incorrecta.Úerrorzadmin_login.htmlr\   )rU   r   r	   r   Úargsr$   Úformr,   Úmethodrr   r   re   ÚsecretsÚcompare_digestr   rT   Úmodifiedr
   Ú
startswithr   )r]   ÚprovidedÚexpecteds      r'   rã   rã     s  € äÔ Üœ Ó0Ó1Ð1ä—‘× Ñ  Ó(ÒJ¬G¯L©L×,<Ñ,<¸VÓ,DÒJÈ×QÑQÓS€Hä‡~�~˜ÒÜ—<‘<×#Ñ# JÓ/Ò5°2ˆÜ”{×)Ñ)×-Ñ-Ð.>Ó?ÒEÀ2ÓFˆáœ×.Ñ.¨x¸ÔBØ)-ŒGÔ%Ñ&Ø#ŒGÔÜÐ+¨YÔ7Ø×"Ñ" 3Ô'Ü Ó)Ð)ÜœG OÓ4Ó5Ð5äÐ-¨wÔ7äÐ-¸ÔAÐAr&   z/admin/logoutÚadmin_logoutc                  óŒ   — t        j                  t        d «       dt         _        t	        dd«       t        t        d«      «      S )NTu   SesiÃ³n admin cerrada.ré   rW   )r   ÚpoprT   rð   r
   r   r	   r%   r&   r'   rô   rô   5  s5   € ä‡K�KÔ! 4Ô(Ø„GÔÜ	Ð
" IÔ.Ü”GÐ,Ó-Ó.Ð.r&   z/adminÚ
admin_jobsc            	      óâ   — t        «       } | r| S t        «       }|D �cg c]
  }|d   rŒ	|‘Œ }}|D �cg c]
  }|d   sŒ	|‘Œ }}t        |«      }t        d|||t	        |«      ¬«      S c c}w c c}w )Nr�   zadmin_jobs.html)Úin_progress_jobsÚfinished_jobsÚupload_filesÚ
total_jobs)r^   rª   rÊ   r   rJ   )Úguardr©   r?   rù   rú   rû   s         r'   r÷   r÷   =  s�   € ä‹N€EÙØˆäÓ€DØ'+ÖF °3°}Ó3EšÐFÐÐFØ$(Ö?˜S¨C°Ó,>’SÐ?€MÐ?Ü)¨$Ó/€LäØØ)Ø#Ø!Ü�t“9ôð ùò	 GùÚ?s   �
A'¨A'²
A,½A,z/admin/jobs/<job_id>/cancelÚadmin_cancel_jobÚjob_idc                 óh  — t        «       }|r|S t        t        j                  d   «      }t        j
                  |_        |j                  «       }|j                  d| f«       |j                  «       }|s0|j                  «        t        dd«       t        t        d«      «      S |d   xs dj                  «       j                  «       }|t         v r0|j                  «        t        dd	«       t        t        d«      «      S t#        t%        j$                  «       «      }|j                  d
||| f«       |j'                  «        |j                  «        |j(                  dk7  r t        dd	«       t        t        d«      «      S |dv rt        dd	«       nt        dd«       t        t        d«      «      S )Nr£   ú"SELECT * FROM bulk_jobs WHERE id=?úEl trabajo indicado no existe.rê   ræ   r‚   r+   z!Ese trabajo ya estaba finalizado.Úwarningzô
        UPDATE bulk_jobs
        SET status='cancelled',
            next_attempt_ts=?,
            last_status='CANCELLED_BY_ADMIN',
            updated_at_ts=?
        WHERE id=? AND status NOT IN ('complete', 'failed', 'cancelled')
        r6   uG   No se pudo cancelar el trabajo porque su estado cambiÃ³ mientras tanto.r‡   ul   Trabajo cancelado localmente. Si TikTok ya habÃ­a aceptado el envÃ­o, esta acciÃ³n no puede retirarlo allÃ­.z Trabajo cancelado correctamente.ré   )r^   r   r   re   r¤   r¥   r¦   r7   r8   Úfetchoner§   r
   r   r	   r,   r‹   r�   rp   ÚtimeÚcommitÚrowcount)rÿ   rý   r1   r;   r=   r‚   Únow_tss          r'   rþ   rþ   Q  sj  € ä‹N€EÙØˆä”;×%Ñ% nÑ5Ó6€DÜ—{‘{€DÔØ
�+‰+‹-€CØ‡K�KÐ4°v°iÔ@Ø
�,‰,‹.€CáØ�
‰
ŒÜÐ.°Ô8Üœ Ó0Ó1Ð1à�(‰mÒ!˜r×(Ñ(Ó*×0Ñ0Ó2€FØÔ&Ñ&Ø�
‰
ŒÜÐ1°9Ô=Üœ Ó0Ó1Ð1ä”—‘“Ó€FØ‡K�Kð	ð 
�˜Ð ô
ð 	‡K�K„MØ‡J�J„Là
‡|�|�qÒÜÐWÐYbÔcÜœ Ó0Ó1Ð1àÐ,Ñ,ÜØzØõ	
ô
 	Ð0°)Ô<ä”G˜OÓ,Ó-Ð-r&   z/admin/jobs/<job_id>/relaunchÚadmin_relaunch_jobc           
      ó°  — t        «       }|r|S t        t        j                  d   «      }t        j
                  |_        |j                  «       }|j                  d| f«       |j                  «       }|s0|j                  «        t        dd«       t        t        d«      «      S |d   xs dj                  «       j                  «       }|t         vr0|j                  «        t        dd«       t        t        d«      «      S |d	   xs d}t#        |«      }|rt$        j&                  j)                  |«      s0|j                  «        t        d
d«       t        t        d«      «      S t+        |d   xs dj                  «       xs |«      }t-        j.                  «       j0                  }	|	› d|› �}
t#        |
«      }	 t3        j4                  ||«       t9        t;        j:                  «       «      }i d|	“d|“d|“d|“dd“dd“dd “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “|d    |
|dd d d |d!œ¥}	 t=        ||«       |j?                  «        |j                  «        t        d#|	› �d$«       t        t        d«      «      S # t6        $ r=}|j                  «        t        d|› �d«       t        t        d«      «      cY d }~S d }~ww xY w# t@        $ rc}|j                  «        	 t%        jB                  |«       n# t6        $ r Y nw xY wt        d"|› �d«       t        t        d«      «      cY d }~S d }~ww xY w)%Nr£   r  r  rê   ræ   r‚   r+   z-Solo se pueden relanzar trabajos finalizados.r_   z=No se puede relanzar porque el archivo original ya no existe.Úoriginal_filenameÚ_z6No se pudo duplicar el archivo para el relanzamiento: Úidr’   r”   r–   Ú	scheduledÚattemptsr   Ú
last_errorÚaccess_tokenÚaccount_aliasÚtitleÚprivacy_levelÚallow_commentÚ
allow_duetÚallow_stitchÚcommercial_toggleÚbrand_organic_toggleÚbrand_content_toggleÚis_aigc©r  r_   r  Ú	video_urlÚ
publish_idÚlast_statusÚlast_fail_reasonr˜   z#No se pudo crear el nuevo trabajo: zTrabajo relanzado. Nuevo job: ré   )"r^   r   r   re   r¤   r¥   r¦   r7   r8   r  r§   r
   r   r	   r,   r‹   r�   rg   rd   r[   rj   r   ÚuuidÚuuid4ÚhexÚshutilÚcopy2rŸ   rp   r  rR   r  r-   Úremove)rÿ   rý   r1   r;   r=   r‚   Úsource_filenameÚsource_pathr  Ú
new_job_idÚnew_stored_filenameÚnew_file_pathÚexcr  r?   s                  r'   r	  r	  †  sŸ  € ä‹N€EÙØˆä”;×%Ñ% nÑ5Ó6€DÜ—{‘{€DÔØ
�+‰+‹-€CØ‡K�KÐ4°v°iÔ@Ø
�,‰,‹.€CáØ�
‰
ŒÜÐ.°Ô8Üœ Ó0Ó1Ð1à�(‰mÒ!˜r×(Ñ(Ó*×0Ñ0Ó2€FØÔ*Ñ*Ø�
‰
ŒÜÐ=¸wÔGÜœ Ó0Ó1Ð1àÐ+Ñ,Ò2°€OÜ  Ó1€KÙœbŸg™gŸn™n¨[Ô9Ø�
‰
ŒÜÐMÈwÔWÜœ Ó0Ó1Ð1ä% sÐ+>Ñ'?Ò'EÀ2×&LÑ&LÓ&NÒ&aÐRaÓbÐÜ—‘“×!Ñ!€JØ'˜L¨Ð*;Ð)<Ð=ÐÜ"Ð#6Ó7€Mð2Ü�‰�[ -Ô0ô ”—‘“Ó€FðØˆjðà˜ðð 	˜ðð 	˜6ð	ð
 	�+ðð 	�Aðð 	�dðð 	˜˜NÑ+ðð 	˜˜_Ñ-ðð 	��W‘ðð 	˜˜_Ñ-ðð 	˜˜_Ñ-ðð 	�c˜,Ñ'ðð 	˜˜NÑ+ðð 	˜SÐ!4Ñ5ðð  	 Ð$:Ñ ;ð!ð" 	 Ð$:Ñ ;ð#ð$ �y‘>Ø.Ø.ØØØØ Øò3€Cð8
2Ü˜˜sÔ#Ø�‰Œð 	‡J�J„LÜ	Ð*¨:¨,Ð
7¸ÔCÜ”G˜OÓ,Ó-Ð-øôa ò 2Ø�
‰
ŒÜÐFÀsÀeÐLÈgÔVÜœ Ó0Ó1Õ1ûð2ûôJ ò 2Ø�
‰
Œð	Ü�I‰I�mÕ$øÜò 	Ùð	úäÐ3°C°5Ð9¸7ÔCÜœ Ó0Ó1Õ1ûð2ús`   Æ<J  ÉK) Ê 	K&Ê)2K!ËK&Ë!K&Ë)	MË2MÌLÌMÌ	L%Ì"MÌ$L%Ì%%MÍ
MÍMz/admin/files/deleteÚadmin_delete_filec                  ó¢  — t        «       } | r| S t        j                  j                  d«      xs dj	                  «       }t        |«      }|s t        dd«       t        t        d«      «      S t        |«      \  }}t        j                  j                  |«      s t        dd«       t        t        d«      «      S 	 t        j                  |«       |d	kD  rt        d
|› d�d«       n|d	kD  rt        dd«       nt        dd«       t        t        d«      «      S # t        $ r-}t        d|› �d«       t        t        d«      «      cY d }~S d }~ww xY w)Nr_   r+   u   Nombre de archivo invÃ¡lido.rê   ræ   z&El archivo ya no existe en el sistema.r  zNo se pudo borrar el archivo: r   u   Archivo borrado. Ojo: habÃ­a uE    trabajo(s) en curso usando ese vÃ­deo y ahora quedarÃ¡n sin fichero.uV   Archivo borrado. Los trabajos finalizados asociados dejarÃ¡n de mostrarse en el panel.ré   zArchivo borrado del sistema.)r^   r   rì   r$   r,   rg   r
   r   r	   rÏ   rd   r[   rj   r&  rŸ   )rý   r_   r    Úactive_jobsÚterminal_jobsr,  s         r'   r-  r-  Þ  s-  € ä‹N€EÙØˆä—|‘|×'Ñ'Ð(9Ó:Ò@¸b×GÑGÓI€OÜ˜Ó/€IÙÜÐ,¨gÔ6Üœ Ó0Ó1Ð1ä!5°oÓ!FÑ€K�ä�7‰7�>‰>˜)Ô$ÜÐ6¸	ÔBÜœ Ó0Ó1Ð1ð2Ü
�	‰	�)Ôð
 �Q‚ÜØ+¨K¨=Ð8}Ð~Øõ	
ð 
˜Ò	ÜÐfÐhqÕräÐ,¨iÔ8ä”G˜OÓ,Ó-Ð-øô ò 2ÜÐ.¨s¨eÐ4°gÔ>Üœ Ó0Ó1Õ1ûð2ús   Â;D Ä	EÄ!"E	ÅEÅ	Ez/upload_localÚupload_localc                  óZ  — t        «       } | st        dd«       t        d«      S dt        j                  vrt        dd«       t        d«      S t        j                  d   }|j
                  st        dd«       t        d«      S t        j                  d   }t        |j
                  «      }t        j                  «       j                  }|› d|› �}t        j                  j                  ||«      }|j                  |«       t!        ||||d d d d	d d d
œ	«       t        t#        d|¬«      «      S )Nú!Please connect with TikTok first.rê   r×   ÚvideozNo video file provided.zNo file selected.rc   r  Úlocal_uploaded)	r    r_   r  r  Úlast_init_responseÚposting_summaryr‚   r  Úbulk_job_idúui.post_to_tiktok©Údraft_id)r   r
   r   r   rÇ   rf   r   re   r   r!  r"  r#  rd   r[   rH   Úsaver   r	   )r  ÚfilerÅ   Úoriginal_fnr;  r_   Ú	save_paths          r'   r1  r1    s  € ä-Ó/€LÙÜÐ1°7Ô;Ü˜ÓÐà”g—m‘mÑ#ÜÐ'¨Ô1Ü˜ÓÐä�=‰=˜Ñ!€DØ�=Š=ÜÐ! 7Ô+Ü˜ÓÐä×#Ñ# LÑ1€Jä §¡Ó.€KÜ�z‰z‹|×Ñ€HØ!˜
 ! K =Ð1€OÜ—‘—‘˜Z¨Ó9€IØ‡I�IˆiÔäØà"Ø.Ø!,ØØ"&Ø#Ø&ØØñ
	
ôô ”GÐ/¸(ÔCÓDÐDr&   z/static_preview/<draft_id>Ústatic_previewr;  c                 óº   — t        «       }|syt        | «      }|sy|j                  d«      }|rt        j                  j                  |«      syt        |dd¬«      S )N)zNot authenticatedé‘  )z	Not foundé”  r    z	video/mp4F)ÚmimetypeÚas_attachment)r   r   r$   rd   r[   Úexistsr   )r;  r  Údraftr[   s       r'   r@  r@  0  sR   € ä-Ó/€LÙØ'ä�xÓ €EÙØà�9‰9�[Ó!€DÙ”r—w‘w—~‘~ dÔ+Øä�T K¸uÔEÐEr&   z/post/<draft_id>Úpost_to_tiktokc                 ó�  — t        «       }|st        dd«       t        d«      S t        | «      }|st        dd«       t        d«      S 	 t	        |«      }t        |«      \  }}|j                  d«      }t        |d   «      }d}	d }
t        |t        «      r|d	kD  r|d	kD  r||kD  r	d
}	d||fz  }
d }|j                  d«      }|rBt        |t        j                  d   t        j                  d   t        j                  d   ¬«      }t        d| |||	|
|||¬«	      S # t
        $ r$}t        d|› �d«       t        d«      cY d }~S d }~ww xY w)Nr3  rê   r×   úDraft not found.ú8Cannot post right now. Please try again later. Details: Úmax_video_post_duration_secr    Tr   Fz7Video is %.1fs but max allowed is %ss for this creator.r_   ÚPUBLIC_BASE_URLÚMEDIA_SIGNING_SECRETÚMEDIA_TOKEN_TTL_SECONDS©r_   Úpublic_base_urlÚsigning_secretÚttl_secondszpost_to_tiktok.html)r;  rG  Úcreator_infoÚduration_okÚduration_msgÚpull_urlÚcan_post_nowÚcannot_post_reason)r   r
   r   r   r   r-   r   r$   r   Ú
isinstancerp   r   r   re   r   )r;  r  rG  rT  ÚerX  rY  Úmax_durÚdurrU  rV  rW  r_   s                r'   rH  rH  A  so  € ä-Ó/€LÙÜÐ1°7Ô;Ü˜ÓÐä�xÓ €EÙÜÐ  'Ô*Ü˜ÓÐð Ü)¨,Ó7ˆô
 (<¸LÓ'IÑ$€LÐ$à×ÑÐ<Ó=€GÜ
(¨¨{Ñ);Ó
<€CØ€KØ€LÜ�'œ3Ô G¨a¢K°C¸!²GÀÀgÂØˆØPÐTWÐY`ÐSaÑaˆð €HØ—i‘iÐ 1Ó2€OÙÜ)Ø+Ü'×.Ñ.Ð/@ÑAÜ&×-Ñ-Ð.DÑEÜ#×*Ñ*Ð+DÑEô	
ˆô ØØØØ!ØØ!ØØ!Ø-ô
ð 
øô3 ò  ÜÐHÈÈÐLÈgÔVÜ˜ÓÕûð ús   Á	D Ä	EÄ!E Ä:EÅ Ez/post/<draft_id>/publishÚpublishc                 óö
  — t        «       }|st        dd«       t        d«      S t        | «      }|st        dd«       t        d«      S 	 t	        |«      }t        j                  j                  d«      d	k7  r2t        d
d«       t        t        j                  xs t        d«      «      S t        |«      \  }}|s&t        |xs dd«       t        t        d| ¬«      «      S t        j                  j                  d«      xs dj                  «       }|s2t        dd«       t        t        j                  xs t        d«      «      S t        j                  j                  d«      xs dj                  «       }t        j                  j                  d«      dk(  }	t        j                  j                  d«      dk(  }
t        j                  j                  d«      dk(  }|r'|dk(  r"t        dd«       t        t        d| ¬«      «      S |j                  d«      xs g }||vr"t        dd«       t        t        d| ¬«      «      S t        j                  j                  d«      dk(  }t        j                  j                  d«      dk(  }t        j                  j                  d«      dk(  }|j                  d«      du rd}|j                  d«      du rd}|j                  d «      du rd}| }| }| }d}d}|	rS|
s$|s"t        d!d«       t        t        d| ¬«      «      S |
}|}|r'|dk(  r"t        dd«       t        t        d| ¬«      «      S |j                  d"«      }t        |d#   «      }t        |t        «      r6|d$kD  r1|d$kD  r,||kD  r't        d%||fz  d«       t        t        d| ¬«      «      S |j                  d&«      }|s"t        d'd«       t        t        d| ¬«      «      S t         j"                  d(   }t$        j&                  j)                  ||«      }t$        j&                  j+                  |«      s"t        d)d«       t        t        d| ¬«      «      S t-        |t         j"                  d*   t         j"                  d+   t         j"                  d,   ¬-«      }	 t/        ||||||||dd.|¬/«      }|j                  d0«      xs i j                  d1«      }t1        | i |¥||||||||	|
|d2œd3|d4œ¥«       t        t        d5| ¬«      «      S # t
        $ r/}t        d|› �d«       t        t        d| ¬«      «      cY d }~S d }~ww xY w# t
        $ r/}t        d6|› �d«       t        t        d| ¬«      «      cY d }~S d }~ww xY w)7Nr3  rê   r×   rJ  rK  r9  r:  Úmusic_confirmÚ1uE   You must agree to TikTokâ€™s Music Usage Confirmation before posting.zui.app_homezJThis TikTok account cannot publish at this moment. Please try again later.r  r+   z1Please select a Privacy status before publishing.r  r  ÚonÚ
your_brandÚbranded_contentÚ	SELF_ONLYzIBranded content cannot be posted with privacy set to Only me (SELF_ONLY).Úprivacy_level_optionsú'You must select a valid privacy option.r  r  r  Úcomment_disabledTFÚduet_disabledÚstitch_disabledú]If commercial content disclosure is on, you must select Your brand, Branded content, or both.rL  r    r   ú1Video duration %.1fs exceeds allowed maximum %ss.r_   ú2Internal error: missing stored_filename for draft.rc   úVideo file not found on server.rM  rN  rO  rP  ÚPULL_FROM_URL)r  Úcaptionr  Údisable_commentÚdisable_duetÚdisable_stitchr  r  r  Úmoder  Údatar  )r  r  r  r  r  r  rc  rd  Úposted)r6  r  r7  r‚   r  zui.status_pagezError posting to TikTok: )r   r
   r   r   r   r-   r	   r   rì   r$   Úreferrerr   r,   r   rZ  rp   r   re   rd   r[   rH   rF  r   r   r   )r;  r  rG  rT  r[  rX  rY  r  r  r  rc  rd  Úoptionsr  r  r  rq  rr  rs  r  r  r\  r]  r_   rÅ   Ú
local_pathr  Ú	init_respr  s                                r'   r^  r^  x  sK  € ä-Ó/€LÙÜÐ1°7Ô;Ü˜ÓÐä�xÓ €EÙÜÐ  'Ô*Ü˜ÓÐðIÜ)¨,Ó7ˆô
 ‡|�|×Ñ˜Ó(¨CÒ/ÜÐUÐW^Ô_Üœ×(Ñ(ÒB¬G°MÓ,BÓCÐCä';¸LÓ'IÑ$€LÐ$ÙÜØÒnÐ"nØô	
ô œÐ 3¸hÔGÓHÐHä—\‘\×%Ñ% oÓ6Ò<¸"×CÑCÓE€MÙÜÐAÀ7ÔKÜœ×(Ñ(ÒB¬G°MÓ,BÓCÐCä�\‰\×Ñ˜gÓ&Ò,¨"×3Ñ3Ó5€EäŸ™×(Ñ(Ð)<Ó=ÀÑEÐÜ—‘×!Ñ! ,Ó/°4Ñ7€JÜ—l‘l×&Ñ&Ð'8Ó9¸TÑA€Oá˜=¨KÒ7ÜÐYÐ[bÔcÜœÐ 3¸hÔGÓHÐHà×ÑÐ6Ó7Ò=¸2€GØ˜GÑ#ÜÐ7¸ÔAÜœÐ 3¸hÔGÓHÐHä—L‘L×$Ñ$ _Ó5¸Ñ=€MÜ—‘×!Ñ! ,Ó/°4Ñ7€JÜ—<‘<×#Ñ# NÓ3°tÑ;€Là×ÑÐ*Ó+¨tÑ3ØˆØ×Ñ˜Ó(¨DÑ0Øˆ
Ø×ÑÐ)Ó*¨dÑ2Øˆà'Ð'€OØ!�>€LØ%Ð%€Nà ÐØ ÐáÙ™oÜØoØôô œGÐ$7À(ÔKÓLÐLà)ÐØ.Ðá M°[Ò$@ÜÐ]Ð_fÔgÜœGÐ$7À(ÔKÓLÐLà×ÑÐ<Ó=€GÜ
(¨¨{Ñ);Ó
<€CÜ�'œ3Ô G¨a¢K°C¸!²GÀÀgÂÜÐAÀSÈ'ÀNÑRÐT[Ô\ÜœÐ 3¸hÔGÓHÐHà—i‘iÐ 1Ó2€OÙÜÐBÀGÔLÜœÐ 3¸hÔGÓHÐHä×#Ñ# LÑ1€JÜ—‘—‘˜j¨/Ó:€JÜ�7‰7�>‰>˜*Ô%ÜÐ/°Ô9ÜœÐ 3¸hÔGÓHÐHä&Ø'Ü#×*Ñ*Ð+<Ñ=Ü"×)Ñ)Ð*@ÑAÜ×&Ñ&Ð'@ÑAô	€Ið*IÜ,Ø%ØØ'Ø+Ø%Ø)Ø!5Ø!5ØØ Øô
ˆ	ð  —m‘m FÓ+Ò1¨r×6Ñ6°|ÓDˆ
äØðØðà&/Ø(à"Ø%2Ø%2Ø",Ø$0Ø):Ø",Ø'6ñ	$ð #Ø&òô	
ô* œÐ 0¸8ÔDÓEÐEøôG ò IÜÐHÈÈÐLÈgÔVÜœÐ 3¸hÔGÓHÕHûðIûôJ ò IÜÐ)¨!¨Ð-¨wÔ7ÜœÐ 3¸hÔGÓHÕHûðIús=   Á	T ÒA.U  Ô	T=Ô$T8Ô2T=Ô8T=Õ 	U8Õ	$U3Õ-U8Õ3U8z/post/<draft_id>/scheduleÚschedule_postc                 óŽ  — t        «       }|st        dd«       t        d«      S t        | «      }|st        dd«       t        d«      S t	        j
                  d«      xs dj                  «       }|sd}|t        d<   dt        _        t        |«       t        j                  j                  d	«      xs dj                  «       }|s"t        d
d«       t        t        d| ¬«      «      S 	 t        |«      }t        j                  j                  d«      dk7  r"t        dd«       t        t        d| ¬«      «      S t        j                  j                  d«      xs dj                  «       }|s"t        dd«       t        t        d| ¬«      «      S t        j                  j                  d«      xs dj                  «       }t        j                  j                  d«      dk(  }	t        j                  j                  d«      dk(  }
t        j                  j                  d«      dk(  }|	r&|
s$|s"t        dd«       t        t        d| ¬«      «      S t        |	xr |
«      }t        |	xr |«      }|r'|dk(  r"t        dd«       t        t        d| ¬«      «      S t        j                  j                  d«      dk(  }t        j                  j                  d«      dk(  }t        j                  j                  d«      dk(  }|j                  d«      }|rt        j                   j#                  |«      s"t        dd«       t        t        d| ¬«      «      S |j                  d «      }|j                  d!«      xs dj                  «       xs t        j                   j%                  |«      }|s"t        d"d«       t        t        d| ¬«      «      S 	 t'        |«      }|j                  d#«      xs g }|r&||vr"t        d$d«       t        t        d| ¬«      «      S |j                  d%«      du rd&}|j                  d'«      du rd&}|j                  d(«      du rd&}|j                  d)«      }t)        |«      }t+        |t,        «      r6|d*kD  r1|d*kD  r,||kD  r't        d+||fz  d«       t        t        d| ¬«      «      S t/        |«      \  }}|st        |xs d,d-z   d.«       t-        t1        j0                  «       «      }t3        j4                  «       j6                  }i d0|“d1|“d2|“d3|“d4d5“d6d*“d7d “d8|“d9|“d|“d|“d|rd:nd*“d|rd:nd*“d|rd:nd*“d|	rd:nd*“d;|rd:nd*“d<|rd:nd*“d:||dd d d |d=œ¥}t9        t:        j<                  d>   «      }t>        j@                  |_!        |jE                  «       }|jG                  d?«       |jI                  «       D �cg c]  }|d@   ‘Œ	 } }tK        | «      }!|jM                  «       D �"�#ci c]  \  }"}#|"|!v sŒ|"|#“Œ }}"}#dAjO                  |jQ                  «       «      }$dAjO                  dBgtS        |«      z  «      }%|jG                  dC|$› dD|%› dE�tU        |jW                  «       «      «       |jY                  «        |j[                  «        t]        | i |¥d5|||||||	|
|||dFœ
dGœ¥«       t        dH|› �dI«       t        t        dJ|¬K«      «      S # t        $ r/}t        d|› �d«       t        t        d| ¬«      «      cY d }~S d }~ww xY w# t        $ r}t        d/|› �d.«       Y d }~�Œbd }~ww xY wc c}w c c}#}"w )LNr3  rê   r×   rJ  Úoauth_aliasr+   ÚdefaultTÚ
publish_atz#Please select a schedule date/time.r9  r:  z<Invalid publish_at (must include timezone offset). Details: r`  ra  uH   You must agree to TikTokâ€™s Music Usage Confirmation before scheduling.r  z1Please select a Privacy status before scheduling.r  r  rb  rc  rd  rk  re  z;Branded content cannot be scheduled with privacy SELF_ONLY.r  r  r  r    rn  r_   r  rm  rf  rg  rh  Fri  rj  rL  r   rl  z2This TikTok account cannot publish at this moment.zD Your job was scheduled anyway; the worker will retry automatically.r  zKCould not validate creator settings right now (scheduled anyway). Details: r  r’   r”   r–   r‚   r  r  r  r  r  r6   r  r  r  r£   zPRAGMA table_info(bulk_jobs)r5   rB   rC   rD   rE   r4   )
r  r  r  r  r  r  rc  rd  r  r  )r‚   r8  r7  zScheduled job created: ré   zui.bulk_job_page©rÿ   )/r   r
   r   r   r   r$   r,   rð   r0   r   rì   r	   r   r-   ri   rd   r[   rF  Úbasenamer   r   rZ  rp   r   r  r!  r"  r#  r   r   re   r¤   r¥   r¦   r7   r8   r9   rG   rF   rH   rI   rJ   rK   rL   r  r§   r   )&r;  r  rG  r  r  r”   r[  r  r  r  rc  rd  r  r  r  r  r  r    r_   r  rT  rx  r\  r]  rX  rY  r  rÿ   r?   r1   r;   Úrr<   ÚcolsetrM   rN   rP   rQ   s&                                         r'   r{  r{    sI  € ä-Ó/€LÙÜÐ1°7Ô;Ü˜ÓÐä�xÓ €EÙÜÐ  'Ô*Ü˜ÓÐô —[‘[ Ó/Ò5°2×<Ñ<Ó>€MÙà!ˆØ!.Œ�ÑØŒÔä! -Ô0ä—,‘,×"Ñ" <Ó0Ò6°B×=Ñ=Ó?€JÙÜÐ3°WÔ=ÜœÐ 3¸hÔGÓHÐHðIÜ2°:Ó>ˆô
 ‡|�|×Ñ˜Ó(¨CÒ/ÜÐXÐZaÔbÜœÐ 3¸hÔGÓHÐHä—\‘\×%Ñ% oÓ6Ò<¸"×CÑCÓE€MÙÜÐAÀ7ÔKÜœÐ 3¸hÔGÓHÐHä�\‰\×Ñ˜gÓ&Ò,¨"×3Ñ3Ó5€EäŸ™×(Ñ(Ð)<Ó=ÀÑEÐÜ—‘×!Ñ! ,Ó/°4Ñ7€JÜ—l‘l×&Ñ&Ð'8Ó9¸TÑA€Oá¡*±ÜÐmÐovÔwÜœÐ 3¸hÔGÓHÐHäÐ 1Ò @°jÓAÐÜÐ 1Ò E°oÓFÐá °Ò <ÜÐKÈWÔUÜœÐ 3¸hÔGÓHÐHô —L‘L×$Ñ$ _Ó5¸Ñ=€MÜ—‘×!Ñ! ,Ó/°4Ñ7€JÜ—<‘<×#Ñ# NÓ3°tÑ;€Lð —	‘	˜+Ó&€IÙœBŸG™GŸN™N¨9Ô5ÜÐ/°Ô9ÜœÐ 3¸hÔGÓHÐHà—i‘iÐ 1Ó2€OØŸ™Ð#6Ó7Ò=¸2×DÑDÓFÒeÌ"Ï'É'×JZÑJZÐ[dÓJeÐÙÜÐBÀGÔLÜœÐ 3¸hÔGÓHÐHðlÜ)¨,Ó7ˆà×"Ñ"Ð#:Ó;ÒA¸rˆÙ�}¨GÑ3ÜÐ;¸WÔEÜœGÐ$7À(ÔKÓLÐLà×ÑÐ.Ó/°4Ñ7Ø!ˆMØ×Ñ˜OÓ,°Ñ4ØˆJØ×ÑÐ-Ó.°$Ñ6Ø ˆLà×"Ñ"Ð#@ÓAˆÜ,¨YÓ7ˆÜ�gœsÔ#¨°!ª¸¸aºÀCÈ'ÂMÜÐEÈÈgÈÑVÐX_Ô`ÜœGÐ$7À(ÔKÓLÐLä+?ÀÓ+MÑ(ˆÐ(ÙÜØ#Ò[Ð'[ØXñYàôô ”—‘“Ó€FÜ�Z‰Z‹\×Ñ€FðØˆfðà˜ðð 	˜ðð 	˜=ð	ð
 	�+ðð 	�Aðð 	�dðð 	˜ðð 	˜ðð 	�ðð 	˜ðð 	™m™°ðð 	™:‘a¨1ðð 	™\™¨qðð 	Ñ"3™Q¸ðð  	Ñ%9¡¸qð!ð" 	Ñ%9¡¸qð#ð$ Ø*Ø.ØØØØ Øò3€Cô8 ”;×%Ñ% nÑ5Ó6€DÜ—{‘{€DÔØ
�+‰+‹-€Cð ‡K�KÐ.Ô/Ø"Ÿ|™|›~Ö.˜!ˆAˆf‹IÐ.€DÐ.Ü�‹Y€FØŸI™I›K×
7‘D�A�q¨1°ª;ˆ1ˆa‰4Ð
7€CÑ
7à�y‰y˜Ÿ™›Ó$€HØ—9‘9˜c˜U¤S¨£XÑ-Ó.€LØ‡K�KÐ)¨(¨°:¸l¸^È1ÐMÌuÐUX×U_ÑU_ÓUaÓObÔcà‡K�K„MØ‡J�J„LäØð	
Øð	
à!Ø!àØ!.Ø!.Ø(Ø ,Ø%6Ø(Ø#2Ø(Ø!.ñ ò		
ôô* 
Ð# F 8Ð
,¨iÔ8Ü”GÐ.°vÔ>Ó?Ð?øôo ò IÜÐLÈQÈCÐPÐRYÔZÜœÐ 3¸hÔGÓHÕHûðIûôX ò lÜÐ[Ð\]Ð[^Ð_Ðaj×kÒkûðlüòT /ùã
7sV   Ã([ ÏA\ ÐB \ Ò/#\ ×	\<×5]Ø]Û	\Û$$\Ü\Ü\Ü	\9Ü\4Ü4\9z/status/<draft_id>Ústatus_pagec                 ó¬   — t        «       }|st        dd«       t        d«      S t        | «      }|st        dd«       t        d«      S t	        d| |¬«      S )Nr3  rê   r×   rJ  zstatus.html)r;  rG  )r   r
   r   r   r   )r;  r  rG  s      r'   r„  r„  Î  sU   € ä-Ó/€LÙÜÐ1°7Ô;Ü˜ÓÐä�xÓ €EÙÜÐ  'Ô*Ü˜ÓÐä˜=°8À5ÔIÐIr&   z/api/status/<draft_id>Ú
api_statusc                 óR  — t        «       }|st        dddœ«      dfS t        | «      }|st        dddœ«      dfS |j                  d«      }|st        dd	d
œ«      dfS 	 t	        ||«      }t        d|dœ«      dfS # t
        $ r#}t        dt        |«      dœ«      dfcY d }~S d }~ww xY w)NFÚnot_authenticated©r„   rê   rB  Údraft_not_foundrC  r  TÚno_publish_id_yet)r„   ÚstateéÈ   )r„   ru  )r   r   r   r$   r   r-   rr   )r;  r  rG  r  ru  r[  s         r'   r†  r†  Ý  s¼   € ä-Ó/€LÙÜ˜eÐ.AÑBÓCÀSÐHÐHä�xÓ €EÙÜ˜eÐ.?Ñ@ÓAÀ3ÐFÐFà—‘˜<Ó(€JÙÜ˜dÐ-@ÑAÓBÀCÐGÐGð<Ü  ¨zÓ:ˆÜ˜d¨DÑ1Ó2°CÐ7Ð7øÜò <Ü˜e¬c°!«fÑ5Ó6¸Ð;Õ;ûð<ús   ÁA: Á:	B&ÂB!ÂB&Â!B&z/api/media_url/<draft_id>Úapi_media_urlc                 ó  — t        «       }|st        dddœ«      dfS t        | «      }|st        dddœ«      dfS |j                  d«      }|st        dddœ«      d	fS t        j
                  d
   }t        j                  j                  ||«      }t        j                  j                  |«      st        dddœ«      dfS t        |t        j
                  d   t        j
                  d   t        j
                  d   ¬«      }t        d|dœ«      S )NFrˆ  r‰  rB  rŠ  rC  r_   Úmissing_stored_filenameiô  rc   Úfile_not_foundrM  rN  rO  rP  T)r„   Úurl)r   r   r   r$   r   re   rd   r[   rH   rF  r   )r;  r  rG  r_   rÅ   ry  r’  s          r'   rŽ  rŽ  ò  s  € ä-Ó/€LÙÜ˜eÐ.AÑBÓCÀSÐHÐHä�xÓ €EÙÜ˜eÐ.?Ñ@ÓAÀ3ÐFÐFà—i‘iÐ 1Ó2€OÙÜ˜eÐ.GÑHÓIÈ3ÐNÐNä×#Ñ# LÑ1€JÜ—‘—‘˜j¨/Ó:€JÜ�7‰7�>‰>˜*Ô%Ü˜eÐ.>Ñ?Ó@À#ÐEÐEä
 Ø'Ü#×*Ñ*Ð+<Ñ=Ü"×)Ñ)Ð*@ÑAÜ×&Ñ&Ð'@ÑAô	€Cô ˜$ sÑ+Ó,Ð,r&   z/bulk/job/<job_id>Úbulk_job_pagec                 ób   — t        «       }|st        dd«       t        d«      S t        d| ¬«      S )Nr3  rê   r×   zbulk_job.htmlr€  )r   r
   r   r   )rÿ   r  s     r'   r“  r“    s0   € ä-Ó/€LÙÜÐ1°7Ô;Ü˜ÓÐÜ˜?°6Ô:Ð:r&   z/api/bulk/job/<job_id>Úapi_bulk_jobc                 óx  — t        «       }|st        dddœ«      dfS t        t        j                  d   «      }t
        j                  |_        |j                  «       }|j                  d| f«       |j                  «       }|j                  «        |st        dddœ«      dfS t        d	t        |«      d
œ«      dfS )NFrˆ  r‰  rB  r£   r  Ú	not_foundrC  T)r„   r?   r�  )r   r   r   r   re   r¤   r¥   r¦   r7   r8   r  r§   rœ   )rÿ   r  r1   r;   r=   s        r'   r•  r•    s¥   € ä-Ó/€LÙÜ˜eÐ.AÑBÓCÀSÐHÐHä”;×%Ñ% nÑ5Ó6€DÜ—{‘{€DÔØ
�+‰+‹-€CØ‡K�KÐ4°v°iÔ@Ø
�,‰,‹.€CØ‡J�J„LáÜ˜e¨kÑ:Ó;¸SÐ@Ð@ä˜$¤t¨C£yÑ1Ó2°CÐ7Ð7r&   )Wrd   rî   r$  r  r!  r¤   r   Úflaskr   r   r   r   r   r	   r
   r   r   r   Údb.bulkr   Úservices.authr   Úservices.draftsr   r   Úservices.mediar   r   r   Úservices.creatorr   r   Útoken_storer   r   Útiktok_clientr   r   r   Ú__name__ÚbprT   r�   ri   r(   rr   r0   Ú
Connectionr>   rœ   rR   rU   r^   rg   rk   rt   r�   r�   r¥   r¡   rª   rÊ   rÏ   ÚrouterÐ   rØ   rÚ   rÜ   rß   rã   rô   r$   r÷   Úpostrþ   r	  r-  r1  r@  rH  r^  r{  r„  r†  rŽ  r“  r•  r%   r&   r'   ú<module>r¥     sª  ðã 	Û Û Û Û Û Ý ÷÷ ÷ õ Ý 4ß 2ß `Ñ `ß Mç .ß YÑ Yáˆt�XÓ€à)Ð Ú;Ð ð3�tó 3ð¨ð °ó ð$	˜×+Ñ+ð 	¸ó 	ðj˜7×-Ñ-ð j°Dð j¸Tó jð2 ó 2ò>ðD Có Dð/ 3ð /¨4ó /ð
�có ð
L˜3ó 
Lð
˜ð 
 ó 
ð˜Ÿ™ó ò0ò8#ðL¨#ó ð< ‡�ˆ#˜	€Ó"ñIó #ðIð ‡�ˆ&˜:€Ó&ñGó 'ðGð ‡�ˆ*˜y€Ó)ñIó *ðIð ‡�ˆ&˜5€Ó!ñ'ó "ð'ð ‡�ˆ*˜y€Ó)ñ+ó *ð+ð ‡�ˆ. 5¨& /¸M€ÓJñBó KðBð. ‡�ˆ/ F 8°n€ÓEñ/ó Fð/ð ‡�ˆ˜<€Ó(ñó )ðð& ‡�Ð	&Ð1C€ÓDð1.˜Sò 1.ó Eð1.ðh ‡�Ð	(Ð3G€ÓHðT.˜sò T.ó IðT.ðn ‡�Ð	Ð)<€Ó=ñ!.ó >ð!.ðN ‡�ˆ/ F 8°n€ÓEñ&Eó Fð&EðR ‡�Ð
&°°ÐBR€ÓSðF˜Sò Fó TðFð  ‡�Ð
 u gÐ8H€ÓIð0˜Sò 0ó Jð0ðl ‡�Ð
$¨v¨hÀ€ÓKðTI�cò TIó LðTIðv ‡�Ð
%°¨xÀ/€ÓRðs@˜Cò s@ó Sðs@ðr ‡�Ð
¨¨¸-€ÓHðJ˜#ò Jó IðJð ‡�Ð
"¨U¨G¸l€ÓKð<˜ò <ó Lð<ð( ‡�Ð#¨o€Ó>ð-˜Cò -ó ?ð-ð< ‡�Ð €Ó7ð;˜#ò ;ó 8ð;ð ‡�Ð ¨>€Ó:ð8˜ò 8ó ;ñ8r&   