Files
sublogue/server/core/__pycache__/database.cpython-313.pyc
T

165 lines
44 KiB
Plaintext
Raw Normal View History

2026-01-17 21:49:22 +13:00
ó
¿ÄjiÐzãó\SrSSKJr SSKJr SSKJrJrJrJrJ r J
r
J r J r J
r
SSKJr SSKJrJrJr SSKrSSKr\R,"\5r\"5r"SS \5r"S
S \5r"S S
\5r"SS\5r"SS\5r"SS\5r"SS\5r "SS5r!g)zh
Database layer using SQLAlchemy with SQLite
Handles persistent storage for settings, runs, and history
é)Údatetime)ÚPath) Ú
create_engineÚColumnÚIntegerÚStringÚDateTimeÚBooleanÚFloatÚTextÚ
ForeignKey)Údeclarative_base)Ú sessionmakerÚ relationshipÚscoped_sessionNcó”\rSrSrSrSr\"\SS9r\"\ "S5SSSS9r
\"\ SS 9r \"\
\R\RS
9rS rS rg
)ÚSettingséz1Settings table - stores application configurationÚsettingsT©Ú primary_keyédF)ÚuniqueÚnullableÚindex©r©ÚdefaultÚonupdatecó<SURSURS3$)Nz<Settings(key='z
', value='ú')>©ÚkeyÚvalue©Úselfs Ú1c:\Users\Matt\subtitleapp\server\core\database.pyÚ__repr__ÚSettings.__repr__sØ  §¡ 
¨*°T·Z±Z°LÀЩN)Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__Ú__doc__Ú
__tablename__rrÚidrr#r r$r rÚutcnowÚ
updated_atr(Ú__static_attributes__r+r*r'rrsRÙ€Má  TÑ *€BÙ
˜ T°EÀÑ
F€CÙ 4 %Ñ (€EÙ˜¨(¯/©/ÀHÇOÁOÑT€JõEr*rcóÊ\rSrSrSrSr\"\SS9r\"\ \
RSSS9r \"\ 5r
\"\SS 9r\"\SS 9r\"\SS 9r\"\5r\"\"S
5S S 9r\"S S
SS9rSrSrg)Ú
ProcessingRunéz<Processing runs table - stores each batch processing sessionÚprocessing_runsTrrrrr©ré2Ú in_progressÚ
FileResultÚrunzall, delete-orphan)Úback_populatesÚcascadecóVSURSURSURS3$)Nz<ProcessingRun(id=z, started_at='ú ', status='r!)r2Ú
started_atÚstatusr%s r'r(ÚProcessingRun.__repr__/s/Ø# D§G¡G 9¨N¸4¿?¹?Ð:KÈ;ÐW[×WbÑWbÐVcÐcfÐgr*r+N)r,r-r.r/r0r1rrr2r rr3rDÚ completed_atÚ total_filesÚsuccessful_filesÚ failed_filesr Úduration_secondsrrErÚ file_resultsr(r5r+r*r'r7r7sÙ%€Má  TÑ *€BÙ˜¨(¯/©/ÀEÐQUÑV€JÙ˜(Ó#€LÙ˜¨!Ñ,€KÙ˜g¨qÑÙ˜'¨1Ñ-€LÙ˜e“}ÐÙ
F˜2“J¨
Ñ
6€Fñ   ¸UÐL`Ña€Lõhr*r7có\rSrSrSrSr\"\SS9r\"\\ "S5SSS9r
\"\ "S 5SSS9r \"\ "S
5SS 9r
\"\SS 9r\"\ "S
55r\"\5r\"\5r\"\\R,SS9r\"\5r\"SSS9rSrSrg)r>é3z>File results table - stores individual file processing resultsrLTrzprocessing_runs.idF©rréôéÿrr;r©rrr7)r@cóVSURSURSURS3$)Nz<FileResult(id=ú
, file_name='z ', success=ú)>)r2Ú file_nameÚsuccessr%s r'r(ÚFileResult.__repr__Es/Ø  §¡  ¨°t·~±~Ð6FÀkÐRV×R^ÑR^ÐQ_Ð_aÐbr*r+N)r,r-r.r/r0r1rrr2r
Úrun_idrÚ file_pathrVr
rWrEr ÚsummaryÚ
error_messager rr3Ú processed_atÚdurationrr?r(r5r+r*r'r>r>3Ù"€Má  TÑ *€BÙ
G™ZÐ(<ÓÐUYÑ
Z€FÙ‘v˜c“{¨U¸$Ñ?€IÙ‘v˜c“{¨UÑ3€IÙW ,€GÙ
F˜3“KÓ
€FÙT‹l€GÙ˜4“L€MÙ˜(¨H¯O©OÀeÑL€LÙg‹€Hñ °~Ñ
F€Cõcr*r>cóž\rSrSrSrSr\"\SS9r\"\ "S5SSS9r
\"\ \ RSSS 9r\"\S
S 9r\"\S
S 9r\"\5rS rS
rg)Ú ScanHistoryéIz2Scan history table - stores directory scan historyÚ scan_historyTrrPFrOr:rr;cóVSURSURSURS3$)Nz<ScanHistory(id=ú
, directory='z', files_found=rU)r2Ú directoryÚ files_foundr%s r'r(ÚScanHistory.__repr__Ts/Ø! $§'¡' ¨-¸¿¹Ð7GÀÐW[×WgÑWgÐVhÐhjÐkr*r+N)r,r-r.r/r0r1rrr2rrer rr3Ú
scanned_atrfÚfiles_with_plotÚscan_duration_msr(r5r+r*r'r`r`IseÙ"€Má  TÑ *€BÙv˜c“{¨U¸$Ñ?€IÙ˜¨(¯/©/ÀEÐQUÑV€JÙ˜¨!Ñ,€KÙ˜W¨aÑ0€OÙ˜g“Ðõlr*r`cóø\rSrSrSrSr\"\SS9r\"\ "S5SSS9r
\"\ SSS9r \"\ \
RSS 9r\"\ 5r\"\ 5r\"\ "S
5S SS 9r\"\S
S9r\"\S
S9r\"\5r\"\5rSrSrg)Ú
ScheduledScanéXz>Scheduled scans table - stores scheduled scan jobs and resultsÚscheduled_scansTrrPFrOrRr<Ú scheduled)rrrr;cóVSURSURSURS3$)Nz<ScheduledScan(id=rdrCr!)r2rerEr%s r'r(ÚScheduledScan.__repr__hs/Ø# D§G¡G 9¨M¸$¿.¹.Ð9IÈÐUY×U`ÑU`ÐTaÐadÐer*r+N)r,r-r.r/r0r1rrr2rrer Ú
scheduled_forrr3Ú
created_atrDrGrErfrirjr r\r(r5r+r*r'rlrlXÙ%€Má  TÑ *€BÙ‘v˜c“{¨U¸$Ñ?€IÙ˜8¨e¸4Ñ@€MÙ˜¨(¯/©/ÀEÑJ€JÙ˜Ó!€JÙ˜(Ó#€LÙ
F˜2“J¨ ¸
@€FÙ˜¨!Ñ,€KÙ˜W¨aÑ0€OÙ˜g“ÐÙ˜4“L€Mõfr*rlcóº\rSrSrSrSr\"\SS9r\"\ "S5SSS9r
\"\ "S 55r \"\ \
RSSS
9r\"\SS 9r\"\5r\"\S S 9rS
rSrg)ÚApiUsageélz=API usage tracking table - monitors API calls per integrationÚ api_usageTrr<FrOéÈr:r;éc ópSURSURSURSURS3 $)Nz
<ApiUsage(id=z , provider='z ', calls=z
, timestamp='r!)r2ÚproviderÚ
call_countÚ timestampr%s r'r(ÚApiUsage.__repr__xs:ؘtŸw™w˜i |°D·M±M°?À)ÈDÏOÉOÐK\Ð\iÐjn×jxÑjxÐiyÐy|Ð}r*r+N)r,r-r.r/r0r1rrr2rr{Úendpointr rr3r}r
rWÚresponse_time_msr|r(r5r+r*r'rurulssÙ€Má  TÑ *€BÙ‘f˜R“j¨5¸Ñ=€HÙf˜S“kÓ"€HÙ¯©À5ÐPTÑU€IÙW dÑ+€GÙ˜g“ÐÙ˜¨Ñ+€Jõ~r*rucó&\rSrSrSrSr\"\SS9r\"\ "S5SSSS9r
\"\ "S 5SS
9r \"\ "S 5SS
9r \"\ "S 55r
\"\ "S 55r\"\5r\"\\R&SS
9r\"\\R&\R&S9rSrSrg)ÚSuggestedMatché|z>Suggested matches table - stores auto-matched titles for filesÚsuggested_matchesTrrPF)rrrrQré
r<rRrcóVSURSURSURS3$)Nz<SuggestedMatch(id=rTz', matched_title='r!)r2rVÚ
matched_titler%s r'r(ÚSuggestedMatch.__repr__Šs0Ø$ T§W¡W I¨]¸4¿>¹>Ð:JÐJ\Ð]a×]oÑ]oÐ\pÐpsÐtr*r+N)r,r-r.r/r0r1rrr2rrZrVr‡Ú matched_yearÚmatched_imdb_idr Ú
match_datar rr3rsr4r(r5r+r*r'rr|sÙ'€Má  TÑ *€BÙv˜c“{¨U¸4ÀtÑL€IÙ‘v˜c“{¨UÑ3€IÙ™6 #Ñ7€MÙ™& %€LÙ™V B›ZÓ(€OÙ˜€JÙ˜¨(¯/©/ÀEÑJ€JÙ˜¨(¯/©/ÀHÇOÁOÑT€Jõur*rcó\rSrSrSrS(SjrSrSrS)SjrSr S r
S
r S r S r
S*S
jrS+SjrSrSrS+SjrSrS,SjrSrSrS)SjrS)SjrS)SjrSrS-SjrSrS.SjrSrSrSr S r!S!r"S"r#S#r$S/S$jr%S%r&S&r'S'r(g)0ÚDatabaseManageréŽz+Manages database connections and operationscó4[U5Ul[SUR3SS9Ul[ [ URS95Ul[RRUR5 [RSUR35 g)zInitialize database connectionz
sqlite:///F)Úecho)ÚbindzDatabase initialized at N) rÚdb_pathrÚenginerrÚSessionÚBaseÚmetadataÚ
create_allÚloggerÚinfo)r&rs r'Ú__init__ÚDatabaseManager.__init__skä˜G“}ˆŒ Ü# j°·±°Ð$?ÀeÑŒ Ü%¤l¸¿ ¹ Ñ&DÓEˆŒ ô
× Ñ  §¡Ô Ð.¨t¯|©|¨nÐ>r*có"UR5$)zGet a new database session)r”r%s r'Ú get_sessionÚDatabaseManager.get_sessionsà|‰|r*có8URR5 g)zClose the sessionN)r”Úremover%s r'Ú
close_sessionÚDatabaseManager.close_sessionŸsà ×ÑÕr*Ncó®UR5nUR[5RUS9R 5nU(a1[
R "UR5UR5 $UUR5 $![
Ra URsUR5 $f=f!UR5 f=f)zGet a setting value©r#)
rÚqueryrÚ filter_byÚfirstÚjsonÚloadsr$ÚcloseÚJSONDecodeError)r&r#rÚsessionÚsettings r'Ú get_settingÚDatabaseManager.get_setting¥à×$ˆð Ø—mm¤HÓ7¸CÐHˆGÞðŸ:š: g§m¡mÓ
M‰Mà M‰MOøô ×"Ÿ=™=Ñ
M‰M)ûð
M‰MOús/7CÁ
B Á:CÂ B?Â,CÂ>B?Â?CÃCcóvUR5nUR[5RUS9R 5n[ U[ 5(d[R"U5OUnU(a!XTl [R"5Ul O[XS9nURU5 UR5 [R!SU35 UR)5 g!["a.nUR%5 [R'SU35 eSnAff=f!UR)5 f=f)zSet a setting valuer¤r"zSetting updated: zError setting value: N)rrÚ
isinstanceÚstrr¨Údumpsr$rr3r4ÚaddÚcommitr˜r™Ú ExceptionÚrollbackÚerrorrª)r&r#r$r­Ú
json_valueÚes r'Ú set_settingÚDatabaseManager.set_setting³à×$ˆð Ø—mm¤HÓ7¸CÐ@×Hˆ3=¸UÄC×2HÑ2HœŸš *ÈeˆJæØ *”
Ü%-§_¢_Ó%6Õ" =Ø ˜ N‰NÔ Ü K‰KÐ+¨C¨5Ð
M‰MOøô ó Ø × Ñ Ô Ü L‰LаРûð ûð
M‰MOús$CC+Ã+
D#Ã5)DÄD#Ä#D&Ä&D8cóŽUR5nUR[5R5n0nUH0n[R
"UR 5X4R'M2 UUR5 $![Ra UR X4R'Muf=f!UR5 f=f)z Get all settings as a dictionary)
rrÚallr¨r$r#)r&rÚresultr­s r'Úget_all_settingsÚ DatabaseManager.get_all_settingsÌà×$ˆð
Ø—}‘}¤XÓ4ˆH؈FÛ#ð8Ü*.¯*ª*°W·]±]Ó*CFŸ;™;Ó
à M‰MOøô ×8Ø*1¯-©-FŸ;™;Ô8ûð
M‰MOús.*B2½,A?Á)B2Á?,B/Â+B2Â.B/Â/B2Â2CcóXUR5Hup#URX#5 M g)z Update multiple settings at onceN)Úitemsr»)r&Ú
settings_dictr#r$s r'Úupdate_settingsÚDatabaseManager.update_settingsÛs%à'×/‰JˆCØ × Ñ ˜ 0r*có†UR5n[USS9nURU5 UR5 URn[
R
SU35 UUR5 $![a.nUR5 [
RSU35 eSnAff=f!UR5 f=f)zCreate a new processing runr=)rHrEzCreated processing run zError creating run: N) rr7r´r2r˜r™r¸)r&rHr?rYs r'Ú
create_runÚDatabaseManager.create_runâà×$ˆð ÜØˆ
K‰K˜Ô Ø N‰NÔ Ø—V‘VˆFÜ K‰KÐ1°&°Ð ð
M‰MOøô ó Ø × Ñ Ô Ü L‰LШsÐ ûð ûð
M‰MOús$AA3Á3
B+Á=)B&Â&B+Â+B.Â.CcóbUR5nUR[5RU5nU(a“[R
"5UlX%lX5lSUl UR(a-UR UR-
R5nXel UR5 [RSU35 UR'5 g![ a.nUR#5 [R%SU35 eSnAff=f!UR'5 f=f)zMark a run as completedÚ completedzCompleted run zError completing run: N)rr7Úgetrr3rGrIrJrErDÚ
total_secondsrKr˜r™r¸)r&rYrIrJr?r^s r'Ú complete_runÚDatabaseManager.complete_runöà×$ˆð Ø—-
Ó2°6Ó:ˆCÞÜ#+§?¢?Ó#4Ô Ø'7Ô$Ø#/Ô Ø(
à—>—>Ø #× 0Ñ 0°3·>±>Ñ A×RHØ+3ÔÔ Ü ˜n¨V¨HÐ
M‰MOøô ó Ø × Ñ Ô Ü L‰LÐ1°!°Ð ûð ûð
M‰MOús$B>C!Ã!
DÃ+)DÄDÄDÄD.c ópUR5n[UU[U5RUUUUUS9n UR U 5 UR 5 UR5 g![ a.n
UR5 [RSU
35 eSn
A
ff=f!UR5 f=f)zAdd a file processing result)rYrZrVrWrEr[r\r^zError adding file result: N) rr>rÚnamer´r˜r¸) r&rYrZrWrEr[r\r^r¿s r'Úadd_file_resultÚDatabaseManager.add_file_resultà×$ˆð ÜØØ˜y›/×ØØØ ˆFð
K‰K˜Ô Ø N‰NÕ ð
M‰MOøô ó Ø × Ñ Ô Ü L‰LÐ5°a°SÐ ûð ûð
M‰MOús$AA(Á(
B Á2)BÂB Â B#Â#B5c óšUR5nUR[5R[RR 55R
U5R5n/nUnURURUR(aURR5OSUR(aURR5OSURURURURUR S.5 UUR#5 $!UR#5 f=f)zGet processing run historyN)r2rDrGrHrIrJrKrE)rr7Úorder_byrDÚdescÚlimitr¾Úappendr2Ú isoformatrGrHrIrJrKrE)r&r×Úrunsr¿r?s r'Úget_run_historyÚDatabaseManager.get_run_history%à×$ˆð Ø—=‘=¤Ó×ç‰eE‹lŸ3™3›5ð
ðˆØ
ØŸ&™&Ø@CÇÇ #§.¡.×":Ñ":Ô"<ÐTXØDG×DT×DT C×$4Ñ$4×$>Ñ$>Ô$@ÐZ^Ø#&§?¡?Ø(+×(<Ñ(<Ø$'×$4Ñ$4Ø(+×(<Ñ(<Ø!Ÿj™jñ ö ñðà M‰MOøˆGM‰MOús DD8Ä8E
c
ózUR5nUR[5RU5nU(dUR 5 g/nUR
H™nUR
URURURURURURURUR(aURR5OSUR S. 5 M URUR"(aUR"R5OSUR$(aUR$R5OSUR&UR(UR*UR,URUS. UR 5 $!UR 5 f=f)z-Get detailed information about a specific runN) r2rZrVrWrEr[r\r]r^) r2rDrGrHrIrJrKrErL)rr7rLr2rZrVrWrEr[r\r]r^rDrGrHrIrJrK)r&rYr?rLr¿s r'Úget_run_detailsÚDatabaseManager.get_run_details=sIà×$ˆð Ø—-
Ó2°6Ó:ˆCÞØð8
M‰MOð5ˆLØ×*Ø× Ÿ)™)Ø!'×!1Ñ!1Ø!'×!1Ñ!1Ø%Ÿ~™~Ø$Ÿm™mØ%Ÿ~™~Ø%+×%9Ñ%9ØGM×GZ×GZ F×$7Ñ$7×$AÑ$AÔ$CÐ`dØ &§¡ñ
%ö
ñ—ffØ<?¿N¿N˜cŸn™n×8ÐPTØ@C×@P×@P × 0Ñ 0× :Ñ :Ô <ÐVZØØ$'×$8Ñ$8Ø #× 0Ñ 0Ø$'×$8Ñ$8ØŸ*™*Ø ,ñ
ð
M‰MOøˆGM‰MOús+F(ÁEF(Æ(F:córUR5n[UUUUS9nURU5 UR5 [R SU35 UR5 g![ a.nUR5 [RSU35 eSnAff=f!UR5 f=f)zAdd a scan history entry)rerfrirjzScan history saved for zError saving scan history: N)
rr`r´r˜r™r¸)r&rerfrirjÚscanrºs r'Úadd_scan_historyÚ DatabaseManager.add_scan_historycà×$ˆð ÜØ'Ø /Ø!1ñ ˆ
K‰K˜Ô Ø N‰NÔ Ü K‰KÐ1°)°Ð
M‰MOøô ó Ø × Ñ Ô Ü L‰LÐ6°q°cÐ ûð ûð
M‰MOús$AA)Á)
B!Á3)BÂB!Â!B$Â$B6c
ó,UR5nUR[5R[RR 55R
U5R5n/nUHxnURURURUR(aURR5OSURURURS.5 Mz UUR5 $!UR5 f=f)zGet scan historyN)r2rerhrfrirj)rr`rhr×r2rerfrirj)r&r×Úscansr¿s r'Úget_scan_historyÚ DatabaseManager.get_scan_historywà×$ˆð Ø—MM¤+Ó.××&×ç‰eE‹lŸ3™3›5ð
ðˆØ
ØŸ'™'Ø!%§¡ØAEÇÇ $§/¡/×";Ñ";Ô"=ÐVZØ#'×#3Ñ#3Ø'+×';Ñ';Ø(,×(=Ñ(=ñ
öñðà M‰MOøˆGM‰MOús CDÄDcóTUR5n[UUSS9nURU5 UR5 URUR 5 $![ a.nUR5 [RSU35 eSnAff=f!UR 5 f=f)zCreate a scheduled scan entryro)rerrrEzError creating scheduled scan: N)
rrlr´r2r˜r¸)r&rerrros r'Úcreate_scheduled_scanÚ%DatabaseManager.create_scheduled_scans“à×$ˆð ܈