initial commit

This commit is contained in:
2025-07-20 00:51:55 +03:00
commit 42684e0cb6
29 changed files with 2615 additions and 0 deletions
+95
View File
@@ -0,0 +1,95 @@
import asyncio
import logging
from datetime import datetime
from pathlib import Path
import aiofiles
import orjson
import config
import movies.tmdb as tmdb
import movies.yandex_disk as yandex_disk
from movies.classes import Movie, TVShow
from singleton import Singleton
class MoviesDB(metaclass=Singleton):
def __init__(self, db_path: Path | str):
self.path = Path(db_path).resolve()
self.contents = []
self.by_tmdb_id: dict[int, Movie | TVShow] = {}
self.by_title: dict[str, Movie | TVShow] = {}
self.last_updated = None
def _assign_content(self):
self.by_tmdb_id = {}
self.by_title = {}
for content in self.contents:
tmdb_id = content.tmdb_id
self.by_tmdb_id[tmdb_id] = content
title, og_title = content.title, content.og_title
title = title if title else ""
og_title = og_title if og_title else ""
full_title = title + og_title
if full_title:
self.by_title[full_title] = content
async def auto_update(self):
while True:
await asyncio.sleep(config.MOVIES_DB_UPDATE_INTERVAL_SECONDS)
await self.update()
async def update(self):
logging.info("Updating Movies DB")
raw_contents = await yandex_disk.get_all_contents()
self.contents = await tmdb.fetch_all_data(raw_contents)
self.last_updated = datetime.now()
await self.save_to_disk()
self._assign_content()
logging.info("Finished updating Movies DB")
async def save_to_disk(self):
logging.info("Saving Movies DB to disk")
to_save = await asyncio.to_thread(orjson.dumps, {
"last_updated": self.last_updated,
"contents": self.contents
})
async with aiofiles.open(self.path, "wb") as file:
await file.write(to_save)
logging.info("Finished Saving Movies DB to disk")
async def load_from_disk(self):
if not self.path.exists():
return
logging.info("Loading Movies DB from disk")
async with aiofiles.open(self.path, "rb") as file:
file_content = await file.read()
if len(file_content) == 0:
return
loaded_db = await asyncio.to_thread(orjson.loads, file_content)
self.last_updated = loaded_db.get("last_updated", None)
contents = loaded_db.get("contents", [])
new_contents = []
for content in contents:
match content["type"]:
case "movie":
new_contents.append(Movie(**content))
case "tv":
new_contents.append(TVShow(**content))
case _:
continue
self.contents = new_contents
self._assign_content()
logging.info("Finished Loading Movies DB from disk")