
    ɻi              
          d dl Zd dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
mZ d dlmZmZmZ ej                   j#                  ej                   j%                  e            ZdZdZdZ eej0                  j3                  d e ee      dz  d	z                    Zed
z  Zedz  Zedz  Zedz  Z eej0                  j3                  d e ee      dz                    Z ej0                  j3                  dd      jC                  d      Z" e#ej0                  j3                  dd            Z$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/d di i d!Z0da1d" Z2d# Z3d$ed%efd&Z4d' Z5d( Z6dRd d)d*Z7d d)d+Z8ddd d d,d-Z9d. Z:d/ Z;d0 Z<d1 Z=d2 Z>d3 Z?d4 Z@d5 ZAd6 ZBd7 ZCd8 ZDd9 ZEdSd:ed;e#d%e#fd<ZFd= ZGd> ZHd?efd@ZIdAefdBZJdAefdCZKdD ZLdE ZMd ddFZNdG ZOdH ZP G dI dJej                  j                        ZSeTdKk(  rn e#ej0                  j3                  dLdM            ZU G dN dOej                        ZW eWdeUfeS      5 ZXdPeX_Y         eZdQeU        eXj                          ddd       yy# 1 sw Y   yxY w)T    N)Path)parse_qsurlparsequotezhttps://fresq.ruhttps://applico.ru)	/app/ajaxz/upload/z/ajax/z/local/z/bitrix/APPLICO_EXPORT_DIRapplico_exportoutputzmanifest.jsonzcollections.jsonz
items.jsonzitems_detailed.ndjsonFRESQ_CACHE_DIRz
.cache_imgIMGPROXY_ORIGIN /COLLECTIONS_CACHE_TTL120900119277zApplico DemoAPPlicoi  i=  iX    i  @  i   F)loadedcollectionsitems_by_idbasic_by_idc                      t         j                         sy 	 t        j                  t         j	                  d            S # t
        $ r Y y w xY w)Nutf-8encoding)MANIFEST_PATHexistsjsonloads	read_text	Exception     !/opt/fresq/current/serve_proxy.py_load_manifestr(   B   sE    !zz-1171CDD s   (A   	AAc                     	 t        |       j                  j                  d      }|sy|j                  d      d   S # t        $ r Y yw xY w)Nr   zapplico-item)r   pathrstripsplitr$   )urlr+   s     r'   _slug_from_urlr/   K   sL    }!!((-!zz#r"" s   &= = 	A	A	r.   returnc                     	 t        |       }|j                  j                  d      dk7  r| S t        |j                        }|j                  d      xs dgd   }|xs | S # t        $ r | cY S w xY w)zSome exports contain links like https://applico.ru/imgproxy?url=<real>&w=400.
    Applico doesn't always serve /imgproxy, so unwrap to the real image URL.r   	/imgproxyr.   r   r   )r   r+   r,   r   querygetr$   )r.   parsedqsinners       r'   _unwrap_imgproxy_urlr8   U   sq    #;;c"k1Jfll#&2$*| 
s   *A! 3A! !A/.A/c                 p    | sy| }|j                  d      s|j                  d      sd|z   }t        |      S )Nr   http://https://r   )
startswithr8   )url_or_pathr.   s     r'   _normalize_imgr>   c   s9    
CNN9%
)C"S($$r&   c                     | sy| j                  d      s| j                  d      r| S | j                  d      rd| z   S | j                  d      r	t        | z   S t        dz   | z   S )Nr   r:   r;   z//zhttps:r   )r<   REMOTE_BASE_FRESQ)r=   s    r'   _normalize_fresq_imgrA   l   sk    i(K,B,B:,Nd#+%%c" ;..s"[00r&   bwc                T    dt        |        d| }|r|dz  }t        r	t        |z   S |S )Nz/imgproxy?url=z&w=z&bw=1)r   r   )r.   widthrC   r+   s       r'   _imgproxy_urlrF   x   s7    E#J<s5'2D	%%Kr&   c                T    t        | t        |      }t        | t        |      }||dS )z5Return both fast and HQ URLs for progressive loading.)rE   rC   )fasthq)rF   FAST_WIDTH_IMAGEHQ_WIDTH_IMAGE)r.   rC   fast_urlhq_urls       r'   _imgproxy_url_progressiverN      s/    S(8R@H3n<F r&   )width_imagewidth_backgroundrC   progressivec                f   fd}fd}t        | t              rd| v r| j                  dg       D ]n  }t        |t              s|j                  d      xs d}	|dk(  rt        |	      }	nt	        |	      }	|	sH|r ||	      }
|
d   |d<   |
d   |d	<   c ||	|      |d<   p | S t        | t
              r| rt        | d
   t              rd| d
   v r| D ]  }t        |t              s|j                  d      xs d}|r'|dk(  rt        |      n
t	        |      } |||      |d<   |j                  dg       xs g D ]R  }t        |t              s|j                  d      xs d}	|	s,|dk(  rt        |	      n
t	        |	      }	 ||	|      |d<   T  | S t        | t
              r| D ]  }t        |t              sdD ]n  }|j                  |g       xs g D ]S  }t        |t              s|j                  d      xs d}	|dk(  rt        |	      }	nt	        |	      }	|	sH ||	|      |d<   U p  | S | S )Nc                      t        | |      S NrB   )rF   )r.   rE   rC   s     r'   _wrapz"_rewrite_image_urls.<locals>._wrap   s    S%B//r&   c                     t        |       S rT   )rN   )r.   rC   s    r'   _wrap_progressivez._rewrite_image_urls.<locals>._wrap_progressive   s    (44r&   itemsimgr   applicorH   rI   imgHQr   colors
premColors)
isinstancedictr4   r>   rA   list)database_urlrO   rP   rC   rQ   rU   rW   itemrY   urls
collectioncimggroupkeycolors       `           r'   _rewrite_image_urlsrk      si   05 $'T/HHWb) 	:DdD)((5/'RC9$$S)*3/,S1D"&v,DK$(JDM"'["9DK	:   $$:d1gt+DTXYZT[I[ 	6Jj$/>>%(.BD/79/D~d+J^_cJd$)$0@$A
5!"w39r 6!$-hhuo+-5-BnS)H\]`Ha#C5U6	6  $ 	DEeT*/ 
D"YYsB/52 	DE%eT2 ))E*0bC9,,S1237',S2B'Ce	D
D	D Kr&   c                 T   t        | t              s| S | D ]  }t        |t              sd|v rt        |j	                  d            |d<   |j	                  d      }t        |t              sW|D ]5  }t        |t              sd|v st        |j	                  d            |d<   7  | S )NrY   rX   )r_   ra   r`   rA   r4   )rb   rf   rX   rd   s       r'   _rewrite_fresq_collectionsrm      s    dD! L
j$'
"$89N$O
5!NN7+E%&! LD!$-%4-&:488E?&KULL Kr&   c                    t        | t              s| S | D ]i  }t        |t              sdD ]Q  }|j                  |g       xs g D ]6  }t        |t              s|j                  d      xs d}t	        |      |d<   8 S k | S )Nr\   rY   r   )r_   ra   r`   r4   rA   )rb   rh   ri   rj   rY   s        r'   _rewrite_fresq_backgroundro      s    dD! 9%&+ 	9C3+1r 9!%.ii&,"3C8e	9	99 Kr&   c                     t        | t              s| S | j                  d      }t        |t              r>|D ]9  }t        |t              sd|v st	        |j                  d      xs d      |d<   ; | S )NrX   rY   r   )r_   r`   r4   ra   rA   )rb   rX   rd   s      r'   _rewrite_fresq_image_payloadrq      sl    dD!HHWE% 	JD$%%4-2488E?3HbIU	J Kr&   c                    t        | t              r| }n5t        | t              r#| j                  d      }t        |t              s| S | S h d}|D ]l  }t        |t              s|j                  d      }t	        |j                  d      xs d      j                         j                         }|dv s||v shd|d<   n | S )	zCEnsure Standard/Nonstandard size options are visible in Fresq mode.rb   >   #   стандартные панели%   стандартные размеры)   нестандартные размерыidnamer   )S  T    FisHidden)r_   ra   r`   r4   strstriplower)rb   rX   target_namesoptopt_idrw   s         r'   _unhide_fresq_optionsr      s     $	D$	 %&KL
  $#t$3776?(b)//1779''4<+?#C
