§
    æoj¿;  ã                   ód   — 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  G d„ d¦  «        Z	dS )é    N)Úsettingsc                   ó(   — e Zd ZdZd„ Zdedefd„ZdS )ÚVideoProcessorz.Process video files to HLS format using FFmpegc                 ó†   — t           j        | _        t           j        | _        t           j        | _        ddlm} || _        d S )Nr   )Úredis_client)	r   ÚFFMPEG_CACHE_PATHÚffmpeg_cache_pathÚSTORAGE_PATHÚstorage_pathÚUPLOAD_PATHÚupload_pathÚapp.redis_clientr   )Úselfr   s     ú$/app/app/services/video_processor.pyÚ__init__zVideoProcessor.__init__   sC   € Ý!)Ô!;ˆÔÝ$Ô1ˆÔÝ#Ô/ˆÔØ1Ð1Ð1Ð1Ð1Ð1Ø(ˆÔÐÐó    Ú	stream_idÚreturnc                 ób  — d|› �}d|› �}	 | j         › d|› d�}| j        › d|› �}|› d�}d|› d�}| j                             |¦  «        }d}	|r„t	          j        |¦  «        }
|
                     d	¦  «        d
k    rW|
                     dd¦  «        }	t          j                             d|	› d�¦  «         t          j         	                    ¦   «          |	dk    rJt          j                             |¦  «        rt          j        |¦  «         t          j        |d¬¦  «         nt          j        |d¬¦  «         t          j                             d|› d�¦  «         t          j                             d|› d�¦  «         t          j                             d|› d�¦  «         t          j         	                    ¦   «          | j                             |t	          j        dddœ¦  «        ¦  «         |	dk    ro|	dz  }ddt%          |¦  «        d|dddddddd d!d"d#d$d%|› d&�d'd(|g}t          j                             d)|› d*�¦  «         t          j         	                    ¦   «          n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+¬,¦  «        }d-}|j        D �]Ø}d.|v rPt1          j        d/|¦  «        }|r9t5          t6          |                     ¦   «         ¦  «        \  }}}|d0z  |d1z  z   |z   }d2|v �r|t1          j        d3|¦  «        }|�rd|�rat5          t6          |                     ¦   «         ¦  «        \  }}}|d0z  |d1z  z   |z   }||	dz  z   }|dk    r||z  d4z  nd}t1          j        d5|¦  «        }|r"t;          |                     d+¦  «        ¦  «        nd6}||z
  }|dk    r||z  nd}d7„ t          j        |¦  «        D ¦   «         }tA          |¦  «        |	z   }|dk    rt7          |dz  ¦  «        nd}tC          |d4¦  «        d8||||d9œ}| j                             |t	          j        |¦  «        ¦  «         ||||d8d:œ}| j                             |t	          j        |¦  «        ¦  «         �ŒÚ| "                    d;¬<¦  «        } | dk    rB| j                             |t	          j        dd=dœ¦  «        ¦  «         tG          d>| › �¦  «        ‚t          j                             |¦  «        s?| j                             |t	          j        dd=dœ¦  «        ¦  «         tG          d?¦  «        ‚t          j                             d@|› d�¦  «         t          j         	                    ¦   «          | j                             |t	          j        dAdBdCdDœ¦  «        ¦  «         t          j                             dE|› d�¦  «         t          j         	                    ¦   «          	 dF„ t          j        |¦  «        D ¦   «         }| $                    ¦   «          |stG          dG¦  «        ‚tA          |¦  «        }d}!| j        › dH|› �}"t          j        |"d¬¦  «         ddIl%m&}# ddJl'm(}$  |#¦   «         }%	 |% )                    |$¦  «         *                    |$j+        |k    ¦  «         ,                    ¦   «         }&|&r7||&_-        d|&_.        dK|&_/        d-|&_0        d-|&_1        |% 2                    ¦   «          |% 3                    ¦   «          n# |% 3                    ¦   «          w xY wti          |¦  «        D �]U\  }'}(|› dL|(› �})|"› dM|'› dN�}*t          j                             |*¦  «        r·|!d+z  }! |#¦   «         }%	 |% )                    |$¦  «         *                    |$j+        |k    ¦  «         ,                    ¦   «         }&|&r3|!|&_.        dO|'d+z   › dP|› dQ�|&_/        d-|&_1        |% 2                    ¦   «          |% 3                    ¦   «          n# |% 3                    ¦   «          w xY wŒëdd|)dRdSdTdUdV|*g	}t'          j5        |dd¬W¦  «        }+|+j6        dk    rô|!d+z  }!dA|!|z  dXz  z   },| j                             |t	          j        |,dBdC|!|dYœ¦  «        ¦  «          |#¦   «         }%	 |% )                    |$¦  «         *                    |$j+        |k    ¦  «         ,                    ¦   «         }&|&r2|!|&_.        dO|'d+z   › dP|› �|&_/        d-|&_1        |% 2                    ¦   «          |% 3                    ¦   «          �Œó# |% 3                    ¦   «          w xY wt          j                             dZ|'› d[|+j        › d�¦  «         t          j         	                    ¦   «          �ŒW |#¦   «         }%	 |% )                    |$¦  «         *                    |$j+        |k    ¦  «         ,                    ¦   «         }&|&r7d|&_.        d|&_-        d-|&_/        d-|&_0        d-|&_1        |% 2                    ¦   «          |% 3                    ¦   «          n# |% 3                    ¦   «          w xY wt          j                             d\|› d�¦  «         t          j         	                    ¦   «          nª# tn          $ r�}-t          j                             d]|-› d�¦  «         t          j         	                    ¦   «          dd-l8}.|. 9                    ¦   «          | j                             |t	          j        dd=t%          |-¦  «        d^œ¦  «        ¦  «         ‚ d-}-~-ww xY w| j                             |t	          j        d4d_dœ¦  «        ¦  «         | j         :                    |¦  «         ddIl%m&}# ddJl'm(}$  |#¦   «         }%	 |% )                    |$¦  «         *                    |$j+        |k    ¦  «         ,                    ¦   «         }&|&rc||&_;        d`|&_<        |% 2                    ¦   «          t          j                             da|› db�¦  «         t          j         	                    ¦   «          |% 3                    ¦   «          n# |% 3                    ¦   «          w xY wddcl=m>}/  |/¦   «          | j         ?                    |dd¦  «         dS # t&          j@        $ rr | j                             d|› �t	          j        ddedœ¦  «        ¦  «         | j                             |t	          j        d	d
