
    i                        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Zd dl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 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/Z0dZ1dZ2dZ3dZ4dZ5dZ6dddddZ7 e8g d      Z9 e8g d      Z: e8djw                               Z< ejz                  d      Z>i 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,d-d.d/d0d1d2d3d4d5d5d6Z?i d ddddd)dd7dd8dd9dd:dd;d!d<d#d=d%d>d'd?d)d@d+dAd-dBd/dCd1dDdEdFdGdHd6Z@	 ej                  j                  dI      r eC       d dJlDmEZEmFZFmGZGmHZH dKZ1	 ej                  j                  dL      r eC        eGj                  d1M       dKZ2	 ej                  j                  dN      r eC        eFj                  dOdP      j                   e       dQ       dKZ5	 ej                  j                  dR      r eC       	 d dlLZL eFj                  dOdP      j                   e       dQ       dKZ6	 ej                  j                  dS      r eC       	 d dTlNmOZO  eO        dKZ3	 ej                  j                  dU      r eC       dV eFj                         v r	dKZ4 eC       d dlRZRdKZ4 ej                  dW      j                  ej                         	 ej                  j                  dX      r eM       dKZVd dlWZW eWj                  d         ej                  dY      j                  ej                         	 ej                  j                  d[      r eC       dKZ]d dl^Z^ ej                  d\      j                  ej                         i Z_d] Z` G d^ d_ea      Zby#  Y xY w#  Y xY w# eM$ r Y w xY w#  Y xY w# eM$ r
 d dTlPmOZO Y vw xY w#  Y vxY w#  Y 9xY w#  Y xY w# eC$ r0ZYdZV eZeYeM      s ej                  dZ e\eY      z          Y dZY[YdZY[Yww xY w#  dZ]Y xY w)`    )print_functionunicode_literalsN)Queue   )ANYWINPY2TYPE_CHECKINGunicode)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pngwebpjxl)jpwx)r    r"   r#   r!   )opusowacafmp3flacwavzaif aiff flac mp3 opus wavz^-?[0-9a-f]{8,10}$s   30         s   28   s   21   s   17   s   15   s   13	   s   12
   s   11   s   10      9      8      7      6      5   4   3   2)            rE             %   *   /   4   8   =   B   G   K   P   U   Y   [   a   PRTY_NO_PIL)ExifTagsImage	ImageFontImageOpsTPRTY_NO_PILF)sizePRTY_NO_PIL_WEBPRGB)r.   r.   )formatPRTY_NO_PIL_JXLPRTY_NO_PIL_HEIF)register_heif_openerPRTY_NO_PIL_AVIFz.avifPILPRTY_NO_VIPSpyvipsz#libvips found, but failed to load: PRTY_NO_RAWrawpyc                    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t        |d d    }d}d| |||t!        |      |fz  S )Nz
top.r.   )wfjfxff 
ascii   /r0   i)#  acr   thz%s/%s/%s/%s.%x.%s)r   splitlowerreplaceth_dir_cachegethashlibsha512r   digestr   decodelenclearEXTS_ACTH_CHint)histpathremmtimefmtffardfnextdcacherd_keyhb64cats                C/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/th_srv.py
thumb_pathr      sj    C[FB ))C.

