+
    hci<                        R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHt ^ RIHt ^ RIt^ RIHt RtRtR	tR
tRtRRRRRR/tRRRRRRRR/tRRRRRR/t^
tRt ! R  R!]4      tR# )"uT  
Google Veo Video Provider – generates I2V (Image-to-Video) via the Google Flow UI
using Playwright to handle reCAPTCHA automatically.

Strategy:
  1. Use GoogleFlowImageProvider to generate an image and get mediaGenerationId
  2. Launch Playwright browser with session cookies
  3. Navigate to Flow, configure I2V settings
  4. Use the mediaGenerationId as start frame
  5. Submit generation and capture the response
  6. Poll for completion and download the video

Requires: playwright (pip install playwright && playwright install chromium)
Uses the same cookies as GoogleFlowImageProvider.
)annotationsN)Callable)Path)Any)VideoProviderz'https://labs.google/fx/api/auth/sessionzNhttps://aisandbox-pa.googleapis.com/v1/video:batchAsyncGenerateVideoStartImagezHhttps://aisandbox-pa.googleapis.com/v1/video:batchAsyncGenerateVideoTextzQhttps://aisandbox-pa.googleapis.com/v1/video:batchCheckAsyncVideoGenerationStatusz5https://labs.google/fx/api/trpc/project.createProject	landscapeVIDEO_ASPECT_RATIO_LANDSCAPEportraitVIDEO_ASPECT_RATIO_PORTRAITsquareVIDEO_ASPECT_RATIO_SQUAREveo_3_1_i2v_fastveo_3_1_i2v_s_fastveo_3_1_t2v_fast	veo_2_i2vveo_2_0_i2v	veo_2_t2vveo_2_0_t2vOriginzhttps://labs.googleReferer%https://labs.google/fx/tools/video-fxzContent-Typezapplication/json,  c                      ] tR t^BtRtRtR tR R ltR R ltR R	 lt	R
 R lt
RR R lltR R ltRR R lltRR R lltR tR tR tRtR# )GoogleVeoVideoProviderzGenerates I2V videos via Google Veo using Playwright for reCAPTCHA handling.

Supports both:
- I2V (Image-to-Video): provide start_image_media_id from GoogleFlowImageProvider
- T2V (Text-to-Video): prompt only, no image

google_veoc                	Z   \         P                  ! R R4      V n        \         P                  ! RR4      V n        \         P                  ! RR4      V n        \         P                  ! R\         P                  ! RR4      4      p\
        P                  VR4      V n        \         P                  ! RR	4      p\        P                  W"4      V n	        V P                  '       g   \        R
4      hV P                  '       g   \        R4      hRV n        \        P                  ! ^xRR7      V n        R# )GOOGLE_FLOW_SESSION_TOKEN GOOGLE_FLOW_CSRF_TOKENGOOGLE_FLOW_PROJECT_IDGOOGLE_VEO_ASPECT_RATIOGOOGLE_FLOW_ASPECT_RATIOr	   r
   GOOGLE_VEO_MODELr   u   GOOGLE_FLOW_SESSION_TOKEN is required. Extract from Chrome DevTools → Application → Cookies → https://labs.google → __Secure-next-auth.session-tokenu   GOOGLE_FLOW_CSRF_TOKEN is required. Extract from Chrome DevTools → Application → Cookies → https://labs.google → __Host-next-auth.csrf-tokenNTtimeoutfollow_redirects)osgetenvsession_token
csrf_token
project_idVIDEO_ASPECT_RATIOSgetaspect_ratioVIDEO_MODELSmodelEnvironmentError_access_tokenhttpxClienthttp_client)self
aspect_key	model_keys   &  Z/home/gabslocked/Desktop/Projetos/Images/video_automation/providers/google_veo_provider.py__init__GoogleVeoVideoProvider.__init__K   s    YY'BBG))$<bA))$<bAYY8!yy)CZPR
/33J@]^II02DE	!%%i;
!!!"K 
 "F  *. <<dK    c                   V ^8  d   QhRR/#    returnstr )formats   "r8   __annotate__#GoogleVeoVideoProvider.__annotate__k   s     
 
 
