
    ^i8                     n   d dl Z d dlZd dl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 d dlmZ d dlmZ d dlmZ d d	lmZ d dlZd dlZd dlZd dlZd d
lmZmZ d dlmZm Z  d dl!m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3  ede4      Z5e5jm                  dddg      d        Z7e5jm                  ddg      d        Z8e5jm                  ddg      d        Z9e5jm                  ddg      d         Z:d! Z;d" Z< e       Z=e5jm                  d#dg      d$        Z>e5jm                  d%dg      d&        Z?e5jm                  d'dg      d(        Z@e5jm                  d)dg      d*        ZAe5jm                  d+dg      d,        ZBe5jm                  d-dg      d.        ZCy)/    N)	Blueprintrequestjsonify	send_filecurrent_app)get_llm)get_tts)get_stt)BlobServiceClient)
Proctoring)BytesIO)DeepFace)	BaseModelValidationError)OptionalList)datetime)timezone)AnalysisRequestAnalysisResponseHeadPose)
fraudCheck)check_attire)compare_voices)judge_audio_quality)NamedTemporaryFile)get_pdf_extractorroutes/GETPOST)methodsc                      t        ddd      S )NzEngine is runningsuccess)messagestatus)r        /var/www/html/engine/routes.pyindexr*      s    &  r(   z/api/llmc                     t        j                          } 	 t        j                         }|st        ddi      dfS d|vrt        ddi      dfS d|v r
|d   r|d   nd}|d   }t	        |      }|j                  |      }t        | d       t        d	|i      S # t        $ r2}t        | d       t        d
t        |       dd      dfcY d}~S d}~ww xY w)z
    LLM (Language Learning Model) API endpoint
    Purpose: Generates text responses using specified LLM engine
    Input: JSON with required 'prompt' field and optional 'engine' field
    Returns: Generated text response or error message
    errorNo JSON data provided  promptz Missing required field: 'prompt'engineopenaillmresponsezAn error occurred: failedr,   r&     N)	timer   get_jsonr   r   generate_textget_duration	Exceptionstr)startdatar0   r/   
llm_engineresultes          r)   llm_apirB   %   s    IIKE!0   4;   $,t#3XhHhV_
))&1UE"
F+,, UE"*3q6(3
   	s)   $B B A	B 	C!'CCCz/api/ttsc                     t        j                          } d}	 t        j                         st        ddi      dfS g d}t	        fd|D              s!t        dddj                  |       i      dfS j                  d	      xs d
}j                  dd      j                         }t        j                  j                  dd      }d   }| d| }d| d}t        j                  dd       	 t        |      }|j                        }|dk(  rEt        |d      5 }	|j                  d       |	j!                  |j#                                ddd       d| d||d}
t%        | d       t        |
      S # 1 sw Y   *xY w# t&        $ r=}|r4t        j(                  j+                  |      rt        j,                  |       |d}~ww xY w# t&        $ re}t%        | d       |r4t        j(                  j+                  |      rt        j,                  |       t        t/        |      dd      dfcY d}~S d}~ww xY w)an  
    Text-to-Speech (TTS) API endpoint
    Purpose: Converts text to speech audio and handles storage
    Input: JSON with required fields:
        - text: Text to convert to speech
        - name: Filename for the audio
        - engine: TTS engine to use
        - storage: Storage type (local/azure)
    Returns: Audio file location (local path or Azure URL)
    Nr,   r-   r.   )textnamer0   voicec              3   &   K   | ]  }|v  
 y w)Nr'   ).0kr>   s     r)   	<genexpr>ztts_api.<locals>.<genexpr>`   s     6196s   zMissing required fields: z, r0   
