U
    E¨œh9W  ã                   @   sæ  U 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 d dlm	Z	m
Z
 d dlZd dlmZmZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ d dlZd dlZd d	lmZ d d
lmZ d dlmZ e d¡Z e !e ¡ eddZ"eƒ Z#dZ$dZ%dZ&dZ'dZ(edƒZ)edƒZ*edƒZ+e)j,dd e*j,dd e+j,dd ej-de%e&e(dZ.i Z/e	e0e	f e1d< da2ee#ƒfed	œdd„Z3d dlmZ e0e0e4dœd d!„Z5e0e0e0e6d"œd#d$„Z7e0e0e0e6d%œd&d'„Z8e" 9d(¡ed)ƒed)ƒed)ƒedƒedƒedƒedƒee3ƒfe0e0e0e4e4e4e4e0d*œd+d,„ƒZ:G d-d.„ d.ƒZ;e" 9d/¡ed)ƒed)ƒed)ƒedƒfe0e0e0e0d0œd1d2„ƒZ<e" 9d3¡ed)ƒed)ƒed)ƒed)ƒee3ƒfee0e0e0e0d4œd5d6„ƒZ=e" 9d7¡ed)ƒed)ƒed)ƒed)ƒee3ƒfee0e0e0e0d4œd8d9„ƒZ>e" ?d:¡ee3ƒfe0e0d;œd<d=„ƒZ@d>d?„ ZAe0d@œdAdB„ZBe0d@œdCdD„ZCe0eedEœdFdG„ZDe" ?dH¡dIdJ„ ƒZEe" ?dK¡dLdM„ ƒZFeGdNkrâz ejHdOdPgdddQ eIdRƒ W n, ejJeKfk
rÀ   eIdSƒ eLdTƒ Y nX eIdUƒ eIdVƒ ejHe"dWdXdY dS )Zé    N)Údatetime)ÚPath)ÚDictÚOptional)ÚFastAPIÚFileÚFormÚHTTPExceptionÚ
UploadFileÚHeader)ÚJSONResponse)Ú
HTTPBearerÚHTTPAuthorizationCredentials)ÚDepends©Úcredentials)Ú	messaging)ÚClientErrorz<durlabhdarshan-eff42-firebase-adminsdk-jo207-dd9fa8b9d1.jsonzVideo Processing Server)ÚtitleZasdlkbcalwb232h3u2bdib29ZAKIA4ALHXKCHCESTHJHDZ(3biTOwuU1u89IiyriSlB34kvDJxtq6f5V4Oldm9pz#co.techxr.system.backend.upload.devz
ap-south-1ZuploadsÚ
processingZ
hls_outputT©Úexist_okZs3)Zaws_access_key_idZaws_secret_access_keyZregion_nameÚconversion_tasksFc                 C   s"   | j tkrtddddid‚| j S )z,Verify the passkey from Authorization headeri‘  zInvalid passkeyzWWW-AuthenticateZBearer)Ústatus_codeÚdetailÚheaders)r   ÚAPI_PASSKEYr	   r   © r   úA/home/aprabhat/apps/x.techxrdev.in/mp4_to_m3u8_videoconversion.pyÚverify_passkey=   s    
ýr   )ÚbucketÚkeyÚreturnc              
   C   sd   zt j| |d W dS  tk
r^ } z,|j di ¡ d¡}|dkrLW Y ¢
dS ‚ W 5 d }~X Y nX d S )N©ÚBucketÚKeyTÚErrorÚCode©Z404Z	NoSuchKeyZNotFoundF)Ú	s3_clientÚhead_objectr   ÚresponseÚget)r    r!   ÚeÚcoder   r   r   Ú_s3_object_existsI   s    
r/   )r    Úsrc_keyÚdst_keyr"   c              
   C   s:  ||ddddœ}z t  | |dœ| |¡ d|d< t j| |d zt j| |d d|d< W nV tk
