Files
Local-Booru/system_module/db.py
T
Hell13Cat ed7bc4fba5 0.0.4s
2026-05-26 23:20:03 +03:00

92 lines
2.8 KiB
Python

from tinydb import TinyDB, Query
import os
import json
from collections import Counter
import gelbooru
from datetime import datetime
class DB:
def __init__(self):
db_path = "datas"
if not os.path.exists(db_path):
os.makedirs(os.path.dirname(db_path), exist_ok=True)
json.dump({}, open(db_path+"/db.json", "w", encoding="utf-8"))
self.db = TinyDB(db_path+"/db.json")
self.File = Query()
def add(self, data_add):
self.db.insert(data_add)
def add_raw(self, data_add):
is_video = False
is_gif = False
if data_add["image"].split(".")[-1] in ["webm", "mp4", "avi"]:
is_video = True
if data_add["image"].split(".")[-1] == "gif":
is_gif = True
add_data = {
"md5": data_add["md5"],
"local_filename": data_add["image"],
"is_video": is_video,
"is_gif": is_gif,
"tags": data_add["tags"].split(" "),
"rating": data_add["rating"],
"score": data_add["score"],
"timestamp": data_add["created_at"],
"display_date": gelbooru.gelbooru_date_parse(data_add["created_at"]),
"source": data_add["source"],
"width": data_add["width"],
"height": data_add["height"]
}
self.db.insert(add_data)
pass
def get_all(self):
sorted_records = sorted(
self.db.all(),
key=lambda x: datetime.strptime(
x["timestamp"],
"%a %b %d %H:%M:%S %z %Y"
),
reverse=True
)
return sorted_records
def get_search(self, ratings, tags):
ratings
results = self.db.search(
self.File.rating.one_of(self.ratings) &
self.File.tags.any(self.tags)
)
sorted_records = sorted(
results,
key=lambda x: datetime.strptime(
x["timestamp"],
"%a %b %d %H:%M:%S %z %Y"
),
reverse=True
)
return sorted_records
def get_unknow(self):
results = self.db.search(self.File.tags == [])
return results
def get_autocomplete(self, tag_slise):
counter = Counter()
for record in self.db.all():
counter.update(record.get("tags", []))
results = [
{
"tag": tag,
"count": count
}
for tag, count in counter.items()
if tag.lower().startswith(tag_slise)
]
results.sort(key=lambda x: x["count"], reverse=True)
top_10 = results[:10]
return top_10
def edit_data(self, id_file, edit_data):
self.db.update(self.edit_data, self.File.md5 == self.id_file)