
    j                        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i Z	 ej                         ZdZd Z G d dej                  j                        Zedk(  rd dlZ eej&                        dkD  r eej&                  d         ndZ ed	e         ed
       dej.                  _         ej.                  defe      5 Z	 ej5                          ddd       yy# e$ r  ed       Y w xY w# 1 sw Y   yxY w)    N2   c                    | ||f}t         5  |t        v rt        |   cddd       S 	 ddd       ddd| dt        |      dt        |      ddd	g}t        j                  |t        j
                  t        j                  
      }|j                         \  }}t         5  t        t              t        k\  rt        t        t                    }t        |= |t        |<   ddd       |S # 1 sw Y   xY w# 1 sw Y   |S xY w)z6Run ffmpeg once per unique slice and cache the result.Nffmpegz-yz-iz-ssz-toz-fwav-)stdoutstderr)_audio_cache_lock_audio_cachestr
subprocessPopenPIPEDEVNULLcommunicatelen
_CACHE_MAXnextiter)	filepath
start_timeend_timekeycommandprocess
audio_data_
oldest_keys	            /root/serve_cors.pyget_trimmed_audior       s    Z
*C	 %,$% %%
 	$hs:s8}eG wzzGYGYZG'')MJ	 '|
*d<01JZ(&S' -% %' s   C%?C1%C.1C;c                   .     e Zd Z fdZd Z fdZ xZS )CORSRequestHandlerc                     | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd	       t        t        |          S )
NzAccess-Control-Allow-Origin*zAccess-Control-Allow-MethodszGET, OPTIONSzAccess-Control-Allow-HeaderszAccess-Control-Expose-HeaderszContent-Length, Content-RangezCache-Controlzpublic, max-age=31536000)send_headersuperr"   end_headers)self	__class__s    r   r'   zCORSRequestHandler.end_headers,   sj    6<7H7=8:YZ*DE':<<    c                 F    | j                  d       | j                          y )N   )send_responser'   )r(   s    r   
do_OPTIONSzCORSRequestHandler.do_OPTIONS5   s    3r*   c           	      h   t         j                  j                  | j                        }t         j                  j	                  |j                        j                  d      }t         j                  j                  |j                        }d|v rd|v r|j                  d      rt        j                  j                  |      r	 t        |d   d         }t        |d   d         }t        |||      }t        |      }d| j                  v r| j                  d   }|j                  dd      j!                  d	      }	|	d   rt#        |	d         nd}
t        |	      d
kD  r|	d
   rt#        |	d
         n|d
z
  }||k\  r|d
z
  }||
z
  d
z   }| j%                  d       | j'                  dd       | j'                  dd       | j'                  dd|
 d	| d|        | j'                  dt)        |             | j+                          	 | j,                  j/                  ||
|d
z           y | j%                  d       | j'                  dd       | j'                  dd       | j'                  dt)        |             | j+                          	 | j,                  j/                  |       y |j                  d      ret        j                  j                  |      rE	 t7        |d      }t        j8                  |j;                               }|d   }d| j                  v ro| j                  d   }|j                  dd      j!                  d	      }	|	d   rt#        |	d         nd}
t        |	      d
kD  r|	d
   rt#        |	d
         n|d
z
  }||k\  r|d
z
  }||
z
  d
z   }| j%                  d       | j'                  dd       | j'                  dd       | j'                  dd|
 d	| d|        | j'                  dt)        |             | j+                          |j=                  |
       |}|dkD  rN|j?                  tA        |d            }|sn0	 | j,                  j/                  |       |t        |      z  }|dkD  rN|jC                          y | j%                  d       | j'                  dd       | j'                  dd       | j'                  dt)        |             | j+                          	 dd l"}|jG                  || j,                         |jC                          y tH        |          S # t0        $ r Y y w xY w# t0        $ r Y y w xY w# t2        $ r}t5        d|        Y d }~d }~ww xY w# t0        $ r Y w xY w# t0        $ r Y |w xY w# t2        $ r}t5        d|        Y d }~d }~ww xY w)N/startendz.wavr   Rangezbytes= r         zContent-Typez	audio/wavzAccept-RangesbyteszContent-Rangezbytes zContent-Length   zError serving trimmed audio: rb   i   zError serving file: )&urllibparseurlparsepathunquotelstripparse_qsqueryendswithosexistsfloatr    r   headersreplacesplitintr-   r%   r   r'   wfilewriteBrokenPipeError	Exceptionprintopenfstatfilenoseekreadmincloseshutilcopyfileobjr&   do_GET)r(   parsed_pathr   rB   r   r   r   	total_lenrange_headerrange_match
first_byte	last_bytelengtheffsfile_lenbytes_to_readchunkrW   r)   s                       r   rY   zCORSRequestHandler.do_GET9   sf   ll++DII6<<''(8(89@@E%%k&7&78 e83D3DV3LQSQXQXQ_Q_`hQi';"5>!#45
 ua1.xXN

O	 dll*#'<<#8L"."6"6x"D"J"J3"OK8CA[^!4AJ7:;7G!7KP[\]P^KN 3dmpqdqI I-$-M	&3a7F&&s+$$^[A$$_g>$$_zl!I;VWXaWb6cd$$%5s6{C$$&

((Jy1})MN  &&s+$$^[A$$_g>$$%5s9~F$$&

((4 
 V$)A124(XXahhj)a5dll*#'<<#8L"."6"6x"D"J"J3"OK8CA[^!4AJ7:;7G!7KP[\]P^KN 3dlopdpI H,$,qL	&3a7F&&s+$$^[A$$_g>$$_zl!I;VWX`Wa6bc$$%5s6{C$$&FF:&$*M'!+ !s=)'D E$!" JJ,,U3 &U3 (!+ GGI&&s+$$^[A$$_g>$$%5s8}E$$&%**1djj9 GGI
 w~M +   +   ;5aS9::;F  / "!" +   2,QC0112s   	EU !T/ -A U T> E1V U2 *V >V A V 0 V V /	T;8U :T;;U >	U
U 	U

U 	U/U**U/2	U>;V =U>>V 	V
V VV 	V1V,,V1)__name__
__module____qualname__r'   r.   rY   __classcell__)r)   s   @r   r"   r"   +   s    =f  f r*   r"   __main__r5   i  zIStarting CORS-enabled server with Aggressive Caching on http://localhost:zPress Ctrl+C to stop.Tr4   z
Shutting down server.)http.serverhttpsocketserversys	threadingr   rD   urllib.parser;   r   Lockr
   r   r    serverSimpleHTTPRequestHandlerr"   rg   r   argvrJ   portrO   ThreadingTCPServerallow_reuse_addresshttpdserve_foreverKeyboardInterrupt r*   r   <module>r}      s     
   	  "INN$ 
8t == t l z"388}q03sxx{dD	UVZU[
\]	
!":>L##7	(	(	("d5G	H -E	-!- -  ! 	-+,	-- -s*   C1CC.+C1-C..C11C: