U
    j8$                     @   s  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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mZ d	d
lmZmZmZ ed	ddZe ZeddZdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd  Z'dS )!    N)ThreadPoolExecutor)datetime)Path)settings)File)close_old_connections)	Mock_TestQuestion_Bank   )explanation_video_storagemock_video_folderparse_question_numberzquestion-video)max_workersthread_name_prefixrez^[a-f0-9]{32}$c                  C   s&   t tdd} t| p"tjt dS )NZQUESTION_VIDEO_SPOOL_ROOT zcet-question-video-jobs)getattrr   r   ospathjointempfile
gettempdir
configured r   =/var/www/html/crackeverytest/admin_app/question_video_jobs.py
spool_root   s    r   c                  C   s8   t tdd} | r.tj| r.t| tjr.| S tdS )NFFMPEG_BINARYr   Zffmpeg)	r   r   r   r   isfileaccessX_OKshutilwhichr   r   r   r   ffmpeg_binary#   s    r#   c                 C   s$   t t| pdstdt |  S )Nr   zInvalid upload job id.)_JOB_ID_PATTERN	fullmatchstr
ValueErrorr   job_idr   r   r   _job_dir*   s    r*   c                 C   s   t | d S )Nzstatus.json)r*   r(   r   r   r   _status_path0   s    r+   c              	   C   sx   t | }|jddd t  d |d< t| }|d}t. |jt	
|dd tt|t| W 5 Q R X d S )NTparentsexist_okZ
updated_atz.tmputf-8encoding)r*   mkdirr   utcnow	isoformatr+   with_suffix_status_lock
write_textjsondumpsr   replacer&   )r)   statusjob_dirr   	temporaryr   r   r   _write_status4   s    
r@   c              
   C   sB   t | }| sd S t  t|jddW  5 Q R  S Q R X d S )Nr1   r2   )r+   existsr8   r:   loads	read_text)r)   r   r   r   r   read_job_status?   s
    rD   c                 C   s>  t tjj| jddddd}|s0tdtt	t
dd}|sLtdt||krftd	|i }t|d
dD ]:\}}t|dpd }|rv| dkrv||| qvi }t }	g }
|D ]}zt|j\}}|d
k s|t|krtd|t|||	krtd||	| ||d
  }t|dpBd }| dkr\d}|rn|||n|}||||||f}||}|d ks||kr|||< W q tk
r } z|
d|j| W 5 d }~X Y qX q|
rtd|
t j}t|}|d }|jddd g }zt| dd dD ]t\}}}}}}|d|| }|d }|  D ]}|!| qpW 5 Q R X ||||d |t||jd q<W n* t"k
r   t#j$t|dd  Y nX || j| j%dt|ddddt|t| g t&' ( d d }t)|| t*+t,|| j| |S )!N)test_id
section_ididtagz This mock test has no questions.Z QUESTION_VIDEO_MAX_FILES_PER_JOBi  zSelect one or more video files.z0A maximum of {0} videos can be uploaded at once.r
   )startr   )nullnonez7Question number {0} is outside this mock's 1-{1} range.z1More than one file was supplied for question {0}.z{0}: {1}
inputTFr,   c                 S   s   | d S )N   r   rowr   r   r   <lambda>       z#create_upload_job.<locals>.<lambda>keyz{0}{1}wb)numbersource_numberquestion_idrH   
input_pathoriginal_nameignore_errorsqueuedr   r/   )r)   mock_test_id
mock_titlestatetotal	processeduploadedfailedlinked_questionsignored_tag_duplicateserrors
created_at)-listr	   objectsfilterrG   order_byvaluesr'   intr   r   lenformat	enumerater&   getstriplower
setdefaultsetr   nameaddappendr   uuiduuid4hexr*   r4   sortedopenchunkswrite	Exceptionr!   rmtreer_   r   r5   r6   r@   	_executorsubmit_process_upload_job)	mock_testuploaded_files	questionsZ	max_filesfirst_number_by_tagrV   questionrH   Zparsed_by_groupZseen_numbersrg   rc   	extensioncanonical_number	candidateexistingexcr)   r>   Z	input_dirmanifestrW   rY   destinationchunkr=   r   r   r   create_upload_jobG   s      
 


(
 
r   c                 C   s   t  }|stdtttdd}|dd| dddd	d
ddddddddddd|g}tj|tjtj|dd}|j	dkr|j
jddddd  }td|d S )Nz;FFmpeg is not installed or FFMPEG_BINARY is not configured.ZQUESTION_VIDEO_FFMPEG_TIMEOUTi   z-yz-iz-map_metadataz-1z-c:vlibx264z-presetfastz-crf28z-pix_fmtZyuv420pz-c:aaacz-b:aZ96kz	-movflagsz
+faststartF)stdoutstderrtimeoutcheckr   r1   r<   )rg   i$zFFmpeg compression failed: {0})r#   RuntimeErrorrn   r   r   
subprocessrunDEVNULLPIPE
returncoder   decoderp   )sourcer   binaryr   commandresultdetailsr   r   r   _compress_video   sH             
r   c                 C   s  t   t| }d|d< t| | t| }z`zt
jj|d}t }t|}t|d	d
 dD ]}|d|d  }	|d |d< t| | z4zt|d t	|	 tj|d|d tjd}||r|| |	d}||t|}W 5 Q R X |dr(tjj ||d dj!|d}ntjj |d |dj!|d}|d  |7  < |d  d7  < W nV t"k
r } z6|d  d7  < |d #|d |d t	|d W 5 d }~X Y nX W 5 |d  d7  < t|d |	fD ]*}
z|
  W n tk
r   Y nX qt| | X q\|d d kr.d!nd"|d< |$dd  W nB t"k
r } z"d|d< |d #d#t	|i W 5 d }~X Y nX W 5 t  d |d< t| | tjt	|d dd t   X d S )$N
processingr`   r/   Zfinished_atrM   Tr[   )rG   c                 S   s   | d S )NrV   r   rO   r   r   r   rQ      rR   z%_process_upload_job.<locals>.<lambda>rS   zcompressed-{0}.mp4rV   Zcurrent_question_numberrb   r
   rY   z{0}.mp4/rbrH   )rE   rH   )explanation_videorX   )rG   rE   re   rc   rd   rg   rZ   )filequestion_numbererrorr   	completedZcompleted_with_errorsr   )%r   rD   r@   r*   r   r5   r6   r!   r   r&   r   rj   rr   r   r   r}   rp   r   unlinkOSErrorr   r   r   r   r<   seprA   deleter~   saver   r	   rk   updater   ry   pop)r)   r^   r   r=   r>   r   storagefolderitemoutput_pathr   storage_name
compressed
saved_nameZlinkedr   r   r   r   r      st    

"

 
,
r   )(r:   r   r!   r   r   	threadingrz   concurrent.futuresr   r   pathlibr   django.confr   django.core.filesr   	django.dbr   learn.modelsr   r	   question_video_servicer   r   r   r   Lockr8   
__import__compiler$   r   r#   r*   r+   r@   rD   r   r   r   r   r   r   r   <module>   s4   a 