O$ Kr&   c                     t               xs i } | j                  d      xs d}| j                  d      xs t        }	 t        |      }t        |      j                  dd      j                         }t        | j                  d            }| j                  d      xs g }|sd}t        t              |t        t        |      ||d	gd
g}g }|D ]  }	|j                  t        |	j                  d      xs d      ddddddt        |	j                  d      xs d      |	j                  d      xs dddt        |	j                  d            |	j                  d      xs ddgg ddd        |sddddddddddd|ddgg dddg}t        |      ||t        |r|d   j                  d      ndxs d      dgt        g d}
|||
dS # t        $ r t        t              }Y w xY w)N
source_urlzhttps://applico.ru/item_id- original_imgfactureszIhttps://applico.ru/upload/iblock/cee/zmujnpch3j8gezjiqzgjnbbnaa8kcu7o.jpgrv   rY   rw   rv   rY   rw   rX   pricer   Frv   rw   Baser   rY   rY   rw   r   	premPriceexcludedOptionsinstallPriceminInstallPriceexamplePriceexampleExtraPricerv   	groupNameselectedImgisPremr]   r^   
isSeamlessisSeamlessMode   rv   rw   rY   r   rX   catalogremove_background)r   
backgroundimage)r(   r4   DEMO_ITEM_IDintr$   r/   replaceupperr>   DEMO_SECTION_IDDEMO_COLLECTION_NAMEappendDEMO_CATALOG_NAME)manifestr   raw_item_idr   	item_nameitem_imgr   rf   background_itemsfr   s              r'   _build_demo_datar     s=   %2Hl+D/DJ,,y)9\K$k" z*223<BBDIhll>:;H||J'-2H^ o&( g,#%		
J  
QUU7^0q1#( !#$ !%&!%%+*+UU6]4f!  .aeeEl; !f 7 !#"')	

4  #( !#$ !%&#!#+V<= #"'
. 'l!(hqkoog6OaP	
 %E "& k  $l#$s   G G'&G'c                     i }| s|S | j                  d      }|D ]=  }d|v s|j                  dd      \  }}|j                         ||j                         <   ? |S )N;=r   )r-   r}   )cookie_headercookiespartspartkvs         r'   _parse_cookiesr   t  sf    G$E +$;::c1%DAq!"GAGGI+ Nr&   c                 @    t        |       }|j                  d      dk(  S )Ndata_sourcerZ   r   r4   r   r   s     r'   _should_use_applicor     s     ]+G;;}%22r&   c                 B    t        |       }|j                  dd      dk(  S )Nimg_qualityrH   r   r   s     r'   _should_use_fast_imagesr     s"    ]+G;;}f-77r&   c                 @    t        |       }|j                  d      dk(  S )N
applico_bw1r   r   s     r'   _should_use_bwr     s     ]+G;;|$++r&   c                 B    t        |       }|j                  d      xs dS )Napplico_item_idr   r   r   s     r'   _get_applico_cookie_item_idr     s!    ]+G;;()/R/r&   c                 B    t        |       }|j                  d      xs dS )Napplico_section_idr   r   r   s     r'   _get_applico_cookie_section_idr     s!    ]+G;;+,22r&   c                 (   t        |       }|j                  d      xs d}|j                  d      xs d}	 t        |      }	 t        |      }|dk  s	|t        kD  rd}|dk  s	|t
        kD  rd}||fS # t        $ r d}Y =w xY w# t        $ r d}Y Bw xY w)N	applico_wr   	applico_hr   )r   r4   r   r$   APPLICO_MAX_WIDTHAPPLICO_MAX_HEIGHT)r   r   whs       r'   _get_applico_cookie_sizer     s    ]+GK &BAK &BAFF 	Av&&Av''a4K    s#   A2 B 2B ?B BBvaluebasec                     dd l }	 | j                  d      }||j	                  |      dz  z   S # t        $ r t        |       j                  dd      }Y >w xY w)Nr   r   ignore)errorsi )zlibencoder$   r|   crc32)r   r   r   raws       r'   _stable_int_idr     s\    :ll7# 4::c?V+,,  :%j9:s   . %AAc            	         t         j                  d      ryd} i }i }t        j                         rX	 t	        j
                  t        j                  d            }|xs g D ]$  }|j                  d      }|||t        |      <   & 	 t        j                         rv	 t        j                  dd      j                         D ]L  }|j                         }|st	        j
                  |      }|j                  d      }|?||t        |      <   N 	 t        j                         r*	 t	        j
                  t        j                  d            } | s%dt         d<   |t         d	<   |t         d
