U
    Uti\                     @   s  d dl Z d dlZd dlZd dl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%e&dddZ'e(ddddZ)e%j*ddddd Z+e%j*ddddd Z,e%j*ddddd Z-e%j*ddddd Z.e%j*dddd d Z/e%j*d!d"gd#d$d%d# Z0e%j*d&d'gd(d$e(d)d*d(Z1e%j*d+d'gd,d$e(d)d-d,Z2e%j*d.d"gd/d$e(d)d0d/Z3e%j*d1d"gd2d$e(d)d3d2Z4e%j*d4d'gd5d$e(d)d6d5Z5e%j*d7d'gd8d$e(d)d9d8Z6e%j7d:d;de(d)d<d;Z8e%j7d=d>de(d?d@d>Z9e%j7dAdBde(d?dCdBZ:dS )D    N)
	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_statusZui)returnc                   C   s   t dd k	S )Ntiktok_token)r   get r   r   //var/www/html/luxverbi-app/app/blueprints/ui.py_is_connected   s    r   )aliasr   c                 C   sR   | pd  }|sdS z$t|s6td}|r6t|| W n tk
rL   Y nX dS )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tokr   r   r   _ensure_alias_token_persisted#   s    
r&   /landing)endpointc                   C   s   t dt dS )Nzlanding.htmlZis_connectedr   r   r   r   r   r   r(   8   s    /appapp_homec                   C   s   t dt dS )Nz
index.htmlr*   r+   r   r   r   r   r-   =   s    z/contactcontactc                   C   s   t dt dS )Nzcontact.htmlr*   r+   r   r   r   r   r.   B   s    z/tostosc                   C   s   t dS )Nztos.htmlr   r   r   r   r   r/   G   s    z/privacyprivacyc                   C   s   t dS )Nzprivacy.htmlr0   r   r   r   r   r1   L   s    z/upload_localPOSTupload_local)methodsr)   c                  C   s   t  } | stdd tdS dtjkr8tdd tdS tjd }|jsZtdd tdS tjd }t|j}t	
 j}| d| }tj||}|| t||||d d d d	d d d
	 ttd|dS )N!Please connect with TikTok first.errorr,   ZvideozNo video file provided.zNo file selected.
UPLOAD_DIR_Zlocal_uploaded)		file_pathstored_filenameoriginal_filename
publish_idlast_init_responseposting_summarystatus	video_urlbulk_job_idui.post_to_tiktokdraft_id)r   r   r   r   filesfilenamer   configr   uuiduuid4hexospathjoinsaver   r   )access_tokenfile
upload_dirZoriginal_fnrD   r:   Z	save_pathr   r   r   r3   T   s>    








z/static_preview/<draft_id>GETstatic_previewrC   c                 C   sJ   t  }|sdS t| }|sdS |d}|r8tj|s<dS t|dddS )N)zNot authenticated  )z	Not found  r9   z	video/mp4F)mimetypeas_attachment)r   r   r   rK   rL   existsr	   )rD   rO   draftrL   r   r   r   rS   ~   s    
z/post/<draft_id>post_to_tiktokc                 C   s2  t  }|stdd tdS t| }|s:tdd tdS zt|}W n> tk
r } z td| d td W Y S d }~X Y nX t|\}}|d}t|d }d}	d }
t	|t
r|d	kr|d	kr||krd
}	d||f }
d }|d}|rt|tjd tjd tjd d}td| |||	|
|||d	S )Nr5   r6   r,   Draft not found.8Cannot post right now. Please try again later. Details: max_video_post_duration_secr9   Tr   Fz7Video is %.1fs but max allowed is %ss for this creator.r:   PUBLIC_BASE_URLMEDIA_SIGNING_SECRETMEDIA_TOKEN_TTL_SECONDSr:   Zpublic_base_urlZsigning_secretZttl_secondszpost_to_tiktok.html)rD   rY   creator_infoduration_okduration_msgpull_urlcan_post_nowcannot_post_reason)r   r   r   r   r   r#   r   r   r   
isinstanceintr   r   rG   r   )rD   rO   rY   rb   erf   rg   max_durdurrc   rd   re   r:   r   r   r   rZ      sR    