"
"
$C
czc"1g!33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~CGn(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 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&d% Z'y&))ThumbSrvc                 Z
   || _         |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\                  | j                  j^                  fD cg c]  }t+        |j/                  d             c}\  | _0        | _1        | _2        | _3        | _4        | _5        tl        s1dj/                  d      D ]  }| j`                  jo                  |        tp        s1dj/                  d      D ]  }| j`                  jo                  |        tr        s1dj/                  d      D ]  }| j`                  jo                  |        tt        s1dj/                  d      D ]  }| j`                  jo                  |        t+               | _;        d| j                  jx                  v r| xjv                  | j`                  z  c_;        d| j                  jx                  v r| xjv                  | jb                  z  c_;        d| j                  jx                  v r| xjv                  | jd                  z  c_;        d| j                  jx                  v r>| jf                  | jh                  | jj                  fD ]  }| xjv                  |z  c_;         y y c c}w )NFTr   ,r0   zthumb-{}-{}FFmpegFFprobez^cannot create audio/video thumbnails because some of the required programs are not available: z, r/   czdownload FFmpeg to fix it:[0m z	thumb.clnzheif heifs heic heics z
avif avifsr"   r#   pilvipsrawff)=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_cnvr{   exts_spec_unsafer   qranger   workerrc   	no_vthumb	no_athumbr   r   appendjoinr   no_acoder   th_cleancleanerth_r_pil	th_r_vipsth_r_rawth_r_ffith_r_ffvth_r_ffafmt_pilfmt_vipsfmt_rawfmt_ffifmt_ffvfmt_ffa
H_PIL_HEIFdiscard
H_PIL_AVIF
H_PIL_WEBP	H_PIL_JXL	thumbableth_dec)	selfr   nwant_ffmissingmsgyrs   zsss	            r   __init__zThumbSrv.__init__   s   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<<- 		""		##		""		""		""		""

 

	
LMLLLL ,2237 ($$Q'( !'', ($$Q'( \\#& ($$Q'( [[% ($$Q'( %DII$$$NNdll*NTYY%%%NNdmm+NDII$$$NNdll*N499###dllDLLA &#%& $O

s   8!T(c                 *    | j                  d||       y )Nthumb)r   )r   r   r   s      r   r   zThumbSrv.logU  s    gsA&r   c                 >    d| _         t        | j                  d       y )NTthumbstopper)r   r   _fire_sentinelsr   s    r   shutdownzThumbSrv.shutdownX  s    t##^4r   c                 n    t        | j                        D ]  }| j                  j                  d         y N)r   r   r   put)r   _s     r   r   zThumbSrv._fire_sentinels\  s*    tyy! 	AFFJJt	r   c                 `    | j                   5  | j                   cd d d        S # 1 sw Y   y xY wr   )r   r   r   s    r   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3r/   r   thsizer'   )flagsr{   r   )r   vnr   mulr&   r   s         r   getreszThumbSrv.getresd  sG    #:a1xx!'',11v|SVc\))r   c           
         | 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        |	rt7        | j                   j                  j8                  j;                               }t=        fd	|D        d       }|sA| j	                  d
d|d       | j                   j                  j>                  d   d   d   }| j@                  jC                  ||||f       | j	                  d|d|d|d       | jD                  sW| j                  5  || j                  vr
	 d d d        n2	 d d d        |5  |jG                  d       d d d        | jD                  sW	 t%        jH                  |      }|jJ                  r| jM                  |       |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-                  |      sjt/        |d      5 }|j1                  t3        t        j                  j                  |                   d d d        n# 1 sw Y   nxY w| j5                  |       |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 r&   vfdir.txtwbTc              3   B   K   | ]  }|j                   k(  s|  y wr   )realpath).0r'   ptops     r   	<genexpr>zThumbSrv.get.<locals>.<genexpr>  s     @QQZZ4-?q@s   zptop z not in r/   r   r   zconv z :z [0mr2   )'r   vfshisttabr   r   r   r   ospathr   r   r   r   r   r   dirnamer   