i¦  «        ¦  «         tG          df¦  «        ‚tn          $ r†}-| j                             d|› �t	          j        dd=dœ¦  «        ¦  «         | j                             |t	          j        d	d
i¦  «        ¦  «         tG          dgt%          |-¦  «        › �¦  «        ‚d-}-~-ww xY w)hzConvert video to HLS formatzprocessing_progress:zprocessing_state:z/videos/z.mp4z/hls/z/master.m3u8z/storage/hls/r   ÚstatusÚinterruptedÚlast_successful_segmentz#[PROCESSING] Resuming from segment Ú
T)Úexist_okz0[PROCESSING] Starting HLS processing for stream z[PROCESSING] Input: z[PROCESSING] Output: Ústarting)Ú
percentager   é   Úffmpegz-ssz-iz-c:vÚlibx264z-c:aÚaacz-b:aÚ128kz-fÚhlsz	-hls_timeÚ2z-hls_list_sizeÚ0z-hls_segment_filenamez/segment_%03d.tsz	-progresszpipe:1z[PROCESSING] Seeking to z	 seconds
é   )ÚstdoutÚstderrÚtextÚbufsizeNz	Duration:zDuration: (\d+):(\d+):(\d+)i  é<   z	out_time=zout_time=(\d+):(\d+):(\d+)éd   zspeed=([\d.]+)xg      ð?c                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS ©z.ts©Úendswith©Ú.0Úfs     r   ú
<listcomp>z0VideoProcessor.process_video.<locals>.<listcomp>ƒ   s*   € Ð(]Ð(]Ð(]¨qÈ1Ï:Ê:ÐV[ÑK\ÔK\Ð(]¨Ð(]Ð(]Ð(]r   Ú
processing)r   r   ÚspeedÚeta_secondsÚcurrent_segmentsÚtotal_segments)r   r8   Úlast_position_secondsÚvideo_durationr   i   )ÚtimeoutÚerrorzFFmpeg failed with code zHLS master playlist not createdz1[PROCESSING] HLS processing completed for stream é_   Úgenerating_thumbnailszGenerating thumbnails)r   r   Ú	step_namez6[PROCESSING] Starting thumbnail generation for stream c                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS r-   r.   r0   s     r   r3   z0VideoProcessor.process_video.<locals>.<listcomp>µ   s)   € Ð UÐ UÐ U qÀ1Ç:Â:ÈeÑCTÔCTÐ U Ð UÐ UÐ Ur   zNo segment files foundz/thumbnails/)ÚSessionLocal)ÚStreamzStarting thumbnail generationú/z/thumb_z.jpgzProcessing segment z of z (skipped, already exists)z-vframesÚ1z-vfzscale=320:180z-y)Úcapture_outputr(   é   )r   r   r?   Úcurrent_thumbnailÚtotal_thumbnailsz6[PROCESSING] Failed to generate thumbnail for segment z: z7[PROCESSING] Thumbnail generation completed for stream z0[PROCESSING ERROR] Thumbnail generation failed: )r   r   r<   Ú	completedÚreadyz[PROCESSING] Updated stream z status to ready
)Úregenerate_master_ffconcati,  r;   zHLS processing timed outzFailed to process video: )Ar   r   r   ÚgetÚjsonÚloadsÚsysr'   ÚwriteÚflushÚosÚpathÚexistsÚshutilÚrmtreeÚmakedirsÚsetÚdumpsÚstrÚ
subprocessÚPopenÚPIPEÚSTDOUTr&   ÚreÚsearchÚmapÚintÚgroupsÚfloatÚgroupÚlistdirÚlenÚminÚwaitÚRuntimeErrorÚsortÚapp.databaserA   Úapp.models.streamrB   ÚqueryÚfilterÚidÚfirstÚthumbnail_progress_totalÚthumbnail_progress_generatedÚthumbnail_progress_messageÚthumbnail_progress_errorÚthumbnail_progress_updated_atÚcommitÚcloseÚ	enumerateÚrunÚ
returncodeÚ	ExceptionÚ	tracebackÚ	print_excÚdeleteÚhls_pathr   Úservices.ffconcat_servicerK   ÚexpireÚTimeoutExpired)0r   r   Úprogress_keyÚ	state_keyÚ
video_pathÚhls_dirr€   Úhls_url_pathÚexisting_stateÚresume_fromÚstateÚ
start_timeÚcmdÚprocessÚdurationÚlineÚmatchÚhoursÚminutesÚsecondsÚcurrent_timeÚtotal_current_timer   Úspeed_matchr5   Úremaining_timer6   Úsegment_filesr7   r8   Úprogress_dataÚ
state_dataÚreturn_codeÚgenerated_countÚthumbnails_dirrA   rB   ÚdbÚstreamÚiÚsegment_fileÚsegment_pathÚthumbnail_pathÚresultÚthumbnail_percentageÚer}   rK   s0                                                   r   Úprocess_videozVideoProcessor.process_video   s  € à9¨iÐ9Ð9ˆØ3¨	Ð3Ð3ˆ	ðr	Eà Ô,ÐEÐE°iÐEÐEÐEˆJØÔ*Ð<Ð<°Ð<Ð<ˆGØ!Ð/Ð/Ð/ˆHØB¨9ÐBÐBÐBˆLð "Ô.×2Ò2°9Ñ=Ô=ˆNØˆKØð 'Ýœ
 >Ñ2Ô2�Ø—9’9˜XÑ&Ô&¨-Ò7Ð7Ø"'§)¢)Ð,EÀqÑ"IÔ"I�KÝ”J×$Ò$Ð%ZÈ;Ð%ZÐ%ZÐ%ZÑ[Ô[Ð[Ý”J×$Ò$Ñ&Ô&Ð&ð ˜aÒÐÝ”7—>’> 'Ñ*Ô*ð +Ý”M 'Ñ*Ô*Ð*Ý”˜G¨dÐ3Ñ3Ô3Ð3Ð3å”˜G¨dÐ3Ñ3Ô3Ð3åŒJ×ÒÐ]ÐPYÐ]Ð]Ð]Ñ^Ô^Ð^ÝŒJ×ÒÐB°JÐBÐBÐBÑCÔCÐCÝŒJ×ÒÐA°XÐAÐAÐAÑBÔBÐBÝŒJ×ÒÑÔÐð Ô×!Ò! ,µ´
