ó
    �®žj:0  ã                   ón  • S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
JrJrJrJrJr  SSKJr  SSKJr  SSKJrJrJr  SS	KJr  SS
KJr  SSKJrJr  SSKJ r   SSK!J"r"J#r#  SSK$J%r%J&r&  SSK'J(r(J)r)J*r*J+r+  \RX                  " \-5      r.Sr/SSSSSS.r0S\1S\14S jr2S\S\S\34S jr4 " S S\ 5      r5g)aH  Video conversion pipeline.

Orchestrates three steps:
1. Extract audio from the video via ffmpeg and transcribe it using the
   shared ASR transcriber.
2. Sample representative frames using either fixed-interval or
   scene-change sampling.
3. Merge transcript segments and frames by timestamp into a single
   DoclingDocument.
é    N)ÚBytesIO)ÚPath)ÚContentLayerÚDocItemLabelÚDoclingDocumentÚDocumentOriginÚImageRefÚTrackSource)ÚAbstractDocumentBackend)ÚNoOpBackend)ÚConversionStatusÚDoclingComponentTypeÚ	ErrorItem)ÚConversionResult©ÚVideoPipelineOptions)Ú_AsrModelFactoryÚ_merge_into_sentences)ÚBasePipeline)ÚProfilingScopeÚTimeRecorder)Úassign_speakersÚdiarize)ÚFixedIntervalFrameSamplerÚSimpleSceneChangeFrameSamplerÚ
VideoFrameÚVideoFrameSamplingModezÝFFmpeg is required for video processing but was not found on PATH. Install it with your system package manager (e.g., 'brew install ffmpeg' on macOS, 'apt-get install ffmpeg' on Linux, 'winget install ffmpeg' on Windows).ú	video/mp4zvideo/x-msvideozvideo/quicktimezvideo/x-matroskaz
video/webm)ú.mp4z.aviz.movz.mkvz.webmÚfilenameÚreturnc                 ót   • [        U 5      R                  R                  5       n[        R	                  US5      $ )Nr   )r   ÚsuffixÚlowerÚ_VIDEO_SUFFIX_TO_MIMETYPEÚget)r    r#   s     Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/pipeline/video_pipeline.pyÚ_video_mimetyper(   K   s-   € Ü�(‹^×"Ñ"×(Ñ(Ó*€FÜ$×(Ñ(¨°Ó=Ð=ó    Ú
video_pathÚwav_pathc                 ó  • [         R                  " SSS[        U 5      SSSSSS	S
S[        U5      /SSS9nUR                  S:w  a?  [        R                  SUR                  UR                  R                  SS5      SS 5        gg)zLExtract audio track from video to a 16kHz mono WAV. Returns True on success.Úffmpegz-nostdinz-iz-vnz-acodecÚ	pcm_s16lez-arÚ16000z-acÚ1z-yTF)Úcapture_outputÚcheckr   z#Audio extraction failed (rc=%s): %szutf-8ÚreplaceiÔþÿÿN)Ú
subprocessÚrunÚstrÚ
returncodeÚ_logÚdebugÚstderrÚdecode)r*   r+   Úresults      r'   Ú_extract_audior=   P   s—   € ä�^Š^àØØÜ�
‹OØØØØØØØØÜ�‹Mð	
ð Øñ#€Fð& ×Ñ˜AÓÜ�
‰
Ø1Ø×ÑØ�M‰M× Ñ  ¨)Ó4°T°UÐ;ô	
ð
 Ør)   c                   óž   ^ • \ rS rSrSrS\4U 4S jjr\S\4S j5       r\S\	S\
4S j5       rS	\S\4S
 jrS	\S\4S jrS	\SS4S jrSrU =r$ )ÚVideoPipelineéo   zžPipeline that transcribes a video's audio and samples its frames,
