
    @j	&                     |   S r SSKrSSKrSSKrSSKrSSKJrJr  SSKJr  SSK	J
r
Jr  \" \5      R                  5       R                  r\S-  r\S-  rSrS	rS
rSrSrSrSrSrS rS\4S jrS rS rS\4S jr S r!S r"S r#\$S:X  a   \RJ                  " \#" 5       5        gg! \& a    \" S5        \'" SSS9   gf = f)a6  
NW AL Scanner Baron Lightning Bridge v001
-----------------------------------------
Loads the organization's authorized Baron widget in installed Google Chrome,
captures live Alabama lightning responses, and writes a normalized local file:

    baron_lightning.json

Output format matches the existing V3 broadcast lightning consumer:
    [{"lat": 34.8, "lon": -87.7, "t": 1784235000000}, ...]

Requirements:
    py -m pip install playwright

This script uses the already-installed Google Chrome channel, so a separate
Playwright Chromium download is not required.
    N)datetimetimezone)Path)async_playwrightTimeoutErrorzbaron_lightning.jsonzbaron_lightning_status.jsonzhttps://staticbaronwebapps.velocityweather.com/digitial_wx/widgets/mapv2/index.html?initjson=/digitial_wx/widgets/dcms/017da136-5149-4082-aed2-93cd4f1a1683/live/init.json#8.58/34.774/-87.6187g      B@g     @@g      Vg      Ui  i,    c                      [         R                  " [        R                  5      R	                  5       R                  SS5      $ )N+00:00Z)r   nowr   utc	isoformatreplace     baron_lightning_bridge_v001.pyutc_now_isor   3   s+    <<%//199(CHHr   pathc                     U R                  U R                  S-   5      nUR                  [        R                  " USS9SS9  UR                  U 5        g )Nz.tmp   )indentzutf-8)encoding)with_suffixsuffix
