U
    
:ZhM+  ã                	   @   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 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	e.e	f e/d< da0ee!ƒfed	œdd„Z1G dd„ dƒZ2e  3d ¡ed!ƒed!ƒed!ƒedƒfe.e.e.e.d"œd#d$„ƒZ4e  3d%¡ed!ƒed!ƒed!ƒed!ƒee1ƒfee.e.e.e.d&œd'd(„ƒZ5e  6d)¡ee1ƒfe.e.d*œd+d,„ƒZ7d-d.„ Z8e.d/œd0d1„Z9e.eed2œd3d4„Z:e  6d5¡d6d7„ ƒZ;e  6d8¡d9d:„ ƒZ<e=d;krêz ej>d<d=gddd> e?d?ƒ W n, ej@eAfk
rÈ   e?d@ƒ eBdAƒ Y nX e?dBƒ e?dCƒ ej>e dDdEdF dS )Gé    N)Údatetime)ÚPath)ÚDictÚOptional)ÚFastAPIÚFileÚFormÚHTTPExceptionÚ
UploadFileÚHeader)ÚJSONResponse)Ú
HTTPBearerÚHTTPAuthorizationCredentials)ÚDepends©Úcredentials)Ú	messagingz<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   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   r   E   s
   r   z/notify-image-upload.©ÚtempleÚslotÚurlZauthorizationc                 Ã   s.   |dt › krdddœS t| ||ƒ dddœS )NzBearer FÚUnauthorized)ÚsuccessÚmessageTzNotification sent)r   Úsend_push_notificationr)   r   r   r   Únotify_image_uploadL   s    
r1   z/upload-video)Úvideor*   Údater+   Úpasskeyc           
   
   Ã   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.   r/   Útask_idéÊ   )Úcontentr   Ú_Úwb)Ústatusr*   r3   r+   Ú	file_pathÚerrorÚs3_pathTz0Video uploaded successfully. Processing started.©r7   zUpload failed: iô  )r!   r   ÚstrÚuuidZuuid4Ú
UPLOAD_DIRÚfilenameÚopenÚreadÚwriter   r%   r   ÚasyncioÚcreate_taskÚprocess_videoÚ	Exception)
r2   r*   r3   r+   r4   r5   r;   Úbufferr7   Úer   r   r   Úupload_videoY   sH    
ýú	ù
ýýúrL   z/conversion-status/{task_id})r5   r4   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:   r<   r=   )r:   r<   r=   r>   )r   r	   Úgetr   r'   r(   r   )r5   r4   ÚtaskÚresponser   r   r   Úget_conversion_status•   s    ýrP   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:)rM   ÚlowerÚprintr   ZMessageZNotificationÚsendrI   )r*   r+   Zs3_urlZslot_mappingZ
slot_hindiZtemple_mappingZtemple_hindir   rQ   r/   rO   rK   r   r   r   r0   ¨   sB    þ÷
ýú	
r0   )r5   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;   r*   r3   r+   r   zplaylist.m3u8Úffmpegz-iz-codec:Úcopyz-start_numberÚ0z	-hls_timeÚ10z-hls_list_sizez-fZhls)ÚstdoutÚstderrr   zFFmpeg conversion failed: r:   z(DurlabhDarshanAssets/App/aaj-ke-darshan/ú/z.m3u8zapplication/vnd.apple.mpegurlz
video/MP2TÚrbZContentType)Z	ExtraArgsr=   r<   )r!   r   r   ÚPROCESSING_DIRÚmkdirÚnameÚshutilÚmover?   ÚHLS_OUTPUT_DIRrF   Úcreate_subprocess_execÚ
subprocessÚPIPEÚcommunicateÚ
returncoderI   Údecoder   r&   ÚiterdirÚis_fileÚsuffixrC   Ú	s3_clientZupload_fileobjÚAWS_BUCKET_NAMEr'   Úcleanup_task_filesr(   )r5   rN   r;   r*   r3   r+   Ztask_processing_dirZprocessing_file_pathZhls_output_pathZ	m3u8_fileZffmpeg_commandÚprocessrY   rZ   Zs3_base_pathZ	file_itemZs3_keyÚcontent_typeÚfrK   r   r   r   rH   Ï   st    
      øý

ü"rH   )r5   Ú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 z: N)	Úexistsr`   ÚrmtreerA   Úglobrj   ÚunlinkrI   rS   )r5   rr   rs   Zoriginal_filer;   rK   r   r   r   rn   '  s    

rn   r[   c                   Ã   s   ddiS )Nr/   z"Video Processing Server is runningr   r   r   r   r   Úroot;  s    rx   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:   )r   r'   r(   )Ú.0Útr   r   r   Ú
<listcomp>D  s      z health_check.<locals>.<listcomp>)r:   r!   Zactive_tasks)r!   Úlenr   Úvaluesr   r   r   r   Úhealth_check?  s    ýr~   Ú__main__rU   z-version)Úcapture_outputÚchecku   âœ“ FFmpeg is availableu9   âœ— FFmpeg is not available. Please install FFmpeg first.é   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)CrF   Úosr`   rd   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CertificateZcredZinitialize_appÚappÚsecurityr   ZAWS_ACCESS_KEY_IDZAWS_SECRET_ACCESS_KEYrm   Z
AWS_REGIONrA   r]   rb   r^   Úclientrl   r   r?   Ú__annotations__r!   r   r   Zpostr1   rL   rM   rP   r0   rH   rn   rx   r~   r"   ÚrunrS   ÚCalledProcessErrorÚFileNotFoundErrorÚexitr   r   r   r   Ú<module>   sª     


ü
üüûû;'X


