143 lines
4.7 KiB
Python
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
|