
    h                     n   d dl mZm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Zd dlZd dlmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) erddl*m+Z+ ere,Z-dZ.dZ/dZ0dZ1dZ2 e3g d      Z4 e3g d      Z5 e3djm                               Z7 ejp                  d      Z9	 ejt                  jw                  d      r e<       d dl=m>Z>m?Z?m@Z@mAZA dZ.	 ejt                  jw                  d      r e<        e@j                  d       dZ/	 ejt                  jw                  d      r e<        e?j                  dd      j                   e       d       dZ2	 ejt                  jw                  d      r e<       d dlEmFZF  eF        dZ0	 ejt                  jw                  d      r e<       d e?j                         v r	dZ1 e<       d dlHZHdZ1 ej                  d       j                  ej                         	 ejt                  jw                  d!      r e<       dZLd dlMZM ej                  d"      j                  ej                         i ZNd# ZO G d$ d%eP      ZQy#  Y ZxY w#  Y xY w#  Y xY w#  Y xY w#  Y xY w#  dZLY <xY w)&    )print_functionunicode_literalsN)Queue   )ANYWINPY2TYPE_CHECKING)VFS)bos)HAVE_FFMPEGHAVE_FFPROBEau_unpkffprobe)BytesIO)
FFMPEG_URL
VF_CAREFULCooldownDaemonafsencatomic_movefsencmin_exruncmdstatdirub64encvsplitwunlink)SvcHubF)jpgwebppng)opusowacafmp3flacwavzaif aiff flac mp3 opus wavz^-?[0-9a-f]{8,10}$PRTY_NO_PIL)ExifTagsImage	ImageFontImageOpsTPRTY_NO_PILF   )sizePRTY_NO_PIL_WEBPRGB)   r2   r    )formatPRTY_NO_PIL_HEIF)register_heif_openerPRTY_NO_PIL_AVIFz.avifPILPRTY_NO_VIPSpyvipsc                    t        |      \  }}|sd}|j                  d      d   j                         }||v r|d d dv r|j                  dd      }t        }|dz   |z   }	|j                  |	      }|st        j                  t        |	            j                         }
t        |
      j                  d	      d d
 }|d d d|dd dj                         |z   }t        |      dkD  r|j                          |||	<   t        j                  t        |            j                         }
t        |
      j                  d	      d d
 }|t        v rd}n|d d }|dk(  rdn|dk(  rdnd}d}d| |||t        |      |fz  S )Nz
top.r2   )wfjff 
ascii   /   i)#  acr   wr    pr!   r   thz%s/%s/%s/%s.%x.%s)r   splitlowerreplaceth_dir_cachegethashlibsha512r   digestr   decodelenclearEXTS_ACint)histpathremmtimefmtffardfnextdcacherd_keyhb64catfcs                 E/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/th_srv.py
thumb_pathrf   }   sz    C[FB ))C.

"
"
$C
czc"1g-kk#r"F$Y_F	F	BNN6&>*113aj("-bq'3q8,335;v;LLNv 	vbz"))+A			7	#CR	(B
g~!Wc	fc	uu(CRUS!III    c                       e Zd Zd Z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Z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 Zy)ThumbSrvc                    || _         |j                  | _        |j                  | _        |j                  | _        t        | j                  j                        | _        t        j                         | _
        i | _        i | _        i | _        t        j                  | j                        | _        d| _        d| _        t%        d| j                  j&                        | _        t+        | j                  j,                  j/                  d            | _        t3        | j(                  dz        | _        t7        | j(                        D ]2  }t9        | j:                  dj=                  || j(                               4 | j                  j>                   xs | j                  j@                   }|rtB        rtD        sg }tB        s|jG                  d       tD        s|jG                  d       d	}|d
