
    4AjY                        d Z ddlm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mZmZmZmZmZmZmZ  G d de
          ZdS )	u  Video analyzer tool — comprehensive reference video analysis.

Orchestrates multiple analysis tools to produce a VideoAnalysisBrief from a
video URL or local file. Runs entirely locally with zero API keys: yt-dlp for
download, youtube-transcript-api for captions, PySceneDetect/FFmpeg for scene
detection, FFmpeg for frame extraction, and faster-whisper for transcription.

The agent's own vision model analyzes extracted keyframes — this tool provides
the structured data; the agent provides the visual interpretation.
    )annotationsN)Path)Any)	BaseToolDeterminismExecutionModeResourceProfile
ToolResultToolStability
ToolStatusToolTierToolRuntimec            
         e Zd ZdZdZej        ZdZdZ	e
j        Zej        Zej        Zej        ZdgZdZddgZg d	Zg d
ZddgZddgddddg dddddddddddddddZdddZ ed d!d"d#d$%          Zdd&gZ g d'Z!g Z"g d(Z#dPd,Z$dQd-Z%dRd/Z&dSd3Z'dTd7Z(dUd>Z)dVd@Z*dWdBZ+dXdEZ,dXdFZ-dYdGZ.dZdHZ/d[dKZ0d\dNZ1dOS )]VideoAnalyzervideo_analyzerz0.1.0analysismultiz
cmd:ffmpeguB  Core: FFmpeg is required (https://ffmpeg.org/download.html)
For URL downloads: pip install yt-dlp
For YouTube transcripts: pip install youtube-transcript-api
For local transcription: pip install faster-whisper
For scene detection: pip install scenedetect[opencv]
All dependencies are free and local — no API keys needed.zvideo-understandffmpeg)analyze_reference_videoextract_structureextract_styleextract_transcript)zcomprehensive video analysiszreference video understandingz#style extraction from example videoz(understanding video structure and pacingzediting or modifying videozgenerating new video contentobjectsourcestringz;Video file path or URL (YouTube, Shorts, Instagram, TikTok))typedescription)transcript_onlystandarddeepr   ztranscript_only: transcript + metadata only. standard: + scene detection + keyframes + audio energy. deep: + intra-scene sampling + detailed style extraction.)r   enumdefaultr   integer      2   zMaximum keyframes to extract)r   r"   minimummaximumr   z8Directory for analysis outputs (default: auto-generated))r   analysis_depthmax_keyframes
output_dir)r   required
propertiesuV   VideoAnalysisBrief artifact — see schemas/artifacts/video_analysis_brief.schema.json   i   r   i  F)	cpu_coresram_mbvram_mbdisk_mbnetwork_requiredr)   )z&downloads video to output_dir (if URL)z/writes keyframe images to output_dir/keyframes/z<writes analysis JSON to output_dir/video_analysis_brief.json)z2Review keyframe images for representative coveragez'Check transcript accuracy against videoz$Verify scene boundaries look correctstrreturnboolc                ,    |                     d          S )z'Check if source is a URL vs local file.)zhttp://zhttps://zwww.)
startswith)selfr   s     L/app/working/workspaces/default/OpenMontage/tools/analysis/video_analyzer.py_is_urlzVideoAnalyzer._is_url   s      !@AAA    c                    |                      |          sdS |                                }d|v rdS d|v sd|v rdS d|v rdS d	|v rd
S dS )zDetect platform from URL.
local_filezyoutube.com/shortsshortszyoutube.comzyoutu.beyoutubezinstagram.com	instagramz
tiktok.comtiktok	other_url)r;   lower)r9   r   ss      r:   _detect_platformzVideoAnalyzer._detect_platform   su    ||F## 	 <LLNN1$$8Aq9a;18{r<   platformc                
    |dv S )N)r@   r?    )r9   rG   s     r:   _is_youtubezVideoAnalyzer._is_youtube   s    000r<   inputsdict[str, Any]r
   c           
         |d         }|                     dd          }|                     dd          }|                     d          rt          |d                   }n3t          d          dt          t          j                               z  }|                    d	d	
           |                     |          }|                     |          }t          j                    }d|dddg dddg i dd}	|r||	d         d<   n||	d         d<   g }