elevenlabsstoragelocalDEPLOYMENT_ENVunknownrE   _z./temp/questions_audios/.mp3z./temp/questions_audiosT)exist_okwbr   r$   )r&   filename
local_pathenvironmentttsr4   r5   r6   )r7   r   r8   r   alljoingetlowerr   configosmakedirsr	   text_to_speechopenseekwritereadr:   r;   pathexistsremover<   )r=   rU   required_fieldsr0   rL   
deploy_env	file_name
tts_engineaudio_iofr3   rA   r>   s               @r)   tts_apirm   K   s3    IIKEJ9!G%<=>CC =6o664TYY5O4PQ   (#3|((9g.446 !''++,<iH
L	!l!I;/	/	{$?

-=	 J!006H '!*d+ -qMM!$GGHMMO,-
 $(k.()	H &8$$- -  	bggnnZ8		*%G	
  UE""''..4IIj!V
   	s`   $G 8G 7A>G 6-F	 #1E=(F	 =FF	 		G8G

GG 	I AH;5I ;I z/api/sttc                     t        j                          } 	 t        j                         }|st        ddi      dfS |j	                  d      }|j	                  dd      j                         }|j	                  d      }|rt        j                  j                  |      st        ddi      dfS 	 t        |      }|j                  ||      }t        | d	       t        d
|d      S # t        $ r2}t        | d	       t        dt        |       dd      dfcY d}~S d}~ww xY w# t        $ r2}t        | d	       t        dt        |       dd      dfcY d}~S d}~ww xY w)a/  
    Speech-to-Text (STT) API endpoint
    Purpose: Converts audio file at given path to text using specified STT engine
    Input: JSON with fields:
        - file_path: Path to the audio file on server
        - engine: STT engine to use (default: whisper)
    Returns: JSON with transcribed text
    r,   zNo JSON body providedr.   	file_pathr0   whisperisozInvalid or missing file_pathsttr$   )r&   
transcriptzFailed to transcribe audio: r4   r5   r6   NzUnexpected error: )r7   r   r8   r   rZ   r[   r]   rd   isfiler
   transcribe_audior:   r;   r<   )r=   r>   ro   r0   rq   
stt_enginers   rA   s           r)   stt_apirw      sl    IIKE$!G%<=>CCHH[)	(I.446hhuo y 9G%CDEsJJ	 J#44YDJ&#(  
  	&7Ax@"   	  UE")#a&2
   	sM   $D# A1D# .6C% %	D .'DD D# D  D# #	E,'EEEc                 Z    t        j                          | z
  }t        d| d|dd       |S )a	  
    Utility function to measure and log execution time
    Purpose: Calculates and prints the duration of API calls
    Parameters:
        - start: Start time of the function
        - fnName: Name of the function being timed
    Returns: Duration in seconds
    z	Function z took z.2fz seconds)r7   print)r=   fnNamedurations      r)   r:   r:      s2     yy{U"H	IfXVHS>
:;Or(   c                    	 t        j                  d      }t        j                  d      }t        j                  d      }d| d| d}t	        j
                  |      }|j                  |      }| j                  d       |j                  || d	      }d
t        j                  d       d| d| }	|	|fS # t        $ r}
t        dt        |
             d}
~
ww xY w)a  
    Azure Blob Storage upload handler
    Purpose: Uploads audio files to Azure Blob Storage
    Parameters:
        - audio_io: BytesIO object containing audio data
        - name: Base name for the blob file
    Returns: Tuple of (blob_url, blob_name)
    Required Environment Variables:
        - AZURE_STORAGE_CONNECTION_STRING
        - AZURE_CONTAINER_NAME
        - AZURE_STORAGE_ACCOUNT
    AZURE_STORAGE_CONNECTION_STRINGAZURE_CONTAINER_NAMEz%Y%m%d-%H%M%Sztts/-rQ   r   T)rE   r>   	overwritezhttps://AZURE_STORAGE_ACCOUNTz.blob.core.windows.net/r   zAzure upload failed: N)r]   getenvr7   strftimer   from_connection_stringget_container_clientra   upload_blobr;   r<   )rk   rE   connection_stringcontainer_name	timestamp	blob_nameblob_service_clientcontainer_clientblob_clientblob_urlrA   s              r)   upload_to_azurer      s    :II&GH#9: MM/2	4&)D1	 0FFGXY.CCNS 	a&22 3 
 bii(?@AAXYgXhhijsitu"" :/Ax899:s   B4B7 7	C CCz/api/proctor/analyzec                     	 t        di t        j                  } 	 t               }|j                  | j                        }t	        d|        t        |      S # t        $ r6}t	        d|        t        d|j                         d      dfcY d }~S d }~ww xY w# t        $ r0}t	        d|        t        dt        |      i      dfcY d }~S d }~wt        $ re}t	        dt        |              t	        d	t        |              t        j                          t        d
t        |      d      dfcY d }~S d }~ww xY w)NzValidation error: zInvalid request formatr,   detailsr.   zAnalysis completed: zValueError: r,   zException type: zException message: Internal server errorr6   r'   )r   r   jsonr   ry   r   errorsr   comprehensiveAnalysisimage
ValueErrorr<   r;   type	traceback	print_exc)requestDatarA   proctoring_servicer@   ves        r)   analyzer      s*   X%55
S'\#99+:K:KL$VH-.v  X"1#&'!9ahhjQRTWWWX  0RD!"R)*C// S a	*+#CF8,-!8SVLMsRR	SsM   A =B 	B#+BBB	E%%C
EEAD<6E<Ez/api/proctor/verify_identityc                  6   	 t        j                         } | j                  d      }| j                  d      }t        j                  ||      }t        |      S # t        $ r6}t        j                          t        dt        |      i      dfcY d }~S d }~ww xY w)Nid_imageselfier,   r6   )
r   r8   rZ   r   match_facesr   r;   r   r   r<   )r>   id_image_b64
selfie_b64r@   rA   s        r)   verify_identityr     s    /!xx
+XXh'
''jAv /Q()3../s   AA 	B"+BBBz/api/proctor/attire_checkc                      	 t         j                  j                  d      } t        |       }t	        d|i      S # t
        $ r"}t	        dt        |      i      dfcY d }~S d }~ww xY w)Nr   r@   r,   r6   )r   r   rZ   r   r   r;   r<   )	image_b64r@   rA   s      r)   handle_attire_checkr   %  s^    /LL$$W-	i(&)** /Q()3../s   69 	A$AA$A$z/api/proctor/voice_matchc                     	 dt         j                  vrt        ddi      dfS dt         j                  vrt        ddi      dfS t         j                  d   } t         j                  d   }t        dd	      5 }| j	                  |j
                         |j
                  }d d d        t        dd	      5 }|j	                  |j
                         |j
                  }d d d        t              \  }}t        j                  |       t        j                  |       t        ||d
      S # 1 sw Y   xY w# 1 sw Y   \xY w# t        $ r"}t        dt        |      i      dfcY d }~S d }~ww xY w)N	ref_audior,   zref_audio file is requiredr.   
test_audioztest_audio file is requiredF.wavdeletesuffix)match_scoreis_matchr6   )r   filesr   r   saverE   r   r]   rf   r;   r<   )	ref_audio_filetest_audio_fileref_tempref_path	test_temp	test_pathr   r   rA   s	            r)   voice_matchr   /  sT   #/gmm+G%ABCSHHw}},G%BCDcII !{3!--5  uV< 	%.}}H	%  uV< 	'	  0!I	'
 !/x CX 			(
		)& 
  		% 	%	' 	'   /Q()3../sY    E  E 3E 7(D+E 4(D7AE +D40E 7E <E 	E.E)#E.)E.z/api/proctor/voice_qualityc                  b   	 dt         j                  vrt        ddi      dfS t         j                  d   } t        dd      5 }| j	                  |j
                         |j
                  }d d d        	 t              }t        j                  |       t        |      S # 1 sw Y   5xY w# t        $ r7}t        j                          t        dt        |      d	      d
fcY d }~S d }~ww xY w# t        $ r7}t        j                          t        dt        |      d	      d
fcY d }~S d }~ww xY w)Naudior,   zaudio file is requiredr.   Fr   r   r   r   r6   )r   r   r   r   r   rE   r   r;   r   r   r<   r]   rf   )
audio_file
temp_audio
audio_pathr@   rA   s        r)   voice_qualityr   V  s   S'--'G%=>?DD]]7+
  uV< 	)
OOJOO,#J	)
	W(4F 			*v	) 	)  	W!%<QPQSVVV	W  S!8SVLMsRRSsj    C.  C. (B+C. 4B+ ?C. B($C. +	C+4,C& C+!C. &C++C. .	D.7,D)#D.)D.z/api/extract-pdfc                     	 t         j                  j                  d      } | st        ddi      dfS t	               }|j                  |       }t        d|i      S # t        $ r"}t        dt        |      i      dfcY d }~S d }~ww xY w)Nrd   r,   zPDF path is requiredr.   r@   r6   )r   argsrZ   r   r   extract_textr;   r<   )pdf_path	extractorr@   rA   s       r)   
pdfextractr   s  s    
/<<##F+G%;<=sBB%'	''1&)** /Q()3../s"   /A 'A 	B#B :B B)Dr7   r]   flaskr   r   r   r   r   services.llmr   services.ttsr	   services.sttr
   azure.storage.blobr   services.proctorr   ior   deepfacer   r   base64numpynpcv2pydanticr   r   typingr   r   r   pytzr   services.proctor.models.modelsr   r   r   services.proctor.fraud_checkr   services.proctor.attire_checkr   services.proctor.voice_matchr   services.proctor.voice_qualityr   tempfiler   services.extractorr   __name__r   router*   rB   rm   rw   r:   r   
proctoringr   r   r   r   r   r   r'   r(   r)   <module>r      s    	 E E       0 '   * * / !   V V 3 6 7 > ' 0	8X	&cE6?+ , j6(+" ,"J j6(+F ,FP j6(+/ ,/b':T L
$vh7S 8S. ,vh?/ @/ )F8</ =/ (6(;$/ <$/L *VH=S >S8  5'2/ 3/r(   