jI                  |      z  }| j                  |d       tJ        r/| j                  jL                  r| j                  dtN        z   d       | j                  jP                  rt9        | jR                  d       | j                  jT                  | j                  jV                  | j                  jX                  | j                  jZ                  | j                  j\                  fD cg c]  }t+        |j/                  d             c}\  | _/        | _0        | _1        | _2        | _3        th        s1dj/                  d      D ]  }| j^                  jk                  |        tl        s1dj/                  d      D ]  }| j^                  jk                  |        t+               | _7        d| j                  jp                  v r| xjn                  | j^                  z  c_7        d| j                  jp                  v r| xjn                  | j`                  z  c_7        d| j                  jp                  v r>| jb                  | jd                  | jf                  fD ]  }| xjn                  |z  c_7         y y c c}w )NFTr   ,rE   zthumb-{}-{}FFmpegFFprobez^cannot create audio/video thumbnails because some of the required programs are not available: z,    czdownload FFmpeg to fix it:[0m z	thumb.clnzheif heifs heic heics z
avif avifspilvipsff)9hubasrvargsloglog_funcr   th_pokepoke_cd	threadingLockmutexbusyuntempram	Conditionmemcondstoppingrm_nullthumbsmaxth_mtnthrsetth_spec_cnvrJ   exts_spec_unsafer   qranger   workerr3   	no_vthumb	no_athumbr   r   appendjoinr   no_acoder   th_cleancleanerth_r_pil	th_r_vipsth_r_ffith_r_ffvth_r_ffafmt_pilfmt_vipsfmt_ffifmt_ffvfmt_ffa	HAVE_HEIFdiscard	HAVE_AVIF	thumbableth_dec)	selfru   nwant_ffmissingmsgyr?   zsss	            re   __init__zThumbSrv.__init__   sF   HH	HH			 1 12^^%
	 **4::6!499??+	 #DII$9$9$?$?$D E499q=)tyy! 	DA4;; 4 4Q		 BC	D ii)))D1D1D-DK|Gx(y)rC499W%%CHHSAH$)),,=
JAN994<<-
 		""		##		""		""		""	Q
 	Q
MdmT\4< ,2237 ($$Q'( !'', ($$Q'( %DII$$$NNdll*NTYY%%%NNdmm+N499###dllDLLA &#%& $7	Q
s   #!Q(c                 *    | j                  d||       y )Nthumb)ry   )r   r   rp   s      re   rx   zThumbSrv.log   s    gsA&rg   c                 |    d| _         t        | j                        D ]  }| j                  j	                  d         y )NT)r   r   r   r   put)r   _s     re   shutdownzThumbSrv.shutdown   s1    tyy! 	AFFJJt	rg   c                 `    | j                   5  | j                   cd d d        S # 1 sw Y   y xY wN)r~   r   r   s    re   stoppedzThumbSrv.stopped   s'    ZZ 	!yy=	! 	! 	!s   $-c                     d|v rdnd}|j                   d   j                  d      \  }}t        |      |z  t        |      |z  fS )N3rn   r   thsizex)flagsrJ   rV   )r   vnrZ   mulrG   ra   s         re   getreszThumbSrv.getres   sG    #:a1xx!'',11v|SVc\))rg   c           
      r   | j                   j                  j                  j                        }|s| j	                  d       y t        ||||| j                        }t        j                  j                  |      }t        j                  | j                        }d}	| j                  5  	 | j                  |   j                  |       | j	                  d|       d d d        |	rt5        | j                   j                  j6                  j9                               }t;        fd	|D        d       }|sA| j	                  d
d|d       | j                   j                  j<                  d   d   d   }| j>                  jA                  ||||f       | j	                  d|d|d|d       | jB                  sW| j                  5  || j                  vr
	 d d d        n2	 d d d        |5  |jE                  d       d d d        | jB                  sW	 t%        jF                  |      }|jH                  r| jK                  |       |S 	 y #  t        j                  j                  |      }
