Files
embycovers/__pycache__/app.cpython-314.pyc
T

196 lines
30 KiB
Plaintext
Raw Normal View History

2026-04-15 09:27:29 +12:00
+
„ÆÜi˜Eã óZaRXt>0t^RIt^RIt^RIt^RIt^RIHt^RIt^RIH t H
t
H t H t ^RI
HtHt^RIHt^RIHt^RIHtHtHtHtHtHt] !RR 7t]P9R
]!R R 7R R
7]!RR 7t]P<P?RR4t ]P<P?RR4t!]!R4t"]"PGRR7Rt$Rt%]!R4t&RRRRRR/t']^kRYRR llt(RZR!R"llt)R[R#R$llt*R\R%R&llt+R]R'R(llt,R^R)R*llt-R+R,lt.R_R-R.llt/R/R0lt0R`R8R9llt1R1RR2R3R4R5R6R7]$]%RR3 R:R;llt2]P?R<]R=7R>R?l4t3]P?R@4] !RA^RB7RC3RDREll4t4]P?RF4RGRHl4t5]P?RI4RJRKl4t6]PoRL4RMRNl4t8]PoRO4RPRQl4t9]P?RR4RS4t:];RT8Xd^RI<t<]<Pz!]RURVRW7R#R#)aéN)ÚPath)ÚFastAPIÚ
HTTPExceptionÚQueryÚRequest)Ú HTMLResponseÚStreamingResponse)Ú StaticFiles)ÚJinja2Templates)ÚImageÚ ImageDrawÚ ImageFontÚ ImageFilterÚ
ImageColorÚImageOpszEmby Thumbnail Generator)Útitlez/staticÚstatic)Ú directory)ÚnameÚ templatesÚEMBY_URLzhttp://10.0.0.2:8096Ú EMBY_API_KEYÚ b9af54b630f6448289ab96422add567aÚcacheT)Úexist_oki zstatic/studiosÚhuluzhulu.pngÚhbozhbo.pngÚdisneyz
disney.pngcó^V^8„dQhR\R\R\PR,/#)éÚstudioÚ
max_heightÚreturnN)ÚstrÚintr )Úformatsapp.pyÚ __annotate__r($s*÷ ñ œSð ¬cð ¼5¿;¹;ÈÕ;Mñ ócó–\PV4pV'gR#\V, pVP4'gR#\P
!V4P
R4pVPV8”dOWP, pVP\VPV,4V3\P4pV#)zQLoad a studio logo from disk and scale it to max_height, preserving aspect ratio.NÚRGBA) Ú STUDIO_FILESÚgetÚ STUDIOS_DIRÚexistsr ÚopenÚconvertÚheightÚresizer%ÚwidthÚLANCZOS)r!r"ÚfilenameÚpathÚimgÚscales&& r'Úmake_studio_logor:$sä×Ñ Ó'€Hß ÙÜ ˜Õ !€DØ ;‰;=Š=ÙÜ
*Š*
×
" 
*€CØ
‡zzØŸZ™ZÕ'ˆØj‰jœ#˜cŸi™i¨%Õ0°*Ð=¼u¿}¹}ÓMˆØ €Jr)cóPV^8„dQhR\R\R\P/#)r Ú image_bytesÚmoder#)Úbytesr$r )r&s"r'r(r(3s%÷

(¤uð
(´
(ÄEÇKÁKñ
(r)có.\P!\P!V44;_uu_4p\P
!V4pVP
4VPV4P4uuRRR4# +'giR#;i)a Fully decode image bytes into an in-memory PIL image.
Some Emby-delivered assets appear to trigger blocky/partial artifacts when
we process the lazy decoder output directly. Forcing a full load and copy
gives us a stable image object before resize/filter operations.
N) r r0ÚioÚBytesIOrÚexif_transposeÚloadr1Úcopy)r<r=r8s&& r'Úload_image_from_bytesrE3s[ô
Š”B—J’J˜{Ó+× ,Ô ,°Ü×% cÓØ Œ
Ø{‰{˜ ×
-× ,× ,Ó ,ús ³AB B có<V^8„dQhR\R\R\/#)r r7Úparamsr#)r$Údict)r&s"r'r(r(Bs!÷ñœð¤dð´dñr)cƒóv"\P!^R7;_uu_4GRjxL
p\ V 2pT;'g/p\VR&VP W4R7GRjxL
pVP 4VP
4uuRRR4GRjxL
#LoL8L +GRjxL
'giR#;i5i)é©ÚtimeoutNÚapi_key©rG)ÚhttpxÚ AsyncClientrrr-Úraise_for_statusÚjson)r7rGÚclientÚurlÚrs&& r'Úemby_getrWBéÜ× Ò ¨×Ü
˜4˜!ˆØ LˆL܈)‰ Ø—*‘*˜S Ø ×ÑÔØv‰v‹x÷
-×
-×,×,üs\$B9¦B§B9ª5BÁBÁ #BÂ
B9ÂBÂB9ÂBÂB9ÂB6 Â"B%Â#
B6 Â.B6 Â0 B9có<V^8„dQhR\R\R\/#)r Úitem_idÚ
image_typer#©r$r>)r&s"r'r(r(Ls!÷ñ¤#ð´3ðÄuñr)cƒóZ"\P!^R7;_uu_4GRjxL
p\ RV RV 2pVPVR\/R7GRjxL
pVP 4VP uuRRR4GRjxL
#LaL4L +GRjxL
'giR#;i5i)rJrK/Items/ú/Images/rMrN)rOrPrr-rrQÚcontent)rYrZrSrTrVs&& r'Úemby_get_imager`LszéÜ× Ò ¨×Ü
˜' ' ¨(°:°,Ð?ˆØ—**˜S¨)´\Ð)B Ø ×ÑÔØy‰y÷  -×,×,üs\$B+¦B§B+ª+BÁB
ÁBÁ5
B+ÂB ÂB+Â
BÂ B+ÂB( ÂBÂ
B(  B( Â" B+c óVV^8„dQhR\R\R\R\R,/#)r rYrZÚindexr#N)r$r%r>)r&s"r'r(r(Ts/÷ñ¬3ð¼CðÌðÔTYÐ\`ÕT`ñr)c ƒó¬"\P!^R7;_uu_4GRjxL
p\ RV RV RV 2pVPVR\/R7GRjxL
pVP
R9dRRR4GRjxL
R#VP
4VPuuRRR4GRjxL
#LˆLXL8L +GRjxL
'giR#;i5i) zJReturns image bytes or None if the image type doesn't exist for this item.rKNr]r^Ú/rMrN)i”é)rOrPrr-rÚ status_coderQr_)rYrZrbrSrTrVs&&& r'Úemby_get_image_optionalrgTéä× Ò ¨×Ü
˜' ' ¨(°:°,¸¸GˆØ—*‘*˜S¨)´\Ð)BC× CˆØ =‰=˜ ÷ -×
×ÑÔØy‰y÷
-× -×,×,üsz$C¦B/§Cª.B7ÁB1ÁB7Á/ CÁ:B3Á;CÂB7Â
CÂ)B5Â*CÂ1B7Â3CÂ5CÂ7C Â=CÂ>
C à C à Ccó<V^8„dQhR\R\R\/#)r rYr<rZr[)r&s"r'r(r(_s!÷ñ¤Sð´uðÌ#ñr)c ƒóö"\P!4p\VRR7pVPVR^\RR7\P
!VP
44p\P!^R7;_uu_4GRjxL
p\ RV RV 2pVPVR \/VR
R R \/R
7GRjxL
pVP4TP$uuRRR4GRjxL
#LlL5 \PdQp TPP4;'g \!T 4p
\#RRTP$ RT
2R7T hRp ? ii;iLq +GRjxL
'giR#;i5i)ÚRGB©r=ÚJPEGT)r&ÚqualityÚoptimizerKNr]r^rMz Content-Typeú
image/jpegz X-Emby-Token)rGr_ÚheadersiözEmby upload failed (z): )rfÚdetail)r@rArEÚsaveÚbase64Ú b64encodeÚgetvaluerOrPrÚpostrrQÚHTTPStatusErrorÚtextÚstripr$rrf) rYr<rZÚ
upload_bufÚ upload_imageÚ
upload_b64rSrTrVÚexcrqs &&& r'Úemby_upload_imager~_sAéÜ€Jܸ5ÔA€LØ×ѸÀdÐÔ×! *×"5Ñ"5Ó"7Ó8€Jä× Ò ¨×Ü
˜' ' ¨(°:°,Ð?ˆØ—+‘+Ø Øœ|Ðà  Ø¤ ðð ó
÷
ˆð Ø
× Ñ Ô ð}‰}÷'-×
øô× Ø—V‘V—\‘\“^×/¤s¨3£xˆFÜØØ-¨a¯m©m¨_¸CÀ¸xÐðð
ûð ú÷,üs…A?E9ÂC.ÂE9Â5EÂ:C0Â;EÃC2Ã EÃ
E9Ã(EÃ)E9Ã0EÃ2EÄA EÅEÅEÅE9ÅE6 Å"E%Å#
E6 Å.E6 Å0 E9cópV^8„dQhR\PR\R\R\P/#)r r8r4r2r#)r r%)r&s"r'r(r(}s0÷ñ”E—K‘Kð¬ð´Sð¼U¿[¹[ñr)cóT\P!VW3\PRR7#)z6Scale and center-crop image to exactly width x height.)ÚmethodÚ centering)çà?rƒ)rÚfitr r5)r8r4r2s&&&r'Ú
cover_cropr…}s%ä <Š<Ø Ø ˆÜ}‰}Øô  ðr)cóPV^8„dQhR\R\R\P/#)r ÚsizeÚboldr#)r%ÚboolrÚ FreeTypeFont)r&s"r'r(r(s'÷

