Files
vaiola/shell/Handlers/CivitHandler.py
2025-10-16 18:42:32 +07:00

143 lines
4.7 KiB
Python

import json
import os.path
from modules.civit.Civit import Civit
from modules.civit.datamodel import Creator, Tag, Model
from modules.civit.fetch import Fetch
from modules.shared.DatabaseSqlite import SQLiteDatabase
from shell.Handlers.ABS import Handler
from modules.civit.client import Client
class CivitHandler(Handler):
def __init__(self):
super().__init__()
self.forwarding_table: dict[str, Handler] = {
'fetch': FetchHandler(self),
'save': SaveHandler(self)
}
self.handle_table: dict = {
'init': self._init,
}
self.client: Civit | None = None
def _init(self, command: list[str], pos=0):
keys, args = self.parse_arguments(command[pos:], ['path', 'key', 'dbpath'])
self._check_arg(keys, 'path')
if not keys['dbpath']: keys['dbpath'] = keys['path']
db = SQLiteDatabase(path=keys['dbpath'], name='data')
self.client = Civit(db, path=keys['path'], api_key=keys['key'])
self.succeed = True
class SaveHandler(Handler):
def __init__(self, parent):
super().__init__()
self.parent: CivitHandler = parent
self.forwarding_table: dict[str, Handler] = {
}
self.handle_table: dict = {
'creators': self._creators,
'tags': self._tags,
'models': self._models,
'images': self._images,
}
def _creators(self, command: list[str], pos=0):
self.parent.client.from_fetch('creator', Creator)
self.succeed = True
def _tags(self, command: list[str], pos=0):
self.parent.client.from_fetch('tag', Tag)
self.succeed = True
def _models(self, command: list[str], pos=0):
self.parent.client.from_fetch('model', Model)
self.succeed = True
def _images(self, command: list[str], pos=0): raise NotImplemented
class FetchHandler(Handler):
def __init__(self, parent):
super().__init__()
self.parent: CivitHandler = parent
self.forwarding_table: dict[str, Handler] = {
}
self.handle_table: dict = {
'creators_raw': self._creators_raw,
'creators': self._creators,
'tags_raw': self._tags_raw,
'tags': self._tags,
'models': self._models,
'images': self._images,
'datamodel': self._datamodel,
'load': self._load,
}
def _load(self, command: list[str], pos=0):
keys, args = self.parse_arguments(command[pos:], ['entity'])
self._check_arg(keys, 'entity')
res = Fetch.load(self.parent.client.client, keys['entity'])
for r in res: print(r)
self.succeed = True
def _creators_raw(self, command: list[str], pos=0):
keys, args = self.parse_arguments(command[pos:], ['page', 'limit', 'query'])
res = self.parent.client.client.get_creators_raw(page=keys['page'], limit=keys['limit'], query=keys['query'])
print(res)
self.succeed = True
def _creators(self, command: list[str], pos=0):
res = self.parent.client.fetcher.creators()
for r in res: print(r)
self.succeed = True
def _tags_raw(self, command: list[str], pos=0):
keys, args = self.parse_arguments(command[pos:], ['page', 'limit', 'query'])
res = self.parent.client.client.get_tags_raw(page=keys['page'], limit=keys['limit'], query=keys['query'])
print(res)
self.succeed = True
def _tags(self, command: list[str], pos=0):
res = self.parent.client.fetcher.tags()
for r in res: print(r)
self.succeed = True
def _models(self, command: list[str], pos=0):
res = Fetch.models(self.parent.client)
for r in res: print(r)
self.succeed = True
def _images(self, command: list[str], pos=0):
keys, args = self.parse_arguments(command[pos:], ['start'])
res = Fetch.images(self.parent.client.client, start_with=keys['start'])
for r in res: print(r)
self.succeed = True
def _datamodel(self, command: list[str], pos=0):
entities = {
'creator': 'fetch_creators',
'tag': 'fetch_tags',
'model': 'fetch_models',
'image': 'fetch_images',
}
keys, args = self.parse_arguments(command[pos:], ['entity', 'top', 'dump'])
self._check_arg(keys, 'entity')
if keys['entity'] in entities:
res = Fetch.datamodel(self.parent.client.client, entities[keys['entity']], keys['top'] or 10)
print(json.dumps(res, indent=2, ensure_ascii=False))
if keys['dump']:
with open(keys['dump'], 'w') as f:
json.dump(res, f, indent=2, ensure_ascii=False)
self.succeed = True