r¬ } z8|j d	i ¡ d
¡}|dkrŽd|d< nd|› |d< W 5 d}~X Y nX W n„ tk
r } z6|j d	i ¡ d
¡› d|j d	i ¡ d¡› |d< W 5 d}~X Y n0 tk
r4 } zt|ƒ|d< W 5 d}~X Y nX |S )z?Copy then delete, and verify deletion. Returns detailed status.FN)ÚfromÚtoÚcopiedÚdeletedÚerrorr#   Tr4   z;delete_failed_or_blocked (ObjectLock/LegalHold/permission?)r6   r&   r'   r(   r5   zhead_after_delete_error: ú: ÚMessage)	r)   ÚcopyZdelete_objectr*   r   r+   r,   Ú	ExceptionÚstr)r    r0   r1   Úoutr-   r.   r   r   r   Ú_s3_move_objectS   s$    
$Br=   )r    Ú
src_prefixÚ
dst_prefixr"   c                 C   sŒ   g g  }}t  d¡}|j| |dD ]^}| dg ¡D ]L}|d }||t|ƒd…  }	t| ||	ƒ}
|
 d¡rt| |
¡ q2| |
¡ q2q"||dœS )z<Move all objects under a prefix; returns per-object results.Úlist_objects_v2©r$   ÚPrefixÚContentsr%   Nr5   ©ÚmovedÚskipped)r)   Úget_paginatorÚpaginater,   Úlenr=   Úappend)r    r>   r?   rE   rF   Ú	paginatorÚpageÚitemr!   r1   Úresr   r   r   Ú_s3_move_prefixp   s    


rO   z/promote-unapproved-slot.)ÚtempleÚdateÚslotÚmove_jpgÚ	move_jsonÚmove_hlsÚdry_runÚpasskeyc              
   Ã   s$  d| › d|› }g g g g dœ|t dœ}	|ræ|› d|› d}