free_umaskr   MKD_700MKD_755makedirsexistsopenwriter   writevolcfglistall_volsvaluesnextall_apsr   r   r   waitstatst_sizepoke)r   r   r   r   r   r   tpathabspathconddo_convthdirchmodinf_pathrs   allvolsr   sts    `               r   r   zThumbSrv.geti  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		%   Q.'+yy';';RWW\\%5%@77<<y9xxx0h- Brwww'? @AB B B$$X.$(6		% !	 	:  	s[   .N02IN)1N63O CN&8M'	N'M0,*NNN&)N36O Oc                     | j                   | j                  | j                  | j                  | j                  | j
                  | j                  dS )N)r   r   r   r   ffiffvr   )r   r   r   r   r   r   r   r   s    r   getcfgzThumbSrv.getcfg  s=    <<MM<<<<<<<<
 	
r   c           	      >   g }d}|j                  d      D ]-  }|j                  |dt        | j                  |      d       / d}|j                  d      D ]2  }|j                  |d|j                  j                  |      d       4 dj                  |      S )Nzth_dec th_no_webp th_no_jpgr   ()
z#th_qv th_qvx thsize th_spec_p convtrt   r{   r   getattrr   r   r   r   r   r   retzss       r   volcfgizThumbSrv.volcfgi  s    *((3- 	BBJJRB)?@A	B2((3- 	<BJJRb)9:;	<wws|r   c           	      >   g }d}|j                  d      D ]-  }|j                  |dt        | j                  |      d       / d}|j                  d      D ]2  }|j                  |d|j                  j                  |      d       4 dj                  |      S )Nzq_opus q_mp3r   r$  r%  aconvtrt   r&  r(  s       r   volcfgazThumbSrv.volcfga  s    ((3- 	BBJJRB)?@A	B((3- 	<BJJRb)9:;	<wws|r   c                    	 t        j                  t        j                  j	                  |dd             t        j                  t        j                  j	                  |dd             y #  Y nxY wdx}}| j
                  j                  j                  j                         D ]5  }|j                  |k(  s| j                  |      }| j                  |      } n d}| j                  |t        |      t        |      |fz         | j                  j                  rt         j                   nt         j"                  }|df|dffD ]  \  }}t        j$                  t        j                  j	                  ||      |       t'        t        j                  j	                  ||d      d      5 }	|	j)                  |j+                  d             d d d        # 1 sw Y   xY w y )	Nrz   cfg.txtry   rt   z&writing thumbnailer-config %d,%d to %sr   r   utf-8)r   r  r  r  r   r   r   r  r  r   r+  r.  r   r   r   r  r  r  r  r
  r  encode)
r   r   cfgicfgar   tr  cfgr   rs   s
             r   r  zThumbSrv.writevolcfg  so   	HHRWW\\(D)<=HHRWW\\(D)<=	t))--((//1 	B{{h&||B'||B'		
 5c$iTH556#yy33d|4 	-HCLLh4?bggll8S)<dC -q

7+,- - -	-s   A(A+ +A/+!GG	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 %.1fr/   )	r   
th_ram_max	Exceptionr   sumr   itemsr   r  )r   needttpathr   r5  kvuseds           r   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                 2   | j                   s| j                  j                         }|sn|\  }}}}|j                  d      d   j	                         }d}g }|| j
                  j                  v r-t        | j                  | j
                  j                  ||      }	n|}	|	rPt        j                  j                  |      s0|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(  r8|| j                  v r*|
| j                  v r|j!                  | j"                         f|dk(  r*|| j$                  v r|j!                  | j&                         |dk(  r*|| j(                  v r|j!                  | j*                         |r|s|r|r|j!                  | j,                         |r|j!                  | j.                         |r|j!                  | j0                         &|r|j!                  | j2                         E|sI|j!                  | j4                         d}h|d
k(  r9|| j6                  v s|| j                  v r|j!                  | j8                         |d
k(  s|| j                  v s|r|j!                  | j:                          t<        j                  j                  |      \  }}t<        j                  j?                  |d|      }	 tA        | j                  ||jB                         d}|D ]/  }	 |s|jE                  d      rtG        d       ||	|||       d} n ||	k7  r#|	r!tA        | j                  |	|jB                         	 tQ        | j                  |||jB                         g }| jT                  5  | jV                  |   }| jV                  |= | jX                  j[                  |d        | j\                  j[                  |d       xs g }d d d        |D ]  } 	 tA        | j                  | t^                 D ]  }!|!5  |!ja                          d d d         | jb                  5  | jb                  ja                          d d d        | j                   s| jT                  5  | xjd                  dz  c_2        d d d        y #  Y xY w# tF        $ r}tI        |dd      dk(  }d}||jJ                  ||r|n	tM               fz  }d|v rdnd}| j                  ||       |s\||d   k(  r~	 tO        |d      5 }	 d d d        n# 1 sw Y   nxY wnY# tF        $ r#}d}| j                  |||fz  d       Y d }~n2d }~ww xY w	 tA        | j                  ||jB                         n#  Y nxY wY d }~d }~ww xY w# tF        $ rl}|r:t<        j                  j                  |      sd}| j                  ||||fz  d       n%|s#	 tO        |d      jS                          n#  Y nxY wY d }~}d }~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)Nrn   ro   Fr   r+   )r(   r)   r*   r,   r-   r!   r   r   r   r   Tr&   .pngzpng only allowed for waveforms
returncoder   A  z&%s could not create thumbnail of %r
%sz<Signals.SIG90r   z"failed to create the file [%s]: %rr/   z#failed to move  [%s]  to  [%s]:  %rab)3r   r   r   r{   r|   r   r   r   r   r  r	  rsplitr   r   r   r   r   conv_pilr   	conv_vipsr   conv_raw	conv_opusconv_mp3	conv_flacconv_wav
conv_wavesr   conv_ffmpeg	conv_specr  r   r   r   endswithr9  r'  __name__r   r
  r   closer   r   r   popr   r   
notify_allr   r   )"r   taskr  r  r   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=  conv_okfunexr321r   r   r   r5  r   subsapr'   s"                                     r   r   zThumbSrv.worker  s   --66::<D&*#GUC--$R(..0CFDdii'''!$((DII,=,=wK!sxxu5ll3*2.%<#99	6M	%<%<"HiH9H99++ 4C D[ t||+Bsdll/B  e|t||(;t||@SDMM23$--+?DNN3#*=DMM2X$ KK7% KK6& KK7% KK6% KK8%)F#*=ATD$4$45)<WDNN3548 e,ID#WW\\$S1F&"((3 G !!!ennV&<'(HIIb1"G!: '!g'2884
DHHfeRXX> F =yy'IIe$VT*6<"	=  DHHb*5  # #LLN# ##  *'')*q --v ZZ 	IINI	 	I ! !"2|Q73>DCCwd QQC-4!$AHHS!$$r(?>%)&$%7 !)1$(!) !) !)#, >$H $fb\)91 = =>
!#DHHfbhh?! '!4  277>>%#8=AHHQ&%!44a8 UD)//1= =# #* *	 	s   7!S5  +S=7"W& 'AYY+2Y3Z Z5S:=	W#AWU?'U2)	U?2U;7U?>W?	V+V&!W&V++W/!WWWWW#&	Y/>Y.Y	Y	YYYY(+Y03Y=	 Z
Z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)Nr.   )resamplec              3   2   K   | ]  \  }}|d k(  s|  yw)OrientationN )r   r>  r?  s      r   r   z(ThumbSrv.fancy_pillow.<locals>.<genexpr>k  s     O41aA<NQOs   r   )r4   r/   r2   rs   )method)r   r   	thumbnailr\   LANCZOSr  r[   TAGSr;  getexifr   	ROTATE_90
ROTATE_180
ROTATE_270	transposer`   minr^   fit)r   imr   r   resrr>  exifrotrotsiwihdwdhs                 r   fancy_pillowzThumbSrv.fancy_pillowe  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                    	 | j                  |||      }ddg}|j                  d      rdnd}d|j                  |   i}|j                  d	      r|j                  d
       d|d<   nd|d<   |j                  |vr|j                  d      } |j                  |fi | y # t        $ rL}| j                  dj                  |      d       |j	                  | j                  ||             Y d }~d }~ww xY w)Nzfancy_pillow {}rF  rb   L.jxlth_qvxth_qvqualityz.webp)RGBALAr2   rr  Tprogressive)r  r9  r   rc   rs  r   rS  r   extendmodeconvertsave)	r   r}  r  r   r   ri  fmtsr*  r   s	            r   conv_image_pilzThumbSrv.conv_image_pil  s    	/""2sB/B
 s|/XW288B<(>>'" KK'DN #'D77$E"B1  	/HH&--b148LLR-..	/s   B 	C4(AC//C4c                     | j                  d|       t        j                  t        |            5 }| j	                  ||||       d d d        y # 1 sw Y   y xY w)N皙?)rA  r\   r
  r   r  )r   r  r  r   r   r}  s         r   rI  zThumbSrv.conv_pil  sK    c5!ZZg' 	42E33	4 	4 	4s   AAc                    ddg}d|v rdg}| j                  ||      \  }}|ddd}d }	|D ]  }
	 |
