Ë
    ˆ¾ajq  ã            	       óV  — d 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mZmZmZ  ej                  dej                   «       ej                  dej                   «      fZd	ed
efd„Zddœdedeedf   ded
efd„Zded
efd„Zded
ee   fd„Zdededed
efd„Zded
efd„Zy)a5  
Auto-process Hudl exchanges where the opponent sent video.

Wizard flow per exchange:
1. Open sidebar row ("They sent you video.")
2. Click "Add to Video Library"
3. Modal: "Add without scheduled event"
4. Modal: "Game Footage"
5. Modal: "Add to Video Library" (confirm)
6. Modal: "No, Thanks" (Hudl Assist)
é    N)ÚPage)Úhuman_delay)Úclose_hudl_popups)Ú_ensure_exchange_list_visibleÚ_open_active_exchange_rowÚ_parse_active_exchange_liÚopen_exchangezthey\s+sent\s+you\s+videoz'their\s+video\s+is\s+in\s+your\s+videosÚmessageÚreturnc                 ób   ‡— | xs dj                  «       Š‰syt        ˆfd„t        D «       «      S )NÚ Fc              3   ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­w©N)Úsearch)Ú.0ÚpatternÚtexts     €úT/var/www/html/sergio/sergio-backend/app/automation/tasks/exchange_incoming_videos.pyÚ	<genexpr>z-_is_incoming_video_message.<locals>.<genexpr>%   s   øè ø€ ÐKÑ3J¨ˆw�~‰~˜d×#Ñ3Jùs   ƒ)ÚstripÚanyÚINCOMING_VIDEO_PATTERNS)r
   r   s    @r   Ú_is_incoming_video_messager   !   s-   ø€ ØŠM�r× Ñ Ó"€DÙØÜÓKÕ3JÓKÓKÐKó    g      4@©Ú	timeout_sÚpageÚpatterns.r   c             ƒ   ó²  ‡ K  — t        j                  «       |z   }t        j                  «       |k  �r|D ]Í  }t        j                  |t        j                  «      }|fˆ fd„	|fˆ fd„	|fˆ fd„	fD ]�  }	  |«       j
                  }|j                  «       ƒ d{  –—† dkD  ra|j                  «       ƒ d{  –—† rI|j                  «       ƒ d{  –—†  |j                  d¬«      ƒ d{  –—†  t        dd	«      ƒ d{  –—†    y
Œ’ ŒÏ t        j                  d«      ƒ d{  –—†  t        j                  «       |k  r�Œy7 Œ£7 ŒŠ7 Œt7 Œ\7 ŒJ# t        $ r Y Œáw xY w7 Œ7­w)z?Click the first visible element whose text matches any pattern.c                 ó*   •— ‰j                  d| ¬«      S )NÚbutton©Úname©Úget_by_role©Úpr   s    €r   Ú<lambda>z&_wait_and_click_text.<locals>.<lambda>4   s   ø€  × 0Ñ 0°ÀÐ 0Ô Br   c                 ó*   •— ‰j                  d| ¬«      S )NÚlinkr"   r$   r&   s    €r   r(   z&_wait_and_click_text.<locals>.<lambda>5   s   ø€  × 0Ñ 0°¸aÐ 0Ô @r   c                 ó&   •— ‰j                  | «      S r   )Úget_by_textr&   s    €r   r(   z&_wait_and_click_text.<locals>.<lambda>6   s   ø€  × 0Ñ 0°Ô 3r   Nr   éˆ  ©Útimeoutçš™™™™™é?gffffffö?Tg      Ð?F)ÚtimeÚ	monotonicÚreÚcompileÚIÚfirstÚcountÚ
is_visibleÚscroll_into_view_if_neededÚclickr   Ú	ExceptionÚasyncioÚsleep)r   r   r   Údeadliner   ÚregexÚlocator_factoryÚlocs   `       r   Ú_wait_and_click_textrB   (   s&  øè ø€ ô �~‰~Ó )Ñ+€HÜ
�.‰.Ó
˜XÓ
%ÛˆGÜ—J‘J˜w¬¯©Ó-ˆEàÔBØÔ@ØÔ3ó$�ð
Ù)Ó+×1Ñ1�CØ ŸY™Y›[×(¨1Ò,°s·~±~Ó7G×1GÐ1GØ!×<Ñ<Ó>×>Ð>Ø!Ÿi™i°˜iÓ5×5Ð5Ü)¨#¨sÓ3×3Ð3Ú#øñ$ð  ô  �m‰m˜DÓ!×!Ð!ô# �.‰.Ó
˜XÔ
%ð$ ð )øÐ1GøØ>øØ5øØ3ùä ò Ùðúà!ús–   ƒA0EÁ4$EÂD<ÂEÂ3D>Â4EÃE ÃEÃ%EÃ&EÃ9EÃ:EÃ>EÄEÄEÄ;EÄ<EÄ>EÅ EÅEÅEÅ	EÅEÅEÅEc              ƒ   ó¨  K  — d}|D ]™  }| j                  |«      j                  }	 |j                  «       ƒ d{  –—† dkD  r`|j                  «       ƒ d{  –—† rH|j	                  «       ƒ d{  –—†  |j                  d¬«      ƒ d{  –—†  t        dd«      ƒ d{  –—†   yŒ› t        | d	«      ƒ d{  –—† S 7 Œ}7 Œd7 ŒN7 Œ67 Œ$# t        $ r Y ŒÅw xY w7 Œ­w)
zHClick the blue 'Add to Video Library' button in exchange details header.)z-.ex-details-header .ex-actions .ex-action-addz?.ex-details .ex-actions button:has-text('Add to Video Library')z'button:has-text('Add to Video Library')Nr   r-   r.   ç      ð?çš™™™™™ù?T)zAdd to Video Library)	Úlocatorr6   r7   r8   r9   r:   r   r;   rB   )r   Ú	selectorsÚselectorÚbtns       r   Ú"_click_add_to_video_library_headerrJ   E   sÉ   è ø€ ð€Ió
 ˆØ�l‰l˜8Ó$×*Ñ*ˆð	Ø—Y‘Y“[×  1Ò$¨s¯~©~Ó/?×)?Ð)?Ø×4Ñ4Ó6×6Ð6Ø—i‘i¨�iÓ-×-Ð-Ü! # sÓ+×+Ð+Ùøð ô & dÐ,EÓF×FÐFð !øÐ)?øØ6øØ-øØ+ùäò 	Ùð	úàFúsŒ   ‚#C¦C¹B7ºCÁB9ÁCÁ,B;Á-CÂB=ÂCÂB?ÂCÂCÂ2CÂ3CÂ7CÂ9CÂ;CÂ=CÂ?CÃ	CÃ
CÃCÃCc              ƒ   óØ  K  — g }t        | dd¬«      ƒ d{  –—† r|j                  d«       t        | dd¬«      ƒ d{  –—† r|j                  d«       d}d	}|D ]ƒ  }| j                  |«      j                  }	 |j	                  «       ƒ d{  –—† d
kD  rJ|j                  «       ƒ d{  –—† r2|j                  d¬«      ƒ d{  –—†  t        dd«      ƒ d{  –—†  d} nŒ… |st        | dd¬«      ƒ d{  –—† }|r|j                  d«       t        | dd¬«      ƒ d{  –—† r|j                  d«       t        | «      ƒ d{  –—†  |S 7 �Œ07 �Œ7 ŒÀ7 Œ§7 Œ�7 Œ}# t        $ r Y �Œw xY w7 Œq7 ŒJ7 Œ(­w)z9Run modal steps after 'Add to Video Library' was clicked.)zAdd without scheduled eventzAdd without scheduler eventg      .@r   NÚadd_without_scheduled_event)zGame FootageÚgame_footage)z7[role='dialog'] button:has-text('Add to Video Library')z2.uni-modal button:has-text('Add to Video Library')z.footer button:has-text('Add to Video Library')Fr   r-   r.   rD   rE   T)z^Add to Video Library$g      $@Úconfirm_add_to_library)z
No, Thanksz	No thanksÚhudl_assist_declined)
rB   ÚappendrF   r6   r7   r8   r:   r   r;   r   )r   Ústeps_completedÚconfirm_selectorsÚ	confirmedrH   rI   s         r   Ú_complete_add_to_library_wizardrT   Y   s�  è ø€ à!#€Oä!Øð	
ð ô÷ ð ð 	×ÑÐ<Ô=ä! $Ð(:ÀdÔK×KÐKØ×Ñ˜~Ô.ðÐð
 €IÛ%ˆØ�l‰l˜8Ó$×*Ñ*ˆð	Ø—Y‘Y“[×  1Ò$¨s¯~©~Ó/?×)?Ð)?Ø—i‘i¨�iÓ-×-Ð-Ü! # sÓ+×+Ð+Ø �	Ùøð &ñ Ü.ØØ(Øô
÷ 
ˆ	ñ
 Ø×ÑÐ7Ô8ä!ØØ%Øô÷ ð ð
 	×ÑÐ5Ô6ä
˜DÓ
!×!Ð!ØÐð]ùð Lùð !øÐ)?øØ-øØ+ùô ò 	Úð	úð
øðøð "ús»   ‚E*–E—&E*½E	¾9E*Á8EÂEÂEÂ&EÂ'EÃ EÃEÃEÃEÃE*Ã2E$Ã3(E*ÄE&Ä#E*Ä?E(Å E*Å	E*ÅEÅEÅEÅEÅ	E!ÅE*Å E!Å!E*Å&E*Å(E*ÚrowÚindexc              ƒ   ó˜  K  — |j                  d«      xs d}	 t        | d¬«      ƒ d {  –—† }|j                  |«      }t        | ||«      ƒ d {  –—† }| j	                  d«      j
                  }|j                  dd¬«      ƒ d {  –—†  t        d	d
«      ƒ d {  –—†  t        | «      ƒ d {  –—† sd|d| j                  dœS t        | «      ƒ d {  –—† }d||j                  d«      xs d|j                  d«      xs ||| j                  dœS 7 Œä7 ŒÀ7 ŒŒ7 Œz7 Œi7 ŒG# t        $ r$}	d|t        |	«      | j                  dœcY d }	~	S d }	~	ww xY w­w)Nr#   r   T©Úfull_scrollzdiv.ex-detailsÚvisiblei˜:  )Ústater/   r0   g333333ó?Úerrorz&Add to Video Library button not found.)Ústatusr#   r
   ÚurlÚokÚprocessÚhref)r]   r#   r
   ra   Úwizard_stepsr^   )Úgetr   Únthr   rF   r6   Úwait_forr   rJ   r^   rT   r;   Ústr)
r   rU   rV   Úschool_nameÚlist_locatorÚliÚ
opened_urlÚdetails_panerb   Úexcs
             r   Ú!_process_single_incoming_exchangerm   Ž   sP  è ø€ ð
 —'‘'˜&“/Ò' R€Kð!
Ü:¸4ÈTÔR×RˆØ×Ñ˜eÓ$ˆä4°T¸2¸{ÓK×Kˆ
Ø—|‘|Ð$4Ó5×;Ñ;ˆØ×#Ñ#¨)¸UÐ#ÓC×CÐCÜ˜#˜sÓ#×#Ð#ä7¸Ó=×=Ð=à!Ø#ØCØ—x‘xñ	ð ô =¸TÓB×Bˆð ØØ—w‘w˜yÓ)Ò/¨RØ—G‘G˜F“OÒ1 zØ(Ø—8‘8ñ
ð 	
ð% Søð LøàCøØ#øà=øð Cùô ò 
àØÜ˜3“xØ—8‘8ñ	
õ 	
ûð
üsª   ‚E
™D ©Dª%D ÁDÁ5D ÂDÂD ÂDÂD Â,DÂ-D ÃE
ÃD ÃDÃ<D ÄE
ÄD ÄD ÄD ÄD ÄD ÄD Ä	EÄ#EÄ<EÄ=E
ÅEÅE
c              ƒ   ó�  K  — d| j                   j                  «       vrt        | «      ƒ d{  –—†  nt        | «      ƒ d{  –—†  g }g }d}t	        |«      D �]  }t        | d¬«      ƒ d{  –—† }|j                  «       ƒ d{  –—† }d}t	        |«      D ]L  }t        |j                  |«      |«      ƒ d{  –—† }	|	sŒ)t        |	j                  d«      xs d«      sŒH||	f} n |s n{|\  }
}	t        | |	|
«      ƒ d{  –—† }|j                  d«      d	k(  r|j                  |«       n|j                  |«       t        | «      ƒ d{  –—†  t        d
d«      ƒ d{  –—†  �Œ |s|s	d	ddg g ddœS d	dt        |«      t        |«      ||dt        |«      › d�|rdt        |«      › d�z   dœS dz   dœS 7 �Œ„7 �Œs7 �ŒL7 �Œ77 �Œ7 ŒÂ7 Œz7 Œh­w)z¥
    Find all exchanges with incoming video messages and add them to the library.
    Re-scans the sidebar after each item because indices shift once processed.
    ÚexchangeNé2   TrX   r`   r   r]   r_   g      à?rD   Ú process_incoming_video_exchangesr   z"No incoming video exchanges found.)r]   ÚactionÚprocessed_countÚ	processedÚerrorsr
   z
Processed z incoming video exchange(s)z; z failed.Ú.)r]   rr   rs   Úerror_countrt   ru   r
   )r^   Úlowerr	   r   Úranger   r7   r   rd   r   rc   rm   rP   r   Úlen)r   rt   ru   Ú
max_passesÚ_rh   r7   Ú	next_itemÚirU   rV   Úresults               r   rq   rq   ¸   sè  è ø€ ð
 ˜Ÿ™Ÿ™Ó)Ñ)Ü˜DÓ!×!Ñ!ä Ó%×%Ð%à€IØ€FØ€Jä�:×ˆÜ:¸4ÈTÔR×RˆØ"×(Ñ(Ó*×*ˆà-1ˆ	Ü�u–ˆAÜ1°,×2BÑ2BÀ1Ó2EÀqÓI×IˆCÙØÜ)¨#¯'©'°)Ó*<Ò*BÀÕCØ ˜H�	Ùð ñ Ùà‰
ˆˆsÜ8¸¸sÀEÓJ×JˆØ�:‰:�hÓ 4Ò'Ø×Ñ˜VÕ$à�M‰M˜&Ô!Ü Ó%×%Ð%Ü˜#˜sÓ#×#Ò#ð/ ñ2 ™VàØ8Ø ØØØ;ñ
ð 	
ð Ø4Ü˜y›>Ü˜6“{ØØàœ˜Y›Ð(Ð(CÐDÙ-3�”C˜“K�= Ð)ñ>ñð ð :=ñ>ñð ðW 	"ùà%ùð SùØ*ùð Jùð Køð
 	&øØ#ús•   ‚+G­F1®GÁF4Á)GÁ+F7Á,GÂF:Â2GÂ6F=Â7%GÃ GÃ=G Ã>A	GÅGÅGÅGÅAGÆ4GÆ7GÆ:GÆ=GÇ GÇGÇG)Ú__doc__r<   r3   r1   Úplaywright.async_apir   Úapp.automation.helpersr   Úapp.automation.tasks.popupr   Úapp.automation.tasks.exchanger   r   r   r	   r4   r5   r   rf   Úboolr   ÚtupleÚfloatrB   rJ   ÚlistrT   ÚdictÚintrm   rq   © r   r   Ú<module>rŒ      s  ðñ
ó Û 	Û å %å .Ý 8÷ó ð €B‡J�JÐ+¨R¯T©TÓ2Ø€B‡J�JÐ9¸2¿4¹4Ó@ðÐ ðL¨ð L°ó Lð ò	Ø
ðà�C˜�H‰oðð ð	ð
 
óð:G°4ð G¸Dó Gð(2°ð 2¸¸c¹ó 2ðj'
Ø
ð'
à	ð'
ð ð'
ð 
ó	'
ðT<°ð <¸$ô <r   