
    1jJ                        % S 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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JrJr  SSKJr  SSKJr  \R0                  " \5      rSSKrSSKJrJrJrJ r J!r!  SSK"J#r#  SSK$J%r%  SSK&r&\'" \
RP                  " S	5      5      r)\)(       d  SSK*r*\*RV                  " S
5        1 Skr,Sr-Sr.Sr/\ " S S5      5       r0Sq1\Rd                  S-  \3S'   / r4\5\Rl                     \3S'   S\74S jr8\Rr                  S 5       r:\" S\:S9r;\)\;Rx                  l=        0 r>\?\@\?4   \3S'   S\@4S jrA\" \B5      R                  S5      rDSqE\R                  S-  \3S'   \R                  " 5       rHS\R                  4S jrIS\@S\?S-  4S jrJS\@S \?4S! jrKS"S"S"S#S#S#S$S$S$S#S#S#S%.rLS&S1rM1 S'krNS( rOS) rPS*\QS+\@S\Q4S, jrRS-\@4S. jrSSS/0 S0.S1S2SS"SSS3.S4S5.S6S7SSSSSSS&S8.S0.S9S/0 S0.S:S/0 S0.S"S/0 S0./rT\R                  " \" \B5      R                  S;5      R                  5       5      rW\R                  " \" \B5      R                  S<5      R                  5       5      rX\R                  " \" \B5      R                  S=5      R                  5       5      rYS> rZS? r[S@ r\SA r]SB r^\;R                  SC5      SD 5       r`\;R                  SE5      ScSF\ SG\?4SH jj5       rb\;R                  SI5      SF\ 4SJ j5       rc\;R                  SK5      \" SL5      4SM\!4SN jj5       rd\;R                  SO5      ScSG\?4SP jj5       re\;R                  SQ5      \" SL5      SR4SM\!SS\'4ST jj5       rf\;R                  SU5      \" SL5      4SM\!4SV jj5       rg\;R                  SW5      \" SL5      \" SL5      \" / SX94SY\@SZ\@S[\5\!   4S\ jj5       rh\;R                  S]\%" \" \B5      R                  S^-  S4S_9S^S`9  Sa rk\Sb:X  a  \k" 5         gg)du>   Kitmaker web app — Razzmatazz kit builder + audio converter.    N)	dataclassfield)Path)escape)FastAPIFileFormRequest
UploadFile)Response)StaticFilesffmpegz?ffmpeg not found on PATH. Audio conversion and probe will fail.>   .aac.aif.m4a.mp3.ogg.wav.aiff.flac         c                   t    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   \" S S9r	\
R                  \S	'   S
rg)AnalysisJob.   rawextfnameforce	cache_keyc                  H    [         R                  " 5       R                  5       $ N)asyncioget_event_loopcreate_future     "/DATA/Downloads/kitmaker/server.py<lambda>AnalysisJob.<lambda>5   s    7;Q;Q;S;a;a;cr(   )default_factoryresultr'   N)__name__
__module____qualname____firstlineno__bytes__annotations__strboolr   r-   r$   Future__static_attributes__r'   r(   r)   r   r   .   s/    	J	HJKN"3cdFGNNdr(   r   _analysis_queue_worker_tasks	worker_idc                 r  #     [         R                  5       I S h  vN n UR                  (       dS  [        UR                  5      nU(       a7  SUS'   UR
                  R                  U5         [         R                  5         M  UR                  (       a7  [        5       nUR                  SUR                  45        UR                  5         [        R                  " [        R                  UR                  UR                   UR"                  5      I S h  vN nSUS'   [%        UR                  U5        UR
                  R                  U5        [         R                  5         GMc   GNL NT! [&         a%  nUR
                  R)                  U5         S nANFS nAff = f! [         R                  5         f = f7f)NT_cachedz,DELETE FROM analysis_cache WHERE file_hash=?F)r8   getr    	cache_getr!   r-   
set_result	task_doneget_dbexecutecommitr$   	to_threadanalysisanalyze_audior   r   r   	cache_set	Exceptionset_exception)r:   jobcacheddbr-   es         r)   _analysis_workerrN   ;   s;    
#''))	(99"3==1(,F9%JJ))&1 %%' yyX

ICMMK[\		",,X-C-CSWWcggWZW`W`aaF %F9cmmV,JJ!!&) %%') ) b  	(JJ$$Q''	( %%'sd   F7E'F7AE, /F7BE, E*:E, F7*E, ,
F6FF FF F44F7c                  #    [         R                  " 5       q[         R                  " 5       n[        R                  5         [        [        5       H2  nUR                  [        U5      5      n[        R                  U5        M4     S 7v   [         H  nUR                  5         M     [         R                  " [        SS06I S h  vN   [        R                  5         S qg  N7f)Nreturn_exceptionsT)r$   Queuer8   get_running_loopr9   clearrangeANALYSIS_WORKERScreate_taskrN   appendcancelgather)apploopitasks       r)   lifespanr^   S   s      mmoO##%D#$ 0 34T" % 
 
..-
@4
@@@O As   CC#C!C#zRazzmatazz Kitmaker)titler^   	_sessionsreturnc                     U R                   R                  S5      nU(       a
  U[        ;  a  [        R                  " S5      n0 [        U'   U$ )Nkitmaker_session   )cookiesr=   r`   secrets	token_hex)requestsids     r)   _session_idrj   k   s?    
//

0
1C#Y&#	#Jr(   zcache.db_dbc                     [         b  [         $ [        R                  " [        [        5      SS9q [        R
                  [         l        [         R                  S5        [         R                  S5        [         R                  S5        [         R                  S5        [         R                  S5        [         R                  5         [         $ )NF)check_same_threadzPRAGMA journal_mode=WALzPRAGMA synchronous=FULLzPRAGMA busy_timeout=10000zPRAGMA wal_autocheckpoint=100zCREATE TABLE IF NOT EXISTS analysis_cache
        (file_hash TEXT PRIMARY KEY, result TEXT, analyzed_at TEXT DEFAULT CURRENT_TIMESTAMP))	rk   sqlite3connectr4   DB_PATHRowrow_factoryrB   rC   r'   r(   r)   rA   rA   {   s    


//#g,%
@CkkCOKK)*KK)*KK+,KK/0KK a bJJLJr(   	file_hashc                 >    [            [        5       R                  SU 45      R                  5       nU(       a  [        R
                  " US   5      OS sS S S 5        $ ! , (       d  f       g = f! [         a$  n[        R                  SU S S U5         S nAg S nAff = f)N3SELECT result FROM analysis_cache WHERE file_hash=?r   zcache_get(%s...) failed: %srd   )	_db_lockrA   rB   fetchonejsonloadsrH   logwarning)rs   rowrM   s      r)   r>   r>      sx    (""E	|hj  *-4::c!f%$	 XX
  19Sb>1Es5   A. AA	A. 
A+'A. +A. .
B8BBr-   c                 N    [            [        5       nUR                  SU [        R                  " U5      45        UR                  5         UR                  S5        S S S 5        g ! , (       d  f       g = f! [         a$  n[        R                  SU S S U5         S nAg S nAff = f)NzFINSERT OR REPLACE INTO analysis_cache (file_hash, result) VALUES (?,?)zPRAGMA wal_checkpoint(PASSIVE)zcache_set(%s...) failed: %srd   )	rv   rA   rB   rx   dumpsrC   rH   rz   r{   )rs   r-   rL   rM   s       r)   rG   rG      s    
FBJJXDJJv./ IIKJJ78 XX  F19Sb>1EEFs5   A6 AA%A6 %
A3/A6 3A6 6
B$ BB$rd          )s16s16les16bes32s32les32bes24s24les24befltfltlefltbe   >   rd   r   r   c                     U R                  5       n [        R                  " SSU 5      n [        R                  " SSU 5      n [        R                  " SSU 5      n U R                  5       =(       d    S$ )Nz[<>:"/\\|?*\x00-\x1f] z\s+z\.+$ zUnnamed Kit)stripresubnames    r)   sanitize_namer      sU    ::<D66*C6D66&#t$D66'2t$D::<(=(r(   c                 >    U R                  S5      nUS:  a  U S U $ U $ )N.r   )rfind)r   r\   s     r)   	strip_extr      s&    

3A1u48&$&r(   input_bytesr   c                 L   [         R                  " USS9 nUR                  U 5        UR                  nSSS5        WS-   n [	        U5      u  pVpxU[
        ;   a  UOSn	U[        ;   a  UOSn
U
S:  a  Sn
SSSS	.U
   nUR                  S
S5      nSSSUSUSU/nX:w  a  US[        U	5      /-  nUS/-  n[        R                  " USSS9nUR                  S:w  a*  UR                  R                  SS9SS n[        SU 35      e[        R                   " 5       n["        R$                  " US5       nUR'                  U	5        UR)                  U
S-  5        UR+                  U5        UR-                  UR.                  5        SSS5        UR1                  5       X44 H  n [2        R4                  " U5        M     $ ! , (       d  f       GN= f! , (       d  f       NQ= f! [6         a     MO  f = f! X44 H+  n [2        R4                  " U5        M  ! [6         a     M)  f = f   f = f)zkConvert any audio to Razzmatazz-compatible WAV (PCM tag 1, preserve
sample rate, 24-bit max, 1-2 channels).FsuffixdeleteNr   r   r   	pcm_s16le	pcm_s24le)rd   r   r   pcm_r   r   z-yz-iz-fz-acodecz-aczpipe:1Tx   )capture_outputtimeoutr   replace)errors   zffmpeg: wbr   )tempfileNamedTemporaryFilewriter   _probeALLOWED_CHANNELSALLOWED_BIT_DEPTHSr   r4   
subprocessrun
returncodestderrdecodeRuntimeErrorioBytesIOwaveopensetnchannelssetsampwidthsetframeratewriteframesstdoutgetvalueosunlinkOSError)r   r   tmp_ininpathoutpathchsrbd_dur	target_ch	target_bdacodecraw_fmtcmdrerrbufwfps                      r)   convert_audior      s    
	$	$C	>&[! 
? voG!&> 00Ba	 22B	r>I!{DYO..,tVT7IvN?E3y>**CzNN3tSA<<1((///3DS9C#/00jjlYYsD!ROOI&OOIN+OOBNN188$	 "
 ||~"A		! #A 
?	>2 "!   "A		!  #sg   F;C.G/ 0AGG/  G;
G

GG/ 
G,+G,/H#7HH#
H	H#H	H#pathc           
         [         R                  " SSSSSSSU /SSS	S
9n[        R                  " UR                  5      nS nSU;   a0  US   R                  S5      nU(       a  [        [        U5      S5      nUR                  S/ 5       Hs  nUR                  S5      S:X  d  M  UR                  SS5      n[        UR                  SS5      5      nUR                  SS5      n[        R                  US5      n	XgX4s  $    SSSU4$ )Nffprobez-vquietz-print_formatrx   z-show_streamsz-show_formatT   )r   textr   formatduration   streams
codec_typeaudiochannelsr   sample_rateiD  
sample_fmtr   rd   )
r   r   rx   ry   r   r=   roundfloatintSAMPLE_FMT_TO_BITS)
r   r   datadurdsr   r   fmtr   s
             r)   r   r      s    	D'?FO		$	4A ::ahhD
C4Nz*a!$CXXi$55')z1%BQUU=%01B%%e,C#''R0B2?" % eRr(   samtempl)r|   typeparams
   seqmod)steplenseqsteps
seqkeytrigseqquantT)r|   r   r   sequence   drumsettings)chokegrploopmodemaclaunchtoggstackfiltmodemacpitchmodplaythru	fx3enable      ztemplates.jsonzglobal_fx.jsonzdefault_seq.jsonc                 l    SR                  S U R                  5        5       5      nU(       a  SU S3$ S$ )Nr   c              3   Z   #    U  H!  u  pU S [        [        U5      5       S3v   M#     g7fz=""Nr   r4   .0kvs      r)   	<genexpr> render_params.<locals>.<genexpr>  s(     J>41s"VCF^,A.>   )+z<params />z	<params/>)joinitems)r   attrss     r)   render_paramsr    s2    HHJ6<<>JJE#(XeWB9k9r(   c           	         [        U S   5      nU S   S:X  a
  SUS'   SUS'   U S   S:X  a  SUS	'   U S   S
:X  a  SUS'   SUS'   SUS'   U S   S:X  aF  X&S'   U(       a  SOSUS'   U(       a  SO[        US-  5      US'   U(       a  SO[        US-  5      US'   U S   S:X  a*  S H  nUR                  US 5        M     SUS'   SUS'   SUS'   U S   S:X  a  UOU R                  S5      =(       d    SnSU S    SU S[	        U5       S U S!    S"3	S#[        U5       3/n	U R                  S$5      (       a  U	R                  S%5        U	R                  S&5        S'R                  U	5      $ )(Nr   r|   r   r   	pitchsemi	pitchfine   i  envdecay	   vfxdistfx1sendfx2send   selpadr   Mutei r   gaindbpanposr   )macpitchmacdelay	oscwavmixmodeldistamtfilenamer   z        <cell row="z" column="0" synth="z" filename="z" type="r   ">            r               <sequence/>        </cell>
)dictr   popr=   r   r  rW   r  )
cellr%  synth_idvolumepanmutedr   r	  r   liness
             r)   render_cellr3    s   T(^AE{a++E{a*E{a)))E{b(AA&	 %f5"+=( aeC"Ho(E{bAEE!TN *+.Uq(Htxx
/C/IrE
d5k]*>xjU[\aUbTccklpqwlxkyy{|
}Q'()E xx
./	LL"#99Ur(   c                   ^  [        U 4S j[         5       S 5      nU(       a  US   OSSSSSS.nU(       a  UR                  S/ 5      O/ nS	T  S
3S[        U5       3U(       a  SOS/nU H>  nSR	                  S UR                  5        5       5      nUR                  SU S35        M@     U(       a  UR                  S5        UR                  S5        SR	                  U5      $ )Nc              3   <   >#    U  H  oS    T:X  d  M  Uv   M     g7f)seqnumNr'   )r  r   r6  s     r)   r  render_seq.<locals>.<genexpr>6  s     G-a81F-s   	r   101601)notesteplennotestepcountmidioutchanseqplayenableseqstepmodeeventsz        <cell seqnum="z" type="noteseq">r'  z            <sequence>r(  r   c              3   Z   #    U  H!  u  pU S [        [        U5      5       S3v   M#     g7fr  r  r  s      r)   r  r7  A  s(     JztqA3bA 02zr  z                <seqevent r  z            </sequence>r)  r*  )nextDEFAULT_SEQ_EVENTSr=   r  r  r  rW   )r6  seqr   rA  r2  evr  s   `      r)   
render_seqrG  5  s    
G-G
NC!S]dS(FF '*SWWXr"rF
 (9:
}V,-.$* 0IE
 JrxxzJJ1%;<  ./	LL"#99Ur(   c                      / n [          Hj  nU R                  SUS    S35        U R                  SUS    SUS    S35        U R                  S[        US	   5       35        U R                  S
5        Ml     U $ )N        <synth id="idz" name=""/>z(        <cell row="0" column="0" synth="z" filename="" type="r   r&  r'  r   r)  )	GLOBAL_FXrW   r  )r2  fxs     r)   render_global_fxrM  I  s    E*2d8*K@A?4zI]^`ag^h]iiklm|M"X,$?#@AB&'	 
 Lr(   c                 b   [        U 5      n/ SQnU GH  nSUS   -
  n[        UR                  S5      5      nUR                  SS5      n[        R                  U[        S   5      n[        UR                  SSUS   S	-    35      5      S S
 n	U(       a  SU SUR                  SS5       3OSn
U(       + nUR	                  SU S[        U	5       S35        US    H@  nUR	                  [        XXTR                  SS5      UR                  SS5      U5      5        MB     GM     UR                  [        5       5        [        S5       H  nUR	                  [        U5      5        M     UR	                  S5        UR	                  S5        UR	                  S5        SR                  U5      S-   $ )N)z&<?xml version="1.0" encoding="UTF-8"?>z
<document>z    <session version="4">   	slotIndexr%  r   tomlabelzPad r   r   z	\Samples\\r   rI  z" name="z"/>cellsr/  r   r0  rd   z        <midimap/>z    </session>z</document>r*  )r   r5   r=   SYNTH_TEMPLATESrW   r   r3  extendrM  rT   rG  r  )kit_nameslotssafer2  slotsi
has_samplestypetemplate	disp_namesample_pathr1  r-  r6  s                 r)   	build_nnrra  S  s   "DaEk""$((:./
'"&&uoe.DE!$((7d4;Lq;P:Q4R"STUXVXY	JTD6DHHZ,D+EFZ\*2$hvi7H6IMNW%DLLTHHXq<QSWS[S[\acdSeglmn &  
LL!#$)Z'( 	LL%&	LL!"	LL99Ud""r(   z	/api/pingc                  
    SS0$ )NokTr'   r'   r(   r)   pingrd  m  s    $<r(   z/api/session/saverh   r   c                    #    [        U 5      nUb	  U[        U'   [        [        R                  " SS05      5      nUR                  SUSSSS9  U$ 7f)Nrc  Trc    ' laxmax_agehttponlysamesite)rj   r`   r   rx   r~   
set_cookie)rh   r   ri   resps       r)   api_session_savern  r  sR     
g
C	#DJJd|,-DOO&Z$Y^O_Ks   AAz/api/session/loadc                    #    [        U 5      n[        R                  U0 5      n[        [        R
                  " U5      5      nUR                  SUSSSS9  U$ 7f)Nrc   rf  Trg  rh  )rj   r`   r=   r   rx   r~   rl  )rh   ri   r   rm  s       r)   api_session_loadrp  |  sO     
g
C==b!DDJJt$%DOO&Z$Y^O_Ks   AAz
/api/probe.filec           	        #    [         R                  R                  U R                  =(       d    S5      S   R	                  5       nU[
        ;  a$  [        [        R                  " SSU 305      SSS9$ U R                  5       I S h  vN nSS K
nUR                  " US	S
9 nUR                  U5        UR                  nS S S 5         [        W5      u  pgpUUUU	=(       d    SU[        U5      S. [         R                   " U5        $  N! , (       d  f       NQ= f! ["         a     $ f = f! [$         a[  n
[        [        R                  " S['        U
5      05      SSS9s S n
A
 [         R                   " W5        $ ! ["         a     $ f = fS n
A
ff = f!  [         R                   " W5        f ! ["         a     f f = f= f7f)Nr   r   errorzUnsupported format:   application/jsonstatus_code
media_typer   Fr   )r   
sampleRatebitDepthr   r   size)r   r   splitextr%  lowerAUDIO_EXTENSIONSr   rx   r~   readr   r   r   r   r   lenr   r   rH   r4   )rq  r   r   r   fr   r   r   r   r   rM   s              r)   	api_prober    s    
''

4==2F
3A
6
<
<
>C
""

G/CC5-I#JK$'4FH 	H		
C		$	$C	>!	vv 
? ,qH
	IIdO) 	>	>&  		  H

GSV#45$'4FH 	H	IIdO 		H	IIdO 		s   BF?DF?!D
?F?(D+ 1DF?

DF?
D(%F?'D((F?+
F5)FFF $E;:F?;
FF?FF?FF F<F,+F<,
F96F<8F99F<<F?z/api/lookupc                 <  #    U c  0 $ U R                  S/ 5      nU(       d  0 $ 0 n[           [        5       nU HD  nUR                  SU45      R	                  5       nUc  M)  [
        R                  " US   5      X$'   MF     SSS5        U$ ! , (       d  f       U$ = f7f)z?Bulk lookup: returns {hash -> result_or_null} for known hashes.Nhashesru   r   )r=   rv   rA   rB   rw   rx   ry   )r   r  outrL   hr|   s         r)   
api_lookupr    s      |	XXh#F	
C	XA**Ethj  CF+  
 J 
 Js"   )B2B
!B
 
B

BBz/api/analyzeFr    c           	        #    [         R                  R                  U R                  =(       d    S5      S   R	                  5       nU[
        ;  a$  [        [        R                  " SSU 305      SSS9$ U R                  5       I S h  vN n[        R                  " U5      R                  5       nUnU R                  =(       d    SnU(       a4  [        R                  " XF-   R                  5       5      R                  5       n[        X2XaUS	9n[        R!                  U5         ["        R$                  " UR&                  S
S9I S h  vN nU$  N N! ["        R(                   a$    [        [        R                  " SS05      SSS9s $ [*         a4  n	[        [        R                  " S[-        U	5      05      SSS9s S n	A	$ S n	A	ff = f7f)Nr   r   rs  zUnsupported: rt  ru  rv  r   )r   r   r   r    r!   r   )r   zAnalysis timed outi  )r   r   r|  r%  r}  r~  r   rx   r~   r  hashlibsha256	hexdigestencoder   r8   
put_nowaitr$   wait_forr-   TimeoutErrorrH   r4   )
rq  r    r   r   rs   r!   r   rJ   r-   rM   s
             r)   api_analyzer    s}    
''

4==2F
3A
6
<
<
>C
""

G}SE-B#CD$'4FH 	H		
Cs#--/IIMMRENNI$5#=#=#?@JJL	
#eI
VCs#H''

C@@  A H

G-A#BC$'4FH 	H H

GSV#45$'4FH 	HHsa   BGEBG#"E EE GE 5GG	G)F?9G:G?GGz/api/convertc           	        #    [         R                  R                  U R                  =(       d    S5      S   R	                  5       nU R                  5       I S h  vN n [        X!5      n[        USSU R                  =(       d    S0S9$  N0! [         a4  n[        [        R                  " S[        U5      05      SS	S
9s S nA$ S nAff = f7f)Nr   r   z	audio/wavzX-Original-Namez
sample.wavcontentrx  headersrs  rt  ru  rv  )r   r   r|  r%  r}  r  r   r   rH   rx   r~   r4   )rq  r   r   wavrM   s        r)   api_convertr    s     
''

4==2F
3A
6
<
<
>C		
CgC%!2DMM4Q\ RT 	T 
  g

GSV#453SeffgsB   ACB
C*B 	C
C
)C?C
 CC

Cz/api/export)defaultkitNameconfigfilesc                 P  ^#    [        U 5      =(       d    Sn[        R                  " U5      nU Vs/ s H  oUR                  S5      (       d  M  UPM     nnU(       d!  [	        [        R
                  " SS05      SSS9$ [        R                  " 5       n[        R                  " US[        R                  5       nS	U 3n	[        5       n
U GHc  nUS   m[        U4S
 jU 5       S 5      nUc  SUS'   M)  UR                  5       I S h  vN n[        U5      S:X  a  SUS'   MW  [        R                   R#                  T5      S   R%                  5       n ['        X5      n[        [+        T5      5      =(       d    SUS   S-    3nUS-   n[        U5      S:  a
  US S nUS-   nSnUR%                  5       U
;   a;  U SU 3n[        U5      S:  a  US S nU S3nUS-  nUR%                  5       U
;   a  M;  U
R-                  UR%                  5       5        UUS'   UR/                  U	 SU 3U5        GMf     [1        X45      nUR/                  U S3U5        S S S 5        [	        UR3                  5       SSSU S30S9$ s  snf  GNx! [(         a     GM  f = f! , (       d  f       NG= f7f)NMyKitr%  rs  zNo samples assigned to any pad.rt  ru  rv  wzSamples/c              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7fr#   )r%  )r  r  fns     r)   r  api_export.<locals>.<genexpr>  s     B1r1AQQs   #	#r   r   r   padrP  r   r      r   -/z.nnrzapplication/zipzContent-Dispositionzattachment; filename="z.zip"r  )r   rx   ry   r=   r   r~   r   r   zipfileZipFileZIP_DEFLATEDsetrC  r  r  r   r   r|  r}  r   rH   r   addwritestrra  r   )r  r  r  r   rX  r   filledr   zf
sample_dir
used_namesrZ  uploadedr   r   r  baseout_namer   stemnnr_xmlr  s                        @r)   
api_exportr    s     !,WDJJvE4A%%
"3aF4

G-N#OP$'4FH 	H **,C	c7#7#7	8Bv&
U
Dj!BBBDIH#%Z  'C3x1}#%Z ''""2&q)//1C#C- !2/PSk9JQ9N8O3PDf}H8}s"DSz&=F.."j0q)t9s?:D"V4=! .."j0 NN8>>+,'DKK:,az2C8C F D(
tfDM7+O 
9R CLLN7H26LTFRW4XY[ [_ 5  (  % 
9	8so   /J&I;I;A%J&:AJJ 	A
JJBJ4A J,J& J
JJJJ
J#J&r  static)	directoryhtmlr   c                  2    [         R                  " SSSSS9  g )Nz
server:appz0.0.0.0i`"  T)hostportreload)uvicornr   r'   r(   r)   mainr    s    KK94Er(   __main__r#   )l__doc__r$   
contextlibr  r   rx   loggingr   r   rf   shutilrn   r   r   	threadingr   r  dataclassesr   r   pathlibr   xml.sax.saxutilsr   	getLoggerr.   rz   rE   fastapir   r   r	   r
   r   fastapi.responsesr   fastapi.staticfilesr   r  r5   which
_ffmpeg_okwarningswarnr~  	PAD_COUNT
GRID_WIDTHrU   r   r8   rQ   r3   r9   listTaskr   rN   asynccontextmanagerr^   rZ   state	ffmpeg_okr`   r+  r4   rj   __file__	with_namerp   rk   
ConnectionLockrv   rA   r>   rG   r   r   r   r   r   r2   r   r   COMMON_ROWSry   	read_textrU  rK  rD  r  r3  rG  rM  ra  r=   rd  postrn  rp  r  r  r  r  r  mountparentr  r'   r(   r)   <module>r     s   D    	   	 	         (  #!  < < & +  &,,x()
MMSTU 	
  e e e )-% ,$&tGLL! &(c (0     )H= 		   	4T	? C  x.
"
":
.!%W$ %>>"" 	 	 	F Fd F RRRR	  q6 ! )'
'u '3 '5 'T 2 zR0r!-%268qa!A1[\3^ _
b1
b1
b1	 **T(^556FGQQSTJJtH~//0@AKKMN	ZZX 8 89K L V V XY :
D(#4   
G 4   	G   ,'+Cy *  < -4  $ .)-c% HJ H4 H H0 .)-c gJ g g -9s)"2.8[8[8[ 
8[ 8[z 		#{T(^%:%:X%EDQX`	 aF zF r(   