g }d }d }i }|r	 ddlm}  |            }|dk    r<| 	                    |          r'|
                    |t          |          dd          }n'|
                    |t          |          ddd          }|j        rN|j                             di           }|j                             d          }|j                             d          }|                     dd          |	d         d<   |                     d d          |	d         d!<   |                     d"d          |	d         d"<   |                     d#d          |                     d$d          |                     d%d          |                     d&d          |                     d'd          d(|	d         d)<   |
                    d           |r|
                    d*           n|                    d+|j                    n# t           $ r"}|                    d+|            Y d }~nd }~ww xY wt          |          }|                                st%          d,d-| .          S t          |          }	 |                     |          }||	d         d!<   |j        |	d         d<   |
                    d           n/# t           $ r"}|                    d/|            Y d }~nd }~ww xY wd }| 	                    |          rn	 dd0lm} dd1lm}  |            }d2g}	  |            }|                    |                    |                    }g }|D ]A}t7          |d3          r|j        nt          |          }||vr|                    |           B|r|}n# t           $ r Y nw xY w|
                    ||d	d4          }|j        rv|j        }|                     d5d          |                     d6g           |                     d7d2          |                     d8d          d9|	d:<   |
                    d;           n/# t           $ r"}|                    d<|            Y d }~nd }~ww xY w||||r	 ddlm}  |            }|
                    |t          |          ddd          }|j        r|j                             d          }|j                             d          }|r|
                    d=           |sY|j                             di           }|                     dd          |	d         d<   |                     d d          |	d         d!<   n/# t           $ r"}|                    d>|            Y d }~nd }~ww xY w|L|rI	 dd?lm}   |             }!|d@t          |          dA}"|	                     d:i                                d7          }#|#r|#d2k    r|#|"d7<   |!
                    |"          }$|$j        r|$j                             dBg           }%dC                    dD |%D                       }&|&dE |%D             |$j                             d7d2          tA          |&!                                          d9|	d:<   |	d:         }|
                    dF           n/# t           $ r"}|                    dG|            Y d }~nd }~ww xY w|dk    r||
|tE          t          j                    |z
  dH          dI|	dJ<   | #                    |	|           t%          d	|	t          |dKz            gtE          t          j                    |z
  dH          L          S g }'|r	 ddMl$m%}(  |(            })|)
                    |dNdOt          |dPz            dQ          }*|*j        r0|*j                             dRg           }'|
                    dS           n/# t           $ r"}|                    dT|            Y d }~nd }~ww xY w|'rotA          |'          |	dU         dV<   g }+|'D ]n},|+                    |,                     dW|,                     dXd                    |,                     dYd          |,                     dZd          dd[d\d]           o|+|	dU         dR<   d^ |'D             }-|	d         d!         ptM          |-          }.|-rtE          tM          |-          tA          |-          z  dH          tE          tO          |-          dH          tE          tQ          |-          dH          |.dk    r#tE          tA          |-          |.d_z  z  dH          nd| )                    |-          d`|	dU         da<   |r|'r	 | *                    ||'          }/tW          |	dU         dR         |/          D ]\  }0}1|1db         |0db<   |1dc         |0dc<   |
                    dd           n/# t           $ r"}|                    de|            Y d }~nd }~ww xY wg }2|dfz  }3|r |'r	 | ,                    |'||          }4ddgl-m.}5  |5            }6|6
                    |dh|4t          |3          didHdj          }7|7j        ru|7j                             dkg           D ]D}8| /                    |8dl         |'          }9|2                    |8dl         |9|8dm         ddn           E|
                    df           n# t           $ r"}|                    do|            Y d }~nd }~ww xY w|r|'s	 ddgl-m.}5  |5            }6|6
                    |dptO          |dq          t          |3          didHdr          }7|7j        rY|7j                             dkg           D ](}8|2                    |8dl         d|8dm         ddn           )|
                    ds           n/# t           $ r"}|                    dt|            Y d }~nd }~ww xY w|2|	df<   |s|r|p|}:	 ddul0m1};  |;            }<|<
                    |:|	d         d!         dv          }=|=j        rEdw|	vri |	dw<   |=j                             dxd          d	dy|	dw         dz<   |
                    d{           n/# t           $ r"}|                    d||            Y d }~nd }~ww xY w| 2                    |	          d}g g | 3                    |	          | 4                    |	          g d~|	d<   dw|	vri |	dw<   |r|	d         d!         }tk          |tl                    r|                     d8d          n)|	                     d:i                                d8d          }>|dk    rtE          |>|d_z  z  d          nd}?|>dk    dd|?d|	dw         d<   |	dw         7                    dg g dd           |	dw         7                    dd           |	dw         7                    dg            |	dw         7                    dd           |	dw         7                    dd           |	dw         7                    dd           |	dw         7                    dd           |	dw         7                    dd           ||
|tA          |2          tA          |'          |d utE          t          j                    |z
  dH          d|	dJ<   | #                    |	|           t          j                    |z
  }@t          |dKz            g}A|3                                r"|A                    t          |3                     t%          d	|	|AtE          |@dH          L          S )Nr   r)   r   r*   r$   r+   zprojects/_analysis	analysis_T)parentsexist_okz1.0r   )r   duration_seconds general)summarytopicstarget_audience)total_scenesscenespacing_profile)versionr   content_analysisstructure_analysisurl
