
    $i:C                        S SK rS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrSrSrSrSrSrSS jrS rS	 rS
 rS rS rS rS r " S S\R2                  R4                  5      r\R8                  " S5        \R2                  R;                  S\5      r\R>                  " \R@                  SS9RC                  5         \R2                  R;                  S\5      r"\RF                  " \RH                  5      r%\%RM                  SS5        \%RO                  \"RP                  SS9\"l(        \)" S5        \"RA                  5         g)    Nz9https://second-brain-dumb-bug-baby.aws-us-west-2.turso.ioa  eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhIjoicnciLCJnaWQiOiI3MzlkODUzZS1mYTY1LTRiNTEtYjMzNC0xMmVmNTIzNDE4NGMiLCJpYXQiOjE3NzgyNzk4MDUsInJpZCI6ImRkM2RlMmQ0LTQwNDMtNDgyMy1hNGQzLTAzODJiYWNkMTQ0MiJ9.ivgVUS97cRk2KegeLqo0rJLvsZ3XtkSi8vCad3tr8xCUqsR-p1wruM4sJII3aSXEVj6Q6FNRMwIq9V1M0LO4CA2f5f60ce59amshf959c091a474e92p1063ddjsn7fb5e4ab36cc.apify_api_3AYc8MshFJclANE1uhywz5ofGcV7Ak0qY9A5zl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                    SSX=(       d    / S.S.SS0/0n[         R                  R                  [         S3[        R
                  " U5      R                  5       S[         3S	S
.SS9n[         R                  R                  U5       n[        R                  " UR                  5       5      sS S S 5        $ ! , (       d  f       g = f)Nrequestsexecute)sqlargs)typestmtr
   close/v2/pipelineBearer application/jsonAuthorizationContent-TypePOSTdataheadersmethod)urllibrequestRequest	TURSO_URLjsondumpsencodeTURSO_TOKENurlopenloadsread)r   r	   payloadreqresps        "/home/ubuntu/second-brain/serve.pyturso_executer'      s    YZUW8XY\bdk[lmnG
..
 
 +\"ZZ '')$+K="9K]^	 ! C 
			$zz$))+& 