r;   c                	:    R V P                    RV P                   2# )z!__Secure-next-auth.session-token=z; __Host-next-auth.csrf-token=)r(   r)   r5   s   &r8   _cookie_string%GoogleVeoVideoProvider._cookie_stringk   s*    /0B0B/C D++/??*;=	
r;   c                   V ^8  d   QhRR/# r=   rA   )rB   s   "r8   rC   rD   q   s     " "s "r;   c                	   V P                   '       d   V P                   # V P                  P                  \        / \        CR V P                  4       /CR7      pVP                  4        VP                  4       pVP                  R4      ;'       g    VP                  R4      V n         V P                   '       g   \        R4      hV P                   # )Cookie)headersaccess_tokenaccessTokenu+   No access_token — cookies may be expired.)	r1   r4   r,   SESSION_URLDEFAULT_HEADERSrG   raise_for_statusjsonRuntimeErrorr5   respdatas   &  r8   _refresh_access_token,GoogleVeoVideoProvider._refresh_access_tokenq   s    %%%##HH$2E2E2GH $ 
 	yy{!XXn5PP-9P!!!LMM!!!r;   c                   V ^8  d   QhRR/# )r>   r?   zdict[str, str]rA   )rB   s   "r8   rC   rD      s     
 
~ 
r;   c                	`    V P                  4       p/ \        CR V P                  4       RRV 2/C# )rK   AuthorizationzBearer )rW   rP   rG   )r5   tokens   & r8   _auth_headers$GoogleVeoVideoProvider._auth_headers   sA    **,

d))+wug.
 	
r;   c                   V ^8  d   QhRR/# r=   rA   )rB   s   "r8   rC   rD      s       r;   c           
     	   V P                   '       d   V P                   # \        P                  R 4       V P                  P	                  \
        RRR\        \        P                  ! 4       4       2RR//V P                  4       R7      pVP                  4        VP                  4       pVR,          R,          R,          R,          R	,          V n         \        P                  R
V P                   4       V P                   # )z&Creating new Flow project for video...rR   projectTitlezveo-toolNamePINHOLErR   rL   resultrV   	projectIdzCreated project: %s)r*   loggerinfor4   postCREATE_PROJECT_URLinttimer]   rQ   rR   rT   s   &  r8   _ensure_project&GoogleVeoVideoProvider._ensure_project   s    ?????"<=$$>T#diik2B1C+DjR[\]&&( % 

 	yy{x.08B;O)4??;r;   Nc               $    V ^8  d   QhRRRRRR/# )r>   promptr@   start_image_media_id
str | Noner?   dictrA   )rB   s   "r8   rC   rD      s-     ! !! )! 
	!r;   c                H   ^ RI Hp RpV! 4       ;_uu_ 4       pVP                  P                  RR7      pVP	                  RRRR/R	R
7      pVP                  RRRV P                  RRRRRRRRRR/RRRV P                  RRRRRRRRRR/.4       VP                  4       pVP                  R4       \        P                  R4       VP                  RRRR7       VP                  R4        VP                  R4      P                  P!                  R R!7       \        P                  R"4       VP                  R 4        VP                  R$4      P                  P'                  R%R&R'7       T'       d3   \        P                  R+TR,,          4       \        P%                  R-4       TP                  R$4      P                  P!                  4        TP                  R.4       TP.                  P1                  T4       \        P                  R/4       TP                  R04        TP                  R14      P                  P!                  R R!7       \        P                  R24       \        P                  R54       \3        ^4       F1  p	TP                  R64       TP5                  R74      p
T
'       g   K/  T
p M	  T'       g   TP+                  4        \-        R84      hTP+                  4        RRR4       T#   \"         d    \        P%                  R#4        ELi ; i  \"         d/    TP)                  R(R)7       TP+                  4        \-        R*4      hi ; i  \"         d/    TP)                  R3R)7       TP+                  4        \-        R44      hi ; i  + '       g   i     T# ; i)9zUse Playwright to submit a video generation request.

The browser handles reCAPTCHA automatically. We intercept the response
to get the operation name for polling.
)sync_playwrightNF)headlesswidthix  heighti  zpt-BR)viewportlocalenamez __Secure-next-auth.session-tokenvaluedomainzlabs.googlepath/secureThttpOnlysameSiteLaxz__Host-next-auth.csrf-tokena  
                const _origFetch = window.fetch;
                window.__veoResponse = null;
                window.fetch = async function(...args) {
                    const [url, opts] = args;
                    const urlStr = typeof url === 'string' ? url : url.url;
                    const resp = await _origFetch.apply(this, args);

                    if (urlStr.includes('batchAsyncGenerateVideo')) {
                        const clone = resp.clone();
                        try {
                            window.__veoResponse = await clone.json();
                        } catch(e) {}
                    }
                    return resp;
                };
            z+Launching browser for Veo I2V generation...r   networkidlei`  )