local_path)VideoDownloaderr   metadata_only)r]   r+   formatvideo720p)r]   r+   ra   max_resolutionmetadata
video_path
audio_pathtitledurationrQ   
resolutionuploaderupload_date
view_count
like_countr   )rk   rl   rm   rn   r   platform_metadatadownloadz
download: FzLocal file not found: )successerrorz
metadata: )YouTubeTranscriptApi)TranscriptFetcherenlanguage_code)url_or_video_id	languagesinclude_auto_generated	full_text
transcriptlanguage
word_count)rz   segmentsr|   r}   narration_transcripttranscript_youtubeztranscript_youtube: download_for_whisperzdownload_for_whisper: )Transcriberbase)
input_path
model_sizer+   r~    c              3  B   K   | ]}|                     d d          V  dS )textrR   Nget.0rE   s     r:   	<genexpr>z(VideoAnalyzer.execute.<locals>.<genexpr>Z  s0      (M(Mqvr):):(M(M(M(M(M(Mr<   c                    g | ]D}|                     d d          |                     dd          |                     dd          dES )startr   endr   rR   )r   r   r   r   r   s     r:   
<listcomp>z)VideoAnalyzer.execute.<locals>.<listcomp>]  sb     % % % !"	 *+w):):'(uuUA()fb(9(9 % % %r<   transcript_whisperztranscript_whisper: r.   )depthsteps_completedsteps_failedrQ   _analysis_metavideo_analysis_brief.json)rq   data	artifactsrQ   )SceneDetectcontent      ?zscenes.json)r   methodmin_scene_length_secondsoutput_pathrX   scene_detectzscene_detect: r\   rW   indexscene_indexstart_secondsend_secondsothermedium)r   
start_timeend_timer   visual_typeenergy_levelc                h    g | ]/}|                     d d          |                     dd          z
  0S )r   r   r   r   r   s     r:   r   z)VideoAnalyzer.execute.<locals>.<listcomp>  sI        mQ''!%%*C*CC  r<   <   )avg_scene_duration_secondsshortest_scene_secondslongest_scene_secondscuts_per_minutepacing_stylerY   motion_typeflow_variancemotion_classificationzmotion_classification: 	keyframes)FrameSampler
