2024-08-13 19:21:48 -04:00
|
|
|
#!/usr/bin/env python3.12
|
2025-01-11 20:59:10 -05:00
|
|
|
# pylint: disable=bare-except, broad-exception-raised
|
2024-08-13 19:21:48 -04:00
|
|
|
|
|
|
|
"""Global State Storage/Counters"""
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
import aiosqlite as sqlite3
|
|
|
|
|
|
|
|
from fastapi import FastAPI
|
|
|
|
from fastapi_utils.tasks import repeat_every
|
|
|
|
|
|
|
|
|
|
|
|
class State(FastAPI):
|
2025-01-11 20:59:10 -05:00
|
|
|
"""Global State for API"""
|
|
|
|
def __init__(self, app: FastAPI, util, constants): # pylint: disable=unused-argument
|
|
|
|
super().__init__()
|
2024-08-13 19:21:48 -04:00
|
|
|
self.counter_db_path = os.path.join("/", "var", "lib", "singerdbs", "stats.db")
|
|
|
|
self.counters = {
|
|
|
|
str(counter): 0 for counter in constants.AVAILABLE_COUNTERS
|
|
|
|
}
|
|
|
|
self.counters_initialized = False
|
|
|
|
logging.debug("[State] Counters: %s", self.counters)
|
|
|
|
|
|
|
|
@app.on_event("startup")
|
|
|
|
async def get_counters():
|
|
|
|
logging.info("[State] Initializing counters...")
|
|
|
|
async with sqlite3.connect(self.counter_db_path, timeout=2) as _db:
|
|
|
|
_query = "SELECT ai_requests, lyric_requests, transcript_list_requests, transcript_requests, lyrichistory_requests, \
|
|
|
|
failedlyric_requests, misc_failures, claude_ai_requests FROM counters LIMIT 1"
|
2024-09-04 20:30:11 -04:00
|
|
|
await _db.executescript("pragma journal_mode = WAL; pragma synchronous = normal; pragma temp_store = memory; pragma mmap_size = 30000000000;")
|
2024-08-13 19:21:48 -04:00
|
|
|
async with _db.execute(_query) as _cursor:
|
|
|
|
_result = await _cursor.fetchone()
|
|
|
|
(ai_requests,
|
|
|
|
lyric_requests,
|
|
|
|
transcript_list_requests,
|
|
|
|
transcript_requests,
|
|
|
|
lyrichistory_requests,
|
|
|
|
failedlyric_requests,
|
|
|
|
misc_failures,
|
|
|
|
claude_ai_requests) = _result
|
|
|
|
self.counters = {
|
|
|
|
'ai_requests': ai_requests,
|
|
|
|
'lyric_requests': lyric_requests,
|
|
|
|
'transcript_list_requests': transcript_list_requests,
|
|
|
|
'transcript_requests': transcript_requests,
|
|
|
|
'lyrichistory_requests': lyrichistory_requests,
|
|
|
|
'failedlyric_requests': failedlyric_requests,
|
|
|
|
'misc_failures': misc_failures,
|
|
|
|
'claude_ai_requests': claude_ai_requests
|
|
|
|
}
|
|
|
|
self.counters_initialized = True
|
|
|
|
logging.info("Counters loaded from db: %s", self.counters)
|
|
|
|
|
|
|
|
|
|
|
|
@app.on_event("startup")
|
|
|
|
@repeat_every(seconds=10)
|
|
|
|
async def update_db():
|
2025-01-11 20:59:10 -05:00
|
|
|
if not self.counters_initialized:
|
2024-08-13 19:21:48 -04:00
|
|
|
logging.debug("[State] TICK: Counters not yet initialized")
|
|
|
|
return
|
|
|
|
|
|
|
|
ai_requests = self.counters.get('ai_requests')
|
|
|
|
lyric_requests = self.counters.get('lyric_requests')
|
|
|
|
transcript_list_requests = self.counters.get('transcript_list_requests')
|
|
|
|
transcript_requests = self.counters.get('transcript_requests')
|
|
|
|
lyrichistory_requests = self.counters.get('lyrichistory_requests')
|
|
|
|
failedlyric_requests = self.counters.get('failedlyric_requests')
|
|
|
|
claude_ai_requests = self.counters.get('claude_ai_requests')
|
|
|
|
|
|
|
|
async with sqlite3.connect(self.counter_db_path, timeout=2) as _db:
|
|
|
|
_query = "UPDATE counters SET ai_requests = ?, lyric_requests = ?, transcript_list_requests = ?, \
|
|
|
|
transcript_requests = ?, lyrichistory_requests = ?, failedlyric_requests = ?, \
|
|
|
|
claude_ai_requests = ?"
|
|
|
|
|
|
|
|
_params = (ai_requests,
|
|
|
|
lyric_requests,
|
|
|
|
transcript_list_requests,
|
|
|
|
transcript_requests,
|
|
|
|
lyrichistory_requests,
|
|
|
|
failedlyric_requests,
|
|
|
|
claude_ai_requests)
|
2024-09-04 20:30:11 -04:00
|
|
|
|
|
|
|
await _db.executescript("pragma journal_mode = WAL; pragma synchronous = normal; pragma temp_store = memory; pragma mmap_size = 30000000000;")
|
2024-08-13 19:21:48 -04:00
|
|
|
async with _db.execute(_query, _params) as _cursor:
|
|
|
|
if _cursor.rowcount != 1:
|
|
|
|
logging.error("Failed to update DB")
|
|
|
|
return
|
|
|
|
await _db.commit()
|
|
|
|
logging.debug("[State] Updated DB")
|
|
|
|
|
2025-01-14 18:37:49 -05:00
|
|
|
|
2024-08-13 19:21:48 -04:00
|
|
|
async def increment_counter(self, counter: str):
|
2025-01-11 20:59:10 -05:00
|
|
|
"""Increment Counter"""
|
|
|
|
if not counter in self.counters.keys():
|
|
|
|
raise BaseException(f"[State] Counter {counter} does not exist")
|
2024-08-13 19:21:48 -04:00
|
|
|
|
|
|
|
self.counters[counter] += 1
|
|
|
|
return True
|
|
|
|
|
|
|
|
async def get_counter(self, counter: str):
|
2025-01-11 20:59:10 -05:00
|
|
|
"""Get Counter"""
|
|
|
|
if not counter in self.counters.keys():
|
|
|
|
raise BaseException(f"[State] Counter {counter} does not exist")
|
2024-08-13 19:21:48 -04:00
|
|
|
|
|
|
|
return self.counters[counter]
|
|
|
|
|
|
|
|
async def get_all_counters(self):
|
2025-01-11 20:59:10 -05:00
|
|
|
"""Get All Counters"""
|
|
|
|
return self.counters
|