"
z/post/<draft_id>/publishpublishc                 C   sV  t  }|stdd tdS t| }|s:tdd tdS zt|}W nF tk
r } z(td| d ttd| d W Y S d }~X Y nX tj	dd	krtd
d ttj
ptdS t|\}}|st|pdd ttd| dS tj	dpd }|s tdd ttj
ptdS tj	dp0d }tj	ddk}	tj	ddk}
tj	ddk}|r|dkrtdd ttd| dS |	dpg }||krtdd ttd| dS tj	ddk}tj	ddk}tj	ddk}|	ddkrd}|	ddkrd}|	d dkr0d}| }| }| }d}d}|	r|
sv|svtd!d ttd| dS |
}|}|r|dkrtdd ttd| dS |	d"}t|d# }t|tr
|d$kr
|d$kr
||kr
td%||f d ttd| dS |	d&}|s4td'd ttd| dS tjd( }tj||}tj|sttd)d ttd| dS t|tjd* tjd+ tjd, d-}zrt||||||||dd.|d/}|	d0pi 	d1}t| |||||||||	|
|d2d3|d4 ttd5| dW S  tk
rP } z(td6| d ttd| d W Y S d }~X Y nX d S )7Nr5   r6   r,   r[   r\   rB   rC   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.privacy_levelr!   z1Please select a Privacy status before publishing.titlecommercial_toggle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.allow_comment
allow_duetallow_stitchcomment_disabledTFduet_disabledstitch_disabled]If commercial content disclosure is on, you must select Your brand, Branded content, or both.r]   r9   r   1Video duration %.1fs exceeds allowed maximum %ss.r:   2Internal error: missing stored_filename for draft.r7   Video file not found on server.r^   r_   r`   ra   ZPULL_FROM_URL)rO   Zcaptionrp   disable_commentdisable_duetdisable_stitchbrand_content_togglebrand_organic_toggleis_aigcmoder@   datar<   )rq   rp   ry   rz   r{   rr   rt   ru   Zposted)r=   r<   r>   r?   r@   zui.status_pagezError posting to TikTok: )r   r   r   r   r   r#   r   r   formr   referrerr   r"   r   rh   ri   r   rG   rK   rL   rM   rX   r   r   r   )rD   rO   rY   rb   rj   rf   rg   rp   rq   rr   rt   ru   optionsry   rz   r{   r   r   r   r   r   rk   rl   r:   rQ   
local_pathr@   Z	init_respr<   r   r   r   rm      s    

&






*




z/post/<draft_id>/scheduleschedule_postc           "         s  t  }|stdd tdS t| }|s:tdd tdS tdpFd }|sbd}|td< dt_t| t	j
d	pxd }|std
d ttd| dS zt|}W nF tk
r } z(td| d ttd| d W Y S d }~X Y nX t	j
ddkrtdd ttd| dS t	j
dp,d }|sRtdd ttd| dS t	j
dpbd }t	j
ddk}	t	j
ddk}
t	j
ddk}|	r|
s|stdd ttd| dS t|	o|
}t|	o|}|r
|dkr
tdd ttd| dS t	j
ddk}t	j
ddk}t	j
ddk}|d}|rXtj|srtdd ttd| dS |d }|d!pd ptj|}|std"d ttd| dS z
t|}|d#pg }|r||krtd$d ttd| dW S |d%dkrd&}|d'dkr.d&}|d(dkrBd&}|d)}t|}t|tr|d*kr|d*kr||krtd+||f d ttd| dW S t|\}}|st|pd,d- d. W n4 tk
r } ztd/| d. W 5 d }~X Y nX tt }t j}||||d0d*d |||||r6d1nd*|rBd1nd*|rNd1nd*|	rZd1nd*|rfd1nd*|rrd1nd*d1||dd d d |d2}ttjd3 }tj |_!|" }|#d4 d5d6 |$ D }t%|  fd7d8|& D }d9'|( } d9'd:gt)| }!|#d;|  d<|! d=t*|+  |,  |-  t.| |d0|||||||	|
|||d>
d? td@| dA ttdB|dCS )DNr5   r6   r,   r[   Zoauth_aliasr!   defaultT
publish_atz#Please select a schedule date/time.rB   rC   z<Invalid publish_at (must include timezone offset). Details: rn   ro   uH   You must agree to TikTok’s Music Usage Confirmation before scheduling.rp   z1Please select a Privacy status before scheduling.rq   rr   rs   rt   ru   r   rv   z;Branded content cannot be scheduled with privacy SELF_ONLY.ry   rz   r{   r9   r   r:   r;   r   rw   rx   r|   Fr}   r~   r]   r   r   z2This TikTok account cannot publish at this moment.zD Your job was scheduled anyway; the worker will retry automatically.warningzKCould not validate creator settings right now (scheduled anyway). Details: Z	scheduled   )idZcreated_at_tspublish_at_tsZnext_attempt_tsr?   attemptsZ
last_errorrO   account_aliasrq   rp   ry   rz   r{   rr   r   r   r   r:   r;   r@   r<   Zlast_statusZlast_fail_reasonupdated_at_tsBULK_DB_PATHzPRAGMA table_info(bulk_jobs)c                 S   s   g | ]}|d  qS )namer   ).0rr   r   r   
<listcomp>  s     z!schedule_post.<locals>.<listcomp>c                    s   i | ]\}}| kr||qS r   r   )r   kvZcolsetr   r   
<dictcomp>  s       z!schedule_post.<locals>.<dictcomp>z, ?zINSERT INTO bulk_jobs (z
) VALUES ())
rq   rp   ry   rz   r{   rr   rt   ru   r   r   )r?   rA   r>   zScheduled job created: Zsuccesszui.bulk_job_pagejob_id)/r   r   r   r   r   r   r"   modifiedr&   r   r   r   r   r#   boolrK   rL   rX   basenamer   r   rh   ri   r   timerH   rI   rJ   r   r   rG   sqlite3Rowrow_factorycursorexecutefetchallsetitemsrM   keyslentuplevaluescommitcloser   )"rD   rO   rY   r   r   r   rj   rp   rq   rr   rt   ru   r   r   ry   rz   r{   r9   r:   r;   rb   r   rk   rl   rf   rg   Znow_tsr   jobconncurcolsZcolnamesZplaceholdersr   r   r   r   b  s   


&






"


*"

"z/status/<draft_id>status_pagec                 C   sH   t  }|stdd tdS t| }|s:tdd tdS td| |dS )Nr5   r6   r,   r[   zstatus.html)rD   rY   )r   r   r   r   r   )rD   rO   rY   r   r   r   r     s    

z/api/status/<draft_id>
api_statusc              
   C   s   t  }|stddddfS t| }|s:tddddfS |d}|sZtdd	d
dfS zt||}td|ddfW S  tk
r } ztdt|ddf W Y S d }~X Y nX d S )NFnot_authenticatedokr6   rT   draft_not_foundrU   r<   TZno_publish_id_yet)r   state   )r   r   )r   r
   r   r   r   r#   str)rD   rO   rY   r<   r   rj   r   r   r   r   +  s    

z/api/media_url/<draft_id>api_media_urlc                 C   s   t  }|stddddfS t| }|s:tddddfS |d}|sZtdddd	fS tjd
 }tj||}tj	|stddddfS t
|tjd tjd tjd d}td|dS )NFr   r   rT   r   rU   r:   Zmissing_stored_filenamei  r7   Zfile_not_foundr^   r_   r`   ra   T)r   url)r   r
   r   r   r   rG   rK   rL   rM   rX   r   )rD   rO   rY   r:   rQ   r   r   r   r   r   r   @  s(    

z/bulk/job/<job_id>bulk_job_pager   c                 C   s(   t  }|stdd tdS td| dS )Nr5   r6   r,   zbulk_job.htmlr   )r   r   r   r   )r   rO   r   r   r   r   _  s
    
z/api/bulk/job/<job_id>api_bulk_jobc                 C   s   t  }|stddddfS ttjd }tj|_| }|	d| f |
 }|  |sntddddfS td	t|d
dfS )NFr   r   rT   r   z"SELECT * FROM bulk_jobs WHERE id=?Z	not_foundrU   T)r   r   r   )r   r
   r   r   rG   r   r   r   r   r   fetchoner   dict)r   rO   r   r   rowr   r   r   r   h  s    );rK   r   rH   r   flaskr   r   r   r   r   r   r   r	   r
   r   db.bulkr   Zservices.authr   Zservices.draftsr   r   Zservices.mediar   r   r   Zservices.creatorr   r   token_storer   r   Ztiktok_clientr   r   r   __name__bpr   r   r   r&   router(   r-   r.   r/   r1   r3   rS   rZ   rm   r   r   r   r   r   r   r   r   r   r   r   <module>   s\   0






)6  :