(”3ð
(œdð
(¬y×/EÑ/Eñ
(r)có,V'dRMRV'dRMRV'dRMRV'dRMRV'dRMR .pVF@p\PPV4'gK*\P!W04u# \P
!V4#)
zC:/Windows/Fonts/arialbd.ttfzC:/Windows/Fonts/arial.ttfzC:/Windows/Fonts/calibrib.ttfzC:/Windows/Fonts/calibri.ttfzC:/Windows/Fonts/verdanab.ttfzC:/Windows/Fonts/verdana.ttfz4/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttfz//usr/share/fonts/truetype/dejavu/DejaVuSans.ttfz</usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttfz?/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf)Úosr7r/rÚtruetypeÚ load_default)r‡rˆÚ
font_pathsÚfps&& r'Úget_fontrs÷+/Ñ&Ð4Pß+/Ñ'Ð5Sß+/Ñ'Ð5SçBFÑ>ÐL}ßJNÑUVð€JóˆÜ
7‰7>‰>˜"× Ô Ü×% bÓ ô × !  'r)có\V^8„dQhR\R\PR\R\/#)r rxÚfontÚ max_widthr#)r$rr%Úlist)r&s"r'r(r(s.÷
ñ
”Cð
œy×
Ä#ð
Ì$ñ
r)cóVP4p.RrTVFTpV RV 2P4pVPV4^,V8:dTpK9V'dVPV4TpKV V'dVPV4V#)ÚÚ )ÚsplitryÚgetbboxÚappend)rxr“r”ÚwordsÚlinesÚcurrentÚwordÚtests&&& r'Ú wrap_textr¡s|Ø J‰J‹L€Eؘˆ7ۈؘ!˜D˜6Ð"×*ˆØ <‰<˜Ó ˜aÕ  IÔ ŠGçØ ˜WÔŠGñ÷Ø
Ø €Lr)Úbackdropú#FFFFFFÚcenterçð?ç333333ã?Únoneú bottom-rightcóªV^8„dQhR\R\R\R\R,R\R\R\R \R
\R \R \/ #)
r rYÚbg_modeÚbackdrop_indexÚ custom_bgNÚ
text_colorÚ
logo_alignÚ
logo_scaleÚdarknessr!Ústudio_positionr#)r$r%Úfloat)r&s"r'r(r(§s‡÷BñBÜ
ðBä
ðBôðBôTBô
ð Bô ð
BôðBôðBô
ðBôðBô ñBr)c
óRVRVR\V4RVRVRVR\\V4^4R\\V4^4RVR V /
p
\P!\ V
4P
R
44P4#) rYr­r!zutf-8)r%Úroundr²ÚhashlibÚmd5ÚreprÚencodeÚ hexdigest) rYr­r!Úpayloads &&&&&&&&&& r'Úbuild_cache_keyr»§sð œ#˜nÓ”eœE *Ó-¨qÓ”Eœ% /¨1Ó˜ €Gô ;Š;”t˜G“}×+¨GÓ 5× Ar)cóÌV^8„dQhR\R\R\R\R\R\R\R\R \R
\R \R \R
\R\R\/#)r Ú poster_bytesrr­r!r4r2Ú
logo_bytesÚbackdrop_bytesr#)r>r$r%)r&s"r'r(r(Â÷YñYÜðYä ðYôðYôð Yô
ð Yô ð
YôðYôðYô
ðYôðYô ðYô
ðYôðYôðYô ñYr)c
ó¨ aa
a a6a7a8a9€\R\RV44o7RS7R,,
o6\S7^Ü,4pV
'd8VR8wd1\V
RR7p\ VS
S 4pVP V63Rl4pMVR8Xd;V'd3\ P!V4p\P!RS
S 3V4pMU\VRR7p\ VS
S 4pVP\P!^R74pVP V63Rl4p\P!R S
S 3R(4p\P!V4o8R)R
V7V V8V
3R lllpR*R V7V V8V
3R
lllp\VR,4pS8P!R+S
S 3.^^^V3R7SR8Xd-S8P!R+S
S 3.^^^\VR,43R7MGSR8Xd V!R^ R7M5SR8XdV!R^ŒR7V!^ŒR7MSR8XdV!R^ŒR7V!^ŒR7VP#R 4p\P$!VV4pVP#R4p\ P!V4p^4o9\R\RV44p\S
R,V,4p\S R,V,4pRV VV9V
3RllpV 'E\V R R7p\VVP&, VVP(, 4p\VP&V,4p\VP(V,4pVP+VV3\P,4pV!VV4wpp^p V ^,o9VP/4wp!p"\P!RVV3R,4p#\P0!R .V#P/4R,OV"N54p$\P!R VS9^,,VS9^,,3R(4p%V%P3V$S9^,S9^,3V$4V%P\P!V R74p%VP#R 4pVP%V%VS9,
VS9,
34VP#R4pVP3VVV3V4M¬\P!V4p&\5^8RR7p'^Bp(\7VP94V'V4p)\;V)4V(,p*V!VV*4wp+p,V)FHp-V&P=V+^,V,^,3V-V'R,R 7V&P=V+V,3V-V'VR 7V,V(,
p,KJ V'VR!8w\?V^.R"7p.V.'d^p/V.P@wp0p1R#V/V/3R$S
V0,
V/,
V/3RV/S V1,
V/,
3RS
V0,
V/,
S V1,
V/,
3/p2V2PCV V2R,4wp3p4VP3V.V3V43V.4\DPF!4p5VPIV5R%R&7V5PK^4V5PM4# \dR'pEL«i;i)-gÚsolidrjrkcó(<\VS,4#©r%©rUÚbg_dims&€r'Ú<lambda>Ú$generate_thumbnail.<locals>.<lambda>Üs
ø€¤ ¥J¤r))Úradiuscó6<\VS,R,4#)g333333ë?rÄs&€r'èsø€¤ A¨¥J°Õ$5Ô 6r)r+có0V^8„dQhR\R\/#)r Ú from_leftÚstrength)r‰r%)r&s"r'r(Ú(generate_thumbnail.<locals>.__annotate__îs÷@ñ@œdð@¬cñ@r)có0<\VS,4p\S
4FspRV\^S
^,
4, ,
p\W$R,,4pV'dTMS
^,
V,
pS PV^3VS3.^^^V3R7Ku R#©gš™™™™™á?©ÚfillN©r%ÚrangeÚmaxÚline) ÚpxÚdr2Úovr4s && €€€€r'Ú
h_gradientÚ&generate_thumbnail.<locals>.h_gradientîsø€Ü ˜1• Ó ˆÜu–ˆAØqœ3˜q %¨!¥)Ó-ˆA˜d•OÓ$ˆAß U¨Q¥Y°¥]ˆBØ G‰Gb˜!W˜r 6˜+°1°a¸¸A°,ˆ r)có$V^8„dQhR\/#)r )r&s"r'r(ös÷WñW¤CñWr)có4<\VS,4p\S4FupRV\^S^,
4, ,
p\WR,,4pSP^S^,
V,
3SS^,
V,
3.^^^V3R7Kw R#) rÍr×ÚyrÙr2r4s & €€€€r'Úv_gradient_bottomÚ-generate_thumbnail.<locals>.v_gradient_bottomösø€Ü ˜1• Ó ˆÜv–ˆAØqœ3˜q &¨1¥*Ó.ˆA˜d•OÓ$ˆ G‰Ga˜ ! aÐ(¨5°&¸1µ*¸qµ.Ð*AÐBÈ!ÈQÐPQÐSTȈGÖ r)gÍÌÌÌÌÌÜ?rÑgÐ?ÚleftT)ú bottom-left)Fgš™™™™™Ù?g@gq=
×£pÝ?có0V^8„dQhR\R\/#)r ÚlwÚlhrÄ)r&s"r'r(s÷  5œ#ð 5¤3ñ 5r)cóD<SR8Xd!SV,
^,SV,
^,3#SR8XdSSV,
^,3#SR8XdSSV,
S,
3#SR8Xd!SV,
S,
SV,
S,
3#SV,
^,SV,
^,3#)©)r2Úpadr4s&&€€€€r'Ú
logo_positionÚ)generate_thumbnail.<locals>.logo_positionø€Ø ˜Ô ˜B•J $ ¥{°qÕ&8Ð
˜
˜ "¨Õ
˜
˜   cÕ
˜
˜2•: Õ# V¨b¥[°3Õ%6Ð ˜
˜  6¨B¥;°1Õ"4Ð4r):NéN)rˆ)r“)r"ztop-leftz top-rightÚPNG)r&)éé)rrrr)éÈ)é´)rr)rrr)'rÕÚminr%rEr…ÚpointrÚgetrgbÚ
ValueErrorr ÚnewÚfilterrÚ GaussianBlurr
ÚDrawÚ rectangler1Úalpha_compositer4r2r3r5r™ÚmergeÚpasterÚupperÚlenrxr:r‡r-r@rArrÚseekru):r½rr­r!r4r2r¿Úvig_maxÚbgÚbg_colorÚoverlayrÞÚ
base_alphaÚ txt_colorr9Ú