|d<    |||      }	 n i }|j                  d	   }|j                  d
      rt        |dz     }d|d<   n |j                  d      r|j                  d   } |	j                  |f|dd| |	j                          y #  |
|d   k(  r Y xY w)Ncentrenoners   downrelative)heightr`   intentcropro   r  r    r1   Toptimize_codingr#   r  )Qstrip)r   r   rS  
VIPS_JPG_Qwrite_to_file
invalidate)r   loaderr  r   r   cropsr&   r   kwimgr   r   qvs                r   conv_image_vipszThumbSrv.conv_image_vips  s    6"#:HE{{2s#16Z@ 	A6
Qm		 XXg>>% B!G$B&*D"#^^E"(#B 	%:2T:T:b	> "s   B;;Cc                 \    | j                  d|       fd}| j                  ||||       y )Nr  c                 F    t        j                  j                  | fi |S r   )rj   r\   rs  )r&   r  r  s     r   _loaderz#ThumbSrv.conv_vips.<locals>._loader  s    <<))'1;;;r   )rA  r  )r   r  r  r   r   r  s    `    r   rJ  zThumbSrv.conv_vips  s,    c5!	< 	WeS"5r   c                   	 | j                  d|       t        j                  |      5 }|j                         	d d d        	j                  t        j
                  j                  k(  rA|j                  d      r0t        |d      5 }|j                  	j                         d d d        t        r	fd}| j                  ||||       y t        r	j                  t        j
                  j                  k(  r!t        j                   	j                  d      }n2t        j                  t#        j$                  	j                              }| j'                  ||||       y t)        d      # 1 sw Y   2xY w# 1 sw Y   xY w)Nr  .jpgr   c                 $   j                   t        j                  j                  k(  r>t        j
                  j                  j                  d      } |j                  | fi |S t	        j
                  j                  j                  | fi |S )Nrgb)interpretation)