| j                   j"                  rt$        j&                  nt$        j(                  }t%        j*                  t        j                  j                  |
d      |       t        j                  j                  |
d      }t$        j                  j-                  |      sYt/        |d      5 }|j1                  t3        t        j                  j                  |                   d d d        n# 1 sw Y   nxY w|g| j                  |<   d}	Y xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w#  Y y xY w)Nzno histpath for Fzjoined waiting room for rG   )vfdir.txtwbTc              3   B   K   | ]  }|j                   k(  s|  y wr   )realpath).0r   ptops     re   	<genexpr>zThumbSrv.get.<locals>.<genexpr>  s     @QQZZ4-?q@s   zptop z not in rn   r   r   zconv z :z [0m   )&rv   vfshisttabrN   rx   rf   r   ospathr   r|   r   r~   r   r   dirnamerw   
free_umaskr   MKD_700MKD_755makedirsexistsopenwriter   listall_volsvaluesnextall_apsr   r   r   waitstatst_sizepoke)r   r   rX   rY   rZ   rW   tpathabspathconddo_convthdirchmodinf_pathr?   allvolsr   sts    `               re   rN   zThumbSrv.get   s   99==((,,T2HHT348S%dllC'',,tS)""4::.ZZ 			% ''-@A	" 499==1188:;G@'@$GBg>BYY]]**1-a03FFJJR01HHsGDaH-- 		) )  		! --	%Bzz		%   O.'+yy';';RWW\\%5%@77<<y9xxx0h- Brwww'? @AB B B %)6		% 	 	8  	s[   .N02IN1N%3N2 CN&8M'	N'M0,NNNN"%N/2N6c                     | j                   | j                  | j                  | j                  | j                  | j
                  dS )N)r   rr   rs   ffiffvr[   )r   r   r   r   r   r   r   s    re   getcfgzThumbSrv.getcfg4  s6    <<MM<<<<<<
 	
rg   c           	         | j                   j                  }||dz  kD  rd}t        |||fz        	 | j                  5  t	        | j
                  j                         D cg c]  \  }}||k7  s| c}}      |z   }||k  r|| j
                  |<   	 d d d        y 	 d d d        | j                  5  | j                  j                  d       d d d        c c}}w # 1 sw Y   @xY w# 1 sw Y   xY w)NgGz?z>file too big; need %.2f GiB RAM, but --th-ram-max is only %.1frn   )	rw   
th_ram_max	Exceptionr~   sumr   itemsr   r   )r   needttpathr   tkvuseds           re   wait4ramzThumbSrv.wait4ram>  s    ii""#*PAAsO,, $((..*:J$!Qa6kAJKdR#:'+DHHV$   %!!!$% J % %s/   #C!C/C3 C1C(CC%(C1c                 F   | j                   st| j                  j                         }|snV|\  }}}}|j                  d      d   j	                         }d}g }|| j
                  j                  v r-t        | j                  | j
                  j                  ||      }	n|}	t        j                  j                  |      s|j                  dd      d   }
|
dk(  }|
dv }|
dk(  }|
dk(  }|
d	k(  }|xs
 |xs |xs |}| j
                  j                  D ]  }|d
k(  xr || j                  v xs || j                  v }|dk(  r*|| j                  v r|j!                  | j"                         X|dk(  r*|| j$                  v r|j!                  | j&                         |r|s|r|r|j!                  | j(                         |r|j!                  | j*                         |r|j!                  | j,                         |r|j!                  | j.                         |s
|j!                  | j0                         d})|d
k(  r9|| j2                  v s|| j                  v r|j!                  | j4                         g|d
k(  sn|| j                  v s~|r|j!                  | j6                          t8        j                  j                  |      \  }}t8        j                  j;                  |d|      }	 t=        | j                  ||j>                         |D ]-  }	 |s|jA                  d      rtC        d       ||	|||        n ||	k7  r!t=        | j                  |	|j>                         	 tM        | j                  |||j>                         g }| jN                  5  | jP                  |   }| jP                  |= | jR                  jU                  |d        | jV                  jU                  |d       xs g }d d d        |D ]  }	 t=        | j                  |tX                 D ]  }|5  |j[                          d d d         | j\                  5  | j\                  j[                          d d d        | j                   st| jN                  5  | xj^                  dz  c_/        d d d        y #  Y xY w# tB        $ r}d}||jD                  |tG               fz  }d|v rdnd}| j                  ||       tI        |dd      dk7  r\||d   k(  r~	 tK        |d      5 }	 d d d        n# 1 sw Y   nxY wnY# tB        $ r#}d}| j                  |||fz  d       Y d }~n2d }~ww xY w	 t=        | j                  ||j>                         n#  Y nxY wY d }~xd }~ww xY w# tB        $ rD}t8        j                  j                  |      sd}| j                  ||||fz  d       Y d }~Od }~ww xY w# 1 sw Y   xY w#  Y xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr;   r<   Fr   r%   )r"   r#   r$   r&   r'   r!   rt   rr   rs   TrG   .pngzpng only allowed for waveformsz&%s could not create thumbnail of %r
%sz<Signals.SIG90
returncoder   A  r   z"failed to create the file [%s]: %rrn   z#failed to move  [%s]  to  [%s]:  %r)0r   r   rN   rJ   rK   rw   r   rx   r   r   r   rsplitr   r   r   r   r   conv_pilr   	conv_vips	conv_opusconv_mp3	conv_flacconv_wav
conv_wavesr   conv_ffmpeg	conv_specr   r   r   r   endswithr   __name__r   getattrr   r   r~   r   r   popr   r   
notify_allr   r   ) r   taskr   r   rZ   r   r^   png_okfunsap_unpktexwant_mp3	want_opus	want_flacwant_wavwant_pngwant_aulibcan_autdirtfnr   funexr   rp   r   r   r   subsapr   s                                    re   r   zThumbSrv.workerO  s\   --66::<D&*#GUC--$R(..0CFDdii'''!$((DII,=,=wK!88??5)ll3*2.%<#99	6M	%<%<"HiH9H99++ 4C D[ t||+Bsdll/B  e|t||(;DMM23$--+?DNN3X$ KK7% KK6& KK7% KK6% KK8%)F#*=ATD$4$45)<WDNN3144 e,ID#WW\\$S1F&"((3  !!!ennV&<'(HIIb1!6 '!'2884DHHfeRXX> F =yy'IIe$VT*6<"	=  DHHb*5  # #LLN# ##  *'')*_ --d ZZ 	IINI	 	{ ! !CCw AAC-4!$AHHS!$r<3s:$r(?>%)&$%7 !)1$(!) !) !)#, >$H $fb\)91 = =>
!#DHHfbhh?! %!2  ww~~e,=AHHQ&%!44a8	= =# #* *	 	s   5!R- )R5/"V AW(W5*W=X
X-R25	V>AVT1T$	T1$T-)T10V1	U:UVUV!!VVVVV	W%!9W  W%(W25W:=X	
XX c                    | j                  ||      }t        | dz  }|j                  ||ft        j                         	 t        d t        j                  j                         D              }|j                         }t        ||         }||= t        j                  t        j                  t        j                  d}	||	v r|j                  |	|         }d|v r#|j                  |t        j                         |S |j                  \  }
}|\  }}t!        |
|      t!        ||      f}t#        j$                  ||t        j                        }|S #  d}Y xY w)Nr2   )resamplec              3   2   K   | ]  \  }}|d k(  s|  yw)OrientationN )r   r   r   s      re   r   z(ThumbSrv.fancy_pillow.<locals>.<genexpr>  s     O41aA<NQOs   r   )   rn   r   r?   )method)r   r   	thumbnailr*   LANCZOSr   r)   TAGSr   getexifrV   	ROTATE_90
ROTATE_180
ROTATE_270	transposer/   minr,   fit)r   imrZ   r   resrr   exifrotrotsiwihdwdhs                 re   fancy_pillowzThumbSrv.fancy_pillow  s&   kk"c"IM
aVemm4	O8==#6#6#8OOA::<Dd1g,CQ ??u'7'7E<L<LM$;d3i(B#:LLu}}L5 	 WWFBFBr2;B,Cb#emm<B		Cs   AE Ec                 4   | j                  d|       t        j                  t        |            5 }	 | j	                  |||      }ddg}ddi}|j                  d      r|j                  d	       d
|d<   nd|d<   |j                  |vr|j                  d      } |j                  |fi | d d d        y # t
        $ rL}| j                  dj                  |      d       |j                  | j                  ||             Y d }~d }~ww xY w# 1 sw Y   y xY w)N皙?zfancy_pillow {}r   r1   Lquality(   z.webp)RGBALAr   r$  Tprogressive)r   r*   r   r   r9  r   rx   r3   r%  r   r  extendmodeconvertsave)	r   r   r   rZ   r   r/  r  fmtsrw   s	            re   r   zThumbSrv.conv_pil  s   c5!ZZg' 	#23&&r33
 3<Dr?D~~g& N+!"X '+]#wwd"ZZ&BGGE"T"5	# 	#  3*11"5t<T[[S1223	# 	#s6   DB6A'D6	D?ADDDDDc                    | j                  d|       ddg}d|v rdg}| j                  ||      \  }}|ddd}|D ]*  }		 |	|d<   t        j                  j                  ||fi |}
 n 
j                  |d
       y #  |	|d	   k(  r Y NxY w)Nr;  centrenoner?   downrelative)heightr/   intentcropr<   r>  )Q)r   r   r9   r*   r%  write_to_file)r   r   r   rZ   r   cropsrG   ra   kwrp   imgs              re   r   zThumbSrv.conv_vips  s    c5!6"#:HE{{2s#16Z@ 	A6
ll,,Wa>2>		 	%2&	b	> "s   &A<<B	c                    | j                  d|       t        |t        |j                  d   dz              \  }}|sy |j	                  d      d   j                         }|dv s|| j                  v rg }n3d|v r|d   d   nd	}	d
dj                  |	dz        j                  d      g}d}
d|v r|
dz  }
n|
dz  }
| j                  ||      } |
j                  t        |       j                  d      }g d}||z  }|dt        |      ddd|ddddg
z  }|j                  d      r|ddgz  }n|g dz  }|t        |      gz  }| j                  ||       y )Nr;  convtr2   r;   r<   )h264h265.durr   rE   s   -ssz{:.0f}rn   utf-8z*scale={0}:{1}:force_original_aspect_ratio=r?   zdecrease,setsar=1:1z increase,crop={0}:{1},setsar=1:1)   ffmpeg   -nostdin   -v   error   -hide_banner   -i   -maps   0:v:0s   -vf	   -frames:v   1s   -metadata:s:v:0s   rotate=0.jpg   -q:v   6rd  s   50s   -compression_level:vre  )r   r   rV   r   r   rK   r   r3   encoder   r   r   r  _run_ff)r   r   r   rZ   r   retr   r^   seekdurscaler0  bscalecmds                 re   r  zThumbSrv.conv_ffmpeg  s   c5!#bhhw&7!&;"<=QnnS!"%++-""cT\\&9D$*cM#f+a.qCHOOC!G4;;GDED<#:**E77Ekk"c"tCy)009
 	t5>XF$
 	
 >>&! C
   C 	e~S"rg   c           	         t        ||j                  d   d|      \  }}}|sy d}d}| j                  j                  r7t	        j                         t        | j                  j                        z
  dk  r[|d   j                         j                  d      r9d	|v sd
|v sd|v sd|v r)t	        j                         | j                  _        d}d}d}| j                  j                  r7t	        j                         t        | j                  j                        z
  dk  r1d|v sd|v r)t	        j                         | j                  _        d}d}d}|j                  d      j                  d      }	t        |	      dkD  r|	d d dgz   |	dd  z   }	dj                  |	D 
cg c]  }
dt        |
      z    c}
      }t        |      dkD  r|d d dz   |dd  z   }| j                  ||z   |       t        j                   ||d   d|d   f      c c}
w ) NrU  Ttimeoutniceoomr   z/FFmpeg failed (probably a corrupt video file):
<   r<   s   .webpzError selecting an encoderz"Automatic encoder selection failedzDefault encoder for format webpz!Please choose an encoder manuallyzbFFmpeg failed because it was compiled without libwebp; enabling --th-ff-jpg to force jpeg output:
r   r   z*Requested resampling engine is unavailablezoutput pad on Parsed_aresample_zdFFmpeg failed because it was compiled without libsox; enabling --th-ff-swr to force swr resampling:
rA   2      z[...]izff: i  i	  z...
ff: [...]
ff: ...i<ro   r   s   ...)r   r   rw   	th_ff_jpgtimerV   rK   r  	th_ff_swrstriprJ   rS   r   strrx   spCalledProcessError)r   rn  r   rs  ri  r   serrrp   r   linesr   txts               re   rh  zThumbSrv._run_ffH  s   c288G+<4SQQ>$$		c$)):M:M6N(NQS(SB((2,474?4<6$> #'))+DIIuACA 		##tyy{S9L9L5M'MPR'R8D@0D8"&))+DIIwACA

4 &&t,u:?#2J'*U34[8Eii%8Q#a&89s8d?et*883uv;FCSA##C#a&&#b')BCC 9s   Hc                 B   t        |t        |j                  d   dz              \  }}d|vrt        d      d|v r|d   d   nd}d|d	z  z   }d
}	|| j                  j
                  dz  kD  r| j                  d|fz         d|dz  z   }d}	|| j                  j
                  dz  kD  rt        d      | j                  ||       d|	z   }
|
dz  }
ddddddt        |      d|
ddg}|t        |      gz  }| j                  ||       d|j                  v r|dz   }ddd d!t        |      t        |      g}t        ||j                  d   d"d#$      d%   }|r#	 t        | j                  ||j                         y t        | j                  |||j                         y y #  Y y xY w)&NrU  r2   rF   	not audiorX  r   ,  r;  i  rg   gffffff?z1waves too big (need %.2f GiB); trying to optimizeih  s   aresample=8000,gQ?zfile too big; cannot wavess   [0:a:0]s   compand=.3|.3:1|1:-90/-60|-60/-40|-40/-30|-20/-20:6:0:-90:0.2,volume=2,showwavespic=s=2048x64:colors=white,convolution=1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 -1 1 -1 5 -1 1 -1 1rZ  r[  r\  r]  r^  r_     -filter_complexra  rb  pngquantr   s   pngquants   --strips   --nofss   --outputT  rp  r   )r   rV   r   r   rw   r   rx   r   r   rh  r   r   r   )r   r   r   rZ   r   ri  r   rk  r   speedupfltrn  wtpaths                re   r  zThumbSrv.conv_wavesu  s   #bhhw&7!&;"<=Qs?K(( !'#c&k!n3S4Z$))&&,,HHHD7RSt#D(G$))&&--899dE"7"h	
 85>$
 	e~S"!V^FfeC bhhw&7dLQOCDHHfbhh7 DHHfeRXX># "s   !F Fc                    t        |t        |j                  d   dz              \  }}d|vrt        d      |j	                  d      d   j                         }|t        v rdnd}d	|v r|d	   d
   nd}	d|	|z  z   }
| j                  |
|       |}|	dk\  s|| j                  v rt        j                  dd      5 }|j                  d       |j                  }	 | j                  |   j                  |       d d d        ddddddt        |      dddddddddd d!t        |      g}| j!                  ||       d"}d#|v r|d$z  }n|d%z  }| j"                  j$                  rd&}nd'}|j'                  |      }ddddddt        |      d(|j)                  d)      dd*d+dg}|j+                  d,      r|d-d.gz  }n|g d/z  }|t        |      gz  }| j!                  ||       y #  |g| j                  |<   Y xY w# 1 sw Y   xY w)0NrU  r2   rF   r  r;   r<   i  iX  rX  r   i  r;  z
.spec.flacF)suffixdelete   hrZ  r[  r\  r]  r^  r_  r`     0:a:0   -acrb     -ars   48000s   -sample_fmts   s16s   -ts   900s   -yz+[0:a:0]aresample=48000{},showspectrumpic=s=r   z!1280x1024,crop=1420:1056:70:48[o]z640x512,crop=780:544:70:48[o]z:filter_size=128:cutoff=0.877z:resampler=soxrr  rY  s   [o]ra  rc  rd  re  rf  )r   rV   r   r   rJ   rK   EXTS_SPEC_SAFEr   r   tempfileNamedTemporaryFiler   namer   r   r   rh  rw   ry  r3   rg  r  )r   r   r   rZ   r   ri  r   fextcoeffrk  r   infiler?   rn  rd   fcos                   re   r  zThumbSrv.conv_spec  sA   #bhhw&7!&;"<=Qs?K((}}S!"%++-
 .C &#c&k!n3S5[ dE"#:!6!66,,LO 2ST2KK&--f5	2 xuW~vuV}C LLb!:#:55B11B991C#CYYs^ 85=		' 2V$	
 >>&! C
   C 	e~S"y2*0DKK&2 2s   :G5GG20G55G>c                 8   | j                   j                  j                         }| j                   j                  s|st	        d      | j                  d|       t        |t        |j                  d   dz              \  }}d|vrt	        d      |j                  d      rd}|j                  d	      }	nd
}|dd  j                  d	      }	ddddddt        |      g| j                  |      z   dddddddd||	t        |      gz   }
| j                  |
|d       y )Ndisabled in server configr;  rU  r2   rF   r  r      -b:arB   s   -q:ar   rZ  r[  r\  r]  r^  r_  r`  r  r  s   44100r     2   -c:as
   libmp3lamer  rs  )rw   q_mp3rK   r   r   r   r   rV   r   r  rg  r   big_tagsrh  )r   r   r   rZ   r   r=  tagsrawtagsqkqvrn  s              re   r   zThumbSrv.conv_mp3  s&   ))//'')99W788c5!RXXg->-B)CDgtK((C B(BB##G,B 85>
 MM'"# XHD]%L&

 	S"#&rg   c                    | j                   j                  s| j                   j                  st        d      | j	                  d|       t        |t        |j                  d   dz              \  }}d|vrt        d      | j                  dd       d	d
ddddt        |      ddddt        |      g}| j                  ||d       y )Nz#flac not permitted in server configr;  rU  r2   rF   r  z
conv2 flacr   rZ  r[  r\  r]  r^  r_  r`  r  r  s   flacr  r  )rw   r   
allow_flacr   r   r   rV   r   rx   r   rh  )r   r   r   rZ   r   r  r  rn  s           re   r  zThumbSrv.conv_flac,  s    99TYY%9%9ABBc5!RXXg->-B)CDgtK((q! 85>XW%L	
 	S"#&rg   c                    | j                   j                  s| j                   j                  st        d      | j	                  d|       t        |t        |j                  d   dz              \  }}d|vrt        d      |d   d   }|d	k(  r|d
   d   }d}|dk  rd}n|dk  rd}| j                  dd       ddddddt        |      ddd|t        |      g}	| j                  |	|d       y )Nz"wav not permitted in server configr;  rU  r2   rF   r  z.bpsr   g        z.bprss	   pcm_s32leg      0@s	   pcm_s16leg      8@s	   pcm_s24lez	conv2 wavr   rZ  r[  r\  r]  r^  r_  r`  r  r  r  r  )rw   r   	allow_wavr   r   r   rV   r   rx   r   rh  )
