Files
sublogue/server/__pycache__/app.cpython-313.pyc
T

315 lines
52 KiB
Plaintext
Raw Normal View History

2026-01-17 21:49:22 +13:00
ó
<Úji\ÁãóÔSrSSKrSSKrSSKrSSKrSSKrSSKrSSKJrJr SSK J
r
SSK J r J
r
JrJrJr SSKJr SSKJr SSKJr SS KJr SS
KJr SS KJrJr SS KJr SS
K J!r! \RD"\RFSS9 \RH"\%5r&\RNRQ\RNRS\RNRU\+55S5r,\ "\%\,SS9r-\"\-5 \"5r.\!"5r/Sq0Sq1Sq2Sq3/SSS.q4Sq5\Rl"5r7Sr8Sr9Sr:Sr;Sr<Sr=S\4Sjr>\="5 \<"5 \-RSS/S9S 5r@\-RSS!/S9S"5rA\-RS#S!/S9S$5rB\-RS%S!/S9S&5rC\-RS'S/S9S(5rD\-RS)S/S9S*5rE\-RS)S!/S9S+5rF\-RS,S!/S9S-5rG\-RS.S!/S9S/5rH\-RS0S1/S9S25rI\-RS.S1/S9S35rJ\-RS4S!/S9S55rK\-RS6S!/S9S75rL\-RS8S!/S9S95rM\-RS:S!/S9S;5rN\-RS<S!/S9S=5rO\-RS>S!/S9S?5rP\-RS@S/S9SA5rQ\-RSBS/S9SC5rR\-RSDS/S9SE5rS\-RSFS/S9SG5rT\-RSHS/S9SI5rU\-RSJS/S9SK5rV\-RSL5SM5rW\-R±SN5SO5rY\%SP:XaZ\&RµSQ5 \SR5SS:Xd\-Rº(d\;"5 \-R½STSUSVSW9 gg)Xz<
Sublogue Flask API Server
Main entry point for the backend
éN)ÚdatetimeÚtimezone)ÚPath)ÚFlaskÚrequestÚjsonifyÚResponseÚstream_with_context)ÚCORS)Ú
ConfigManager)Ú
OMDbClient)Ú
TMDbClient)Ú TVMazeClient)ÚSubtitleProcessorÚSubtitleFormatOptions)Ú FileScanner)ÚDatabaseManagerz)%(asctime)s - %(levelname)s - %(message)s)ÚlevelÚformatÚstaticÚ)Ú
static_folderÚstatic_url_pathF)ÚfilesÚscanningÚ last_scancóXU(a[U[5(dgURS5(aURSS5n[R
"U5nUR (a,UR[R5RSS9nU$![a gf=f)z3Parse ISO datetime strings into naive UTC datetime.NÚZz+00:00)Útzinfo) Ú
isinstanceÚstrÚendswithÚreplacerÚ
fromisoformatrÚ
astimezonerÚutcÚ
ValueError)ÚvalueÚparseds Ú
Server/app.pyÚparse_iso_datetimer+8sˆæ œ
 5¬#×ðØ >‰>˜#× Ñ Ø—MM # 0ˆ×Ó.ˆØ =×&¤x§|¡|Ó4×<ÀDÐIˆˆ
øÜ óÙðúsŸA<BÂ
B)Â(B)cóR[R"5n/n[R"USS9HnURU5 M [ [R"5U-
S-5n[ SU55n[ RU[U5UUS9 [U5UUS.$)z;Run a scheduled scan without mutating in-memory scan state.é
©Ú
batch_sizeéèc3óV# UHoRSS5(dMSv M! g7f©Úhas_plotFéÚget©Ú.0Úfs r*Ú <genexpr>Ú)perform_scheduled_scan.<locals>.<genexpr>PséÐG¢U ¯e©e°JÀ×.FŸ!™!¢Uùó)  )©Ú directoryÚ files_foundÚfiles_with_plotÚscan_duration_ms)r?r@rA) ÚtimerÚscan_directoryÚextendÚintÚsumÚdbÚadd_scan_historyÚlen)r>Ú
start_timerÚbatchrAr@s r*Úperform_scheduled_scanrLGä€JØ €Eä×+¨IÀ"ÔEˆØ
ñFôœDŸIšI›K¨*ÑÑÜÑG¡UÓG€Oä×ÑØÜ˜“JØñô˜5“zØ ðócóô[R5([R"5n[R U5nUHn[R
U5nU(dM![RU[R"5S9(dMO[US5n[RUUSUSUS5 M [RS 5 [R5(dgg![aBn[RSU35 [RU[U55 SnASnAff=f![a"n[RSU35 SnAN¨SnAff=f)
z-Background worker to execute scheduled scans.)Ú
started_atr>r?r@rAzScheduled scan failed: NzScheduled scan worker error: é)Úscheduled_scan_stopÚis_setrÚutcnowrGÚget_due_scheduled_scansÚget_scheduled_scanÚmark_scheduled_scan_runningrLÚcomplete_scheduled_scanÚ ExceptionÚloggerÚerrorÚfail_scheduled_scanr!Úwait)ÚnowÚ due_scan_idsÚscan_idÚscanÚresultÚes r*Úscheduled_scan_workerrc`s4ä!×(×—/#ˆ×5°cÓ:ˆ'Ü×,¨WÓ5ÞÙÜ×5°gÌ(Ï/Ê/ÓJ[Ðð
3°D¸Ñ4EÓFר˜}ÑÐÐñ(ô& × Ñ  Ô#ô/"×(×*øô$—LLÐ#:¸1¸#Ð!>Ô×*¨7´C¸³F×;ûð<ûôó L‰LÐ8¸¸Ð<× =ûð >úsBA;E Â/C<ÃE Ã<
EÄ7EÄ=E ÅEÅE Å
E7ÅE2Å2E7có¨[(a[R5(ag[R"[SS9q[R 5 g)z,Start the scheduled scan worker thread once.NT)ÚtargetÚdaemon)Úscheduled_scan_threadÚis_aliveÚ threadingÚThreadrcÚstart©rMr*Ústart_scheduled_scan_workerrm|s=÷ÒÔ!6×!?Ñ!?×!AÑ!AØÜ%×,Ô4IÐRVÑÜ×ÑÕ!rMcór[RSS5nU(d[RSS5nU(d[RSS5n[RSS5n[RSS5n[RSS5nU(a$[ U[S 9q[ RS
5 O[ RS 5 U(a$[U[S 9q
[ RS 5 O[ RS
5 U(a#[[S 9q [ RS5 OSq [ RS5 [
(d[(d [(a.[[
[[US9q[ RS5 g[ RS5 g)zIInitialize OMDb, TMDb, TVmaze clients and processor with current API keysÚ omdb_api_keyrÚapi_keyÚ tmdb_api_keyÚtvmaze_enabledTÚpreferred_sourceÚomdb)Ú
db_managerz+OMDb client initialized with usage trackingzNo OMDb API key configuredz+TMDb client initialized with usage trackingzNo TMDb API key configuredz-TVmaze client initialized with usage trackingNzTVmaze integration disabled)rszProcessor initializedz No metadata providers configured)rGÚ get_settingÚconfigr6r
Ú omdb_clientrYÚinfoÚwarningrÚ tmdb_clientrÚ
tvmaze_clientrÚ processor)Úomdb_keyÚtmdb_keyrrrss r*Úinitialize_clientsr€s0ô
~‰~˜n¨bÓ1€HÞ ä—>> )¨RÓ0ˆÞ Ü—:‘:˜i¨Óô~‰~˜n¨bÓ1€HÜ—^‘^Ð$4°dÓ;€NÜ—~~Ð&8¸öÜ  ´bÑ Ü ÐÐÜ  ´bÑ Ü Ð ÐÜÑ
Ü Ðˆ
Ü Ð‚{—k’k§]¢]Ü Ü Ü Ø
ˆ ô  ÐÐ:rMcót[R5nU(dm[RS5 [R 5nUR
5Hup#[RX#5 M [RS5 gg![a"n[RSU35 SnAgSnAff=f)z+Migrate settings from JSON file to databasez/Migrating settings from config file to databasezSettings migration completezError migrating settings: N)
rGÚget_all_settingsrYryrwÚget_allÚitemsÚ set_settingrXrZ)Ú db_settingsÚ
file_settingsÚkeyr(rbs r*Úmigrate_settingsr‰¸sð × öÜ K‰KÐ "ŸN™NÓ,ˆ+×3
ܘsÖ K‰KÐ øô ó Ð1°!°Ð6ûð7úsBB Â
B7ÂB2Â2B7Úreturnc ó[[RSS5[RSS5[RSS5[RSS5[RSS5[RSS5S 9$)
z8Load subtitle formatting options from database settings.Úsubtitle_title_boldTÚsubtitle_plot_italicÚsubtitle_show_directorFÚsubtitle_show_actorsÚsubtitle_show_releasedÚsubtitle_show_genre)Ú
title_boldÚ plot_italicÚ
show_directorÚ show_actorsÚ
show_releasedÚ
show_genre)rrGrvrlrMr*Ú get_format_options_from_settingsr˜Ésiä Ü—>>Ð"7¸Ó—NNÐ#9¸—n‘nÐ%=¸—N‘NÐ#9¸—nnÐ%=¸—>>Ð"7¸Ó
 ðrMz
/api/settingsÚGET)ÚmethodscóÀ[R5nSU;aURSS5US'SU;aSUS'SU;aSUS'SU;aSUS'SU;aS US'S
U;aS US
'S U;aS
US 'SU;aS
US'SU;aS
US'SU;aS
US'SU;aS
US'SU;aSUS'SU;aSUS'SU;aSUS'SU;aSUS'SU;aSUS'[U5$)z Get current application settingsrorprrqÚdefault_directoryÚdurationé(rsrtÚinsertion_positionrkÚstrip_keywordsTÚclean_subtitle_contentrrrFrrrÚ quote_styleÚ sarcastic)rGrr6r)Úsettingss r*Ú get_settingsr¥ÜsZô×$€Hð˜%à#+§<¡<° ¸2Ó#>ˆÑ ؘXÓ%Ø#%ˆÑ Ø (Ó*Ø(*ˆÐ˜ÓÑØ Ó)Ø'-ˆÐ +Ø)0ˆÐ˜'Ø%)ˆÐ /Ø-1ˆÐ˜'Ø%)ˆÐ ,Ø*.ˆÐ -Ø+/ˆÐ /Ø-2ˆÐ -Ø+0ˆÐ /Ø-2ˆÐ ,Ø*/ˆÐ˜$Ø"-ˆÑä  ÐrMÚPOSTcó¶[RnSU;a[RSUS5 SU;a[RSUS5 SU;a[RSUS5 SU;a[RSUS5 SU;a"[RS[ US55 SU;a[RSUS5 SU;a[RSUS5 SU;a"[RS[ US55 S U;a"[RS [ US 55 S
U;a"[RS
[ US
55 S U;a"[RS [ US 55 S U;a"[RS [ US 55 S
U;a"[RS
[ US
55 SU;a"[RS[ US55 SU;a"[RS[ US55 SU;a"[RS[ US55 SU;a[RSUS5 [
5 [SSS.5$![a;n[RSU35 [S[U5S.5S4sSnA$SnAff=f)zUpdate application settingsrorqrprrsr rrrrrrTzSettings saved successfully)ÚsuccessÚmessagezError updating settings: F©rZéôN) rÚjsonrGr…rEÚboolr€rrXrYrZr!)Údatarbs r*Úupdate_settingsr¯ sð9Ü|‰|ˆð ˜TÓ N‰N˜>¨4°Ñ+?Ô ˜ N‰N˜>¨4°Ñ+?Ô ˜Ó ä N‰N˜>¨4° ©?Ô   N‰NÐÐ5HÑ0IÔ ˜Ó Ü N‰N˜:¤s¨4°
Ñ+;Ó'<Ô  Ó N‰NÐ-¨tÐ4FÑ/GÔ   N‰NÐÐ6JÑ1KÔ ˜tÓ N‰NÐ+¬T°$Ð7GÑ2HÓ-IÔ #  N‰NÐ3´T¸$Ð?WÑ:XÓ5YÔ ˜ N‰NÐ+¬T°$Ð7GÑ2HÓ-IÔ  !  N‰NÐ0´$°tÐ<QÑ7RÓ2SÔ !  N‰NÐ1´4¸Ð=SÑ8TÓ3UÔ #  N‰NÐ3´T¸$Ð?WÑ:XÓ5YÔ !  N‰NÐ1´4¸Ð=SÑ8TÓ3UÔ #  N‰NÐ3´T¸$Ð?WÑ:XÓ5YÔ   N‰NÐ0´$°tÐ<QÑ7RÓ2SÔ  ˜ Ü N‰N˜=¨$¨}Ñ*=Ô  Ô䨨
ó ð øô
óÜ Ð°ÐØÜ˜“Vñ
ó ð
ðõ ûðús‚JJÊ
KÊ0KË
KËKz/api/scan/startcóð[RnURS[R SS55nU(d[ SSS.5S4$/[ S'S [ S
'S [ S '[R"5n[RS
U35 /n[R"USS9HnURU5 M [[R"5U-
S-5n[SU55n[RU[!U5UUS9 [R#U5nUH"nURS5n X—;dMXyUS'M$ U[ S'S[ S
'[$R&"5R)5[ S '[RS[!U5S[!U5S35 [ S [!U5UUS.5$![*aDn
S[ S
'[R-SU
35 [ S[/U
5S.5S4sS n
A
$S n
A
f[0aDn
S[ S
'[R-SU
35 [ S[/U
5S.5S4sS n
A
$S n
A
ff=f)z&Start scanning directory for SRT filesr>rNo directory specifiedrªérTrNrz"Starting fresh scan of directory: r-r.r0c3óV# UHoRSS5(dMSv M! g7fr2r5r7s r*r:Ústart_scan.<locals>.<genexpr>jséРA·%±%¸
ÀE×2JŸa™aªùr<r=ÚpathÚsuggested_matchúScan completed: ú files found, ú suggested matches loaded)ÚcountrÚsuggested_matcheszInvalid directory: z Scan error: r«)rr6rGrvrÚ
scan_staterBrYryrrCrDrErFrHrIÚ#get_suggested_matches_for_directoryrr]Ú isoformatr'rZr!rX) r>rJrrKrAr@ÚfileÚ file_pathrbs r*Ú
start_scanrÁLsnðJÜ|‰|ˆØ—HH˜[¬"¯.©.Ð9LÈbÓ*QÓRˆ æÜØ Øóððð
ð 
Ø!%Œ
Ø"&Œ
Ü—YY“[ˆ
ä и ÐˆÜ ×/° ÀbÔIˆEØ L‰L˜Ö ñJô¤§ ¢ £ ¨jÑ 8¸DÑôÑÓô ×ÑØÜ˜E›
Ø ñ
ô×BÀ9ÓóˆDØŸ Ó(ˆIØÕ-Ø*;Ñ*FÐð 
Ø!&Œ
Ü"*§,¢,£.×":Ñ":Ó"<Œ
ä Ð&¤s¨5£z l°.ÄÐEVÓAWÐ@XÐXqÐØÜ˜“ZØØ!2ñ 
ó ð øô óØ!&Œ
Ü Ð*¨1¨#ÐØÜ˜“Vñ
ó ð
ðõ ûô
óØ!&Œ
Ü | A ØÜ˜“Vñ
ó ð
ðõ ûðús>A GÁC:GÅ
B
GÇ
I5Ç%9H$ÈI5È$
I5È19I0É*I5É0I5z/api/scan/streamcóv^[RnURS[R SS55mT(d[ SSS.5S4$U4Sjn[
[U"55S S
S S S
.S9$![a;n[RSU35 [ S[U5S.5S4sSnA$SnAff=f)z1Stream scanning progress using Server-Sent Eventsr>rFr±c3óØ># /[S'S[S'S[S'[R"5n[RST
35 S[R
"SS S
S .5S 3v /nS
n[R"T
SS9HTnUS-
nURU5 SS[U5S3[U5UUS.nS[R
"U5S 3v MV [[R"5U-
S-5n[SU55n[RT
[U5UUS9 [RS5 S[R
"SS[U5S .5S 3v [RT
5nUH"nUR!S5n X—;dMXyUS'M$ U[S'S[S'["R$"5R'5[S'[RS [U5S![U5S"35 S#S[U5UUUUS$.n
S[R
"U
5S 3v g![ a! [RS
5 S[S'gf=f![ a/ [RS[U5S35 S[S' gf=f![ a! [RS5 S[S'gf=f![ a [RS%5 gf=f![(aUn S[S'[R+S&U 35 S'[-U 5S(.n S[R
"U 5S 3v Sn A gSn A ff=f7f))z=Generator function that yields SSE-formatted progress updatesrTrNrz&Starting streaming scan of directory: údata: ÚstatuszStarting scan...r)Útyper©Ú
filesFoundú
z+Client disconnected at start, stopping scanFr-r.r4ÚprogresszScanning... found z files)rKÚ batchNumberz-Client disconnected during scan. Stopping at z files.r0c3óV# UHoRSS5(dMSv M! g7fr2r5r7s r*r:Ú0stream_scan.<locals>.generate.<locals>.<genexpr>ÙséÐ%W²¨A¿e¹eÀJÐPU×>V§a¡a²ùr<r=z*Loading suggested matches from database...zLoading saved matches...z*Client disconnected before loading matchesrµr¸Úcomplete)Ú
filesWithPlotrrz-Client disconnected before completion messagezStreaming scan error: rZ)rZ)rBrYryÚdumpsÚ
GeneratorExitrrCrDrIrErFrGrHr6rr]rXrZr!)rJÚ all_filesÚ batch_countrKÚ
progress_datarAr@r¿Úcompletion_datarbÚ
error_datar>s €r*ÚgenerateÚstream_scan.<locals>.generate©søéðg
<à&(”
˜#Ø)-”
˜&Ø*.”
˜!ŸYšY[
ä ÐDÀYÀKÐØ"¤4§:¢:°xÐL^ÐnoÑ.pÓ#qÐ"rÐrvÐ  Ø ô7¸ ÈbÔQØ# qÑ ØÔ%/Ø);¼CÀ »NÐ;KÈ6Ð'RÜ*-¨i«.Ø%*Ø+6ñ )˜
ð!'¤t§z¢z°-Ó'@Ð&AÀÐRô,$'¬¯ ª « °jÑ(@ÀDÑ'HÓ#IÐ ô#&Ñ%W±Ó%WÓ"Wô×'Ü # Ø$3Ø%5ð ô ÐØ"¤4§:¢:°xÐLfÔvyð{DówEñ/Fó$Gð#HðHLðMòMô %'×$JÑ$JÈ9Ó$UÐ&DØ $§¡¨Ó 0 Õ5Ø2CÑ2N˜Ð '0”
˜#Ø).”
˜&Ü*2¯,ª,«.×*BÑ*BÓ*D”
˜;Ñ Ð.¬s°9«~Ð.>¸nÌSÐQbÓMcÐLdÐd}Ðð
à *Ø#'Ü!$ Ø)8Ø$4Ø!*Ø->ñ'#¤4§:¢:¨oÓ#>Ð"?¸Døô_Ü—K‘KÐ MÔNØ-2”J˜zÑðûô0äŸ Ð&SÔTWÐXaÓTbÐScÐcjÐ$kÔlØ16œ
 :Ñð ûô0Ü—K‘KÐ LÔMØ-2”J˜zÑðûô@Ü—K‘KÐ OÔðûôó
<Ø).”
˜:Ñ Ð5°a°SÐ  ›Vñ
ðœtŸzšz¨*Ó6°dÐ;ûð
<üsÛƒM*…ALÁ I Á.LÂ AI9ÃA.LÅ
)J5Å3.LÆ%A5LÈ/K#É
M*É (I6É3LÉ4M*É5I6É6LÉ95J2Ê.LÊ0M*Ê1J2Ê2LÊ5(K ËLËM*ËK Ë LË#LÌLÌM*ÌLÌLÌ
M'ÌA M"ÍM*Í"M'Í'M*útext/event-streamúno-cacheÚnoú
keep-alive©z
Cache-ControlzX-Accel-BufferingÚ
Connection©ÚmimetypeÚheaderszStream scan setup error: r«N) rr6rGrvrr r
rXrYrZr!)rbr>s @r*Ú stream_scanráœø€ðDÜ|‰|ˆØ—HH˜[¬"¯.©.Ð9LÈbÓ*QÓRˆ æÜØ Øóððð
õ
i <ôVÜ ¡£
Ó (à!+Ø%)Øñ
ð
øô óÜ Ð°ÐØÜ˜“Vñ
ó ð
ðõ ûðús$ƒA A3Á"A3Á3
B8Á=0B3Â-B8Â3B8z/api/scan/statuscól[[S[S[[S5[SS.5$)z#Get current scan status and resultsrrr)rrÚ
file_countr)rrIrlrMr*Úget_scan_statusrä&s;ô ܘzÑ  Ñœ* WјGÑó ðrMz/api/scheduled-scanscó\[RRSS[S9n[RRSS5n[R XS9n[
SUS.5$![a;n[RS U35 [
S
[U5S .5S 4sSnA$SnAff=f)
zGet scheduled scansÚlimité2©N)Úscansz Error fetching scheduled scans: Frª) rÚargsr6rErGÚget_scheduled_scansrrXrYrZr!)rbs r*1ð
Ü × Ñ  ¨"´3Ð ÐÜ×! (¨DÓ1ˆÜ×&¨UÐBˆÜØØñ
ó ð øô óÜ Ð°sÐØÜ˜“Vñ
ó ð
ðõ ûðúsA#A&Á&
B+Á00B&Â B+Â&B+cóî[R=(d 0nURS[R SS55nURSS5nU(d[ SSS.5S4$[
U5nU(d[ SS S.5S4$[RX5n[ S
US .5$![a;n[RS U35 [ S[U5S.5S
4sSnA$SnAff=f)zCreate a new scheduled scanr>rÚ
scheduled_forFr±zInvalid scheduled timeT)ÚidzError creating scheduled scan: r«N) rr6rGrvrr+Úcreate_scheduled_scanrXrYrZr!)r>Úscheduled_for_rawrîr_rbs r*DsðÜ|‰|×!˜rˆØ—HH˜[¬"¯.©.Ð9LÈbÓ*QÓRˆ Ø ŸH™H _°bӿܨ Øóððð
ô
+Ð+<Ó=ˆ
ÞÜØ Øóððð
ô
×*¨9ÓÜØØñ
ó ð øô óÜ Ð6°q°cÐØÜ˜“Vñ
ó ð
ðõ ûðús*A'B/Á*!B/Â "B/Â/
C4Â90C/Ã)C4Ã/C4z)/api/scheduled-scans/<int:scan_id>/cancelcóØ[RU5n[SU05$![a;n[R SU35 [S[
U5S.5S4sSnA$SnAff=f)zCancel a scheduled scanr¨z!Error cancelling scheduled scan: FrªN)rGÚcancel_scheduled_scanrrXrYrZr!)r_rbs r*fszð
Ü×*¨7ÓÜØ 
ó ð øô óÜ Ð¸ÐØÜ˜“Vñ
ó ð
ðõ ûðúó‚!$¤
A)®0A$ÁA)Á$A)z/api/suggested-matchescóŽ[RnURS05nUR5H0up#[ U5R
n[ RX$U5 M2 [S[U5S.5$![a;n[RSU35 [S[U5S.5S4sSnA$SnAff=f) z Save suggested matches for filesÚmatchesT)z Error saving suggested matches: FrªN)rr6r„rÚnamerGÚsave_suggested_matchrrIrXrYrZr!)Ú
match_dataÚ file_namerbs r*Úsave_suggested_matchesrûvðÜ|‰|ˆØ—(‘(˜9 bÓà%,§]¡]¦_Ñ !ˆIܘY›×,ˆIÜ × # I¸ &5ôØÜ˜“\ñ
ó ð øô
óÜ Ð°sÐØÜ˜“Vñ
ó ð
ðõ ûðúsA<A?Á?
CÂ 0B?Â9CÂ?Cz'/api/suggested-matches/<path:file_path>ÚDELETEcóØ[RU5n[SU05$![a;n[R SU35 [S[
U5S.5S4sSnA$SnAff=f)z#Delete a suggested match for a filer¨z Error deleting suggested match: FrªN)rGÚdelete_suggested_matchrrXrYrZr!)rbs r*Žszð
Ü×+¨IÓÜØ 
ó ð øô óÜ Ð°sÐØÜ˜“Vñ
ó ð
ðõ ûðúrôcó6[R5n/[S'S[S'S[S'[R S5 [ SU05$![ a;n[RSU35 [ S[U5S .5S
4sSnA$SnAff=f) z0Clear all suggested matches and reset scan staterFrNrz2Cleared all suggested matches and reset scan stater¨z"Error clearing suggested matches: rª) rGÚclear_all_suggested_matchesr¼rYryrrXrZr!©rbs r*rržðä×ð
Ø!&Œ
Ø"&Œ
ä ÐØ 
ó ð øô óÜ Ð9¸!¸ÐØÜ˜“Vñ
ó ð
ðõ ûðús‚AAÁ
BÁ0BÂ
BÂBz/api/maintenance/reset-settingscóP[R=(d 0n[URSS55n[R US9n[
5 [SU05$![a;n[RSU35 [S[U5S.5S4sSnA$SnAff=f) z/Clear all settings, optionally keeping API keysÚ
keep_api_keysF)rzError resetting settings: rªN) rr­r6rGÚclear_settingsr€rrXrYrZr!)rrbs r*Úreset_settingsrºð
Ü|‰|×!˜rˆÜ˜TŸX™X o°uÓ>ˆ
Ü×#°-ÐÜÔÜØ 
ó ð øô óÜ Ð1°!°ÐØÜ˜“Vñ
ó ð
ðõ ûðús‚AA Á
B%Á*0B ÂB%Â B%z/api/maintenance/clear-historycóÖ[R5n[SU05$![a;n[R SU35 [S[
U5S.5S4sSnA$SnAff=f)zHClear processing runs, scan history, scheduled scans, and API usage logsr¨zError clearing history: FrªN)rGÚclear_history_and_logsrrXrYrZr!rs r*Ú
clear_historyrÍsxð
Ü×ÜØ 
ó ð øô óÜ Ð¨sÐØÜ˜“Vñ
ó ð
ðõ ûðús‚ #£
A(­0A#ÁA(Á#A(z/api/maintenance/clear-cachescó [R5n/[S'S[S'S[S'[SU05$![a;n[
R
SU35 [S[U5S.5S 4sSnA$SnAff=f)
z=Clear cached data like suggested matches and reset scan staterFrNrzError clearing caches: rª)rGrrrXrYrZr!rs r*Ú clear_cachesr
Ýs–ðÜ×à Œ
Ø!&Œ
Ø"&Œ
ÜØ 
ó ð øô óÜ Ð.¨q¨cÐØÜ˜“Vñ
ó ð
ðõ ûðús;>¾
BÁ0A>Á8BÁ>Bz /api/searchcóÂ^[RnURSS5R5nURSS5nU(d[ SSS.5S4$[
(d[ (d[ SS S.5S4$/n[
(aMS
S KmS
S KnU4S jnU4S
jnUS:XaUR"U"U55nOUR"U"U55n[ SUS.5$![a"n[RSU35 S nAN5S nAff=f![a;n[RSU35 [ S[U5S.5S4sS nA$S nAff=f)záSearch for title matches from OMDb/TMDb
Query params:
query: The search query (required)
mode: "quick" (default) for single best match (1 API call),
"full" for multiple results to choose from (2 API calls)
ÚqueryrÚmodeÚquickFzNo search query providedrªzAPI not configuredrNc óR># [R"5n[RUSSS.nTR5IShvN nUR [R
US9IShvN n[
[R"5U-
S-5nURS:XUR5IShvN nUR S5S :X[RS
S U3S US
S9 UR S5UR S5UR SS5UR SS5UR SS5UR S5UR S5UR S5S./sSSS5IShvN sSSS5IShvN $[RS
S U3SUS
S9 /sSSS5IShvN sSSS5IShvN $GGNjGN!N]NNN#N!,IShvN (df  O=fSSS5IShvN g!,IShvN (df  g=f7f)z-Quick search - single best match (1 API call)ÚmovieÚshort)ÚapikeyÚtrÆÚplotN©Úparamsr0éÈr ÚTruertz /title?t=Tr4©ÚproviderÚendpointr¨Úresponse_time_msÚ
call_countÚTitleÚYearÚPlotúNo plot availableÚRuntimeúN/AÚ
imdbRatingÚTypeÚPosterÚimdbID©ÚtitleÚyearrÚruntimeÚ imdb_ratingÚ
media_typeÚposterÚimdb_idF) rBrxrpÚ
ClientSessionr6ÚBASE_URLrErGÚtrack_api_call)r)rJrÚsessionÚresprÚaiohttps €r*Úomdb_quick_searchÚ'search_title.<locals>.omdb_quick_searchøéä!%§¢£#.×"5Ñ"5Ø"Ø 'Ø 'ñ  '×4×6¸'Ø#*§;¡;¬{×/CÑ/CÈF ;×#SÑ#SÐW[Ü/2´D·I²I³KÀ*Ñ4LÐPTÑ3TÓ/UÐ#Ÿ{™{¨cÓ1Ø-1¯Y©Y«[×'8 Ø#'§8¡8¨JÓ#7¸6Ó#AÜ$&×$5Ñ$5Ø17Ø3<¸U¸GÐ1DØ04Ø9IØ34ð %6ñ%&ð26·±¸'Ó1BØ04·±¸Ó0@Ø04·±¸ÐATÓ0UØ37·8±8¸IÀuÓ3MØ7;·x±xÀ ÈeÓ7TØ6:·h±h¸vÓ6FØ26·(±(¸8Ó2DØ37·8±8¸HÓ3Eñ -&ð ,'÷$T×#SÐ#S÷ 7×6ô2×-Ø)/Ø+4°U°GÐ)<Ø(-Ø1AØ+,ð ð$&÷?$T×#SÐ#S÷ 7×6Ú#Sò(9ñ $Tñ 7Ù#Sñ 7ß#S×#SÖ#Sú÷ 7×6×6×6×6üsëƒ?H'ÁGÁH'Á#H
Á)GÁ*H
Á-AG!Â5GÂ6B9G!Å/ H
Å;GÅ<H
Æ H'Æ GÆ
H'ÆG!Æ- H
Æ9GÆ:H
Æ> H'Ç
GÇ H'ÇH
ÇG!ÇH
ÇH'ÇH
ÇH'Ç!G8 Ç'G*Ç( G8 Ç4H
Ç; H'ÈH ÈH'È
H$ÈH È H$È H'có># [R"5nSn[RUSS.nTR5IShvN nUR [R
US9IShvN nUS-
nUR S:wa$/sSSS5IShvN sSSS5IShvN $UR5IShvN nUR S5S :wab[[R"5U-
S
-5n[RS S U3S
USS9 /sSSS5IShvN sSSS5IShvN $UR S/5SSnU(d$/sSSS5IShvN sSSS5IShvN $USn [RU R S5SS.n
/n UR [R
U
S9IShvN n US-
nU R S:XU R5IShvN n
U
R S5S :Xa•U RU
R S5U
R S5U
R SS5U
R SS5U
R SS5U
R S5U
R S5U
R S5S.5 SSS5IShvN USSHhnU RUR S5UR S5SSSUR S5UR S5UR S5S.5 Mj [[R"5U-
S
-5n[RS S U3SUUS9 U sSSS5IShvN sSSS5IShvN $GN?GNGGGGNqGNcGN7GN)GGNø!,IShvN (df  GN=fNTNE!,IShvN (df  O=fSSS5IShvN g!,IShvN (df  g=f7f)z9Full search - multiple results with details (2 API calls)rr)rÚsrÆNrr4rr rr0rtz
/search?s=FrÚSearchrPr'r)rÚirrrr r!r"r#r$r%r&r(T) rBrxrpr0r6r1rErGr2Úappend)r)rJÚ api_callsÚ
search_paramsr3r4rÚsearch_resultsÚtop_itemÚ