rc   rl   ThumbFormatBITMAPrj   r\   new_from_arraydatathumbnail_imagethumbnail_buffer)r&   r  r  r   s      r   r  z"ThumbSrv.conv_raw.<locals>._loader  sq    <<5#4#4#;#;; ,,55ejjQV5WC.3..q7B77!<<88QM"MMr   rb   zOeither pil or vips is needed to process embedded bitmap thumbnails in raw files)rA  rl   imreadextract_thumbrc   r  JPEGrS  r
  r  r  	HAVE_VIPSr  HAVE_PILr  r\   	fromarrayior   r  r9  )
r   r  r  r   r   r   rs   r  r}  r   s
            @r   rK  zThumbSrv.conv_raw  s%   c5!\\'" 	(c%%'E	(<<5,,111ennV6L eT" $a

#$N   %b9||u00777__UZZ7ZZ

5:: 67E33a 1	( 	(
$ $s   E*E7*E47F 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}| j                  |||||d       y )Nr  convtr.   rn   ro   )h264h265.durr   r0   s   -ssz{:.0f}r/   r1  s   0:v:0)
rA  r   r   r   rH  r|   r   rc   r2  
_ffmpeg_im)
r   r  r  r   r   r)  r   r   seekdurs
             r   rQ  zThumbSrv.conv_ffmpeg  s    c5!wBHHW,=,A(BCQ1nnS!"%++-""cT\\&9D$*cM#f+a.qCHOOC!G4;;GDEDRx@r   c                     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g
z  }
| j                  |||
       y )Nz*scale={0}:{1}:force_original_aspect_ratio=rs   zdecrease,setsar=1:1z increase,crop={0}:{1},setsar=1:1r1  )   ffmpeg   -nostdin   -v   error   -hide_banner   -i   -maps   -vf	   -frames:v   1s   -metadata:s:v:0s   rotate=0)r   rc   r  r2  r   _ffmpeg_im_o)r   r  r  r   r   r  imapscaler~  bscalecmds              r   r  zThumbSrv._ffmpeg_im  s     =#:**E77Ekk"c"tCy)009
 	t5>TF$
 	
 	%S)r   c                    |j                  d      r|dt        |j                  d   dz     gz  }nn|j                  d      r/|dt        |j                  d         j	                  d      dd	gz  }n.|dt        |j                  d         j	                  d      d