|› d|› d}tt |
ƒrÒ|rp|	d  |
|dd	œ¡ qæz$tt |
|ƒ |	d  |
|d
œ¡ W qæ tk
rÎ } z|	d  |
t|ƒdœ¡ W 5 d}~X Y qæX n|	d  |
ddœ¡ |r®|› d|› d}|› d|› d}tt |ƒrš|r6|	d  ||dd	œ¡ nbz$tt ||ƒ |	d  ||d
œ¡ W n< tk
r– } z|	d  |t|ƒdœ¡ W 5 d}~X Y nX n|	d  |ddœ¡ |r|› d|› d}|› d|› d}z$tjt |dd}| dd¡dk}W nD tk
r< } z$t	dddt|ƒ› dœd W Y ¢S d}~X Y nX |rú|rÌdrTt
nd}g }t d¡}|jt |dD ]H}| dg ¡D ]4}|d }||t|ƒd…  }| ||dd	œ¡ q„qt||	d d< n,t
t ||ƒ}|d |	d d< |d |	d d< n|	d d  |ddœ¡ t	dd |	d!œd"S )#z×
    Move objects from:
      DurlabhDarshanAssets/App/aaj-ke-darshan/{temple}/{date}/unapproved/{slot}[.jpg|.json|/*]
    to:
      DurlabhDarshanAssets/App/aaj-ke-darshan/{temple}/{date}/{slot}[.jpg|.json|/*]
    ú(DurlabhDarshanAssets/App/aaj-ke-darshan/ú/rD   )rE   rF   ÚhlsrV   r    ú/unapproved/z.jpgrE   rV   )r2   r3   Únote)r2   r3   rF   )r2   r6   NZ	not_foundz.jsoné   )r$   rB   ZMaxKeysZKeyCountr   éô  FzFailed to list prefix: ©ÚsuccessÚmessage)r   Úcontentr@   rA   rC   r%   rZ   )Zfrom_prefixr6   TzPromotion attempted)r`   ra   Úresult©rb   )ÚAWS_BUCKET_NAMEr/   rJ   r=   r:   r;   r)   r@   r,   r   rO   rG   rH   rI   )rP   rQ   rR   rS   rT   rU   rV   rW   ÚbaseÚresultsZsrc_jpgZdst_jpgr-   Zsrc_jsonZdst_jsonr>   r?   ÚheadZhas_objectsZcollateÚitemsrK   rL   rM   r!   r1   r<   r   r   r   Úpromote_unapproved_slot€   sn    û	
,,2
rj   c                   @   s    e Zd ZdZdZdZdZdZdS )ÚConversionStatusr   Z	uploadingÚ	completedZfailedÚserver_busyN)Ú__name__Ú
__module__Ú__qualname__Ú
PROCESSINGÚ	UPLOADINGÚ	COMPLETEDÚFAILEDZSERVER_BUSYr   r   r   r   rk   Ú   s
   rk   z/notify-image-upload©rP   rR   ÚurlZauthorizationc                 Ã   s.   |dt › krdddœS t| ||ƒ dddœS )NzBearer FÚUnauthorizedr_   TzNotification sent)r   Úsend_push_notificationru   r   r   r   Únotify_image_uploadá   s    
ry   z/upload-video)ÚvideorP   rQ   rR   rW   c           
   
   Ã   sð   t rtddd dœddS zŽtt ¡ ƒ}t|› d| j›  }t|dƒ}|  ¡ I d H }| 	|¡ W 5 Q R X t
j|||t|ƒd d dœt|< t t|ƒ¡ td	d
|dœdW S  tk
rê }	 z&tddt|	ƒ› d dœdd W Y ¢S d }	~	X Y nX d S ©NFz@Server is busy processing another video. Please try again later.)r`   ra   Útask_idéÊ   )rb   r   Ú_Úwb)ÚstatusrP   rQ   rR   Ú	file_pathr6   Ús3_pathTz0Video uploaded successfully. Processing started.rd   zUpload failed: r^   )rm   r   r;   ÚuuidÚuuid4Ú
UPLOAD_DIRÚfilenameÚopenÚreadÚwriterk   rq   r   ÚasyncioÚcreate_taskÚprocess_videor:   ©
rz   rP   rQ   rR   rW   r|   r   Úbufferrb   r-   r   r   r   Úupload_videoî   sH    
ýú	ù
ýýúr   z/upload-unapproved-videoc           
   
   Ã   sð   t rtddd dœddS zŽtt ¡ ƒ}t|› d| j›  }t|dƒ}|  ¡ I d H }| 	|¡ W 5 Q R X t
j|||t|ƒd d dœt|< t t|ƒ¡ td	d
|dœdW S  tk
rê }	 z&tddt|	ƒ› d dœdd W Y ¢S d }	~	X Y nX d S r{   )rm   r   r;   rƒ   r„   r…   r†   r‡   rˆ   r‰   rk   rq   r   rŠ   r‹   Úprocess_unapproved_videor:   r   r   r   r   Úupload_unapproved_video*  sH    
ýú	ù
ýýúr‘   z/conversion-status/{task_id})r|   rW   c                 Ã   sV   | t krtddd‚t |  }|d | d¡| d¡dœ}|d tjtjfkrLt|dS )	Ni”  zTask not found)r   r   r€   r6   r‚   )r€   r6   r‚   rd   )r   r	   r,   rk   rs   rt   r   )r|   rW   Útaskr+   r   r   r   Úget_conversion_statusf  s    ýr“   c              
   C   sÔ   dddœ}|  | ¡ |¡}t|ƒ dddddd	d
dddœ	}|  |  ¡ | ¡}t|ƒ d|› }d|› d}t|ƒ tjtj|||ddd}	zt |	¡}
td|
ƒ W n, tk
rÎ } ztd|ƒ W 5 d }~X Y nX d S )Nu   à¤ªà¥à¤°à¤¾à¤¤à¤ƒu   à¤¸à¤¾à¤¯à¤‚à¤•à¤¾à¤²)ZmorningZeveningu!   à¤®à¤¹à¤¾à¤•à¤¾à¤²à¥‡à¤¶à¥à¤µà¤°u%   à¤•à¤¾à¤¶à¥€ à¤µà¤¿à¤¶à¥à¤µà¤¨à¤¾à¤¥u   à¤“à¤‚à¤•à¤¾à¤°à¥‡à¤¶à¥à¤µà¤°u   à¤¸à¥‹à¤®à¤¨à¤¾à¤¥u   à¤µà¥ˆà¤·à¥à¤£à¥‹à¤¦à¥‡à¤µà¥€u   à¤¦à¥à¤µà¤¾à¤°à¤•à¤¾à¤§à¥€à¤¶u%   à¤¸à¤¿à¤¦à¥à¤§à¤¿ à¤µà¤¿à¤¨à¤¾à¤¯à¤•u   à¤˜à¥ƒà¤·à¥à¤£à¥‡à¤¶à¥à¤µà¤°u'   à¤¤à¥à¤°à¥à¤¯à¤‚à¤¬à¤•à¥‡à¤¶à¥à¤µà¤°)	ZmahakaleshwarZkashivishwanathZomkareshwarZsomnathZvaishnodeviZdwarkadhishtempleZsiddhivinayakZgrishneshwarZtrimbkeshwaru/   à¤†à¤œ à¤•à¥‡ à¤¦à¤°à¥à¤¶à¤¨ â€“ à¤¶à¥à¤°à¥€ u   à¤†à¤œ u7    à¤•à¥‡ à¤¦à¤°à¥à¤¶à¤¨ à¤‰à¤ªà¤²à¤¬à¥à¤§ à¤¹à¥ˆà¤‚à¥¤)r   ÚbodyZimageZ	all_users)ZnotificationZtopicu   âœ… Notification sent:u   âŒ Error sending notification:)r,   ÚlowerÚprintr   r8   ZNotificationÚsendr:   )rP   rR   Zs3_urlZslot_mappingZ
slot_hindiZtemple_mappingZtemple_hindir   r”   ra   r+   r-   r   r   r   rx   y  sB    þ÷
ýú	
rx   )r|   c                 Ã   s  da zþz¨t|  }t|d ƒ}|d }|d }|d }t|  }|jdd ||j }t t|ƒt|ƒ¡ t	|  }|jdd |d }	d	d
t|ƒddddddddddt|	ƒg}
t
j|
t
jjt
jjdœŽI d H }| ¡ I d H \}}|jdkrütd| ¡ › ƒ‚tjt|  d< d|› d|› d|› }| ¡ D ]`}| ¡ r(|› d|j› }|jdkrVdnd}t|dƒ}tj|t|d|id W 5 Q R X q(tjt|  d< |t|  d < t| ||ƒ W nN tk
r  } z.tjt|  d< t|ƒt|  d!< t| ||ƒ W 5 d }~X Y nX W 5 da X d S )"NTFr   rP   rQ   rR   r   úplaylist.m3u8Úffmpegú-iú-codec:r9   ú-start_numberÚ0ú	-hls_timeÚ10ú-hls_list_sizeú-frZ   ©ÚstdoutÚstderrr   úFFmpeg conversion failed: r€   rX   rY   ú.m3u8úapplication/vnd.apple.mpegurlú
video/MP2TÚrbÚContentType©Z	ExtraArgsr‚   r6   ©rm   r   r   ÚPROCESSING_DIRÚmkdirÚnameÚshutilÚmover;   ÚHLS_OUTPUT_DIRrŠ   Úcreate_subprocess_execÚ
subprocessÚPIPEÚcommunicateÚ
returncoder:   Údecoderk   rr   ÚiterdirÚis_fileÚsuffixr‡   r)   Zupload_fileobjre   rs   Úcleanup_task_filesrt   ©r|   r’   r   rP   rQ   rR   Ztask_processing_dirZprocessing_file_pathZhls_output_pathZ	m3u8_fileZffmpeg_commandÚprocessr£   r¤   Zs3_base_pathZ	file_itemZs3_keyÚcontent_typeÚfr-   r   r   r   rŒ      st    
      øý

ü"rŒ   c                 Ã   s  da zþz¨t|  }t|d ƒ}|d }|d }|d }t|  }|jdd ||j }t t|ƒt|ƒ¡ t	|  }|jdd |d }	d	d
t|ƒddddddddddt|	ƒg}
t
j|
t
jjt
jjdœŽI d H }| ¡ I d H \}}|jdkrütd| ¡ › ƒ‚tjt|  d< d|› d|› d|› }| ¡ D ]`}| ¡ r(|› d|j› }|jdkrVdnd}t|dƒ}tj|t|d|id  W 5 Q R X q(tjt|  d< |t|  d!< t| ||ƒ W nN tk
r  } z.tjt|  d< t|ƒt|  d"< t| ||ƒ W 5 d }~X Y nX W 5 da X d S )#NTFr   rP   rQ   rR   r   r˜   r™   rš   r›   r9   rœ   r   rž   rŸ   r    r¡   rZ   r¢   r   r¥   r€   rX   rY   r[   r¦   r§   r¨   r©   rª   r«   r‚   r6   r¬   r½   r   r   r   r   ô  st    
      øý

ü"r   )r|   Úprocessing_dirÚhls_dirc              
   C   s˜   z\|  ¡ rt |¡ |  ¡ r&t |¡ t| › d }t | › d¡D ]}| ¡ rD| ¡  qDW n6 tk
r’ } ztd| › d|› ƒ W 5 d}~X Y nX dS )z$Clean up all files related to a taskz_*.mp4z_*z!Error cleaning up files for task r7   N)	Úexistsr°   Úrmtreer…   Úglobrº   Úunlinkr:   r–   )r|   rÁ   rÂ   Zoriginal_filer   r-   r   r   r   r¼   M  s    

r¼   rY   c                   Ã   s   ddiS )Nra   z"Video Processing Server is runningr   r   r   r   r   Úroota  s    rÇ   z/healthc                   Ã   s   dt tdd„ t ¡ D ƒƒdœS )NZhealthyc                 S   s$   g | ]}|d  t jt jfkr|‘qS )r€   )rk   rs   rt   )Ú.0Útr   r   r   Ú
<listcomp>j  s      z health_check.<locals>.<listcomp>)r€   rm   Zactive_tasks)rm   rI   r   Úvaluesr   r   r   r   Úhealth_checke  s    ýrÌ   Ú__main__r™   z-version)Úcapture_outputÚchecku   âœ“ FFmpeg is availableu9   âœ— FFmpeg is not available. Please install FFmpeg first.r]   z#Starting Video Processing Server...zTMake sure to update the serverBaseUrl in Unity script to match this server's addressz0.0.0.0iË  )ÚhostÚport)MrŠ   Úosr°   r´   rƒ   r   Úpathlibr   Útypingr   r   Zboto3Zfastapir   r   r   r	   r
   r   Zfastapi.responsesr   Zfastapi.securityr   r   r   ÚuvicornZfirebase_adminr   r   Zbotocore.exceptionsr   ZCertificateZcredZinitialize_appÚappÚsecurityr   ZAWS_ACCESS_KEY_IDZAWS_SECRET_ACCESS_KEYre   Z
AWS_REGIONr…   r­   r²   r®   Úclientr)   r   r;   Ú__annotations__rm   r   Úboolr/   Údictr=   rO   Úpostrj   rk   ry   r   r‘   r,   r“   rx   rŒ   r   r¼   rÇ   rÌ   rn   Úrunr–   ÚCalledProcessErrorÚFileNotFoundErrorÚexitr   r   r   r   Ú<module>   sö     


ü

øøYüüûû;ûû;'TY