r   r   r   rZ   r   r  r  bitscodecrn  s
             re   r  zThumbSrv.conv_wavE  s    99TYY%8%8@AAc5!RXXg->-B)CDgtK((F|A3;=#D4< ET\ Ea  85>XU%L	
 	S"#&rg   c           	         | j                   j                  s| j                   j                  st        d      | j	                  d|       t        |t        |j                  d   dz              \  }}d|vrt        d      d| j                   j                  fz  }|j                  d      }|d   d	   d
k(  rd}	nd|z   }	|dk(  r| j                  n| j                  }
 |
|||||	||       y )Nr  r;  rU  r2   rF   r  z%dkrB   r   r"   z	-c:a copyz-c:a libopus -b:a r$   )rw   r   q_opusr   r   r   rV   r   rg  	_conv_caf	_conv_owa)r   r   r   rZ   r   r  r  sqbqencr  s              re   r   zThumbSrv.conv_opush  s    99TYY%5%5788c5!RXXg->-B)CDgtK((dii&&((YYw:a=F"C&+C #udnn$..GUD'3B7rg   c           	      L   |j                  d      rd}ddg}	nd}| j                  |      }	| j                  d|d|dd	       |j                  d
      j	                  d      }
ddddddt        |      g|	z   ddgz   |
z   d|t        |      gz   }| j                  ||d       y )Nz.owas   webm   -map_metadata   -1   opuszconv2 z []r   rB       rZ  r[  r\  r]  r^  r_  r`  r     -fr  r  )r  r  rx   rg  rJ   r   rh  )r   r   r   r  r  r  r  r   	containertagsetbencrn  s               re   r  zThumbSrv._conv_owa|  s     >>&!I&.FI]]7+FIs3Q7zz'"((. 85>
  X

  9%L

 	S"#&rg   c                 z   |dz   }	 t        | j                  ||j                         	 |d   d   }	| j                  d|dd       |j                  d      j	                  d	      }
d
dddddt        |      ddddg|
z   ddt        |      gz   }| j                  ||d       t        j                  j                  |      }|	dk  s|dk  rf|j                  d      }| j                  d|	||fz  d       d
dddddt        |      dddddddd d!|dd"t        |      g}| j                  ||d       nO| j                  d#|	|fz  d       d
dddddt        |      dddddd$dd"t        |      g}| j                  ||d       	 t        | j                  ||j                         y #  Y xY w#  d}	Y xY w#  Y y xY w)%Nz.opusrX  r   r   zconv2 caf-tmp [r  r   rB   r  rZ  r[  r\  r]  r^  r_  r  r  r`  r  r  r  r  r     i   z&conv2 caf-transcode; dur=%d sz=%d q=%sr  sJ   anoisesrc=a=0.001:d=7:c=pink,asplit[l][r]; [l][r]amerge[s]; [0:a:0][s]amixr  r  r  s   libopusr  s   cafzconv2 caf-remux; dur=%d sz=%ds   copy)r   rx   r   rg  rJ   r   rh  r   r   getsizerR   )r   r   r   r  r  r  r  r   tmp_opusrk  r  rn  szzss                 re   r  zThumbSrv._conv_caf  s    7?	DHHh1	v,q/C 	.2zz'"((. 85>eX
  7(O

 	S"#& XXh'8rJ7#BHH=b"MqQ xuW~"$q %veC LLbcL* HH4Ry@!D xuX %veC LLbcL*	DHHh1U		CJ	s"   !F$ F, !F6 $F),F36F:c                     g }|j                         D ]A  \  }}|D ]7  }t        t        |            dk\  s|j                  dd      }|d|dz   gz  } A C |S )Ni   rY  rL   s	   -metadata   =)r   rS   r{  rg  )r   raw_tagsri  r   vsr   bvs          re   r  zThumbSrv.big_tags  sm    ^^% 	EAr s1v;$&'95BL"t)44C		 