dgz  }|t        |      gz  }| j                  ||d       y )Nr  s   -q:vr  r1   r  r  rv   s	   -effort:vr;   s   -compression_level:vr?   r  )rS  FF_JPG_Qr   r
   r2  r   _run_ff)r   r  r   r  s       r   r  zThumbSrv._ffmpeg_im_o  s    >>&!'*a/0 C ^^F#*+227;	 C )*11':'	 C 	e~S"g&r   c           	         t        ||j                  |   d|      \  }}}|sy d}d}	d|v rd}	d}d}n'| j                  j                  r7t	        j                         t        | j                  j                        z
  d	k  r\|d
   j                         j                  d      r:d|v sd|v sd|v sd|v r*t	        j                         | j                  _        d}	d}d}n~| 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   }	 t        j                  |D cg c]  }|j                  dd        c}      }| j#                  |	d#|d||$       t%        j&                  ||d%   d&|d
   f      c c}w c c}w #  d!d"j                  t               j                  dd       z   d!z   }Y sxY w)'NTtimeoutniceoomrF  z)FFmpeg failed (probably a corrupt file):
zbut no decoder found for: hevczthumbnail cannot be created due to legal reasons; https://github.com/9001/copyparty/blob/hovudstraum/docs/bad-codecs.md [0;90m
rE  r/   <   ro   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   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:
ru   2      z[...]izff: i  i	  z...
ff: [...]
ff: ...i<r1  r}   's   ' 'zcmd: r   r   s   ...)r   r   r   	th_ff_jpgtimer   r|   rS  	th_ff_swrr  r{   r   r   r
   shlexr   cmd2r   spCalledProcessError)r   r  r   ktor  r)  r   serrr   r5  linesr'   txtr*  s                 r   r  zThumbSrv._run_ff3  s_   c288C=tMQ8+t3 WACA $$		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iie<'!*,<=s8d?et*883uv;FC	L3GaQXXgy9GHB 	Ar3/15##C#a&&#b')BCC =
 H	LD)11'9EEKBs$   'I I 3II I -Jc                 H   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       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)&Nr  r.   ry   	not audior  r   ,  r  i  r   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 1r  r  r  r  r  r     -filter_complexr  r  pngquantrC  s   pngquants   --strips   --nofss   --outputT  r  r   )r   r   r   r9  r   r8  r   rA  r   r  r   r   r   )r   r  r  r   r   r)  r   r  r<  speedupfltr  wtpaths                r   rP  zThumbSrv.conv_wavesk  s   wBHHW,=,A(BCQ1s?K(( !'#c&k!n3S4Z$))&&,,HHHD7RSt#D(G$))&&--899dE"7"h	
 85>$
 	e~S"g&!V^FfeC bhhw&7dLQOCDHHfbhh7 DHHfeRXX># "s   !F F!c                 ~    | j                  d|       | j                  ||||g d|d   j                  d      z          y )Nr  s   0:indexrv   )rA  r  r2  )r   r  r  r   r   strms         r   conv_emb_cvzThumbSrv.conv_emb_cv  s?     	c5!UCRg1E1Eg1N)N	
r   c                    t        |t        |j                  d   dz              \  }}}}d|vrt        d      |j                  j	                  dd      }	|	dk  rG|D ]B  }
|
j	                  d      dk(  s|
j	                  d	      d
k(  s-| j                  |||||
      c S  |	s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(}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d0d1d g}| j/                  |||       y #  |g| j                  |<   Y xY w# 1 sw Y   xY w)2Nr  r.   ry   r  	th_spec_pr   
codec_typevideozDISPOSITION:attached_pic1z!spectrograms forbidden by volflagrn   ro   i  iX  r  i  r  z
.spec.flacF)suffixdelete   hr  r  r  r  r  r  r     0:a:0   -acr     -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  r1  s   [o]r  )r   r   r   r9  r   r  r{   r|   EXTS_SPEC_SAFErA  r   tempfileNamedTemporaryFiler  namer   r   r   r  r   r  rc   r2  r  )r   r  r  r   r   r)  r   strmsctnr	want_specr  fextcoeffr  r<  infilers   r  fcfcos                       r   rR  zThumbSrv.conv_spec  s    'RXXg5F5J1K LS%s?K((HHLLa0	q= KHH\*g5!;<C++GUCTJJ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$	
 	%S)]2*0DKK&2 2s   1H?H((H<:H??Ic                 >   | 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d       y )Ndisabled in server configr  r  r.   ry   r  r>     -b:arv   s   -q:ar   r  r  r  r  r  r  r  r  r  s   44100r  rD      -c:as
   libmp3lamer-  r  r  )r   q_mp3r|   r   r9  rA  r   r   r   rS  r2  r   big_tagsr  )r   r  r  r   r   r  tagsrawtagsr   qkr  r  s               r   rM  zThumbSrv.conv_mp3  s-   ))//'')99W788c5!%gs288G3Dq3H/IJgq!tK((C B(BB##G,B 85>
 MM'"# XHD]%L&

 	S"hC0r   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d       y )Nz#flac not permitted in server configr  r  r.   ry   r  z