%	$	$s   	$B77
Cc                 	  ^ [         R                  R                  SU  3S[        S.S9n[         R                  R	                  USS9 n[
        R                  " UR                  5       5      nS S S 5        WR                  S0 5      nUR                  S5      =(       d    UR                  S	5      =(       d    / n/ nU H  n[        U[        5      (       ax  UR                  S
0 5      R                  S/ 5      n	U	(       a!  [        U	S S9n
UR                  U
S   5        Mb  UR                  S5      (       a  UR                  US   5        M  M  [        U[        5      (       d  M  UR                  U5        M     U Vs/ s H%  o(       d  M  UR                  S5      (       d  M#  UPM'     snS S nUR                  S0 5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nU SU SU SU 3R                  S5      nUR                  SS5      n[        U[         ["        45      (       a  SUS S3O
[        U5      nUR                  SS5      nUR                  SS5      nU(       a  U(       a  U SU S 3OSnUR                  S!0 5      =(       d    0 nUR                  S"5      =(       d    UR                  S"5      =(       d    SnUR                  S#5      =(       d    UR                  S$5      =(       d    SnU(       a  U S%3OSnUR                  S&5      nU(       a  US'-  nUR                  S(5      nU(       a/  US)[        U[$        5      (       a  SR'                  U5      OU S*3-  nU=(       d    SR)                  5       n[        U5      R)                  5       nUS-   U-   mUUR                  S+5      =(       d    U=(       d    SUUUUUR                  5       [+        U4S, jS- 5       5      (       a  S.OS/[+        U4S0 jS1 5       5      (       a  S.OS/S2T;   a  S.OS/S/[+        U4S3 jS4 5       5      (       a  S.OS/[+        U4S5 jS6 5       5      (       a  S.OS/[+        U4S7 jS8 5       5      (       a  S.OS/[+        U4S9 jS: 5       5      (       a  S.OS/S;.nUU4$ ! , (       d  f       GNZ= fs  snf )<NzHhttps://real-time-real-estate-data.p.rapidapi.com/property-details?zpid=z)real-time-real-estate-data.p.rapidapi.com)zx-rapidapi-hostzx-rapidapi-key)r      timeoutr   photosresponsivePhotosmixedSourcesjpegc                 &    U R                  SS5      $ )Nwidthr   )get)xs    r&   <lambda>#fetch_zillow_full.<locals>.<lambda>0   s    gq0A    )keyurlhttp   addressstreetAddress citystatezipcodez,  price$,z/mobedrooms	bathroomszbd / ba	resoFactsdescription
livingArealivingAreaValuez sqft. petsAllowedzPets allowed. parkingFeaturesz	Parking: z. neighborhoodc              3   ,   >#    U  H	  oT;   v   M     g 7fN .0wcombineds     r&   	<genexpr>$fetch_zillow_full.<locals>.<genexpr>_   s     p6oH}6o   )z
bay windowznatural lightbrightsunnywindows   r   c              3   ,   >#    U  H	  oT;   v   M     g 7frP   rQ   rR   s     r&   rV   rW   `   s     c3baM3brX   )hardwoodz
wood floorz	oak floorparquet
dishwasherc              3   ,   >#    U  H	  oT;   v   M     g 7frP   rQ   rR   s     r&   rV   rW   c   s     m7l!X7lrX   )elevatorzground floorzfirst floorz	no stairsc              3   ,   >#    U  H	  oT;   v   M     g 7frP   rQ   rR   s     r&   rV   rW   d   s      t8s1h8srX   )balconypatiodeckgardenyardterraceroofc              3   ,   >#    U  H	  oT;   v   M     g 7frP   rQ   rR   s     r&   rV   rW   e   s     s4rq(]4rrX   )bathtubzsoaking tubzbath tubz
shower/tubz
tub/showerc              3   ,   >#    U  H	  oT;   v   M     g 7frP   rQ   rR   s     r&   rV   rW   f   s     g4fq(]4frX   )z	gas stovez	gas rangezgas ovenzgas cooking)r;   hoodrB   bedsr8   rI   notes
feat_lightfeat_hwfeat_dw
feat_ferryfeat_accessfeat_outdoorfeat_tubfeat_gas)r   r   r   RAPIDAPI_KEYr    r   r!   r"   r2   
isinstancedictmaxappendstr
startswithstripintfloatlistjoinlowerany) zpidr8   r$   r%   dr   
raw_photosr,   pjpegsbestaddrstreetr>   r?   r@   r;   	price_rawrB   ro   bathsbeds_strrH   rI   sqftrp   
pet_policyparking
desc_lower
reso_lowerlistingrU   s                                   @r&   fetch_zillow_fullr      s&   
..
 
 
RSWRXYJ*
 ! C 
		R		0DJJtyy{# 
155D (#Itxx0B'CIrJFaEE."-11&"=E5&ABd5k*uah' 3MM!   >A1af)=a>sCF 88Ir"DXXor*F88FBDHHWb!Ehhy"%G4&5'7)4::4@G"%I$.y3,$G$Ga	!}C SQZ^E88J#DHH["%E*.5$uUG2&bHb)/RI((=)OY]]=-IORK88L!FTXX.?%@FBD $tfG"E}-J!!mm-.G9:gt3L3LTYYw/RYZZ\]] #**,JY%%'JC*,H (6D6B"p6opppavwc3bccc1ij$01am7lmmmqst  t8s tttz{s4rsssAyzg4fgggAmnG" F?G 
1	0" ?s   %S =
SS#S 
Sc           
         SS K n[        R                  R                  S[         3[
        R                  " S[        U 5      /05      R                  5       SS0SS9n[        R                  R                  USS	9 n[
        R                  " UR                  5       5      nS S S 5        WS
   S   n[        S5       H  nUR                  S5        [        R                  R                  SU S[         35      n[        R                  R                  USS	9 n[
        R                  " UR                  5       5      nS S S 5        WS
   S   S:X  d  M    O   WS
   S   n	[        R                  R                  SU	 S[         35      n
[        R                  R                  U
SS	9 n[
        R                  " UR                  5       5      nS S S 5        / nW H  nSU;   ag  XS    Vs/ s HR  n[        U[        [        45      (       d  M   UR!                  S5      =(       d    UR!                  S5      =(       d    UPMT     sn-  nMp  SU;   d  Mx  XS   -  nM     U Vs/ s H4  n[        U[        5      (       d  M  UR#                  S5      (       d  M2  UPM6     snS S $ ! , (       d  f       GN= f! , (       d  f       GN{= f! , (       d  f       N= fs  snf s  snf )Nr   zVhttps://api.apify.com/v2/acts/zillowscraper~zillow-property-images-fetcher/runs?token=zpidsr   r   r   r   r)   r*   r   id      z$https://api.apify.com/v2/actor-runs/z?token=   status	SUCCEEDEDdefaultDatasetIdz"https://api.apify.com/v2/datasets/z/items?token=imagesr8   srcr,   r9   r:   )timer   r   r   APIFY_TOKENr   r   r~   r   r    r!   r"   rangesleeprz   r{   r2   r   )r   r   	start_reqr%   run_datarun_id_
status_reqr   
dataset_id	items_reqitemsr,   itemimgr   s                   r&   fetch_zillow_photosr   j   sY   &&
`al`mnZZ3t9+./668!34	 ' I 
			2		6$::diik* 
7fd#F2Y

1^^++26('+O

 ^^##J#;tZZ		,F <&>(#{2   23J&&
,ZLk]SI 
			2		6$

499;' 
7Ftx.y.3\fgjmqsvlw\x>swwu~>>3>.yyF8n$F	 
 Mv!As!3AV8LAvMcrRR1 
7	6 <; 
7	6
 z NsB   :%J%J.#%K $K6KK8KK
J+.
J=	 
Kc                 T    / nSU;   a8  SS K nUR                  " SU5      nU(       a  [        UR                  S5      5      nU(       d  [	        U5      u  pRU(       a5  [        S[        [        R                  " U5      5      [        U 5      /5        g g ! [         a
  n S nAg S nAff = f)N
zillow.comr   /(\d+)_zpidr\   zOUPDATE apartment_listings SET photos=?, updated_at=CURRENT_TIMESTAMP WHERE id=?)
researchr   group	fetch_urlr'   argr   r   	Exception)lidr8   r,   r   mr   es          r&   fetch_photos_backgroundr      s    3		.#.A,QWWQZ8!#IAaTZZ'(#c(3 
  s   BB 
B'"B'c                    SS K nSS KnUR                  R                  SS5        SSKJn  U" 5        nUR                  R                  5       n0 nSU ;   a   [        S5       nUR                  U5      nS S S 5        UR                  SS9n	/ n
W H}  nUS   US	   US
   UR                  SS5      UR                  SS5      UR                  SS5      S.nUR                  S5      (       a  [        US   5      US'   U
R                  U5        M     U	R                  U
5        OUR                  5       n	U	R!                  5       nUR#                  U SSS9  UR%                  S5        UR'                  5       nUR)                  S5      nUR+                  5         S S S 5        UU4$ ! , (       d  f       GN4= f! [         a  nUR                  5       n	 S nANS nAff = f! , (       d  f       WW4$ = f)Nr   z0/home/ubuntu/.local/lib/python3.13/site-packages)sync_playwrightr   z-/home/ubuntu/second-brain/zillow_cookies.jsonzuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36)
user_agentnamevaluedomainpath/secureFhttpOnly)r   r   r   r   r   r   expirationDateexpiresdomcontentloadedi`  )
wait_untilr+   i  a  () => {
            const imgs = Array.from(document.querySelectorAll('img'));
            return imgs
                .map(img => img.src)
                .filter(src => src && src.startsWith('http') && !src.includes('logo') && !src.includes('icon') && !src.includes('avatar') && !src.includes('sprite') && (src.includes('.jpg') || src.includes('.jpeg') || src.includes('.png') || src.includes('.webp')))
                .slice(0, 20);
        })sysr   r   insertplaywright.sync_apir   chromiumlaunchopenloadnew_contextr2   r   r}   add_cookiesr   new_pagegotowait_for_timeoutcontentevaluater   )r8   r   _jsonr   r   browsercontext_optsfraw_cookiescontextcookiesccookier   pager   r,   s                    r&   r   r      s   HHOOAIJ3		a**##%30IJa"'**Q-K K!--  W .  $A !&	!"7"#H+ !fc 2"#%%%"8$%EE*e$<F uu-..,/2B0C,Dy)NN6* % ##G, ))+G!		#"4e	Dd#,,.    	O 
P F?G KJ&  0!--/01 
	P F?sO   #GF2!F 3B-F2 A4G 
F/	*F22
G<GGGG
G*c                    U S S n[        SS5       nUR                  5       R                  SU5      R                  SU5      nS S S 5        SSSWS	./S
.n[        R                  R                  S[        R                  " U5      R                  5       [        SSS.SS9n[        R                  R                  USS9 n[        R                  " UR                  5       5      nS S S 5        WS   S   S   R                  5       n	[        R                  " SSU	5      n	[        R                  " SSU	5      n	[        R                  " U	5      $ ! , (       d  f       GN= f! , (       d  f       N= f)N@  z,/home/ubuntu/second-brain/listing_prompt.txtrz{url}z{html}zclaude-sonnet-4-5-20250929i  user)roler   )model
max_tokensmessagesz%https://api.anthropic.com/v1/messagesz
2023-06-01r   )z	x-api-keyzanthropic-versionr   r   r   r)   r*   r   r   textz^```json\s*r=   z\s*```$)r   r"   replacer   r   r   r   r   r   ANTHROPIC_API_KEYr    r!   r   r   sub)
htmlr8   	truncatedr   promptr#   r$   r%   r   r   s
             r&   claude_extractr      s;   VeI	<c	Ba!!'3/77)L 
C .$89G
 ..
 
 /ZZ '')*!-.

  ! 	C 
		R		0Dzz$))+& 
1	?1f%++-D66."d+D66*b$'D::d/ 
C	B$ 
1	0s   1E	=%E	
E
E)c                  p    SS K n U R                  [        R                  " S5      5      R	                  5       $ )Nr      )binasciihexlifyosurandomdecode)r   s    r&   new_idr      s'    BJJqM*1133r6   c                 8    U b  U S:X  a  SS0$ S[        U 5      S.$ )Nr=   r
   nullr   )r
   r   )r~   )vs    r&   r   r      s'    yAGSV,,r6   c                   ,    \ rS rSrS rS rS rS rSrg)Handler   c                 r   [        U R                  R                  SS5      5      nU R                  R	                  U5      n[        SU R                   3SS9  U R                  S:X  a  [        R                  R                  [         S3US[         3S	S
.SS9n [        R                  R                  U5       nUR	                  5       nS S S 5        SnU R!                  UW5        g U R                  S:X  a_   ["        R$                  " U5      n['        US   5      n	U R!                  S["        R(                  " SU	S S 05      R+                  5       5        g U R                  S:X  Ga$   ["        R$                  " U5      nUS   n
SS KnSU
;   ao  UR3                  SU
5      nU(       a  [5        UR7                  S5      U
5      u  pOTU R!                  S["        R(                  " SSS.5      R+                  5       5        g ['        U
5      u  p[9        U	S S U
5      n[;        5       nSn[=        U5      [=        UR                  S5      5      [=        UR                  S5      5      [=        UR                  S 5      5      [=        UR                  S!5      5      [=        S"5      [=        UR                  S5      5      [=        UR                  S#5      5      [=        UR                  S$5      5      [=        ["        R(                  " U5      5      [=        UR                  S%S5      5      [=        UR                  S&S5      5      [=        UR                  S'S5      5      [=        UR                  S(S5      5      [=        UR                  S)S5      5      [=        UR                  S*S5      5      [=        UR                  S+S5      5      [=        UR                  S,S5      5      /nUR                  S5      (       d8  U R!                  S["        R(                  " SS-S.5      R+                  5       5        g [?        UU5        U R!                  S["        R(                  " SUR                  SS.5      UR                  S S/5      US0.5      R+                  5       5        g U R                  S1:X  Ga,   ["        R$                  " U5      nUS   n	UR                  SS/5      n
[        S2U
S S3  S4[A        U	5       S5S6U	;    S7S8U	;    3SS9  SU
;   aB  SS KnUR2                  " SU
5      nU(       a   UR7                  S5      n[5        UU
5      u  pO<0 / pO8[9        U	S S U
5      nUR                  S9/ 5      n[C        U[D        5      (       d  / n[;        5       nSn[=        U5      [=        UR                  S5      5      [=        UR                  S5      5      [=        UR                  S 5      5      [=        UR                  S!5      5      [=        S"5      [=        UR                  S5      5      [=        UR                  S#5      5      [=        UR                  S$5      5      [=        ["        R(                  " U5      5      [=        UR                  S%S5      5      [=        UR                  S&S5      5      [=        UR                  S'S5      5      [=        UR                  S(S5      5      [=        UR                  S)S5      5      [=        UR                  S*S5      5      [=        UR                  S+S5      5      [=        UR                  S,S5      5      /n[?        UU5        U R!                  S["        R(                  " SUR                  SS.5      UR                  S S/5      US0.5      R+                  5       5        U
(       a*  [F        RH                  " [J        X4SS:9RM                  5         g g U R!                  S;S<5        g ! , (       d  f       GN= f! [        R                  R                   a'  nUR	                  5       nUR                  n S nAGNYS nAff = f! [,         aI  nU R!                  S["        R(                  " S[/        U5      05      R+                  5       5         S nAg S nAff = f! [,         aJ  nU R!                  S["        R(                  " S[/        U5      S.5      R+                  5       5         S nAg S nAff = f! [,         aJ  nU R!                  S["        R(                  " S[/        U5      S.5      R+                  5       5         S nAg S nAff = f)=NzContent-Lengthr   zDEBUG POST: T)flushz/tursor   r   r   r   r   r      z/fetchr8   r   i N  i  errorz/importr   r   r\   i  Fz"Could not find ZPID in Zillow URL.)okr  r   a  INSERT INTO apartment_listings
                    (id,address,hood,price,beds,status,url,notes,description,photos,
                     feat_light,feat_hw,feat_dw,feat_ferry,feat_access,feat_outdoor,feat_tub,feat_gas)
                    VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)r;   rn   rB   ro   newrp   rI   rq   rr   rs   rt   ru   rv   rw   rx   um   Could not extract listing data — site may be blocking the request. Try the manual Add Listing form instead.Unknownr=   )r  r;   rB   r   z/import-htmlzDEBUG import-html: url=P   z
 html_len=z has_next_data=__NEXT_DATA__z has_zillow_photo=zillowstaticr,   )targetr	   daemoni  s	   Not found)'r   r   r2   rfiler"   printr   r   r   r   r   r   r    r  	HTTPErrorcode_respondr   r!   r   r   r   r   r~   r   r   r   r   r   r   r   r'   lenrz   r   	threadingThreadr   start)selflengthbodyr$   r%   resultr   r   r   r   r8   _rer   r   r,   r   r   r	   r   r   s                       r&   do_POSTHandler.do_POST   s}   T\\%%&6:;zzv&TYYK(599 ..((+\*,3K=*ASef	 ) C ^^++C0D!YY[F 1 MM&&)YY("Kzz$' e-c4::vtFU|.D#E#L#L#NO YY)#(Xzz$'5k 3&

>37A*;AGGAJ*Lc4::UMq6r+s+z+z+|}#,S>LD,T&5\3?GhD
 Hc'++i"893w{{6?R;SG,-s7;;v3F/GUE*+SW1E-FM23SF9K5LL34c'++iPQ:R6SIa013w{{<PQ7R3SM!45s7;;~VW;X7YJq12CJq8Q4R	 {{9--MM#tzz  Jy  3z  ({  (B  (B  (D  Ec4(c4::&{{9i@$[["5	/ $
 68 YY.(,Xzz$'F|hhub)/CRzCI;o^mqu^u]v  wI  JX  \`  J`  Ia  b  jn  o3&		.#6A wwqz*;D#*F*,b,T&5\3?G$[[26F%fd33bVhD
 Hc'++i"893w{{6?R;SG,-s7;;v3F/GUE*+SW1E-FM23SF9K5LL34c'++iPQ:R6SIa013w{{<PQ7R3SM!45s7;;~VW;X7YJq12CJq8Q4R	 c4(c4::&{{9i@$[["5	/ $
 68 $$,C3*]abhhj  MM#|,W 10 <<))     Kc4::wA.?#@#G#G#IJJKV  Xc4::USV.L#M#T#T#VWWX^  Xc4::USV.L#M#T#T#VWWXs   _- 9_

_- 8A`5 (Bb <H(b %A%b L)c" 
_*%_- -`2`--`25
b??bb
cA cc"
d6,A d11d6c                     U R                  U5        U R                  SS5        U R                  SS5        U R                  5         U R                  R	                  U5        g )Nr   r   Access-Control-Allow-Origin*)send_responsesend_headerend_headerswfilewrite)r  r   r  s      r&   r  Handler._respondl  sP    6");<6<

r6   c                     U R                  S5        U R                  SS5        U R                  SS5        U R                  SS5        U R                  5         g )Nr  r!  r"  zAccess-Control-Allow-MethodszPOST, GET, OPTIONSzAccess-Control-Allow-HeaderszContent-Type, Authorization)r#  r$  r%  )r  s    r&   
do_OPTIONSHandler.do_OPTIONSs  sQ    36<79MN79VWr6   c                     g rP   rQ   )r  formatr	   s      r&   log_messageHandler.log_messagez  s    r6   rQ   N)	__name__
__module____qualname____firstlineno__r  r  r*  r.  __static_attributes__rQ   r6   r&   r  r     s    x-tr6   r  z/home/ubuntu/second-brain)0.0.0.0iZ  T)r  r  )r5  iY  zcert.pemzkey.pem)server_sidez#Serving HTTPS on 7001, HTTP on 7002rP   )*http.serverr9   sslr   urllib.requestr   urllib.errorr   r   
subprocesstempfiler  r   r   ry   APIPY_TOKENr   r'   r   r   r   r   r   r   r   serverSimpleHTTPRequestHandlerr  chdir
HTTPServerhttpd2r  serve_foreverr  httpd
SSLContextPROTOCOL_TLS_SERVERctxload_cert_chainwrap_socketsocketr  rQ   r6   r&   <module>rK     s6    
 	    	   G	 iC> C 	'KZ SD$,^64-
Jdkk22 JZ 	$ %			 17	; 	  ,,T : @ @ B0':	nnS,,-   J	 *u||> + ,    r6   