producing a DoclingDocument with transcript text and frame images
interleaved by timestamp.
Úpipeline_optionsc                 óÄ   >• [         TU ]  U5        SU l        Xl        [        R
                  " U R                  R                  U R                  UR                  S9U l	        g )NT)Úasr_optionsÚartifacts_pathÚaccelerator_options)
ÚsuperÚ__init__Úkeep_backendrA   r   ÚcreaterC   rD   rE   Ú
_asr_model)ÚselfrA   Ú	__class__s     €r'   rG   ÚVideoPipeline.__init__u   sR   ø€ Ü‰ÑÐ)Ô*Ø ˆÔØ6FÔÜ*×1Ò1Ø×-Ñ-×9Ñ9Ø×.Ñ.Ø 0× DÑ Dñ
ˆ�r)   r!   c                 ó   • [        5       $ ©Nr   )Úclss    r'   Úget_default_optionsÚ!VideoPipeline.get_default_options   s   € ä#Ó%Ð%r)   Úbackendc                 ó"   • [        U[        5      $ rO   )Ú
isinstancer   )rP   rS   s     r'   Úis_backend_supportedÚ"VideoPipeline.is_backend_supportedƒ   s   € ä˜'¤;Ó/Ð/r)   Úconv_resc                 ó  • UR                   [        R                  :X  d  UR                  (       a  [        R                  $ UR                  =(       a/    [        S UR                  R                  =(       d    /  5       5      nUR                  =(       a    UR                  R                  nU(       dK  U(       dD  [        R                  SUR                  R                  R                  5        [        R                  $ [        R                  $ )Nc              3   óz   #   • U  H1  oR                   =(       a    UR                   R                  5       v •  M3     g 7frO   )ÚtextÚstrip)Ú.0Úts     r'   Ú	<genexpr>Ú2VideoPipeline._determine_status.<locals>.<genexpr>Š   s(   é € ð -
Ú0M¨!�F‰F×%�q—v‘v—|‘|“~Ô%Ò0Mùs   ‚9;z5Video conversion produced an empty document. File: %s)Ústatusr   ÚFAILUREÚerrorsÚdocumentÚanyÚtextsÚpicturesr8   ÚwarningÚinputÚfileÚnameÚPARTIAL_SUCCESSÚSUCCESS)rK   rX   Úhas_textÚhas_picturess       r'   Ú_determine_statusÚVideoPipeline._determine_status‡   s¾   € Ø�?‰?Ô.×6Ñ6Ó6¸(¿/¿/Ü#×+Ñ+Ð+Ø×$Ñ$÷ 
¬ñ -
Ø08×0AÑ0A×0GÑ0G×0MÈ2Ð0Mó-
ó *
ˆð  ×(Ñ(×G¨X×->Ñ->×-GÑ-GˆÞ¦Ü�L‰LØGØ—‘×#Ñ#×(Ñ(ôô $×3Ñ3Ð3Ü×'Ñ'Ð'r)   c                 óø   • [         R                  SUR                  R                  R                  5        [        US[        R                  S9   U R                  U5        S S S 5        U$ ! , (       d  f       U$ = f)NzProcessing video document %s.Ú	doc_build)Úscope)	r8   Úinfori   rj   rk   r   r   ÚDOCUMENTÚ_process_video)rK   rX   s     r'   Ú_build_documentÚVideoPipeline._build_document–   s[   € Ü�	‰	Ð1°8·>±>×3FÑ3F×3KÑ3KÔLÜ˜( K´~×7NÑ7NÓOØ×Ñ Ô)÷ Pàˆ÷ PÔOàˆús   ÁA*Á*
A9Nc                 ó\  • UR                   R                  R                  nS n[        U[        5      (       a‘  [        UR                   R                  R                  5      R                  =(       d    Sn[        R                  " SUS9 nUR                  UR                  5       5        [        UR                  5      nS S S 5        UnOl[        U[
        5      (       a  UnOTUR                  R                  [        [         R"                  SS[%        U5       3S95        [&        R(                  Ul        g  [,        R.                  " S5      cx  UR                  R                  [        [         R"                  S[0        S95        [&        R(                  Ul         Ub(  UR3                  5       (       a   UR5                  5         g g g / n[        R                  " SSS	9 n[        UR                  5      n	S S S 5         [9        UW	5      n
U
(       aÊ  U	R3                  5       (       aµ  U	R;                  5       R<                  S
:”  a—  U R>                  RA                  U	5      n[C        U5      nU RD                  RF                  (       aU   [I        U	U RD                  RJ                  RL                  S9n[O        X{5      n[P        RS                  SURT                  5        O!O [P        RW                  SUR                  5        U	R3                  5       (       a  U	R5                  5         U RD                  n/ nURX                  (       a™  URZ                  [\        R^                  :X  aK  [a        URb                  URd                  URf                  URh                  URj                  URl                  S9nO[o        URp                  URj                  S9n URs                  U5      nUR                   R                  R                  =(       d    Sn[u        U[w        U5      UR                   Rx                  S9n[{        UR                   R                  R|                  =(       d    SUS9Ul?        / nU H`  nUR€                  c  M  UR‚                  c  M!  UR„                  R‡                  5       (       d  MB  UR                  UR€                  SU45        Mb     U H!  nUR                  URˆ                  S
U45        M#     UR‹                  S S9  U GH  u  nnnUS
:X  a‡  Un UR~                  R�                  [Ž        R�                  " UR’                  SS9[”        R–                  [™        URˆ                  URˆ                  S-   URš                  b  SURš                   3OS S9S9  M•  Un UR~                  R�                  [ž        R                   UR„                  [”        R–                  [™        UR€                  UR‚                  UR¢                  S 9S!9  GM     Ub(  UR3                  5       (       a   UR5                  5         g g g ! , (       d  f       GNx= f! [6         a     g f = f! , (       d  f       GNf= f! [6         a!  n[P        RW                  SU5         S nAGN‘S nAff = f! W	R3                  5       (       a  U	R5                  5         f f = f! [6         a!  n[P        RW                  SU5         S nAGNS nAff = f! [6         a-  n[P        RW                  SURˆ                  U5         S nAGM  S nAff = f! [6         a-  n[P        RW                  S"UR€                  U5         S nAGMY  S nAff = f! [6         a     g f = f! Ub8  UR3                  5       (       a"   UR5                  5         f ! [6         a     f f = ff f = f)#Nr   F)Údeleter#   r?   zUnsupported input type: )Úcomponent_typeÚmodule_nameÚerror_messager-   z.wav)r#   r{   r   )Úaccelerator_devicez!Diarization: %d speakers detectedzSpeaker diarization failed: %szNAudio extraction produced no output for %s; document will contain frames only.)Ú
prominenceÚcuts_per_minuteÚ	probe_fpsÚmin_scene_duration_secondsÚ
max_framesÚsmooth_window)Úinterval_secondsr„   zFrame sampling failed: %sz	video.mp4)r    ÚmimetypeÚbinary_hashÚvideo)rk   Úoriginé   c                 ó   • U S   U S   4$ )Nr   r‹   © )Úes    r'   Ú<lambda>Ú.VideoPipeline._process_video.<locals>.<lambda>  s   €  q¨¡t¨Q¨q©T¡lr)   )ÚkeyéH   )Údpigü©ñÒMbP?zscene:)Ú
start_timeÚend_timeÚ
identifier)ÚimageÚcontent_layerÚsourcez Failed to add frame at %.3fs: %s)r”   r•   Úvoice)Úlabelr[   r˜   r™   z%Failed to add transcript at %.3fs: %s)Rri   Ú_backendÚpath_or_streamrU   r   r   rj   rk   r#   ÚtempfileÚNamedTemporaryFileÚwriteÚgetvaluerc   Úappendr   r   ÚPIPELINEÚtyper   rb   ra   ÚshutilÚwhichÚMISSING_FFMPEG_MESSAGEÚexistsÚunlinkÚ	Exceptionr=   ÚstatÚst_sizerJ   Ú
transcriber   rA   Úenable_diarizationr   rE   Údevicer   r8   ru   Únum_speakersrh   Úgenerate_frame_imagesÚframe_sampling_moder   ÚSCENE_CHANGEr   Úscene_change_prominencer�   Úscene_change_probe_fpsrƒ   Úmax_sampled_framesÚscene_change_smooth_windowr   Úframe_interval_secondsÚsampler   r(   Údocument_hashr   Ústemrd   r”   r•   r[   r\   Ú	timestampÚsortÚadd_picturer	   Úfrom_pilr—   r   ÚBODYr
   Úscene_idÚadd_textr   ÚTEXTÚspeaker)rK   rX   r�   Ú
temp_videor#   Úfr*   Útranscript_itemsÚwfr+   Úaudio_okÚdiarizationÚexcÚoptsÚframesÚsamplerr    rŠ   ÚeventsÚitemÚframeÚ_Ú
event_typeÚpayloads                           r'   rw   ÚVideoPipeline._process_videoœ   su  € à!Ÿ™×0Ñ0×?Ñ?ˆØ"&ˆ
ä�n¤g×.Ñ.Ü˜(Ÿ.™.×-Ñ-×2Ñ2Ó3×:Ñ:×D¸fˆFÜ×,Ò,°EÀ&ÒIÈQØ—‘˜×/Ñ/Ó1Ô2Ü! !§&¡&›\�
÷ Jð $‰JÜ˜¬×-Ñ-Ø'‰Jà�O‰O×"Ñ"ÜÜ#7×#@Ñ#@Ø /Ø$<¼TÀ.Ó=QÐ<RÐ"Sñôô /×6Ñ6ˆHŒOØðQ	ä�|Š|˜HÓ%Ñ-Ø—‘×&Ñ&ÜÜ';×'DÑ'DØ$3Ü&<ñôô #3×":Ñ":�”ØðD Ñ%¨*×*;Ñ*;×*=Ñ*=ðØ×%Ñ%Õ'ð +>Ð%ð  "ÐÜ×,Ò,°FÀ5ÒIÈRÜ §¡›=�÷ Jð&Ü)¨*°hÓ?�Þ §¡× 1Ñ 1°h·m±m³o×6MÑ6MÐPQÓ6QØ'+§¡×'AÑ'AÀ(Ó'KÐ$Ü'<Ð=MÓ'NÐ$à×,Ñ,×?×?ðPÜ*1Ø (Ø37×3HÑ3H×3\Ñ3\×3cÑ3cñ+˜Kô 0?Ø 0ó0Ð,ô !ŸI™IØ CØ +× 8Ñ 8õð @ô  —L‘Lð=à"Ÿ™ôð —?‘?×$Ñ$Ø—O‘OÔ%ð ×(Ñ(ˆDØ')ˆFØ×)×)Ø×+Ñ+Ô/E×/RÑ/RÓRÜ;Ø#'×#?Ñ#?Ø(,×(<Ñ(<Ø"&×"=Ñ"=Ø37×3RÑ3RØ#'×#:Ñ#:Ø&*×&EÑ&Eñ‘Gô 8Ø)-×)DÑ)DØ#'×#:Ñ#:ñ�GðCØ$Ÿ^™^¨JÓ7�Fð
  —~‘~×*Ñ*×/Ñ/×>°;ˆHÜ#Ø!Ü(¨Ó2Ø$ŸN™N×8Ñ8ñˆFô
 !0Ø—^‘^×(Ñ(×-Ñ-×8°Àñ!ˆHÔð
 79ˆFÛ(�à—O‘OÓ/ØŸ™Ó1ØŸ	™	Ÿ™×)Ó)à—M‘M 4§?¡?°A°tÐ"<Ö=ñ )ó  �Ø—‘˜uŸ™°°5Ð9Ö:ñ  ð �K‰KÑ2ˆKÑ3ä*0Ñ&��:˜wØ “?Ø#�EðØ ×)Ñ)×5Ñ5Ü"*×"3Ò"3°E·K±KÀRÑ"HÜ*6×*;Ñ*;Ü#.Ø+0¯?©?Ø).¯©¸5Ñ)@ð (-§~¡~Ñ'Að '-¨U¯^©^Ð,<Ñ$=à)-ñ$ð 6ó ð( #�DðØ ×)Ñ)×2Ñ2Ü".×"3Ñ"3Ø!%§¡Ü*6×*;Ñ*;Ü#.Ø+/¯?©?Ø)-¯©Ø&*§l¡lñ$ð	 3ô 	ñ5 +1ðX Ñ%¨*×*;Ñ*;×*=Ñ*=ðØ×%Ñ%Õ'ð +>Ð%÷} JÖIûôB !ó Ùðú÷C JÖIûô,  )ó PÜ ŸL™LÐ)IÈ3×OÒOûðPûð —?‘?×$Ñ$Ø—O‘OÕ%ð %ûô. !ó CÜ—L‘LÐ!<¸c×BÒBûðCûôZ %ó ÜŸ™Ø>Ø!ŸO™OØ÷ó ûðûô& %ó ÜŸ™ØCØ ŸO™OØ÷ó ûðûô !ó Ùðûð Ñ%¨*×*;Ñ*;×*=Ñ*=ðØ×%Ñ%Õ'øÜ ó Ùðúð +>Ð%úsX  Â	5X/Ä6A"]. Æ2Y Ç]. ÇYÇ2]. Ç;BZ ÊAY# Ë"Z Ë8C]. ÏZ< ÏB]. Ñ2]. Ò]. Ò"A+]. ÔB[*Ö]. ÖA)\$×>]. Ø] Ø/
X>Ù
YÙYÙ
Y Ù]. Ù#
ZÙ-Z	ÚZ Ú	ZÚZ Ú(Z9Ú9]. Ú<
['Û["Û]. Û"['Û']. Û*
\!Û4!\Ü]. Ü\!Ü!]. Ü$
]Ü.!]Ý]. Ý]Ý]. Ý
]+Ý*]+Ý.^+Þ^Þ^+Þ
^&Þ#^+Þ%^&Þ&^+)rJ   rH   rA   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   rG   ÚclassmethodrQ   r   ÚboolrV   r   r   rp   rx   rw   Ú__static_attributes__Ú__classcell__)rL   s   @r'   r?   r?   o   s›   ø† ñð

Ð)=÷ 
ð ð&Ð$8ó &ó ð&ð ð0Ð+Bð 0Àtó 0ó ð0ð(Ð*:ð (Ð?Oô (ðÐ(8ð Ð=Mô ðiÐ'7ð i¸D÷ iò ir)   r?   )6rÚ   Úloggingr¥   r4   rž   Úior   Úpathlibr   Údocling_core.types.docr   r   r   r   r	   r
   Ú docling.backend.abstract_backendr   Údocling.backend.noop_backendr   Údocling.datamodel.base_modelsr   r   r   Údocling.datamodel.documentr   Ú"docling.datamodel.pipeline_optionsr   Ú docling.pipeline.asr_transcriberr   r   Údocling.pipeline.base_pipeliner   Údocling.utils.profilingr   r   Ú!docling.utils.speaker_diarizationr   r   Ú"docling.utils.video_frame_samplingr   r   r   r   Ú	getLoggerrÖ   r8   r§   r%   r6   r(   rÜ   r=   r?   r�   r)   r'   Ú<module>rî      sÏ   ðñ	ó Û Û Û Ý Ý ÷÷ õ EÝ 4÷ñ õ
 8Ý C÷õ 8ß @÷÷ó ð ×Ò˜Ó"€ðð ð ØØØØñÐ ð>˜cð > cô >ð
˜tð ¨tð ¸ô ô>V�Lõ Vr)   