conv2 flacr2   r  r  r  r  r  r  r  r  r  s   flacr-  r  r  )r   r   
allow_flacr9  rA  r   r   r   r   r   r  )r   r  r  r   r   r  r   r  s           r   rN  zThumbSrv.conv_flac(  s    99TYY%9%9ABBc5!RXXg->-B)CDaAtK((q! 85>XW%L	
 	S"hC0r   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d       y )Nz"wav not permitted in server configr  r  r.   ry   r  z.bpsr   g        z.bprss	   pcm_s32leg      0@s	   pcm_s16leg      8@s	   pcm_s24lez	conv2 wavr2   r  r  r  r  r  r  r  r  r  r-  r  r  )r   r   	allow_wavr9  rA  r   r   r   r   r   r  )
r   r  r  r   r   r  r   bitscodecr  s
             r   rO  zThumbSrv.conv_wavA  s   99TYY%8%8@AAc5!RXXg->-B)CDaAtK((F|A3;=#D4< ET\ Ea  85>XU%L	
 	S"hC0r   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  r  r.   ry   r  z%dkrv   r   r(   z	-c:a copyz-c:a libopus -b:a r*   )r   r   q_opusr9  rA  r   r   r   r2  	_conv_caf	_conv_owa)r   r  r  r   r   r  r  r   sqbqencrh  s               r   rL  zThumbSrv.conv_opusd  s    99TYY%5%5788c5!%gs288G3Dq3H/IJgq!tK((dii&&((YYw:a=F"C&+C #udnn$..GUD'3B7r   c           	      N   |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d       y )Nz.owas   webm   -map_metadata   -1   opuszconv2 z []r2   rv       r  r  r  r  r  r  r  r     -fr-  r  r  )rS  r  r   r2  r{   r   r  )r   r  r  r  r  r*  r)  r   	containertagsetbencr  s               r   r'  zThumbSrv._conv_owax  s     >>&!I&.FI]]7+FIs3Q7zz'"((. 85>
  X

  9%L

 	S"hC0r   c                    |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d       t        j                  j                  |      }|	dk  s|dk  rg|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d       nP| j                  d$|	|fz  d       d
dddddt        |      ddddd d%dd#t        |      g}| j                  ||dd       	 t        | j                  ||j                         y #  Y xY w#  d}	Y xY w#  Y y xY w)&Nz.opusr  r   r   zconv2 caf-tmp [r/  r2   rv   r0  r  r  r  r  r  r  r,  r-  r  r  r1  r.  r-  r  r  rH   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  rD   r  s   libopusr  s   cafzconv2 caf-remux; dur=%d sz=%ds   copy)r   r   r   r2  r{   r   r  r   r  getsizer   )r   r  r  r  r  r*  r)  r   tmp_opusr  r4  r  szr*  s                 r   r&  zThumbSrv._conv_caf  s    7?	DHHh1	v,q/C 	.2zz'"((. 85>eX
  7(O

 	S"hC0 XXh'8rJ7#BHH=b"MqQ xuW~"$q %veC LLb(L4 HH4Ry@!D xuX %veC LLb(L4	DHHh1U		CJ	s"   !F' F/ !F9 'F,/F69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   r1  r}   s	   -metadata   =)r;  r   r
   r2  )r   raw_tagsr)  r>  vsr?  bvs          r   r  zThumbSrv.big_tags  sm    ^^% 	EAr wqz?d*'95BL"t)44C		 