È!ÐWaÐ;bÐ;bÑ0cÔ0cÑdÔdÐdð ˜QŠˆØ(¨1™_�
àØ�3˜z™?œ?Ø˜*Ø˜IØ˜EØ˜FØ˜%Ø Ø$ cØ+°Ð-IÐ-IÐ-IØ Øð�õ ”
× Ò Ð!R¸JÐ!RÐ!RÐ!RÑSÔSÐSÝ”
× Ò Ñ"Ô"Ð"Ð"ð Ø˜*Ø˜IØ˜EØ˜FØ˜%Ø Ø$ cØ+°Ð-IÐ-IÐ-IØ Øð�õ !Ô&ØÝ!”Ý!Ô(ØØðñ ô ˆGð ˆHØœð 2Qñ 2Q�à $Ð&Ð&ÝœIÐ&DÀdÑKÔK�EØð IÝ25µc¸5¿<º<¹>¼>Ñ2JÔ2JÑ/˜˜w¨Ø#(¨4¡<°'¸B±,Ñ#>ÀÑ#H˜ð  $Ð&Ñ&ÝœIÐ&CÀTÑJÔJ�EØñ 'Q ñ 'QÝ25µc¸5¿<º<¹>¼>Ñ2JÔ2JÑ/˜˜w¨Ø',¨t¡|°gÀ±lÑ'BÀWÑ'L˜à-9¸[È1¹_Ñ-MÐ*ØNVÐYZÊlÈlÐ&8¸8Ñ&CÀsÑ%JÐ%JÐ`a˜
õ ')¤iÐ0BÀDÑ&IÔ&I˜Ø?JÐ S¥ k×&7Ò&7¸Ñ&:Ô&:Ñ ;Ô ;Ð ;ÐPS˜ð *2Ð4FÑ)F˜ØBGÈ!Â)À) ~¸Ñ'=Ð'=ÐQR˜ð )^Ð(]µB´J¸wÑ4GÔ4GÐ(]Ñ(]Ô(]˜Ý+.¨}Ñ+=Ô+=ÀÑ+KÐ(Ø>FÈºl¸l­¨X¸©\Ñ):Ô):Ð):ÐPQ˜õ +.¨j¸#Ñ*>Ô*>Ø&2Ø%*Ø+6Ø0@Ø.<ð)ð )˜ð Ô)×-Ò-¨l½D¼JÀ}Ñ<UÔ<UÑVÔVÐVð 8HØ.<Ø5GØ.6Ø&2ð&ð &˜
ð Ô)×-Ò-¨i½¼ÀJÑ9OÔ9OÑPÔPÐPùð "Ÿ,š,¨t˜,Ñ4Ô4ˆKà˜aÒÐàÔ!×%Ò% lµD´JÈaÐ[bÐ?cÐ?cÑ4dÔ4dÑeÔeÐeÝ"Ð#K¸kÐ#KÐ#KÑLÔLÐLõ ”7—>’> (Ñ+Ô+ð FØÔ!×%Ò% lµD´JÈaÐ[bÐ?cÐ?cÑ4dÔ4dÑeÔeÐeÝ"Ð#DÑEÔEÐEåŒJ×ÒÐ^ÐQZÐ^Ð^Ð^Ñ_Ô_Ð_ÝŒJ×ÒÑÔÐð Ô×!Ò! ,µ´
È"ÐXoð  Vð  <Wð  <Wñ  1Xô  1Xñ  Yô  Yð  Yõ ŒJ×ÒÐcÐV_ÐcÐcÐcÑdÔdÐdÝŒJ×ÒÑÔÐðrà UÐ U­B¬J°wÑ,?Ô,?Ð UÑ UÔ U�Ø×"Ò"Ñ$Ô$Ð$à$ð AÝ&Ð'?Ñ@Ô@Ð@å!$ ]Ñ!3Ô!3�Ø"#�ð %)Ô$5Ð!NÐ!NÀ9Ð!NÐ!N�Ý”˜N°TÐ:Ñ:Ô:Ð:ð 6Ð5Ð5Ð5Ð5Ð5Ø4Ð4Ð4Ð4Ð4Ð4Ø!�\‘^”^�ð
ØŸXšX fÑ-Ô-×4Ò4°V´YÀ)Ò5KÑLÔL×RÒRÑTÔT�FØð $Ø:H˜Ô7Ø>?˜Ô;Ø<[˜Ô9Ø:>˜Ô7Ø?C˜Ô<ØŸ	š	™œ˜à—H’H‘J”J�J�Jø�B—H’H‘J”J�J�Jøøøõ (1°Ñ'?Ô'?ð 9+ñ 9+‘O�A�|Ø&-Ð#>Ð#>°Ð#>Ð#>�LØ(6Ð%FÐ%F¸qÐ%FÐ%FÐ%F�Nõ ”w—~’~ nÑ5Ô5ð !Ø'¨1Ñ,˜à)˜\™^œ^˜ð'Ø%'§X¢X¨fÑ%5Ô%5×%<Ò%<¸V¼YÈ)Ò=SÑ%TÔ%T×%ZÒ%ZÑ%\Ô%\˜FØ%ð ,ØFU Ô Cð EPÐZ[Ð^_ÑZ_ð  EPð  EPÐesð  EPð  EPð  EP Ô AØGK Ô DØ "§	¢	¡¤ àŸHšH™JœJ˜J˜Jø˜BŸHšH™JœJ˜J˜JøøøØ ð !Ø˜lØ" CØ˜ØØ&ð�Cõ (œ^¨CÀÈ4ÐPÑPÔP�FàÔ(¨AÒ-Ð-Ø'¨1Ñ,˜à/1°_À~Ñ5UÐYZÑ4ZÑ/ZÐ,ØÔ)×-Ò-¨l½D¼JØ*>Ø&=Ø)@Ø1@Ø0>ðHð Hñ =ô =ñ ô ð ð *˜\™^œ^˜ð'Ø%'§X¢X¨fÑ%5Ô%5×%<Ò%<¸V¼YÈ)Ò=SÑ%TÔ%T×%ZÒ%ZÑ%\Ô%\˜FØ%ð ,ØFU Ô CØDuÐZ[Ð^_ÑZ_ÐDuÐDuÐesÐDuÐDu Ô AØGK Ô DØ "§	¢	¡¤ àŸHšH™JœJ˜J™Jø˜BŸHšH™JœJ˜J˜Jøøøåœ
×(Ò(Ð)xÐbcÐ)xÐ)xÐgmÔgtÐ)xÐ)xÐ)xÑyÔyÐyÝœ
×(Ò(Ñ*Ô*Ð*Ñ*ð "�\‘^”^�ð
ØŸXšX fÑ-Ô-×4Ò4°V´YÀ)Ò5KÑLÔL×RÒRÑTÔT�FØð $Ø>?˜Ô;Ø:;˜Ô7Ø<@˜Ô9Ø:>˜Ô7Ø?C˜Ô<ØŸ	š	™œ˜à—H’H‘J”J�J�Jø�B—H’H‘J”J�J�Jøøøå”
× Ò Ð!hÐ[dÐ!hÐ!hÐ!hÑiÔiÐiÝ”
× Ò Ñ"Ô"Ð"Ð"øÝð ð ð Ý”
× Ò Ð!YÐTUÐ!YÐ!YÐ!YÑZÔZÐZÝ”
× Ò Ñ"Ô"Ð"Ø Ð Ð Ð Ø×#Ò#Ñ%Ô%Ð%àÔ!×%Ò% lµD´JÈaÐ[bÕmpÐqrÑmsÔmsÐ?tÐ?tÑ4uÔ4uÑvÔvÐvØøøøøðøøøð Ô×!Ò! ,µ´
È#ÐYdÐ;eÐ;eÑ0fÔ0fÑgÔgÐgð Ô×$Ò$ YÑ/Ô/Ð/ð 2Ð1Ð1Ð1Ð1Ð1Ø0Ð0Ð0Ð0Ð0Ð0Ø�‘”ˆBð	ØŸš &Ñ)Ô)×0Ò0°´¸iÒ1GÑHÔH×NÒNÑPÔP�Øð 'Ø&2�F”OØ$+�F”MØ—I’I‘K”K�KÝ”J×$Ò$Ð%aÀIÐ%aÐ%aÐ%aÑbÔbÐbÝ”J×$Ò$Ñ&Ô&Ð&à—’‘
”
�
�
ø�—’‘
”
�
�
øøøð OÐNÐNÐNÐNÐNØ&Ð&Ñ(Ô(Ð(ð Ô×$Ò$ \°3Ñ7Ô7Ð7à�4øåÔ(ð 	;ð 	;ð 	;ØÔ×!Ò!Ð"D¸Ð"DÐ"DÅdÄjÐ`aÐmvÐQwÐQwÑFxÔFxÑyÔyÐyØÔ×!Ò! )­T¬Z¸À=Ð8QÑ-RÔ-RÑSÔSÐSÝÐ9Ñ:Ô:Ð:Ýð 	Eð 	Eð 	EØÔ×!Ò!Ð"D¸Ð"DÐ"DÅdÄjÐ`aÐmtÐQuÐQuÑFvÔFvÑwÔwÐwØÔ×!Ò! )­T¬Z¸À=Ð8QÑ-RÔ-RÑSÔSÐSÝÐC½3¸q¹6¼6ÐCÐCÑDÔDÐDøøøøð	EøøøsÂ   ŒW0r ×=Bj Ú
A<\ Üj Ü\1Ü1Aj ÞA8`ß?j à`*à*A>j â)A7d6ä j ä6eåAj æ%A<h6 è!j è6iéAj êr ê
l8êBl3ì3l8ì8A#r îB(q ñr ñq/ñ/.r òB	v.ô(Bv)ö)v.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rZ   Úboolr¨   © r   r   r   r      s[   € € € € € Ø8Ð8ð)ð )ð )ðwE sð wE¨tð wEð wEð wEð wEð wEð wEr   r   )
rR   r[   r_   rM   ÚredisrU   rO   Ú
app.configr   r   r®   r   r   ú<module>r±      sŸ   ðØ 	€	€	€	Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð ðAEð AEð AEð AEð AEñ AEô AEð AEð AEð AEr   