wait_untilr$   i  z?button:has-text('Novo projeto'), button:has-text('New project')i  )r$   zClicked new projectzNo 'New project' buttontextareavisiblei0u  )stater$   zveo_debug.png)r~   z,Editor not loaded. Screenshot: veo_debug.pngzI2V mode: using mediaId %s...:N   Nz0I2V UI automation not yet implemented, using T2Vr   zTyped prompti  z3button:has-text('Criar'), button:has-text('Create')zClicked generatezveo_debug_no_btn.pngzGenerate button not foundz"Waiting for generation response...i  zwindow.__veoResponsezNo generation response captured)playwright.sync_apiru   chromiumlaunchnew_contextadd_cookiesr(   r)   new_pageadd_init_scriptrg   rh   gotowait_for_timeoutlocatorfirstclick	Exceptionwarningwait_for
screenshotcloserS   keyboardtyperangeevaluate)r5   rp   rq   ru   captured_responsepbrowsercontextpage_	resp_datas   &&&        r8   _generate_via_browser,GoogleVeoVideoProvider._generate_via_browser   s\    	8 !jj'''7G))!437 * G
 >T//mCd 9T__mCd! * ##%D    " $ KKEFII7(  
 !!$':^_eekktxky12%%d+
SZ(..77iQV7W $;=QRU=VW QR LL$**002!!#&MMv&KK'!!$'@RSYY__hl_m./ KK<=2Y%%d+ MM*@A	9(1%  %"#DEEMMO_ b ! g  :89:  S_5"#QRRS2  @%;<"#>??@{ b ! sp   CN+AK1=,L)N1B-NA MA
N.N<+N1 LNLN9MN9NNN!	c               $    V ^8  d   QhRRRRRR/# )r>   operation_namer@   scene_idr?   rs   rA   )rB   s   "r8   rC   rD   !  s&     *P *P3 *P# *P$ *Pr;   c                   Rp\         P                   ! 4       p\         P                   ! 4       V,
          \        8  Ed   RRRV/RVRV/./pV P                  P                  \        VV P                  4       R7      pVP                  4        VP                  4       pVP                  R. 4      pV'       g   \         P                  ! \        4       K  V^ ,          p	V	P                  RV4      p\        P                  RV\         P                   ! 4       V,
          4       VR	8X  d   V	# VR9   d   \        R
V 24      h\         P                  ! \        4       EK@  \        R\         R24      h)z&Poll until video generation completes.MEDIA_GENERATION_STATUS_PENDING
operations	operationr{   sceneIdstatusrd   zPoll: status=%s (%.0fs)!MEDIA_GENERATION_STATUS_COMPLETEDzVideo generation failed: z!Video generation timed out after s)MEDIA_GENERATION_STATUS_FAILED!MEDIA_GENERATION_STATUS_CANCELLED)rl   POLL_TIMEOUTr4   ri   
STATUS_URLr]   rQ   rR   r,   sleepPOLL_INTERVALrg   rh   rS   TimeoutError)
r5   r   r   r   startbodyrU   rV   opsops
   &&&       r8   _poll_status#GoogleVeoVideoProvider._poll_status!  s;   2		iikE!L0#fn%=!8 &D ##((**, ) D
 !!#99;D((<,C

=)QBVVHf-FKK16499;;NO<<	 ? ?"%>vh#GHHJJ}%>|nANOOr;   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r>   
image_pathr   video_promptr@   output_pathon_progresszCallable[[int], None] | Noner?   rA   )rB   s   "r8   rC   rD   S  s<     
 

 
 	

 2
 

r;   c                b   "   \         P                  ! V P                  VV4      G Rj  xL
 #  L5i)zAsync wrapper for image-to-video generation.

Maps ABC signature to internal sync method.
Note: image_path is ignored (Google Veo uses prompt-based generation).
video_prompt is passed as prompt to _generate_sync.
N)asyncio	to_thread_generate_sync)r5   r   r   r   r   s   &&&&&r8   generateGoogleVeoVideoProvider.generateS  s3      &&
 
 	
 
s   &/-/c          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r>   rp   r@   r   z
str | Pathrq   rr   seedz
int | Noner?   r   rA   )rB   s   "r8   rC   rD   f  s<     ? ??  ? )	?
 ? 
?r;   c                t   \        V4      pVP                  P                  RRR7       V'       d   RMRp\        P	                  RWR4       V P                  W4      pVP                  R. 4      pV'       g*   \        R\        P                  ! V4      R,           24      hV^ ,          pVP                  R	/ 4      P                  R
R4      p	VP                  RR4      p
V	'       g*   \        R\        P                  ! V4      R,           24      h\        P	                  RV	4       V P                  W4      pVP                  R4      ;'       g;    VP                  R4      ;'       g"    VP                  R/ 4      P                  R4      pVP                  R4      ;'       g"    VP                  R/ 4      P                  R4      pV'       d   ^ RIpVP                  V4      pMxV'       dL   \        P	                  R4       \        P                  ! V^xRR7      pVP                  4        VP                  pM%\        R\!        VP#                  4       4       24      h\%        VR4      ;_uu_ 4       pVP'                  V4       RRR4       \        P	                  RV\)        V4      4       V#   + '       g   i     L2; i)z Sync implementation of generate.T)parentsexist_okI2VT2Vu)   Generating %s video via Google Veo → %sr   zNo operations: :Ni  Nr   r{   r   r   zNo operation name: zVideo generation started: %sfifeVideoUrlvideoUrlre   encodedVideoNzDownloading video...r#   zNo video URL/data. Keys: wbzVideo saved: %s (%d bytes))r   parentmkdirrg   rh   r   r,   rS   rR   dumpsr   base64	b64decoder2   rQ   contentlistkeysopenwritelen)r5   rp   r   rq   r   modegen_responser   r   r   r   completed_op	video_urlencoded_videor   
video_datadl_respfs   &&&&&             r8   r   %GoogleVeoVideoProvider._generate_syncf  sU    ;'   =,u%?S 11&O |R0L1I$1O0PQRR VR044VR@66)R(!4TZZ^D5I4JKLL2NC ((B ^, B B
+B B"-11.A 	 ^, B B"-11.A 	
 ))-8JKK./ii	3NG$$& J+D1B1B1D,E+FG  +t$$GGJ % 	0+s:O	 %$s   +J''J7	c                	:    V P                   P                  4        R # N)r4   r   rF   s   &r8   r   GoogleVeoVideoProvider.close  s     r;   c                	    V # r   rA   rF   s   &r8   	__enter__ GoogleVeoVideoProvider.__enter__  s    r;   c                	&    V P                  4        R # r   )r   )r5   argss   &*r8   __exit__GoogleVeoVideoProvider.__exit__  s    

r;   )r1   r-   r)   r4   r/   r*   r(   r   )NN)__name__
__module____qualname____firstlineno____doc__r{   r9   rG   rW   r]   rm   r   r   r   r   r   r   r   __static_attributes__rA   r;   r8   r   r   B   sQ     DL@
"
(!J*Pd
&?B!r;   r   )r   
__future__r   r   rR   loggingr&   randomrl   uuidcollections.abcr   pathlibr   typingr   r2   providers.portsr   rO   GENERATE_I2V_URLGENERATE_T2V_URLr   rj   r+   r.   rP   r   r   r   rA   r;   r8   <module>r     s     #    	    $    )
 8c ] `
L  /-)  ,*	 #6& l] lr;   