rg   c                    | j                   j                  |      sy t        t        j                               }	 t	        d      D ]9  }t        j                  |||f       t        j                  j                  |      }; y #  Y y xY w)NrE   )
r{   r   rV   rx  r   r   utimer   r   r   )r   r  tsr   s       re   r   zThumbSrv.poke  sm    ||  &	1X -		$R)wwt,-	s   AB Bc                 F   | j                   j                  }	 d}| j                  j                  j                  j                         D ]m  \  }}|j                  |      r!| j                  dj                  |             n!| j                  dj                  ||             	 || j                  |      z  }o | j                  dj                  |             d| _        t        j                  |       # t        $ r"}| j                  d|d|d       Y d }~d }~ww xY w)	Nr   z[Jcln {}/[Az[Jcln {} ({})/[Az[Jcln err in z: rn   z[Jcln ok; rm {} dirsF)rw   r   rv   r   r   r   
startswithrx   r3   cleanr   r   rx  sleep)r   intervalndirsvolrW   r  s         re   r   zThumbSrv.cleaner  s    99%%E!%!6!6!<!<!> 	LX&&s+HH299(CDHH7>>xMNLTZZ11E	L HH/66u=>!&DJJx   ! LHH(BGKKLs   "C55	D >DD c                     d}dD ]W  }t         j                  j                  ||      }t        j                  j	                  |      sC|| j                  ||      z  }Y |S )Nr   )rI   rF   )r   r   r   r   isdir_clean)r   rW   ri  rc   tops        re   r  zThumbSrv.clean$  sY     	)C'',,x-C88>>#&4;;sC((C	) 
rg   c                 0   |dk(  rt         nt        }t        | j                  |dz         }t	        j                         }d }d}	 t        | j                  | j                  j                   d|d      }t        t        |            }	d}
|	D ]F  \  }}t        j                  j                  ||      }|j                         j                  dd      }t        |      dk  st        |      d	k(  r||j                   z
  }||kD  r| j"                  5  d
}| j$                  D ]5  }|j                         j                  dd      j'                  |      s3d} n |r<|
dz  }
| j)                  dj+                  |             t-        j.                  |d
       d d d        n|