<   dt         d<   yg }| D ]  }|j                  d      xs dj                         }	|j                  d      xs g D ]  }
t        |
j                  d      xs d      }|
j                  d      xs |xs dj                         }|j                         rt        |      n
t        |      }|r||	k7  r|	 d| n|	}g }|
j                  d      xs g D ]  }|j                  d      }|t        |      }|j                  |      xs i }|j                  d      xs( |j                  d      xs |j                  d      xs d}|j                  d      xs1 |j                  d      xs |j                  d      xs t        |      }|j!                  t        |      j                         rt        |      n|||d        |r|d   d   nd}|j!                  ||||d         |t         d<   |t         d	<   |t         d
<   dt         d<   y# t        $ r i }Y w xY w# t        $ r i }Y w xY w# t        $ r d} Y mw xY w)zVLoad exported Applico dataset (Stage 1/2) and map it to Fresq-like /app/ajax payloads.r   Nr   r   r   r   )r   r   r   r   r   TtitleApplicotabsrv   r   labeltabz / rX   r   thumbaltr   r   rY   r   )_APPLICO_CACHEr4   APPLICO_ITEMS_PATHr    r!   r"   r#   r|   r$   APPLICO_ITEMS_DETAILED_PATH
splitlinesr}   APPLICO_COLLECTIONS_PATHisdigitr   r   r   )collections_rawr   r   basic_itemsrowr   linemappedrh   group_titler   tab_id	tab_labelcoll_idrw   rX   itiidiid_sdetailrY   r   coll_imgs                          r'   _load_applico_datar     s   (#OKK   "	**%7%A%A7%A%STK"(b 0''),?,/CL)	0 #))+	3==wW_=`kkm 0zz|jj&''),?,/CL)0  &&(	#"jj)A)K)KU\)K)]^O (,}%(3}%(3}%#'x  F  yy)6Y==?99V$* 	C,"-F)<V<uCCEI%+^^%5c&k>&;QG5>9P[C[k]#i[1alDEggg&," ffY';C$/52jj0`FJJw4G`266RY?`^`

7+[rvvg["&&-[SVWZS[&)#h&6&6&8#c(c!  +0uQxRHMM	 /	@ %+N=!$/N=!$/N=!#N8M  	K	  	K	  	#"O	#s7   AN A4N ()N0 NNN-,N-0N?>N?c                  @    t                t        j                  d      S )Nr   )r   r   r4   r%   r&   r'    _get_applico_collections_payloadr     s    m,,r&   
section_idc                     t                t        j                  d      xs g D ],  }t        |j                  d            t        |       k(  s*|c S  y )Nr   rv   r   r   r4   r|   )r   colls     r'   _find_applico_collection_by_idr    sJ    ""=17R txx~#j/1K r&   
element_idc                     t                t        j                  d      xs g D ]I  }|j                  dg       xs g D ].  }t        |j                  d            t        |       k(  s*|c c S  K y )Nr   rX   rv   r   )r  r  rd   s      r'   !_find_applico_item_in_collectionsr    si    ""=17R HHWb)/R 	D488D>"c*o5	 r&   c                 
   t                | rt        |       at        j	                  di       j	                  t        |             }t        j	                  di       j	                  t        |             }t        |       }|s|r|xs i j	                  d      xsP |xs i j	                  d      xs9 |xs i j	                  d      xs" |xs i j	                  d      xs t        |       }|xs i j	                  d      xsC |xs i j	                  d      xs, |xs i j	                  d      xs |xs i j	                  d      }d	}t        |       j                         rt        |       n| |||d
gdg dS |rc|j	                  d      xs t        |       }|j	                  d      xs d}t        |       j                         rt        |       n| ||d	d
gdg dS t        t        |             }|r|j	                  d      sg r|d   d	   }|j	                  d      }	|j	                  d      xs t        |	xs |       }|j	                  d      xs d}t        |	      j                         rt        |	      n|	||d	d
gdg dS y)zIReturn Fresq-like image payload for a given element_id (Applico item_id).r   r   r   r   rw   r   r   rY   r   r   r   r   r   rX   rv   N)	r   r|   _LAST_APPLICO_ITEM_IDr   r4   r  r   r   r  )
r  r   basic	coll_itemr   rY   r   r  firstfids
             r'   _get_applico_image_payloadr  !  s     #J


]B
/
3
3C
O
DC}b155c*oFE1*=I
eYBOOG$   )  ' R$$V, : 	 YBOON+ ,	rw',  ), R$$U+	 	 03J0G0G0IS_zchqt  @E  F  G !#
 	
 f%8ZmmE"(b03J0G0G0IS_zchqt  @A  B  C !#
 	
 *#j/:D'"bWa iio		&!;S):
%;ii$"),S)9)9);SXe\_jklm !#
 	
 r&   c                     t                t        xs t        } t        j	                  di       j	                  t        |             }t        |t              r|j	                  d      ndxs g }d}t        |t              r$|j	                  d      xs |j	                  d      }|sU|:	 t        |      }|dddddddd	d
