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

437 lines
67 KiB
Plaintext
Raw Normal View History

2026-04-15 09:27:29 +12:00
ó
ë1Þigçã+óÌ %SSKrSSKrSSKrSSKrSSKrSSKrSSKJrJrJr SSK J
r
SSK r SSK J
r
JrJrJr SSKJrJrJr SSKJr SSKJr SSKJrJrJrJrJrJrJ r \
"S S
9r!\!RES \"S S
9S S9 \"SS
9r#\RHRKSS5r&\RHRKSS5r'\
"S5r(\(RSSS9 Sr*Sr+Sr,Sr-Sr.Sr/Sr0Sr1Sq2\ RfS-\4S'S r5S!r6S"r7S#r80r9\:\;\:4\4S$'\Rx"5r=\
"S%5r>S&S'S(S).r?\:\@\@4\4S*'SÈS+\@S,\;S-\R4S-4S.jjrASÉS/\BS0\@S-\R44S1jjrCS-\ Rf4S2jrD\!RS35S45rF\!RS55S65rGSÊS7\@S8\:S-\:4S9jjrHSËSSSS;.S<\@S=\@S>\;S-S?\;S-S,\;S-S@\;S-S-\B4SAjjjrISËSSSS;.S<\@S=\@S>\;S-S?\;S-S,\;S-S@\;S-S-\J\B\@44SBjjjrKSÊS<\@S=\@S>\;S-S-\BS-4SCjjrLSÌS<\@S/\BS=\@4SDjjrMSE\@S-S-\S-4SFjrNSE\S-\@4SGjrOSÊSHSI.S7\@S8\:S-SJ\;S-\P\:4SKjjjrQSL\SM\;S-\J\\44SNjrRSÍSM\;S-\:4SOjjrSSÎSQ\TSM\;S-\:4SRjjrUSS\R4ST\;SU\;S-\R44SVjrVSWSXSXSY.SS\R4ST\;SU\;SZ\WS[\WS\\WS-\R44S]jjrXSWSXS^SY.SS\R4ST\;SU\;S_\WSZ\WS[\WS\\WS-\R44S`jjrYSÏSa\;Sb\TS-\R´4Scjjr[Sa\;S-\R´4Sdjr\Sa\;S-\R´4Sejr]Sf\@Sg\R´Sh\;S-\J\;\;44Sijr^Sj\R6Sk\J\;\;4Sf\@Sg\R´Sl\J\;\;\;4Sh\;S-S4Smjr_Sf\@Sg\R´S?\;S-\P4Snjr`SÐS<\@Su\@Sv\;Sw\@S-Sx\@Sy\@Sz\WS{\WS+\@S|\@S}\TS~\TS\;S-S€\WS\WS\WS-\@4"SƒjjraS„\@S-\
4S…jrbS„\@S-\
4S†jrcSoSSpSqSrSXSsStSPSPS\+\,SSSWSXS^4S‡\BSˆ\@Su\@Sw\@Sx\@Sy\@Sz\WS{\WS+\@S|\@S}\TS~\TS\;S-ST\;SU\;S‰\BSŠ\BS€\WS\WS\WS-\B4*SjjrdSÑS‡\BSˆ\@Su\@Sw\@S-Sx\@Sy\@Sz\WS{\WS+\@S|\@S}\TS~\TS\;S-S‰\BS-SŠ\BS-S€\WS\WS\WS-\B4&SŒjjre\!RKS\SŽ9S\4Sj5rf\!RKS\SŽ9S\4Sj5rg\!RKS“5\"S”S”S•9\"SS”S—S˜9SPSP\"SS™SšS˜94S\;Sœ\;S\TSž\TSM\;4
jj5rh\!RÓS 5S\4j5rj\!RKS¢5\"S£S”S¤9S¥\"SSS•9\"SS”S¦S˜94S§\@S¨\@S©\;Sœ\;4jj5rk\!RKS«5S<\@4j5rl\!RKS­5\"S:5\"SSS•9\"S®S¦S¯S˜9\"S#S¦S¯S˜9\"S°S±S²S˜94S<\@S¨\@S>\;S-S³\;S´\;S§\;4 jj5rm\!RKS¶5\"S·S¦S¸S˜9\"S¹S¦SºS˜9\"S·S±S²S˜94S<\@S³\;S´\;S§\;4jj5rn\!RKS¼5S„\@4j5ro\!RÓS¾5S\4S¿j5rp\!RÓSÀ5S\4j5rq\!RKSÂ55rr\sSÄ:XaSSKtrt\tRê"\!SÅSÆSÇ9 gg)ÒéN)ÚdatetimeÚ timedeltaÚtimezone)ÚPath)ÚFastAPIÚ
HTTPExceptionÚQueryÚRequest)Ú HTMLResponseÚResponseÚStreamingResponse)Ú StaticFiles)ÚJinja2Templates)ÚImageÚ ImageDrawÚ ImageFontÚ ImageFilterÚ
ImageColorÚImageOpsÚUnidentifiedImageErrorzEmby Thumbnail Generator)Útitlez/staticÚstatic)Ú directory)ÚnameÚ templatesÚEMBY_URLzhttp://10.0.0.2:8096Ú EMBY_API_KEYÚ b9af54b630f6448289ab96422add567aÚcacheT)Úexist_okzseries-banner-v10i ç333333ã?gÍÌÌÌÌÌ@g>@Ú http_clienti„ééé´Úairing_lookup_cachezstatic/studioszhulu.pngzhbo.pngz
disney.png)ÚhuluÚhboÚdisneyÚ STUDIO_FILESÚstudioÚ
max_heightÚreturncót[RU5nU(dg[U- nUR5(dg[R
"U5R
S5nURU:”aFXR- nUR[URU-5U4[R5nU$)zQLoad a studio logo from disk and scale it to max_height, preserving aspect ratio.NÚRGBA) r*ÚgetÚ STUDIOS_DIRÚexistsrÚopenÚconvertÚheightÚresizeÚintÚwidthÚLANCZOS)r+r,ÚfilenameÚpathÚimgÚscales Úapp.pyÚmake_studio_logor?4sä×Ñ Ó'€HÞ ØÜ ˜Ñ !€DØ ;‰;=‰=ØÜ
*Š*
×
" 
*€CØ
‡zzØŸZ™ZÑ'ˆØj‰jœ#˜cŸi™i¨%Ñ0°*Ð=¼u¿}¹}ÓMˆØ €JóÚ image_bytesÚmodecó[R"[R"U55n[R
"U5nUR
5 URU5R5sSSS5 $!,(df  g=f)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) rr3ÚioÚBytesIOrÚexif_transposeÚloadr4Úcopy)rArBr<s r>Úload_image_from_bytesrICsUô
Š”B—J’J˜{Ó+Ô ,°Ü×% cÓØ Œ
Ø{‰{˜ ×
-× ,× ,ús «AA:Á:
BcóL[c[R"[S9q[$)N)Útimeout)r"ÚhttpxÚ AsyncClientÚ HTTP_TIMEOUT©r@r>Úget_http_clientrPRsäÑÜ×'´ Ñ=ˆ Ü Ðr@Ústartupcƒó # [5 g7f©N)rPrOr@r>Ú
startup_eventrTYs éäÕùs Úshutdowncƒó\# [b[R5IShvN SqggN7frS)r"ÚacloserOr@r>Úshutdown_eventrX^s,éôÑÜ× Ñ Ó"× ðÙ"ùs ,¡*¢ ,r;ÚparamscƒóÌ# [5n[U3nU=(d 0n[US'URX4S9IShvN nUR 5 UR 5$N$7f)api_key©rY)rPrrr0Úraise_for_statusÚjson)r;rYÚclientÚurlÚrs r>Úemby_getrces\éÜ
Ó
€FÜ
ˆJt
€CØ "€AÜ€A€ij‰j˜ˆ'×'€AØ×ÑÔØ 6‰6‹8€Oñ (ùs;A$½A"¾%A$ÚPrimary©Ú max_widthr,ÚqualityÚitem_idÚ
image_typeÚindexrfrgcƒóì# [5n[SUSU3nS[0nUbX(S'UbX8S'UbXHS'UbXXS'URXxS9IShvN n U R 5 U R
$N 7f) Nú/Items/ú/Images/r[ÚIndexÚmaxWidthÚ maxHeightrgr\)rPrrr0r]Úcontent)
rhrirjrfr,rgr_r`rYrbs
r>Úemby_get_imagerros”éôÓ
€FÜ
ˆJg˜g˜Y h¨z¨lÐ
;€CØ$-¬|Ð#<€FØ ÑØˆw‰ØÑØ&ˆzÑØÑØ(ˆ{ÑØÑØ#ˆyÑØj‰j˜ˆjÐ,€AØ×ÑÔØ 9‰9Ðñ -ùsAA4ÁA2Á!A4cƒó^# [5n[SUSU3nS[0nUbX(S'UbX8S'UbXHS'UbXXS'URXxS9IShvN n U R 5 U R
RS S
5=(d S
R
S 5S n
U RU
4$NY7f)
Nrlrmr[rnrorprgr\ú content-typeú
image/jpegÚ;r)rPrrr0r]ÚheadersÚsplitrq) rhrirjrfr,rgr_r`rYrbÚ content_types r>Úemby_get_image_with_typerzˆéôÓ
€FÜ
ˆJg˜g˜Y h¨z¨lÐ
;€CØ$-¬|Ð#<€FØ ÑØˆw‰ØÑØ&ˆzÑØÑØ(ˆ{ÑØÑØ#ˆyÑØj‰j˜ˆjÐ,€AØ×ÑÔØ—I‘I—M‘M .°,Ó?×OÀ<×VÐWZÓ[Ð\]Ñ^€LØ 9‰9  -ùsAB-ÁB+ÁAB-cƒót# [5n[SUSU3nS[0nUbX%S'URXES9IShvN nURS;agUR 5 UR RSS 5R5nU(aURS
5(dgUR$Ny7f) zJReturns image bytes or None if the image type doesn't exist for this item.rlrmr[Nrnr\)é”értÚzimage/)
rPrrr0Ú status_coder]rwÚlowerÚ
startswithrq)rhrirjr_r`rYrbrys r>Úemby_get_image_optionalr¢éä
Ó
€FÜ
ˆJg˜g˜Y h¨z¨lÐ
;€CØ$-¬|Ð#<€FØ ÑØˆw‰Øj‰j˜ˆjÐ,€A؇}
ÓØ×ÑÔØ—9‘9—=‘= °Ó<€LÞ˜L×3°Hר 9‰9Ðñ -ùs:B8¼B6½A:B8cƒó6# [R"5n[USS9nURUSSSS9 [R
"UR
55n[5n[SUSU3nURUS [0US
[S .S 9IShvN nUR5 UR$$N!![RaLn URR5=(d [!U 5n
[#S
SUR$SU
3S9U eSn A ff=f7f)RGB©rBÚJPEGé\T)ÚformatrgÚoptimizerlrmr[ru)z Content-Typez X-Emby-Token)rYrqrwzEmby upload failed (z): ©rÚdetail)rDrErIÚsaveÚbase64Ú b64encodeÚgetvaluerPrÚpostrr]rLÚHTTPStatusErrorÚtextÚstripÚstrrr) rhrAriÚ
upload_bufÚ upload_imageÚ
upload_b64r_r`rbÚexcrs r>Úemby_upload_imager™³séÜ€Jܸ5ÑA€LØ×ѸÀdÐÑ×! *×"5Ñ"5Ó"7Ó8€Jä
Ó
€FÜ
ˆJg˜g˜Y h¨z¨lÐ
;€CØk‰kØ Øœ<Ðà
ð ð÷ €AðØ ×ÑÔð
=‰=Ðñ# øô × Ñ óØ×+¤3 s£8ˆÜØØ)¨!¯-©-¨¸¸F¸8Ð
ðð ûðüs7‚BDÂB4ÂDÂB6Â(
DÂ6DÃ
ADÄDÄDÚvaluecóU(dg[R"URSS55nURcUR[
R S9nUR[
R 5$![a gf=f)+00:00)Útzinfo)rÚ
fromisoformatÚreplaceÚ
ValueErrorržrÚutcÚ
astimezone)Úparseds r>Úparse_emby_datetimer¥ÏsqÞ ØðÜׯ
©
°c¸8Ó(DÓð‡}ؤx§|¡|ÐØ × Ñ œXŸ\™\Ó *øô óÙðúsŠ&A9Á9
BÂBcó|UR[R5R5R SS5$)Nr)rÚ isoformatr )s r>Ú to_emby_isor¨Ûs-Ø × Ñ œHŸL™LÓ 5× =¸hÈÓ Lr@éÈ)Ú page_sizerªc ƒó†# /nSn[U=(d 05n[U0UE[U5[U5S.E5IShvN nURS/5nUR U5 [ URSU[
U5-55nU(aU[
U5-UaU$U[
U5-
nNz7f)Nr)Ú
StartIndexÚLimitÚItemsÚTotalRecordCount)Údictrcr”r0Úextendr7Úlen) r;rYÚitemsÚ start_indexÚ base_paramsÚpageÚbatchÚtotals r>Ú emby_get_allr¹ß騀EØ€KÜv—| Ó$€KØ
ܘ%
Øð%
ä˜kÓ˜“^ò%
ó ÷ ˆð
˜ %ˆØ
ÜD—H‘HмsÀ5»zÑ1IÓÞ˜ ¤c¨%£jÑ0°EÓ à €Lð ”s˜5“zÑ ñ ñ ùsACÁB?ÁA;CÚnowÚ week_offsetcóˆU[UR5S9-
RSSSSS9nU[US9-nX"[SS9-4$)Údaysr)ÚhourÚminuteÚsecondÚ microsecond)Úweeksr#)rÚweekdayr )Ú
week_starts r>Úget_week_boundsrÆòsOØœ  s§{¡{£}Ñ5×>ÀAÈaÐXYÐghÐi€JØœi¨kÑ:€JØ ¤I°1Ñ$5Ñ 5r@cƒón# [R"[R5n[ X5up#[ SU*5S-n[ U-n[U-nU[US9-
nU[US9-
nU[[ [US-5S9-
n [SSSSS S
S S .5n
[SS
SSS[U5[U5S.5n [SS
SSS [U 5[U[SS9-5S.5n [SS
SSS [U5[U5S.5n
[SSS [U[SS9-
5S.5n[R"U
U U U
USS9IShvN unnnnn[U[5(aUe[U[5(a/n[U[5(a/n[U[5(a/n[U[5(a/n0nUnUR!S5n[#UR!S5=(d S5n[#UR!S5=(d S5n[%UR!S55nU(aUS:d US:wdUcUR!U5nUb UUS:”dUUUR!S5UR!S5=(d SS .UU' 0nUnUR!S5n[#UR!S5=(d S5n[#UR!S5=(d S5n[%UR!S55nU(a US:dUcM†UU4nUR!U5nUb UUS:dUUUUR!S5=(d SS!.UU' 0nUnUR!S5n[%UR!S55nU(aUcM:UR!U5nUb UUS:dMY[#UR!S5=(d S5n[#UR!S5=(d S5nUUUUR!S5=(d SS!.UU' 0nUnUR!S5n[%UR!S55nU(aUcM:UR!U5nUb UUS:dMY[#UR!S5=(d S5n[#UR!S5=(d S5nUUUUR!S5=(d SS!.UU' /nUGn U R!S5nU(dMUR!U5n!UR!U5n"UR!U5n#U R!S"5=(d SR'5n$U$R)5S#:H=(d U"SL=(d U#SL=(d U!SLn%U%(dU R!S$5=(d /n&[U&[*5(aFU&R-S%5V's/sH*n'U'R'5(dMU'R'5PM, n&n'[ U!(aU!S&OSU"(aU"S&OSU#(aU#S&OS5n(Sn)U!cU(SaU"cU#bUR!UU(45n)U!=(d U)n*Sn+U*b,[ S[#UU*S-
R/5S'-55n+U$R)5S#:H=(a U"SL=(d U#SLn,U$R)5S#:H=(a6 U"SL=(d U#SL=(a U+SL=(a UU+s=:*=(a U:*Os n-U,=(d U-n.U!SL=(a U)SLn/U,(aS(O
U-(aS)OSn0U#(aU#SOSn1UR10S*U_S+U R!SS5_S,U R!S-5_S.U$=(d U#(aS/OS0_S1U&_S2S3US43_S5U"(a[U"S5OS_S6U"(a7U"S&(a-U"S7(a#S8U"S&S9U"S7S:U"S;3R'S<5O
U"(aU"S;OS_S=U1(a [U15OS_S>U#(a7U#S&(a-U#S7(a#S8U#S&S9U#S7S:U#S;3R'S<5O
U#(aU#S;OS_S&U*(aU*S&OS_S?U*(a[U*S5OS_S@U*(aU*S;OS_SAU+_SBU/_SCU0_SDU._5 G UR3SESF9 U[U5[U5[U5UUUSG.$GN×s sn'f7f)HNrr#é#ú/ItemsÚSeriesÚtrueÚSortNameÚ AscendingÚ1rd)ÚIncludeItemTypesÚ RecursiveÚSortByÚ SortOrderÚImageTypeLimitÚEnableImageTypesÚEpisodeÚ PremiereDateÚ
Descending)ÚMinPremiereDateÚMaxPremiereDateéz/Shows/Upcomingé )Úhours)T)Úreturn_exceptionsÚSeriesIdÚParentIndexNumberÚ IndexNumberéÚ premiere_atÚIdÚNamer~)Ú
season_numberÚ
episode_idÚ episode_name)Úepisode_numberrçÚStatusÚ
continuingÚAirDaysÚ,råi€QÚcurrent_airingÚrecent_season_startÚidrÚyearÚProductionYearÚstatusÚ
ContinuingÚUnknownÚair_daysÚ
poster_urlú /api/poster/z?w=180&h=270&q=84Úselected_week_air_atÚselected_week_episode_labelrèÚEu · rçu Â·Ú next_air_atÚnext_episode_labelÚseason_premiere_atÚseason_premiere_episodeÚdays_since_season_premiereÚseason_premiere_inferredÚeligibility_reasonÚeligible_new_seasoncóžUS(aSOSUSSL=(a USSLUS=(d US=(d SUSR54$)Nrrr~r)r€)Úitems r>Ú<lambda>Ú'build_airing_snapshot.<locals>.<lambda>ÒsYØ
Ð'×
(‰¨aØ Ð
аmÑ1DÈÐ1LØ Ð
¨]Ñ(;×A¸rØ ˆV‰ ×ÑÓñ #r@©Úkey)Ú generated_atrÅÚweek_endr»Únew_season_min_daysÚnew_season_max_days)rrÚmaxÚNEW_SEASON_MIN_AGE_DAYSÚNEW_SEASON_MAX_AGE_DAYSrÚSEASON_INFERENCE_LOOKBACK_DAYSr¹ÚasyncioÚgatherÚ
isinstanceÚ Exceptionr0r7r“r€r”rxÚ
total_secondsÚappendÚsort)2r»r Úweek_shift_daysÚeligible_min_daysÚeligible_max_daysÚrecent_window_startÚrecent_window_endÚinference_window_startÚ series_taskÚrecent_episodes_taskÚrecent_season_activity_taskÚselected_week_episodes_taskÚupcoming_episodes_taskÚ series_itemsÚrecent_episodesÚrecent_season_activityÚselected_week_episodesÚupcoming_episodesÚrecent_premieres_by_seriesÚepisodeÚ series_idråÚexistingÚearliest_seen_by_series_seasonr Úselected_week_by_seriesÚupcoming_by_seriesÚresultsÚseriesÚrecent_premiereÚselected_week_episodeÚupcomingròÚis_current_airingrõÚpartÚactive_season_numberÚinferred_recent_premiereÚ season_startÚdays_since_premiereÚhas_current_airing_signalÚhas_recent_season_start_signalrrrs2 r>Úbuild_airing_snapshotr=øs
éÜ
,Š,”x—|
$€CÜ*¨3Ó€Jܘ!˜k˜*¨QÑ.€OÜ/°/ÑÜ/°/ÑØ¤ Ð/@Ñ AÑØœiÐ->ÑØ ¤9´#Ô6TÐVgÐjlÑVlÓ2mÑ#nÑä˜xØØØ ØØ
*ó€KôØØ Ø&Ð':Ó&Ð'8Ó
3óÐô#/¨xØØ Ø Ü&Ð'=Ó& s¬Y¸AÑ->Ñ'>Ó
:ó#Ðô#/¨xØØ Ø Ü& & 
:ó#Ðô*Ð*;Ø Ø Ü& s¬Y¸RÑ-@Ñ'@Ó>óÐô nu×m{Òm{ØØØØñ
n÷hÑd€L/Ð#9Ð;QÐSdô×ÐÜ/¤9׈ÜÐ(¬)×4Ø!#ÐÜÐ(¬)×4Ø!#ÐÜÐ#¤Y×Ðà24ÐÛ"ˆØ—KK 
Ó+ˆ ܘGŸK™KÐ(;Ó<×ÓBˆ
ܘWŸ[™[¨Ó7×<¸=ˆÜ)¨'¯+©+°nÓ*EÓFˆ Þ˜M¨AÓÀ1Ó1DÈ ÑH[Ù Ø1°)ÓØ Ñ ˜{¨X°mÑ-DÕ*Ø!.Ø%Ÿk™k¨$Ó/Ø '§ ¡ ¨FÓ 3× 9°rñ 5Ð &  CEÐ)ˆØ—KK 
Ó+ˆ ܘGŸK™KÐ(;Ó<×ÓBˆ
ܘWŸ[™[¨Ó7×<¸=ˆÜ)¨'¯+©+°nÓ*EÓFˆ Þ˜M¨AÓÑ1D٠ؘ-ÐØ5°cÓØ Ñ ˜{¨X°mÑ-DÕ*Ø!.Ø"0Ø '§ ¡ ¨FÓ 3× 9°rñ 3Ð *¨3Ó *ð"02ÐÛ)ˆØ—KK 
Ó+ˆ Ü)¨'¯+©+°nÓ*EÓFˆ Þ˜KÑ Ø.¨yÓØ Ñ ˜{¨X°mÑ-DÕ § ¡ Ð,?Ó @× EÀAÓFˆMÜ  §¡¨]Ó!;×!@¸Aˆ*Ø!.Ø"0Ø '§ ¡ ¨FÓ 3× 9°rñ 2Ð # IÓ +-ÐÛØ—K‘K 
Ó+ˆ Ü)¨'¯+©+°nÓ*EÓFˆ Þ˜KÑ Ø)¨)ÓØ Ñ ˜{¨X°mÑ-DÕ § ¡ Ð,?Ó @× EÀAÓFˆMÜ  §¡¨]Ó!;×!@¸Aˆ*Ø!.Ø"0Ø '§ ¡ ¨FÓ 3× 9°rñ -Ð ˜yÓ €G܈ؗJ‘J˜tÓ$ˆ ÞÙ ØÓØ 7× ;Ñ ;¸IÓ FÐØ)¨)ÓØ—**˜&×,¨"×5ˆà L‰LN˜lÑ 
$¨DÐ
˜
 dÐ ö  à—:‘:˜iÓ.¨BˆÜ × $Ø19·±ÀÔ1DÓUÒ1D¨ÈÏ
É
Ï ˜Ÿ
ž Ñ1Dˆ"Þ0?ˆO˜ ,ÀQÞ6KÐ !  2ÐQRÞ)1ˆH %°qó
Ðð
$(Ð Ø Ñ "Ð';¸qÓ'@ÐF[ÑFgÐksÑkØ'E×'IÑ'IÈ9ÐVjÐJkÓ'lÐ &×BÐ*Bˆ ØØ Ñ #Ü"% ¨c°LÀÑ4OÑ.O×-^Ñ-^Ó-`ÐdiÑ-iÓ)jÓ"kÐ Ø$*§L¡L£N°lÑ$B÷%
Ø Ð -× ÀÐ1Eð
L‰LN˜ 
NØ&¨dÐ2×J°hÀdÐ6J÷
Nà#¨4Ð
Nð"Ð%8×MÐ<MÔ 8×YÐ;YÐØ#2°dÐ#:×#cÐ?WÐ_cÐ?cÐ ö
æ+IÑ'Ètð ö 2:h˜-¸tˆ Øð
Ø 
à F—JJ˜v 
ð
F—J
ð
fס¸
ð
˜ð 
ð
˜¨ Ð3DÐ

ð
#ÖYn¤KÐ0EÀmÑ0TÔ$UÐtxð
ð
(Ð-BÀ?×-SÐXmÐn~×XðÐ)¨/Ñ;¸1Ð=RÐScÑ=dÐ<eÐeiÐjðAOñkPðjQðR÷XñXðY^ô_æ?TÐ+¨NÒ;ÐZ^ð
ð
¶{œ; ð
ð
 ¨× 9¸hÐGW×>XðH˜.¨a°Ð9IÑ0JÐ/KÈ4ÐPXÐYgÑPhÐOiÐj×pÐqvÔwæ2:h˜ð#
ð&
¾l˜\¨/Ò:ÐPTð'
ð(
!Îl¤+¨l¸=Ñ.IÔ"JÐ`dð)
ð*
&Æ| |°NÒ'CÐY]ð+
ð,
)Ð*=ð-
ð.
'Ð(@ð/
ð0
!Ð"4ð1
ð2
"Ð#6ð3
÷ ñið` ‡L€LñðÜ# CÓ!  Ó ðòahùòZVùsHEd5Åd-ÅD(d5ÊCd5Í%A?d5Ï(Cd5Ò1E(d5Ød0Ø6d0Ù
K$d5ä0d5
force_refreshcƒó2# [RU5nU(d(U(a!US[R"5:”aUS$[IShvN [RU5nU(d9U(a2US[R"5:”aUSsSSS5IShvN $[ US9IShvN n[R"5[
-US.[U'UsSSS5IShvN $NQNAN !,IShvN (df  g=f7f)
expires_atÚdata))r@rA)r&r0ÚtimeÚairing_lookup_lockr=ÚAIRING_LOOKUP_CACHE_TTL)r>ÚcachedrAs r>Úget_airing_snapshotrFãéÜ
×
$ 
1€FÞ žV¨¨|Ñ(<¼t¿yºy»{Ó(JØf‰~ÐçÓÞ¦¨F°<Ñ,@Ä4Ç9Â9Ã;Ó,Nؘ&"×+°{ÑC×äŸ)š)›+Ô(?Ññ,
Ô˜÷"×D÷ "×!×!üsyADÁC5ÁDÁAC= DÂ%C7Â&DÂ+ C=Â7C9Â8+C=Ã# DÃ/C;Ã0DÃ7DÃ9C=Ã;DÃ=DÄD Ä DÄDr<r8r5cóN[R"UX4[RSS9$)z6Scale and center-crop image to exactly width x height.)çà?rH)ÚmethodÚ centering)rÚfitrr9)r<r8r5s r>Ú
cover_croprLös%ä <Š<Ø Ø ˆÜ}‰}Øñ  ðr@çð?ç©ÚzoomÚpan_xÚpan_yrPrQrRc ó´
[S[S[U555n[S[S[U555n[[[[[U555nUS:G[U[SUR
5- U[SUR 5- 5n[U[SUR
5- U[SUR 5- 5nU[-
[SS[-
5- n[S[SU55nXgU-
U--n [S[[UR
U -555n
[S[[UR U -555n URX«4[R5n X¡:¼a![[X¡-
US-S- -55*n
O[[X-
US-S- -55n
X²:¼a![[X²-
US-S- -55*nO[[X+-
US-S- -55n[R"SX45n[SU
5n[SU5n[SXU
--
5n[SX.U --
5n[S[S X«55nU(aIU RSSU
U45RU
U4[R5nURUU
S45 U(aMU RSU U-
X«45RU
U4[R5nURUXÞU -45 U(aIU RSSUU 45RUU 4[R5nURUSU45 U(aMU RU
U-
SX«45RUU 4[R5nURUXÚ-U45 U(aLU(aEURU RSSUU45RUU4[R5S
5 U(aSU(aLURU RU
U-
SU
U45RUU4[R5XÚ-S45 U(aSU(aLURU RSU U-
UU 45RUU4[R5SXë-45 U(aWU(aPURU RU
U-
U U-
X«45RUU4[R5XÚ-Xë-45 URXÍU45 U$U[SU5- nUR
[SUR 5- nUU:”a$UR n[[UU-55nO#UR
n[[UU- 55n[S[UR
[[UU- 5555n[S[UR [[UU- 5555n[SUR
U-
5n[SUR U-
5n[[US - US--55n[[US - US--55n URUU UU-U U-45n!U!RX4[R5$) zCover-crop with user-controlled zoom and pan.
`pan_x` / `pan_y` are normalized in [-1, 1], where -1 means left/top and
+1 means right/bottom.
gð¿rMg-Cëâ6?rNg@r„r©rr)rÚminÚfloatÚPRIMARY_MIN_ZOOMÚPRIMARY_MAX_ZOOMr8r5r7Úroundr6rr9ÚnewÚcropÚpaste)"r<r8r5rPrQrRÚ
contain_scaleÚ cover_scaleÚzoom_tr=Úfitted_wÚfitted_hÚfittedÚpaste_xÚpaste_yÚcanvasÚleft_gapÚtop_gapÚ right_gapÚ
bottom_gapr“Ú top_stripÚ bottom_stripÚ
left_stripÚ right_stripÚ target_ratioÚ source_ratioÚcrop_hÚcrop_wÚmax_leftÚmax_topÚleftÚtopÚcroppeds" r>Úcover_crop_positionedrwsô
”c˜#œu U›|Ó -€EÜ ”c˜#œu U›|Ó -€EÜ Ô¤Ô%5´u¸T³{Ó!CÓ D€Dà ˆc„zܘE¤C¨¨3¯9©9Ó$5Ñ5°vÄÀAÀsÇzÁzÓ@RÑ7RÓSˆ
ܘ%¤# ¯©Ó"3Ñ3°V¼cÀ!ÀSÇZÁZÓ>PÑ5PÓQˆ ØÔ)¬S°¸Ô?OÑ9OÓ-PÑPˆÜSœ#˜c +ˆØ¨}Ñ!<ÀÑ FÑäqœ#œe C§I¡I°Ñ$5ÓÜqœ#œe C§J¡J°Ñ$6ÓØ˜XÐ0´%·-±-ÓØ Ó Üœ5 (Ñ"2¸À¹ ÀsÑ7JÑ!KÓM‰Gäœ% Ñ!1°u¸s±{ÀcÑ6IÑ JÓLˆ Ó Üœ5 (Ñ"3¸À¹ÈÑ8KÑ!LÓN‰Gäœ% Ñ!2¸À¹ ÀsÑ7JÑ KÓMˆGä˜5 5 2ˆÜq˜'“?ˆÜ“/ˆÜ˜˜5¨hÑ$6Ñ8ˆ ܘ˜Ñ&8Ñ:ˆ
ÜA”s˜2˜xÓæ ØŸ  Q¨¨8°UÐ$;Ó<×CÀXÈwÐDWÔY^×YfÑYfÓgˆ L‰L˜ W¨a LÔ Ø!Ÿ;™;¨¨8°eÑ+;¸XÐ'PÓQ×XÐZbÐdnÐYoÔqv×q~Ñq~Óˆ L‰L˜¨¸8Ñ1CÐ'DÔ ØŸ ¨E°8Ð%<Ó=×DÀhÐPXÐEYÔ[`×[hÑ[hÓiˆ L‰L˜ a¨ \Ô Ø Ÿ+™+ x°%Ñ'7¸¸HÐ&OÓP×WÐYbÐdlÐXmÔot×o|Ño|Ó}ˆ L‰L˜ wÑ'9¸7Ð&CÔ  L‰L˜Ÿ a¨¨E°5Ð%9ÓAÀ8ÈWÐBUÔW\×WdÑWdÓeÐgmÔ –yØ L‰LØ ˜X¨Ñ-¨q°(¸EÐC×JÈIÐW^ÐK_Ôaf×anÑanÓÑ# 
ö ž(Ø L‰LØ ˜Q ¨5Ñ 0°%¸ÐC×JÈHÐV`ÐKaÔch×cpÑcpÓ
ö ž)Ø L‰LØ ˜X¨Ñ-¨x¸%Ñ/?ÀÐU×\Ð^gÐisÐ]tÔv{÷wDñwDóEØÑ# WÑ%7Ð
ð
 V ˆ
àœ3˜q &)€LØ—99œs 1 c§j¡jÓ1€LàˆÜ”U˜6 LÑ2‰àˆÜ”U˜6 LÑä
”C˜Ÿ ™ ¤3¤u¨V°d©]Ó';Ó#<Ó
>€FÜ
”C˜Ÿ
¤C¬¨f°t©mÓ(<Ó$=Ó
?€Fä1c—ii )€HÜ!S—ZZ )€Gä Œuh l u¨s¡{Ñ 5€DÜ
ŒeW˜q[ U¨S¡[Ñ
3€Càh‰h˜˜c 4¨&¡=°#¸±,Ð@€GØ >‰>˜5˜/¬5¯=©=Ó 9r@ç{®GázÄ¿Ú
dim_factorc óD^[XX$XVS9nURU4Sj5$)NrOcó >[UT-5$rS©r7)rarys €r>rÚ0build_tall_backdrop_background.<locals>.<lambda>osø€¤ 
¡NÔ 3r@)rwÚpoint)r<r8r5ryrPrQrRÚbases ` r>Úbuild_tall_backdrop_backgroundr€ds#ø€ô ¨VÀeÑ Y€DØ :‰:Ô 4r@ÚsizeÚboldcó U(aSOSU(aSOSU(aSOSU(aSOSU(aS OS
/nUH?n[RRU5(dM)[R"X05s $ [R
"U5$) C:/Windows/Fonts/arialbd.ttfzC:/Windows/Fonts/arial.ttfzC:/Windows/Fonts/calibrib.ttfzC:/Windows/Fonts/calibri.ttfzC:/Windows/Fonts/verdanab.ttfzC:/Windows/Fonts/verdana.ttfú4/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttfz//usr/share/fonts/truetype/dejavu/DejaVuSans.ttfú</usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttfz?/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf)Úosr;r2rÚtruetypeÚ load_default)rrÚ
font_pathsÚfps r>Úget_fontrŒrsö+/Ñ&Ð4PÞ+/Ñ'Ð5SÞ+/Ñ'Ð5SæBFÑ>ÐL}ÞJNÑUVð€JóˆÜ
7‰7>‰>˜"× Ó Ü×% bÓ ô × !  'r@có¨/SQnUH?n[RRU5(dM)[R"X 5s $ [ USS9$)N)r„z6/usr/share/fonts/truetype/msttcorefonts/Arial_Bold.ttfú=/usr/share/fonts/truetype/liberation2/LiberationSans-Bold.ttfr†r…r)r‡r;r2rrˆ©rrs r>Úget_arial_bold_fontrsHò€JóˆÜ
7‰7>‰>˜"× Ó Ü×%  ô D˜ $r@cóª/SQnUH?n[RRU5(dM)[R"X 5s $ [ U5$)N)zC:/Windows/Fonts/ariblk.ttfr„zC:/Windows/Fonts/seguisb.ttfrŽr…)r‡r;r2rrˆrrs r>Úget_badge_fontr“sFò€JóˆÜ
7‰7>‰>˜"× Ó Ü×%  ô ˜ $r@rÚfontÚtrackingcó/nSnSnUHJnURU5nURUSUS-
5 [XGS5n[XWS5nML U(dg[ U5U[S[ U5S-
5--nXT-
n X‰4$)NrérT)ÚgetbboxrrUrÚsumr²)
rr”r•ÚwidthsruÚbottomÚchÚbboxr8r5s
r>Úmeasure_tracked_textržžs—Ø
€FØ
€CØ
€FÛˆØ|‰|˜BÓˆØ
d˜1g  Ñ#˜AˆÜV !™WÓñ ö
ØÜ ‹K˜(¤S¨¬C°«K¸!©OÓ%<Ñ <€EØ
‰\€FØ ˆr@ÚdrawÚpositionÚfillcóšUupgUHAnURU5n URXiS-
XyS-
4XƒUS9 XiSU S-
U--
nMC g)Nr©r”)r˜r)
r r’r”r•Úyrœrs
r>Údraw_tracked_textr¦®s`ð D€AÛˆØ|‰|˜BÓˆØ 1˜A‘w‘; ¨¡G¡ Ð,¨bÀ$ˆ Ñ 1‰g˜˜Q™Ñ 8Ñ
òr@cóUR5n/SpTUHNnUSU3R5nURU5SU::aUnM4U(aURU5 UnMP U(aURU5 U$)Nr~Ú)rxr“r˜r)rr”rfÚwordsÚlinesÚcurrentÚwordÚtests r>Ú wrap_textr®½s|Ø J‰J‹L€Eؘˆ7ۈؘ!˜D˜6Ð"×*ˆØ <‰<˜Ó ˜aÑ  IÓ ŠGæØ ˜WÔŠGñöØ
Ø €Lr@Úbackdropú#FFFFFFú
bottom-centerçÍÌÌÌÌÌô?Únoneú bottom-rightÚbg_modeÚbackdrop_indexÚ custom_bgÚ
text_colorÚ
logo_alignÚ
logo_scaleÚdarknessÚstudio_positionÚnew_episodes_tagÚseason_finale_tagÚ
logo_indexÚ primary_zoomÚ
primary_pan_xÚ
primary_pan_ycóà0S[_SU_SU_S[U5_SU_SU_SU_S[[U5S 5_S
[[U5S 5_S U_S U _S
[ U
5_S[ U 5_SU _S[[U
5S 5_S[[U5S 5_S[[U5S 5_n[
R "[U5RS55R5$)render_versionrhr¸ér+r¿zutf-8)
ÚRENDER_VERSIONr7rYrVÚboolÚhashlibÚmd5ÚreprÚencodeÚ hexdigest)rhr¸r+r¿Úpayloads r>Úbuild_cache_keyrÎÍsFð$Øœ.ðàð ð œ#˜nÓð
 ð 
ð ð ”eœE -¨qÓð ”Eœ% /¨1Óð ð ˜ð œDÐ!1Óð œTÐ"3Óð 𠜜e LÓ1°1Ó𠜜u 3°QÓ7ð!ð" œœu 3°QÓ7ð#€Gô& ;Š;”t˜G“}×+¨GÓ 5× Ar@Ú cache_keycó[US3- $)Nz.png©Ú CACHE_DIR©s r>Úget_thumb_cache_pathrÔõsÜ ˜  )r@có[US3- $)Nz .primary.pngrÑs r>Úget_primary_cache_pathrÖùsÜ ˜  1r@Ú poster_bytesrÚ
logo_bytesÚbackdrop_bytesc
óÐ
^^
^ ^
^^B^C^D^E^F•[S[SU55mCSTCS--
mB[TCS-5nT[T
S-5mDU(aJUS:waD[USS9nTD(a[ UT
TTBUUUS 9nO±[ UT
T5nUR
UB4S
j5nOŽUS:Xa9U(a2[R"U5n[R"ST
T4U5nOO[USS9n[ UT
T5nUR[R"S S
95nUR
UB4Sj5n[R"ST
T4S5n[R "U5mESNS["S[4UCUUEU
4SjjjnSOS[4UCUUEU
4Sjjjn[US-5nTER%ST
T4/SSSU4S9 TS:Xa%TER%ST
T4/SSS[US-54S9 OBTS:XaU"SSS9 O4TS:XaU"S S!9 O'TS":XaU"SS#S9 U"S#S!9 OTS$:Xa
U"S%S#S9 U"S#S!9 UR'S5n[R("UU5nUR'S5n[R"U5n[S&[TTD(aS'OS(-55mF[S)[S*U55n[T
S+-U-5n[TTD(aS,OS)-U-5nSn Sn!S-[*S-4UUDU
U U
4S.jjn"U""5n#S/[S0[4UUUFU
4S1jjn$U(a[USS9n%U%cSnU(G[UW%R0- UU%R2- 5n&[U%R0U&-5n'[U%R2U&-5n(U%R5U'U(4[R65n%U$"U'U(5un)n*S2n+U+S3-mFU%R95u n,n-[R"SU'U(4S45n.[R:"S/U.R95SS3QU-P75n/[R"SU'TFS5--U(TFS5--4S5n0U0R=U/TFS6-TFS6-4U/5 U0R[R"U+S
95n0UR'S5nUR)U0U)TF-
U*TF-
45 UR'S5nUR=U%U)U*4U%5 U)U*U'U(4n O£[R "U5n1[?S7SS89n2S9n3[AURC5U2U5n4[EU45U3-n5U$"UU55un6n7U4H6n8U1RGU6S3-U7S3-4U8U2S4S:9 U1RGU6U74U8U2US:9 U7U3-
n7M8 U6U$"UU55S;UU54n U(a™US<:wa“[IUS=S>9n9U9(aS?n:U9RJun;n<U#(dU:O
U#S@U#SA-SB-n=U:U=4T
U;-
U:-
U=4U:TU<-
U:-
4T
U;-
U:-
TU<-
U:-
4SC.n>U>RMU U>S$5un?n@UR=U9U?U@4U95 U?U@U;U<4n!U#(ag[R "U5n1U1R%U#SDU#S@4U#SDU#SE-U#S@U#SA-4/U#SFS9 U1RGU#SGU#SH4U#SIU#SJSKS:9 [NRP"5nAURSUASLSM9 UARUS5 UARW5$![a S nGN f=f![,[.[4a Sn%GNÔf=f)PNrNrMr!éÜÚsolidr„r…)ryrPrQrRcó >[UT-5$rSr|©raÚbg_dims €r>rÚ$generate_thumbnail.<locals>.<lambda>)s
ø€¤C¨¨F©
¤Or@)ééé)Úradiuscó&>[UT-S-5$)Ng333333ë?r|s €r>r5sø€¤ ¡J°Ñ$5Ô 6r@r/)rrrrÚ from_leftÚstrengthcóæ>[UT-5n[T
5HSnSU[ST
S-
5- -
n[X$S--5nU(aUOT
S-
U-
nT RUS4UT4/SSSU4S9 MU g©NrMgš™™™™™á?r©©r7ÚrangerÚline) Úsr¤ÚpxÚdr5Úovr8s €€€€r>Ú
h_gradientÚ&generate_thumbnail.<locals>.h_gradient;sø€Ü ˜1‘ Ó ˆÜu–ˆAØqœ3˜q %¨!¡)Ó-ˆAÜA˜d™‘OÓ$ˆAÞ U¨Q¡Y°¡]ˆBØ G‰Gb˜!W˜r 6˜+°1°a¸¸A°,ˆ r@cóÜ>[UT-5n[T5HNnSU[STS-
5- -
n[XS--5nTRSTS-
U-
4TTS-
U-
4/SSSU4S9 MP g) rçr5r8s €€€€r>Úv_gradient_bottomÚ-generate_thumbnail.<locals>.v_gradient_bottomCsø€Ü ˜1‘ Ó ˆÜv–ˆAØqœ3˜q &¨1¡*Ó.ˆA˜d™‘OÓ$ˆAØ G‰Ga˜ !™ a™Ð(¨5°&¸1±*¸q±.Ð*AÐBÈ!ÈQÐPQÐSTȈGÓ r@gÍÌÌÌÌÌÜ?rTrÚcentergÐ?rtTé )é–)ú bottom-leftéŒr´Fé4g)\Âõ(¼?g{®Gáz´?gš™™™™™Ù?g@gq=
×£pÝ?g
×£p=
Ç?r-c
ó>T(aSnSnO
T(aSnSnOg[T(aSOS[TT(aSOS-55n[U5nURU5nUS US
-
nUS US -
nS
nS
nTn [T(aS
OS
[UT(aSOS-55n
[XjS --[TT(aSOS-55n X•-
S -US
-
n X¶-
S -US -
n
U[R
"U5UUUU U U U
S. $)Nz
Season Finalez#111111z
New Seasonz#E50914éHé:gú~j¼t“¨?gq=
×£p½?rárr—gìQ¸…ëÑ?g333333Ó?gáz®Gáº?gÃõ(\ÂÅ?) rr”Útext_xÚtext_y)rr7r“r˜rÚgetrgb)Ú banner_textÚ banner_fillÚbanner_font_sizeÚ banner_fontÚ text_bboxÚtext_wÚtext_hÚbanner_xÚbanner_yÚbanner_wÚ vertical_padÚbanner_hrrr5Úis_tall_layoutr½r8s €€€€€r>Úget_series_bannerÚ-generate_thumbnail.<locals>.get_series_banneris0ø€Þ Ø)ˆ#‰KÞ
Ø&ˆKØ#‰Kàܦ^™r¸¼SÀÖTbÉ5ÐhmÑAnÓ=oÓÜ$Ð%5Ó6ˆ Ø× Ó4ˆ ؘ1‘  ¨!¡ ÑØ˜1‘  ¨!¡ ÑØˆØˆØˆÜ¦™2°R¼Ð=MÖYgÑQUÐmqÑ=rÓ9sÓtˆ Üv¨qÑ 0Ñ0´#°fÎÁÐ]aÑ6bÓ2cÓØÑÑ)¨I°a©LÑØÑÑ)¨I°a©LÑàÜ×% kÓØØØØØØñ

ð
r@ÚlwÚlhcóè>TS:XaTU-
S-TU-
S-4$TS:Xa
TTU-
S-4$TS:XaTU-
S-TU-
T-
4$TS:Xa
TTU-
T-
4$TS:XaTU-
T-
TU-
T-
4$TU-
S-TU-
S-4$)Nrùrtr´rO)rrr5Úpadr8s €€€€r>Ú
logo_positionÚ)generate_thumbnail.<locals>.logo_positionŒø€Ø ˜Ó ˜B‘J $ ¡{°qÑ&8Ð
˜
˜ "™¨Ñ
˜
˜BJ $ f¨r¡k°CÑ&7Ð
˜
˜   cÑ
˜
˜2: Ñ# V¨b¡[°3Ñ%6Ð ˜
˜  6¨B¡;°1Ñ"4Ð4r@ér—)rrré8réBé.)r,éré
)ztop-leftz top-rightrür´rrrrr”)éÿr"r"ÚPNG)rˆ))r%),rrUr7rIr€rLr~rrrrZÚfilterrÚ GaussianBlurrÚDrawrÇÚ rectangler4Úalpha_compositer°rÚOSErrorr8r5r6r9rxÚmerger\Úupperr²rr?rr0rDrEÚseekr)Gr×rr¸r+r¿r8r5Úvig_maxr¯ÚbgÚbg_colorÚoverlayrôÚ
base_alphaÚ txt_colorr=Ú
logo_max_wÚ
logo_max_hÚlogo_boxÚ
studio_boxrÚbannerrÚlogoÚratiorrÚlogo_xÚlogo_yÚblur_rÚ_rðÚblackÚ shadow_logoÚ shadow_croprŸÚ
title_fontÚline_hrªÚtotal_hÚtxÚtyríÚslogoÚs_padÚswÚshÚtop_yÚ positionsÚsxÚsyÚbufrßrrsG ` `` `` @@@@@r>Úgenerate_thumbnailrOýs3ÿù€ô0 ˆC”S˜(Ó$€AØ
A˜G‰_€FÜ!c'l€GØœs 5¨3¡;Ó/€Nö˜' ¸eÑÞ ÜØØØ‰Bô˜H e¨VÓ4ˆBØÔ4‰BØ ¦ ð!×Ó3ˆYŠYu˜u f˜o¨xÓ
8‰ô# <°eÑ
<ˆÜ
˜˜E 
*ˆØ