| j1                  ||      z  }
(	 |j3                  d      \  }}}t        |      dkD  rt4        j7                  |      rd}t        |      d	k7  st        |      dk7  s||vr
t9               	 | j:                  r#|j<                  st?        j@                  |       ||k(  r5| j)                  dj+                  |             t?        j@                  |       |dk7  rG|j                   |z   |k  r5| j)                  dj+                  |             t?        j@                  |       |}|}I |
S #  Y yxY w# 1 sw Y   7xY w#  |dk7  r!| j)                  dj+                  |      d       Y xY w)NrI   _maxager@   Fr   \rD   rn   rC   Tr   zrm -rf [{}])ignore_errorsr;   r#  yeahokayr   z foreign file in thumbs dir: [{}]zrm replaced [{}]zrm expired [{}])!EXTS_THrU   r  rw   rx  r   ry   
no_scandirsortedr   r   r   r   rK   rL   rS   st_mtimer~   r   r  rx   r3   shutilrmtreer  rJ   PTN_TSmatchr   r   r   r   unlink)r   rc   	thumbpathextsmaxagenowprev_b64prev_fpt1entsr  r?   inffpcmpagesafer   rb   r  r^   s                        re   r  zThumbSrv._clean/  s   +w7C)O4iik	499#7#77	5B $r(#D  2	FAsi+B((*$$T3/C 1v{c!flCLL(< 
B#!% &A wwy00s;FFsK', %&
  !QJE HH]%9%9"%=>"MM"DA