d|xs i j	                  d      xs d
d	dgg dddgS t               j	                  d      S g }|D ]  }	 t        |j	                  d      xs d      }|j	                  d      xs d	}|j	                  d      xs d
}		 t        |j	                  d      xs d      }|j                  |dddddd||d
d|	|dgg ddd        |S # t        $ r d}Y w xY w# t        $ r d}Y w xY w# t        $ r d}Y Xw xY w)z^Return Fresq-like background payload. We use factures of the last requested item if available.r   r   N
base_pricer   r   Fr   r   r   r   r   Tr   r   rv   rw   rY   )r   r  r   r   r4   r|   r_   r`   r   r$   r   r   )
r  r   factsr  r   outr   r  rw   rY   s
             r'   _get_applico_background_payloadr  Z  s   &6,J


]B
/
3
3C
O
DC$.sD$9SWWZ tJEJ#tWW\*>cggg.>
!J #( !#$ !%&#!$'I2??>#B#HbRXYZ ""'  "  !%%l33
C 	aeeDk&Q'C uuV}&eeEl b	g+!,E 	

$ !""D12#
 	: Jg  2  	C	  	E	s6   )F F$F5F! F!$F21F25GGc                      d} dd| ddd| ddd| dd	d
| ddd| ddd| ddd| ddd| ddd| dg	}ddddddddddg}d }||z   D cg c]
  } ||       c}S c c}w )NTrx   u!   Бесшовное полотно)rv   rw   r{   ry   u)   Нестандартные размерыiU  u!   Подпись художникаiV  u   Покрытие лакомiW  u   МонтажiX  u   Образецix  u   Срочностьrz   u#   Стандартные панелиiD  u   Объемный рисунокiy  u   ОтзеркалитьFu7   Зеркальное отражение рисунка.)rv   rw   r{   dataText_    Ч/Бu<   Черно-белый вариант изображения.c                 j    | d   | d   dddddd| j                  dd      d| j                  dd      dS )	Nrv   rw   r   Fr{   r  r   )rv   rw   r   
priceExtraisPricePerMeterisIndividualPriceisPercentToFullPriceisSetr{   isExtraPricer  )r4   )r   s    r'   	normalizez)_build_applico_options.<locals>.normalize  sK    d)K$!&$)
E2!
B/
 	
r&   r%   )hiddenr   visibler  os        r'   _build_applico_optionsr!    s     F@fUHV\]@fU:O^@-6B1vFBPVW>FS
D ,Q		
 V		
G
 $('>3QIaL333s   
A)tsrb   c                     dd l } | j                         }t        d   r|t        d   z
  t        k  r	t        d   S 	 t         d}t        j
                  j                  |d      5 }|j                         }t        j                  |j                  d            }|t        d<   |t        d<   |cd d d        S # 1 sw Y   y xY w# t        $ r Y y w xY w)Nr   rb   r"  z/app/ajax/?type=collections&
   timeoutr   )time_FRESQ_COLLECTIONS_CACHEr   r@   urllibrequesturlopenreadr!   r"   decoder$   )r'  nowr.   respr   rb   s         r'   _get_fresq_collectionsr0    s    
))+C'C2J42P,PSh,h'//	"##?@^^##C#4 	))+C::cjj12D/3$V,-0$T*	 	 	  s0   *C %AB7-	C 7C <C  C 	CCc                 j   t               xs g }|D ]  }|j                  dg       xs g D ]  }t        |j                  d            t        |       k(  s*t        |j                  d      xs d      }t	        |       |j                  d      xs d|ddg|j                  d      xs dg dc c S   y )	NrX   rv   rY   r   rw   r   r   r   )r0  r4   r|   rA   r   )r  r   rf   rd   rY   s        r'   _build_fresq_image_stubr2    s    (*0bK! 
NN7B/52 	D488D>"c*o5*488E?+@bA #&j/$(HHV$4$:#&%&	  *~~f5;)+ 	  r&   c                   j     e Zd Z fdZd Z fdZ fdZ fdZddZddZ	ddZ
dd	Zdd
Z xZS )ProxyHandlerc                 0    t        |   |dt        i| y )N	directory)super__init__BASE_DIR)selfargskwargs	__class__s      r'   r8  zProxyHandler.__init__  s    $=(=f=r&   c                    	 | j                   j                  dd      d   }t        j                   j	                  |      d   j                         }|dv ry|j                  d      ry|j                  d      s|j                  d      ry|j                  d	      s|j                  d
      ryy# t        $ r | j                   }Y w xY w)N?r   r   >   .js.css.map.html.jsonTz/constructorz/app/static/jsz/app/static/cssr   z/ajaxF)r+   r-   r$   ossplitextr~   r<   )r:  r+   exts      r'   _should_disable_cachez"ProxyHandler._should_disable_cache  s    	99??3*1-D ggt$Q'--/;;??>*??+,@Q0R??;'4??7+C  	99D	s   B/ /CCc                     | j                         r6| j                  dd       | j                  dd       | j                  dd       t        |           y )NzCache-Controlz.no-store, no-cache, must-revalidate, max-age=0Pragmazno-cacheExpires0)rH  send_headerr7  end_headersr:  r=  s    r'   rN  zProxyHandler.end_headers  sK    %%'_.^_Xz2Y,r&   c                 *   | j                   j                  d      r| j                         S | j                   j                  d      r| j                         S | j                   j                  t              r| j                         S t        |          S )Nr2   r   )r+   r<   _handle_imgproxy_handle_ajaxPROXY_PREFIXES_proxy_requestr7  do_GETrO  s    r'   rU  zProxyHandler.do_GET  ss    99,((**99,$$&&99/&&((w~r&   c                 6   | j                   j                  d      r| j                  d      S | j                   j                  d      r| j                  d      S | j                   j                  t              r| j                  d      S t        |          S )Nr2   T	head_onlyr   )r+   r<   rQ  rR  rS  rT  r7  do_HEADrO  s    r'   rY  zProxyHandler.do_HEAD  s    99,((4(8899,$$t$4499/&&&66w  r&   c           	      >   t        | j                        }t        |j                        }|j	                  d      xs dgd   }t        | j                  j	                  dd            r|| j                  j	                  dd      }t        |      }| }t        |      }|rt        nt        }	t        }
t        }|dk(  r8t               xs t               j	                  dg       }t        |d||
|      }n|dk(  rjt        | j                  j	                  dd            }|rt!        |      }t#               xs t               j	                  dg       }t        |d||
|      }nS|d	k(  r!|j	                  d
      xs dgd   }t        | j                  j	                  dd            }|r|}t%        |      }|sa| j                  j	                  dd      }	 t        t        |      j                        }|j	                  d      xs dgd   }|rt%        |      }|xs t               j	                  d	i       }t)        | j                  j	                  dd            \  }}|r|r|nt+        |t              }n|	}t        |d||
|      }n,|dk(  rCt-               }|r|D ]/  }|j	                  d      dk(  s|j	                  d      dv s+d|d<   1 n| j/                  |      S | j                  j	                  dd      }t        |      }|rt        nt        }	t        }
|dk(  rt0        | j                  z   }	 t2        j4                  j7                  |d      5 }|j9                         }t;        j<                  |j?                  d            }tA        |      }t;        jB                  |d      jE                  d      }| jG                  d       | jI                  dd       | jI                  dt!        tK        |                   | jM                          |s| jN                  jQ                  |       	 d d d        y |dk(  rt0        | j                  z   }	 t2        j4                  j7                  |d      5 }|j9                         }t;        j<                  |j?                  d            }tS        |      }t;        jB                  |d      jE                  d      }| jG                  d       | jI                  dd       | jI                  dt!        tK        |                   | jM                          |s| jN                  jQ                  |       	 d d d        y |dk(  rt0        | j                  z   }	 t2        j4                  j7                  |d      5 }|j9                         }t;        j<                  |j?                  d            }tU        |      }t;        jB                  |d      jE                  d      }| jG                  d       | jI                  dd       | jI                  dt!        tK        |                   | jM                          |s| jN                  jQ                  |       	 d d d        y |d	k(  r"t0        | j                  z   }	 t2        j4                  j7                  |d      5 }|j9                         }t;        j<                  |j?                  d            }t        |dtV        |
d      }t;        jB                  |d      jE                  d      }| jG                  d       | jI                  dd       | jI                  dt!        tK        |                   | jM                          |s| jN                  jQ                  |       	 d d d        y | j/                  |      S t;        jB                  |d      jE                  d      }| jG                  d       | jI                  dd       | jI                  dt!        tK        |                   | jM                          |s| jN                  jQ                  |       y # t&        $ r Y Dw xY w# 1 sw Y   nxY w1# t&        $ r | j/                  |      cY S w xY w# 1 sw Y   nxY wA# t&        $ r | j/                  |      cY S w xY w# 1 sw Y   nxY wQ# t&        $ r | j/                  |      cY S w xY w# 1 sw Y   nxY wX# t&        $ r | j/                  |      cY S w xY w) Ntyper   r   Cookier   rZ   )rO   rP   rC   r   r   r  RefereritemIdoptionsrv   r  rw   )r  u   ЧБTr  rW     r%  r   F)ensure_ascii   Content-Typezapplication/json; charset=utf-8Content-Lengthfresq)rO   rP   rQ   ),r   r+   r   r3   r4   r   headersr   r   rK   rJ   FAST_WIDTH_BACKGROUNDr   r   rk   r   r|   r  r  r$   r   maxr!  rT  r@   r)  r*  r+  r,  r!   r"   r-  r   dumpsr   send_responserM  lenrN  wfilewriterm   ro   OPTIMAL_WIDTH_IMAGE)r:  rX  r5   r6   req_typecookieis_fastis_hqrC   
w_img_mainw_bg
w_coll_imgpayloadcookie_itemr  r  refref_qsref_itemcookie_w	_cookie_h	width_imgr   
target_urlr/  r   rb   bodys                               r'   rR  zProxyHandler._handle_ajax'  s   $))$fll#FF6N*rdA.t||//"=> \\%%h3F-f5GKE'B+06FJ(D)J=(:<i@P@R@V@VWdfh@i-gyjkotvw\)9$,,:J:J8UW:XY,/,<)9;g?O?Q?U?UVbdf?g-gyjkotvwW$ ff\2:rdA>
9$,,:J:J8UW:XY!,J4Z@,,**9b9C!)(3-*=*=!>$*JJx$8$@RD!#D#&@&JG "H%5%7%;%;GR%H&>t||?O?OPXZ\?]&^#),3X~9VI *I-gyijnsuvY&02& 0774=E1SWWV_HY5Y+/CL0 **Y*??\\%%h3F-f5G-4).J(D9$.:
D//
B/G $4"iik#zz#**W*=>"7"=#zz'FMMgV**3/((9Z[(()93s4y>J((*( JJ,,T2#$ $ =(.:
D//
B/G $4"iik#zz#**W*=>"<T"B#zz'FMMgV**3/((9Z[(()93s4y>J((*( JJ,,T2#$ $ <'.:
D//
B/G $4"iik#zz#**W*=>";D"A#zz'FMMgV**3/((9Z[(()93s4y>J((*( JJ,,T2#$ $ 7".:
D//
B/G $4"iik#zz#**W*=> #6dGQdw{  JO  #P#zz'FMMgV**3/((9Z[(()93s4y>J((*( JJ,,T2#$ $  &&&;;zz'6==gF3)JK)3s4y>:JJT"M % 4$ $ $ ! D...CCD
$ $ $ ! D...CCD
$ $ $ ! D...CCD
$ $ $ ! D...CCDs   Aa ;!a1 Ca#7a1 !b  ;Cbb  9!c Cc5c !c> 9C$c0c> 	a a #a,(a1 1bbbb   b>=b>c
c c-,c-0c95c> >ddc                     | j                  |      ry | j                  j                  dd      }t        |      rt        nt
        }|| j                  z   }| j                  ||      S )NrW  r\  r   )_serve_local_filerf  r4   r   REMOTE_BASE_APPLICOr@   r+   _proxy_request_url)r:  rX  rp  remoter~  s        r'   rT  zProxyHandler._proxy_request  s`    !!I!6!!(B/(;F(C$IZdii'
&&zY&GGr&   c                    t         j                  j                  ||rdnd      }|j                  dd       	 t         j                  j	                  |d      5 }| j                  |j                         |j                         D ]*  \  }}|j                         dv r| j                  ||       , | j                          |s*	 | j                  j                  |j                                d d d        y # t        t        f$ r Y d d d        y w xY w# 1 sw Y   y xY w# t        t        f$ r Y y t         $ r:}	 | j#                  d	d
|        n# t        t        f$ r Y Y d }~y w xY wY d }~y d }~ww xY w)NHEADGET)methodz
User-Agentzfresq-recovery-proxyr`  r%  >   
keep-alivetransfer-encodingproxy-authenticateproxy-authorizationteupgradetrailers
connection  zProxy error: )r)  r*  Request
add_headerr+  rj  status
getheadersr~   rM  rN  rl  rm  r,  BrokenPipeErrorConnectionResetErrorr$   
send_error)r:  r~  rX  reqr/  ri   r   excs           r'   r  zProxyHandler._proxy_request_url  sf   nn$$Z)QV$W|%;<	''R'8 D""4;;/"&//"3 1JCyy{  'b  b $$S%01   " 

((5  ,-AB     !56 	 	}SE%:;#%9:  <	s~   !D! A+D)C8/D! 8DDD! DDDD! D! !E42E4;EE/E' E/&E''E//E4c           	         t        | j                        }t        |j                        }|j	                  d      xs dgd   }|s| j                  dd       y t        |      }t        |j	                  d      xs dgd         }|j	                  d      xs d	gd   d
k(  }t        j                  dd       t        j                  j                  t        |      j                        d   j                         xs d}| d| dt        |       d}t        t        t        |                  }	t        |	 d| | z  }
|
j!                         s
t        |	 d| z  }	 t"        j$                  j'                  |d      5 }|j)                  |j+                                d d d        	 d| d}|r|dz  }ddddddt        |      d|g	}|j                         d k(  r|d!d"gz  }|j-                  t        |
             t/        j0                  |dt.        j2                  t.        j2                  #       |j!                         r|
|k7  r|j7                  d$       t9        j:                  t        |
            \  }}| j=                  d'       | j?                  d(|xs d)       | j?                  d*t        |
jA                         jB                               | jE                          |s)| jF                  jI                  |
jK                                y # 1 sw Y   sxY w# t4        $ r |}
Y w xY w# t4        $ r}| j                  d%d&|        Y d }~y d }~ww xY w)+Nr.   r   r   r   zMissing urlr   1600rC   rL  r   T)parentsexist_okr   z.jpg|z|bw=z|v3_w_tmp   r%  zscale=z:-1z,hue=s=0ffmpegz-hide_bannerz	-loglevelerrorz-yz-iz-vfz.pngz-pix_fmtrgba)checkstdoutstderr)
missing_okr  zImage proxy error: rb  rc  application/octet-streamrd  )&r   r+   r   r3   r4   r  r8   r   	CACHE_DIRmkdirrE  rF  r~   r|   abshashr    r)  r*  r+  write_bytesr,  r   
subprocessrunDEVNULLr$   unlink	mimetypes
guess_typerj  rM  statst_sizerN  rl  rm  
read_bytes)r:  rX  r5   r6   raw_urlrE   rC   rG  ri   	cache_keyout_pathtmp_pathr/  vfcmdr  ctype_s                     r'   rQ  zProxyHandler._handle_imgproxy  s   $))$fll#66%=(RD!,OOC/&w/RVVC[,VHa01ffTl#seQ'3.t4ggx0556q9??AKV	5'c"gYc2DI'	)BugcU;;  i[SE#::H^^++GR+@ 6D((56(!%,Bj( &#H
C yy{f,
F33JJs8}-NN3d:;M;MV`VhVhi ??$X)=OOtO4
 ''H6q3)L2LM)3x}}/F/F+GHJJX0023O6 6. ! ('H(
  ':3%%@AsU   !!L1  L"L1 +B
L  5'L1 LL1  L.+L1 -L..L1 1	M:MMc                    	 | j                   j                  d      }t        j                   j                  t        |      }t        j                   j                  |      syt        j                  |      \  }}| j                  d       | j                  d|xs d       | j                  dt        t        j                   j                  |                   | j                          |s?t        |d      5 }| j                  j                  |j!                                d d d        yy# 1 sw Y   yxY w# t"        $ r Y yw xY w)	Nr   Frb  rc  r  rd  rbT)r+   lstriprE  joinr9  isfiler  r  rj  rM  r|   getsizerN  openrl  rm  r,  r$   )r:  rX  rel
local_pathr  r  r   s          r'   r  zProxyHandler._serve_local_file  s    	))""3'Ch4J77>>*- ++J7HE1s#^U-P6PQ-s277??:3N/OP*d+ /qJJ$$QVVX.// 		s7   AD6 !BD6 6*D* D6 *D3/D6 3D6 6	EE)F)__name__
__module____qualname__r8  rH  rN  rU  rY  rR  rT  r  rQ  r  __classcell__)r=  s   @r'   r4  r4    s9    >  !SjH4<|r&   r4  __main__PORT3000c                       e Zd ZdZy)ReusableTCPServerTN)r  r  r  allow_reuse_addressr%   r&   r'   r  r  4  s    "r&   r  TzServing on http://localhost:)r   )i )\http.serverhttpr!   rerE  socketserverr  r  urllib.requestr)  pathlibr   urllib.parser   r   r   r+   dirnameabspath__file__r9  r@   r  rS  environr4   r|   r	   r   r   r   r   r  r,   r   r   r   r   r   r   r   r   r   rJ   rg  rn  rK   HQ_WIDTH_BACKGROUNDr   r  r(   r/   r8   r>   rA   rF   rN   rk   rm   ro   rq   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r!  r(  r0  r2  serverSimpleHTTPRequestHandlerr4  r  portThreadingTCPServerr  httpddaemon_threadsprintserve_foreverr%   r&   r'   <module>r     s)     	 	      2 277??277??845& *  JJNNDN--89  #_4-0BB ',6 03JJ JJNNDN\)*	 **..!2B7>>sCBJJNN+BEJK %         	  c c %	1  */  8<cV[in @F8_D	3
8,03&-# -S -c -X$v-s # 63 6rAH.4d  "(t4;;77 tn	 zrzz~~ff-.D#L;; # 
B:|	4 #,TF34   s   8#I%%I.