timestampsjpg)r   strategyr   r+   ra   qualityframestimestamp_secondspath)	timestampr   r   r   zkeyframes: count   )r   r   r   r+   ra   r   keyframes_uniformzkeyframes_uniform: )AudioEnergy)r   video_duration_secondsstyle_profilerecommended_offset_seconds)recommended_offsethas_energy_dataaudio_energy_profileaudio_energyzaudio_energy: zflat-motion-graphics)suggested_pipelinesuggested_playbookkey_elements_to_replicateelements_requiring_custom_workestimated_complexitymotion_requiredcreative_differentiation_seedsreplication_guidancer%   )has_narrationspeaker_countdelivery_stylewords_per_minutenarration_stylecolor_palette)primary_colorsaccent_colorsoverall_moodtypography_observedtransition_typesmusic_stylesubtitle_styleproduction_qualityprosumerclosest_playbookplaybook_delta)r   r   r   keyframe_countscene_counthas_transcriptrQ   )8r   r   inttimemkdirrF   r;   tools.analysis.video_downloaderr_   rJ   executer4   rq   r   appendrr   	Exceptionexistsr
   _get_durationstemyoutube_transcript_apirs   !tools.analysis.transcript_fetcherrt   list_extract_video_idhasattrrv   tools.analysis.transcriberr   joinlensplitround_save_brieftools.analysis.scene_detectr   summinmax_classify_pacing_classify_scene_motionzip_compute_keyframe_timestampstools.analysis.frame_samplerr   _timestamp_to_scenetools.analysis.audio_energyr   _suggest_pipeline_estimate_complexity_needs_motion
isinstancedict
setdefault)Br9   rK   r   r   r*   r+   rG   is_urlr   briefr   r   rf   rg   re   r_   
downloader	dl_resulter^   ri   transcript_datars   rt   fetcherlanguages_to_tryytt	available
lang_codestcode	tf_resultr   transcriber	tr_inputsdetected_lang	tr_resultr~   rz   rX   r   detector	sd_resultbrief_scenesscene	durationstotal_durationmotion_resultsbsmrr   keyframe_dirr   r   sampler	fs_resultframe	scene_idxaudio_sourcer   energy	ae_resultwcwpmelapsedr   sB                                                                     r:   r   zVideoAnalyzer.execute   s   !

+Z88

?B77 ::l## 	Uf\233JJ2336T#dikkBRBR6T6TTJ555((00f%%	  $% 
 #,! ! !""$# #
 