write_textjsondumpsr   )r   payloadtemps      r   write_json_atomicr    6   sB    DKK&01DOODJJwq1GODLLr   c                 D    SU [        5       S.UEn[        [        U5        g )Nbaron)providerstateupdated)r   r    STATUS_FILE)r$   extrar   s      r   write_statusr(   ;   s*    = 	G k7+r   c                 0   [        U [        5      (       d  / $ [        [        R                  " 5       S-  5      n[	        5       n/ nU  GH  n[        U[
        5      (       d  M  UR                  S5      =(       d)    UR                  S5      =(       d    UR                  S5      n[        U[        [        45      (       a  [        U5      S:  a  M   [        US   5      n[        US   5      nUR                  S5      =(       d)    UR                  S	5      =(       d    UR                  S
5      nS n	[        U[        [        45      (       a  [        U5      n	U	S:  a  U	S-  n	OV[        U[        5      (       aA   [        [        R                  " UR                  SS5      5      R!                  5       S-  5      n	U	c  GMv  X-
  S:  a  GM  X-
  S:  a  GM  [#        US5      [#        US5      [#        U	S-  5      4n
X;   a  GM  UR%                  U
5        UR'                  UUU	UR                  SS5      UR                  S5      UR                  S5      S.5        GM     UR)                  S S9  U$ ! [        [        4 a     GM;  f = f! [         a     GMM  f = f)Nr   coordinatescoordlocationr   r      time	timestamptl    J)r   r
   iO i    type 	intensitymultiplicity)latlonr0   r2   r4   r5   c                     U S   $ )Nr0   r   )strikes    r   <lambda>#normalize_payload.<locals>.<lambda>   s    6#;r   )key)
isinstancelistintr.   setdictgettuplelenfloat	TypeError
ValueErrorstrr   fromisoformatr   r/   roundaddappendsort)r   now_msseenoutputitemcoordsr7   r6   raw_timets_msr<   s              r   normalize_payloadrU   D   s:   gt$$	t#$F5DF$%%-(UDHHW,=U*AU&4-00CK!O	q	"Cq	"C 88F#Mtxx'<Mhe--ME((#&&**8+;+;C+JKUUWZ^^ = >N*>M)S!}eCmU54<-@A;HHVR(+. HH^4
 	W h KK.K/MU :& 		  s%   I.7A J.JJ
JJurlc                     SU ;   =(       ai    S[        [        5       3U ;   =(       aM    S[        [        5       3U ;   =(       a1    S[        [        5       3U ;   =(       a    S[        [        5       3U ;   $ )Nz/reports/lightning/region.jsonzn_lat=zs_lat=zw_lon=ze_lon=)r?   TARGET_NORTHTARGET_SOUTHTARGET_WESTTARGET_EAST)rV   s    r   is_target_regionr\      s{    (C/ 	/S&'(C/	/S&'(C/	/ S%&'3.	/ S%&'3.r   c                   #    U R                  SSS9U R                  SSS9U R                  S5      U R                  S5      U R                  S5      /nU HO  n UR                  5       I Sh  vN (       a.  UR                  R	                  S	SS
9I Sh  vN   [        SSS9    gMQ     U R                  S5      U R                  S5      U R                  S5      U R                  S5      /nU H  n UR                  5       I Sh  vN (       a  UR                  R	                  SSS
9I Sh  vN   U R                  S5      I Sh  vN   U R                  SSS9nUR                  5       I Sh  vN (       a.  UR                  R	                  S	SS
9I Sh  vN   [        SSS9    gM  M     [        SSS9  g GNH GN$! [         a     GMs  f = f N N N Nf NA! [         a     M  f = f7f)zq
Attempts several UI strategies because Baron may alter markup while keeping
the visible product name unchanged.
	LightningT)exact	LIGHTNINGztext=Lightningz[title*="Lightning" i]z[aria-label*="Lightning" i]Ni  )timeoutforcez [BARON] Lightning layer clicked.flushz[aria-label*="layer" i]z[title*="layer" i]zbutton:has-text("Products")zbutton:has-text("Layers")i	  i   z*[BARON] Lightning layer enabled from menu.zJ[BARON] Could not positively click Lightning; waiting for widget requests.F)get_by_textlocatorcountfirstclickprint	Exceptionwait_for_timeout)page
candidatesrf   menu_candidates	lightnings        r   enable_lightningrq      s     	D1D1%&-.23J 	]]_$$mm))$d)CCC8E %  	./)*2301	O #
	]]_$$mm))$d)CCC++C000 ,,[,E	"***#////D/IIIFdS +	 % # 

V^bc; %C  		 %C0*I  		s   AG'F:,F4-&F:F7F:"AG'0GG&G*G+GG'G+G,&GGG!G'4F:7F::
G	G'G		G'GGGGG
G$ G'#G$$G'c                    ^^	^
#    Sm	Sm
[         R                  " 5       m[        5        IS h  vN n U R                  R	                  SS/ SQS9I S h  vN nUR                  SSS	.S
S9I S h  vN nUR                  5       I S h  vN nUU	U
4S jnUR                  SU5          TR                  5         [        SSS9  [        ST
S9  UR                  [        SSS9I S h  vN   UR                  S5      I S h  vN   [        U5      I S h  vN    [         R                  " TR!                  5       SS9I S h  vN   [$        R$                  " 5       n[$        R$                  " 5       U-
  [&        :  a}  T	(       a  [$        R$                  " 5       T	-
  OS nUb  U[(        :  a  [        ST
[+        U5      S9  UR                  S5      I S h  vN   [$        R$                  " 5       U-
  [&        :  a  M}  [        SSS9  GMY   GN GN GN GN GN( GN GN N! [         R"                   a    [        SSS9   Nf = f Nn! [,         a>  n[        SU 3SS9  [        SSU 3S 9  UR                  S5      I S h  vN     S nANS nAf[.         aD  n[        S!U 3SS9  [        S[1        U5      S 9  UR                  S5      I S h  vN     S nANS nAff = f! , IS h  vN  (       d  f       g = f7f)"Ng        r   chromeT)z--disable-gpuz--disable-dev-shm-usagez--no-first-runz--no-default-browser-check)channelheadlessargsi  i  )widthheightzen-US)viewportlocalec                   >#    [        U R                  5      (       d  g  U R                  5       I S h  vN n[        U5      n[	        [
        U5        [        R                  " 5       m[        U5      m[        STU R                  R                  S5      S   S-   SS9  [        ST S3SS	9  TR                  5         g  N! [         a*  n[        S
U 3SS	9  [        S[        U5      S9   S nAg S nAff = f7f)Nlivez&sig=r   z&sig=REDACTED)strike_count
source_urlage_secondsz$[BARON] Captured Alabama lightning: z recent strikesTrc   z[BARON] Response parse failed: errorr   )r\   rV   r   rU   r    OUTPUT_FILEr.   rD   r(   splitrj   r@   rk   rH   )responser   strikesexccapture_eventlast_capturelatest_counts       r   handle_response#run_bridge.<locals>.handle_response   s      $HLL116 (/+G4!+w7#yy{"7|!-'||11':1=O !	 :<.X !!## 0$  67u=TJWCH56s?   C6B? B=BB? <C6=B? ?
C3	 C.)C6.C33C6r   z$[BARON] Loading authorized widget...rc   loadingr}   domcontentloadediȯ  )
wait_untilra   i  -   )ra   z3[BARON] No Alabama lightning response captured yet.stale)r}   r   i:  z9[BARON] Refreshing widget for a new authorization window.z[BARON] Widget timeout: r   zWidget timeout: r   z[BARON] Bridge error: )asyncioEventr   chromiumlaunchnew_contextnew_pageonclearrj   r(   goto
WIDGET_URLrl   rq   wait_forwaitr   r.   RELOAD_EVERY_SECONDSSTALE_AFTER_SECONDSr?   PlaywrightTimeoutErrorrk   rH   )pbrowsercontextrm   r   cycle_startedager   r   r   r   s           @@@r   
run_bridger      s    LLMMOM!!Q

)) * 	
 	
  ++#s3 , 
 
 %%''	6: 	
O,#4##%<DIY\Bii
7ISYiZZZ++D111&t,,,]!**=+=+=+?LLL !%		iikM14HH8D$))+4$C31D+D$#)5(+C //777 iikM14HH QY]^7 c "	

 (N [1, M++ ]OW[\] 8 * 406dCW.>se,DE++F333 4.se4DAWCH5++F3334e "!!s;  (K,G>K,!KHK-H.KHK&<H;"H
#H;;H<H;HH;&H:H;H?BH;
H9$H;1
H;;K>K,KKK
H;H;H;HH63H;5H66H;;
K.I>3I64I>9K>K4K
?K K
K
KKK)KK)%K,c                     #    [         R                  5       (       d  [        [         / 5        [        SSS9  [	        5       I S h  vN   g  N7f)Nstartingr   r   )r   existsr    r(   r   r   r   r   mainr     s3     +r*!,
,s   AAA	A__main__stoppedz
[BARON] Bridge stopped.Trc   )(__doc__r   r   osr.   r   r   pathlibr   playwright.async_apir   r   r   __file__resolveparentBASE_DIRr   r&   r   rX   rY   rZ   r[   r   r   PAGE_SIZE_LIMITr   r    r(   rU   rH   r\   rq   r   r   __name__runKeyboardInterruptrj   r   r   r   <module>r      s  $   	  '  Y>!!#**//66    ID 
,=~# ,\Z4x z7DF   7Y)67s   
B# #B;:B;