B 
B T[[b11E
 wws|Rr7Q;6<<#3#Bs8r>SW\S_#+% 6E !!#++

2h+22267

7#d{s||f4s:*11"56

2HGe2	h q	
B 
B.	>HH?FFrJANs.   AK AKAK3A$K*KK'	*(LN)r   )r  )r  
__module____qualname__r   rx   r   r   r   rN   r   r   r   r9  r   r   r  rh  r  r  r   r  r  r   r  r  r  r   r   r  r  r"  rg   re   ri   ri      s    F&P'
!*
5n
%"tl6#<'(4l+DZ:?xRh%'N'2!'F8("'HYv
!&	Drg   ri   )R
__future__r   r   rO   loggingr   rer  
subprocessr|  r  r|   rx  queuer   r   r   r   r	   authsrvr
   r   mtagr   r   r   r   utilr   r   r   r   r   r   r   r   r   r   r   r   r   r   svchubr   xranger   HAVE_PIL	HAVE_PILFr   r   	HAVE_WEBPr   r  rU   rJ   r  compiler  environrN   r   r7   r)   r*   r+   r,   load_defaultnewrE  pyheif_pillow_openerr5   registered_extensionspillow_avif	getLoggersetLevelWARNING	HAVE_VIPSr9   rM   rf   objectri   r"  rg   re   <module>r     s   7   	 	       0 0   = =      E				
$
%
:
;1779:	(	)4		zz~~m$k88H::>>.)+	B'	::>>,-+		% %%gi%?		::>>,-+=	::>>,-+1e1133I+	 Ge%%goo6		zz~~n%kIGh((9
 #JLPv P}	Isi   0J' =7J	 5AJ 1J 5AJ  9+J' %AJ. 	JJ' JJ' JJ'  J$"J' 'J+.J4