$  	3%+E(OE"",2E(OL)  

 9	6'6KKKKKK,_..
---$2B2B82L2L- * 2 2%&)*oo"14 4 ! !II !+ 2 2%&)*oo")*0	4 4 ! !I $ H(~11*bAAH!*!3!3L!A!AJ!*!3!3L!A!AJ/7||GR/H/HE(OG,:B,,zST:U:UE(O$674<LLr4R4RE(OL1$,LLR$@$@'/||M2'F'F&.ll<&C&C&.ll<&C&C'/||M2'F'F< <E(O$78 $**:666! ;'..z::: ''(FY_(F(FGGG 6 6 6##$4$4$4555555556 fJ$$&& !!;6;;    ZJ6--j996>h 23+5?h(&&z2222 6 6 6##$4$4$4555555556  H%% &	@%@GGGGGGOOOOOO++-- %)6 ..00C #)B)B6)J)J K KI!#J& 4 429!_2M2MYqSVWXSYSYz11&--d333! 6+5(    D $OO'-!1.2- -  	
 $ A&/nO%4%8%8b%I%I$3$7$7b$I$I$3$7$7
D$I$I&5&9&9,&J&J	5 5E01 $**+?@@@ @ @ @##$>1$>$>????????@
 "z'9j>PU[>PBKKKKKK,_..
&..!"%j//%&,	0 0  	 $ 	Z!*!3!3L!A!AJ!*!3!3L!A!AJ! G'../EFFF# Z#,>#5#5j"#E#E3;<<3L3Lh0>Fll:WX>Y>Yh(:; B B B##$@Q$@$@AAAAAAAAB "z"#@BBBBBB)kmm #-"("%j// 	 !&		*@" E E I I* U U  :]d%:%:,9Ij) (//	::	$ A(~11*bAAH #(M(MH(M(M(M M MI%.% % &.% % % %.N$6$6z4$H$H&))//*;*;&<&<5 5E01 ',,B&CO#**+?@@@ @ @ @##$>1$>$>????????@ %%%#2 ,$)$)++*=q$A$A	' 'E"# UJ///z,GGHHI!&ty{{U':A!>!>	     	::CCCCCC&;==$,,",'03#&zM'A#B#B	. .  	 $ ;&^//"==F#**>::: : : :##$8Q$8$899999999:  	:=f++E&'7L  ###(99Weiiq6Q6Q#R#R"'))OQ"?"? %		- ; ;#%#*$,% %     5AE&'1   I #8_-?@RC	NNN 27IY8WYZ2[2[.3C	NNA.F.F-23y>>1-E-E[ilm[m[muS^^~PR?R-SUV'W'W'Wst$($9$9)$D$DA A*+,<=  	C& 	CC!%!<!<Z!P!P!%(<"=h"GXX > >FB(*=(9B}%*,_*=B''&&'>???? C C C##$Aa$A$ABBBBBBBBC 	!K/ 5	?& 5	?7!>>v}V[\\
EEEEEE&,..#OO", ,","%l"3"3# - -  	 $ 8!*!3!3Hb!A!A 
 
$($<$<!"56% %	 "(()./B)C+4$)&M+-	* *     $**;777 7 7 7##$5!$5$5666666667 	? 	??EEEEEE&,..#OO", ' 33"%l"3"3# - -  	 $ @!*!3!3Hb!A!A  !(()./B)C+,$)&M+-	* *     $**+>??? ? ? ?##$=!$=$=>>>>>>>>? 'k  	: 	:%3L:CCCCCC$"NN"..3Ho>P.Q, ,  	 $ ;&e3313o..7n.@.@A]_`.a.a+/F FE/*+AB $**>::: : : :##$8Q$8$899999999:
 #'"8"8"?"?"8)+.0$($=$=e$D$D#11%88.0)
 )
$% %''%'E/"  		X'9:H9COUY9Z9Z  [$$\1555`e`i`i  kA  CE  aF  aF  aJ  aJ  KW  YZ  a[  a[B4<qLL%hm,a000aC!#b!""$$'	9 9E/"#45 	o))/ <
 <
 	 	 	
 	o))*?DDDo))*<bAAAo))-<<<o))*:B???o))*>
KKKo))*<bAAAo))*:B??? .(!)nnv;;-T9 %dikkE&91 = =#
 #
 	
+++)++%&AABBC	   	0S..///"7A..	
 
 
 	
s   G,L 
L9L44L9AO	 	
O5O00O5U +A<R( 'U (
R52U 4R55BU 
U;U66U;C$Y0 0
Z:ZZ&D^? ?
_+	_&&_+A1c3 3
d=ddA#k= =
l)l$$l)9Cp 
p3p..p3;B's# #
t-t

t B v! !
w+wwrf   r   floatc           
         dddddddt          |          g}|                     |          }t          j        |j                  }t          |                    di                               d	d
                    S )zGet video duration via ffprobe.ffprobez-vquietz-show_entrieszformat=durationz-ofjsonra   ri   r   )r4   run_commandr6  loadsstdoutr2  r   )r9   rf   cmdresultr   s        r:   r   zVideoAnalyzer._get_durationN  sx     tW.6
OO	
 !!#&&z&-((TXXh++//
A>>???r<   rX   
list[dict]
max_framesr   r   list[float]c                >  	 g 	|D ]}|                     dd          }|                     dd          }||z
  }	                    |dz              |dk    r	                    ||dz  z              |dk    r<|dk    r6	                    ||d	z  z              	                    ||d
z  z              t          t          d 	D                                 	t	          	          |k    r.t	          	          |z  	fdt          |          D             		S )z:Compute optimal keyframe timestamps from scene boundaries.r   r   r   皙?g      @r.   r    g      @      ?      ?c              3  6   K   | ]}t          |d           V  dS )   N)r   )r   r  s     r:   r   z=VideoAnalyzer._compute_keyframe_timestamps.<locals>.<genexpr>r  s*      @@a@@@@@@r<   c                @    g | ]}t          |z                     S rI   )r   )r   istepr   s     r:   r   z>VideoAnalyzer._compute_keyframe_timestamps.<locals>.<listcomp>v  s(    OOO*ST]]3OOOr<   )r   r   sortedsetr   range)
r9   rX   r=  r   r!  r   r   ri   rG  r   s
           @@r:   r  z*VideoAnalyzer._compute_keyframe_timestampsZ  sJ    
 	; 	;EIIoq11E))M1--CU{H eck*** #~~!!%(Q,"6777 8c>>!!%(T/"9:::!!%(T/"9::: C@@Z@@@@@AA
z??Z''z??Z/DOOOOOU:=N=NOOOJr<   tsc                    |D ]j}|                     dd          }|                     dd          }||cxk    r|k    r/n >|                     d|                     dd                    c S kdS )z#Map a timestamp to its scene index.r   r   r   r   r   r   )r9   rK  rX   r!  r   r   s         r:   r  z!VideoAnalyzer._timestamp_to_scenez  s     	G 	GEIIoq11E))M1--C!!!!c!!!!!yy%))M1*E*EFFFFF "qr<   r"  c                |    |sdS t          |          t          |          z  }|dk    rdS |dk    rdS |dk    rdS dS )	z+Classify pacing style from scene durations.variable
   slow_contemplative   steady_educationalr.   dynamic_social
rapid_fire)r   r   )r9   r"  avgs      r:   r   zVideoAnalyzer._classify_pacing  sW     	:)nns9~~-88''77''77##|r<   r  r
  c                    |d         d         }|d                              di                                dd          }|dv rdS |d	v rd
S dS )z4Suggest the best pipeline based on content analysis.r   r   r\   rY   r   rR   )r?   rB   rA   	animation)rP  	cinematiczanimated-explainerr   )r9   r  rG   pacings       r:   r  zVideoAnalyzer._suggest_pipeline  se    ?6*+,001A2FFJJ>[]^^888;,,,;##r<   c                v    |d         d         }|d         d         }|dk    s|dk    rdS |dk    s|d	k    rd
S dS )z8Estimate how complex it would be to recreate this style.r\   rW   r   rQ   i,     complexx   r   moderatesimplerI   )r9   r  rX   ri   s       r:   r  z"VideoAnalyzer._estimate_complexity  sR    +,^<?#56c>>Vb[[9c>>Vb[[:xr<   c                   |d                              dg           }d |D             }|r%|r#t          |          t          |          z  dk    S |d                              di                                dd          }|dv S )	z8Determine if motion (video gen or Remotion) is required.r\   rX   c                D    g | ]}|                     d           dk    |S )r   motion_clipr   r   s     r:   r   z/VideoAnalyzer._needs_motion.<locals>.<listcomp>  s.    TTTqaeeM.B.Bm.S.S.S.S.Sr<   333333?rY   r   rR   )rS  rT  )r   r   )r9   r  rX   motion_scenesrY  s        r:   r  zVideoAnalyzer._needs_motion  s     +,002>>TTFTTT 	;m 	;}%%F3s::+,001A2FFJJ>[]^^999r<   c                   ddl }	 ddl}n&# t          $ r dddgt          |          z  cY S w xY w|                    |          }|                                sdddgt          |          z  S |                    |j                  pd}g }|D ]}|                    dd          |                    dd          z
  d	k     r|                    d
dd           St          ddz            fddD             }	|	sdz   g}	g }
g }|	D ]}| 
                    |||          }| 
                    ||z   |          }||9|j        dd         \  }}|dk    rd|z  nd}|dk     r@t          ||z            df}|                    ||          }|                    ||          }|                    ||j                  }|                    ||j                  }|                    ||dddddddd
  
        }|                    |d         dz  |d         dz  z             }|                    t%          |                    |                               |
                    t%          |                    |                               |
s|                    ddd           *t+          |
          t          |
          z  }t+          |          t          |          z  }|dk     rd
}n|dk     rd}nd}|                    |t-          |d          d           |                                 |S )a"  Classify each scene as static_image, animated_still, or motion_clip.

        Samples 2-3 frame pairs per scene and computes dense optical flow
        variance using Farneback. Low uniform flow = pan/zoom on a still.
        High heterogeneous flow = real character/object motion.
        r   Nunknown)r   r   g      >@r   r   rc  static_imageg        g?rD  c                >    g | ]}|z  z   z   k    |z  z   S rI   rI   )r   pri   r   gapr   s     r:   r   z8VideoAnalyzer._classify_scene_motion.<locals>.<listcomp>  s?    qqqQuW_bcWcOcfiOimpOpOpEHqL0OpOpOpr<   )rA  r   rB  r@  r.   ih  g      ?r   r   rQ  g333333?)	pyr_scalelevelswinsize
iterationspoly_n
poly_sigmaflags).r   ).r%   g       @animated_stillrb  )numpycv2ImportErrorr   VideoCaptureisOpenedr   CAP_PROP_FPSr   r   _read_frame_atshaper   resizecvtColorCOLOR_BGR2GRAYcalcOpticalFlowFarnebacksqrtr2  meanvarr   r   release)r9   rf   rX   npru  capfpsresultsr!  sample_timesflow_variancesflow_mag_meansr  frame_aframe_bhwscaledimgray_agray_bflowmagavg_varianceavg_magnituder   ri   r   rk  r   s                             @@@@r:   r   z$VideoAnalyzer._classify_scene_motion  s    		SJJJJ 	S 	S 	S$-CCDs6{{RRRR	S z**||~~ 	S$-CCDs6{{RRggc&''/4 C	 C	EIIoq11E))M1--CU{H#~~~PSTTUUU c8a<((Cqqqqqqq:KqqqL - %}NN! : :--c1c::--c1s7C@@?go }RaR(1#$s77a3;;q5y>>3/C!jj#66G!jj#66Ggs/ABBgs/ABB33FD!!R s! 4   ggd6la/$v,!2CCDD%%eBGGCLL&9&9:::%%eBFF3KK&8&89999! y2NNOOO~..^1D1DDL//#n2E2EEM s"",##.+NN*!&|Q!7!7     
 	s     22r   r  c                    ddl }t          ||z            }|                    |j        |           |                                \  }}|r|ndS )z+Read a single frame at the given timestamp.r   N)ru  r   rI  CAP_PROP_POS_FRAMESread)r9   r  r   r  ru  	frame_numretr*  s           r:   rz  zVideoAnalyzer._read_frame_at  sS    


	C((	'333XXZZ
U%uu%r<   r+   Nonec                    |dz  }d |                                 D             }t          |dd          5 }t          j        ||dt                     ddd           dS # 1 swxY w Y   dS )	z$Save the VideoAnalysisBrief to disk.r   c                    i | ]\  }}||	S rI   rI   )r   kvs      r:   
<dictcomp>z-VideoAnalyzer._save_brief.<locals>.<dictcomp>  s    6661q!666r<   r  zutf-8)encodingr.   )indentr"   N)itemsopenr6  dumpr4   )r9   r  r+   out_pathclean_brieffs         r:   r   zVideoAnalyzer._save_brief  s     ;;66666(C'222 	=aIk1Q<<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s   A!!A%(A%N)r   r4   r5   r6   )r   r4   r5   r4   )rG   r4   r5   r6   )rK   rL   r5   r
   )rf   r   r5   r2  )rX   r<  r=  r   r   r4   r5   r>  )rK  r2  rX   r<  r5   r   )r"  r>  r5   r4   )r  r
  r5   r4   )r  r
  r5   r6   )rf   r4   rX   r<  r5   r<  )r   r2  r  r2  )r  r
  r+   r   r5   r  )2__name__
__module____qualname__namerZ   r   ANALYZEtier
capabilityproviderr   BETA	stabilityr   SYNCexecution_moder   DETERMINISTICdeterminismr   LOCALruntimedependenciesinstall_instructionsagent_skillscapabilitiesbest_fornot_good_forinput_schemaoutput_schemar	   resource_profileidempotency_key_fieldsside_effectsfallback_toolsuser_visible_verificationr;   rF   rJ   r   r   r  r  r   r  r  r  r   rz  r   rI   r<   r:   r   r       s       DGDJH"I"'N+KG >L	F  '1L  L  H 	%&L J !\ 
 !???%P	 	 "=  !Y -
 
 LB o M
 'D!T   '(89  L
 N! ! !B B B B   1 1 1 1u
 u
 u
 u
r
@ 
@ 
@ 
@   @      	$ 	$ 	$ 	$	 	 	 		: 	: 	: 	:] ] ] ]~& & & &= = = = = =r<   r   )__doc__
__future__r   r6  r   pathlibr   typingr   tools.base_toolr   r   r   r	   r
   r   r   r   r   r   rI   r<   r:   <module>r     s  	 	 # " " " " "              
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
~= ~= ~= ~= ~=H ~= ~= ~= ~= ~=r<   