r   c                    | j                   j                  |      sy t        t        j                               }	 t	        d      D ]9  }t        j                  |||f       t        j                  j                  |      }; y #  Y y xY w)Nr0   )
r   r  r   r  r   r   utimer  r  r  )r   re  tsr   s       r   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: r/   z[Jcln ok; rm {} dirsF)r   r   r   r   r  r;  
startswithr   rc   cleanr9  r   r  sleep)r   intervalndirsvolr   ri  s         r   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                 n   dx}}| j                   j                  j                  j                         D ]5  }|j                  |k(  s| j                  |      }| j                  |      } n |df|dffD ]  \  }}|s		 t        t        j                  j                  ||d      d      5 }|j                         j                  d      }d d d        |k(  rct        j                  j                  ||      }	t        j                  j                  |	      s| j                  d|	d       t        j                   |	        d	}
d
D ]W  }t        j                  j                  ||      }t"        j                  j%                  |      sC|
| j'                  ||      z  }
Y |
S # 1 sw Y   xY w#  d}Y xY w)Nrt   rz   ry   r0  rbr1  z%thumbnailer-config changed; deleting r/   r   )rz   ry   )r   r   r  r  r   r+  r.  r
  r  r  r   readr   r	  r   shutilrmtreer   isdir_clean)r   r   r3  r4  r   r6  r   rs   oldcfgr*  r)  tops               r   rC  zThumbSrv.clean   s   t))--((//1 	B{{h&||B'||B'		
 d|4 	HC"'',,xi@$G 61VVX__W5F6 f}h,B77>>"%HH"FJMM"	   	)C'',,x-C88>>#&4;;sC((C	) 
)6 6s$   =+F.( F"F."F+	'F..F4c                 :   |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&|dk7  r!| j)                  dj+                  |      d       Y xY w)Nrz   _maxagert   Fr   \rx   r/   rw   Tr   zrm -rf [{}])ignore_errorsrn   r4   yeahokayr   r0  z foreign file in thumbs dir: [{}]zrm replaced [{}]zrm expired [{}])!EXTS_THr   r'  r   r  r   r   
no_scandirsortedr  r  r  r   r|   r}   r   st_mtimer   r   rB  r   rc   rK  rL  rN  r{   PTN_TSmatchr9  r   r  r   unlink)r   r   	thumbpathextsmaxagenowprev_b64prev_fpt1entsrF  rs   inffpcmpagesafer>  r   r@  r   s                        r   rN  zThumbSrv._cleanA  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.	>a9nHH?FFrJANs.   AK AKAK3A$K*KK'	*-LN)r   )r  )(rT  
__module____qualname__r   r   r   r   r   r   r   r"  r+  r.  r  rA  r   r  r  rI  r  rJ  rK  rQ  r  r  r  rP  r  rR  rM  rN  rO  rL  r'  r&  r  r  r   rC  rN  rq  r   r   r   r      s    Y&v'5!*
6p	
-*%"}~6:4
@6<A"*H'06Dp:?x
P*d%1N12!1F8("1HYv
!&BDr   r   )c
__future__r   r   r   r  loggingr  rer  rK  
subprocessr  r	  r   r  queuer   r   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   r  	HAVE_PILFr   r   r   r   r   r   rV  r   r{   r  compilerZ  r  r  environr   r9  rh   r[   r\   r]   r^   load_defaultnewr  
pillow_jxlImportErrorpillow_heifrf   pyheif_pillow_openerregistered_extensionspillow_avif	getLoggersetLevelWARNINGr  rj   cache_set_maxe
isinstancewarningstrHAVE_RAWrl   r~   r   objectr   rq  r   r   <module>r     sy   7  	  	 	        9 9   = =      E	


	%f59
+
,
:
;1779:	(	)uu u u	
 u u u u u u       !" #$ 	+0qq r r	
 r r r r r r       !" #$ 	


+
2E		zz~~m$k88H::>>.)+	B'	::>>,-+		% %%gi%?
::>>+,+	 			% %%gi%>	::>>,-+	B8 	
::>>,-+1e1133J+
 Ge%%goo6H	zz~~n%mIFGh((9		zz~~m$kHGg''8
 "JJLv L{  		
  	BAA	B
	  HIa%=AFGHHs   0P 7O  AO "O* 1O 5+O* !"P O2 
	P AP +P A%P *AQ OP OP O'#O* &O''O* *O/,P 2P=P  PP P	P PP PQ!&QQQ