
    @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  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   \RP                  " \&" 5       5        gg! \) a    \ " S5        \*" SSS9   gf = f) a6  
NW AL Scanner Baron Lightning Bridge v002
-----------------------------------------
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)urlparseparse_qs)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_v002.pyutc_now_isor   4   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"   7   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                 8   [        U [        5      (       ao  U R                  S5      n[        U[        5      (       a  UR                  S/ 5      n O6[        U R                  S5      [        5      (       a  U R                  S/ 5      n [        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)N	lightningdatar
   coordinatescoordlocationr   r      time	timestamptl    J)r   r   iO i    type 	intensitymultiplicity)latlonr4   r6   r8   r9   c                     U S   $ )Nr4   r   )strikes    r   <lambda>#normalize_payload.<locals>.<lambda>   s    6#;r   )key)
isinstancedictgetlistintr2   settuplelenfloat	TypeError
ValueErrorstrr   fromisoformatr   r3   roundaddappendsort)r    r,   now_msseenoutputitemcoordsr;   r:   raw_timets_msr@   s               r   normalize_payloadrY   E   s    '4  KK,	i&&mmFB/GF+T22kk&"-G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
 	U f KK.K/MS :& 		  s%   K2;A L
2LL

LLurlc                 |   SU ;  a  g [        [        U 5      R                  5      n[        US   S   5      n[        US   S   5      n[        US   S   5      n[        US   S   5      nSnS	nX6s=:*  =(       a    U:*  Os  =(       a    XGs=:*  =(       a    U:*  $ s  $ ! [        [
        [        [        4 a     gf = f)
N/reports/lightning/region.jsonFn_latr   s_latw_lone_longffffffA@gQU)r   r   queryrI   KeyError
IndexErrorrJ   rK   )rZ   ra   northsouthwesteast
shoals_lat
shoals_lons           r   is_target_regionrj      s    's2#,,-eGnQ'(eGnQ'(U7^A&'U7^A&' JJ''%'FD,F,F$,FF,FF j)Z8 s   A"B B;:B;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
candidatesrt   menu_candidatesr,   s        r   enable_lightningr~      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                 @  >#    SU R                   ;  a  g [        U R                   5      (       d  g [        SU R                    3SS9   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)Nr\   z2[BARON] Found Shoals-containing lightning region: Trq   livez&sig=r   z&sig=REDACTED)strike_count
source_urlage_secondsz*[BARON] Captured Shoals-region lightning: z recent strikesz[BARON] Response parse failed: errorr   )rZ   rj   rx   r   rY   r"   OUTPUT_FILEr2   rH   r*   splitrF   ry   rL   )responser    strikesexccapture_eventlast_capturelatest_counts       r   handle_response#run_bridge.<locals>.handle_response   s     0x||C#HLL11Fx||nU]ab6 (/+G4!+w7#yy{"7|!-'||11':1=O !	 @o^ !!## 0$  67u=TJWCH56sC   ADC' C%BC' $D%C' '
D1 DDDDr   z$[BARON] Loading authorized widget...rq   loadingr   domcontentloadediȯ  )
wait_untilro   i  K   )ro   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clearrx   r*   goto
WIDGET_URLrz   r~   wait_forwaitr	   r2   RELOAD_EVERY_SECONDSSTALE_AFTER_SECONDSrE   PlaywrightTimeoutErrorry   rL   )pbrowsercontextr{   r   cycle_startedager   r   r   r   s           @@@r   
run_bridger      s    LLMMOM!!Q

)) * 	
 	
  ++#s3 , 
 
 %%'' 	6D 	
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 m "	

 (X [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4o "!!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.Trq   )+__doc__r   r   osr2   r   r   pathlibr   urllib.parser   r   playwright.async_apir   r	   r   __file__resolveparentBASE_DIRr   r(   r   TARGET_NORTHTARGET_SOUTHTARGET_WESTTARGET_EASTr   r   PAGE_SIZE_LIMITr   r"   r*   rY   rL   rj   r~   r   r   __name__runKeyboardInterruptrx   r   r   r   <module>r      s  $   	  '  + Y>!!#**//66    ID 
,ENG# G$,\_4B z7DF   7Y)67s   B+ +CC