gchar_online / app.py
narugo1992
dev(narugo): update ui
b31365d
import gradio as gr
from gchar.__main__ import cli
from gchar.games import get_character
from gchar.resources.danbooru import get_danbooru_tag
from gchar.resources.pixiv import get_pixiv_keywords
def update_database():
cli(['update'])
def get_character_info(chtext: str):
char = get_character(chtext)
if not char:
raise gr.Error(f'Character not found - {chtext!r}.')
tc = type(char)
fields = {name: getattr(char, name) for name in dir(tc) if isinstance(getattr(tc, name), property)}
visited_names = {'raw_data', 'skins', 'names'}
data = []
if 'index' in fields:
data.append(('id', fields['index']))
visited_names.add('index')
for name_name in ['cnname', 'enname', 'jpname']:
mul_name = f'{name_name}s'
if fields[mul_name]:
data.append((mul_name, list(map(str, fields[mul_name]))))
visited_names.add(name_name)
visited_names.add(mul_name)
if fields['alias_names']:
data.append(('alias', list(map(str, fields['alias_names']))))
visited_names.add('alias_names')
for name in fields.keys():
if name not in visited_names:
value = fields[name]
if hasattr(value, 'label'):
value = value.label
elif hasattr(value, 'name'):
value = value.name
data.append((name, value))
visited_names.add(name)
pkeywords = get_pixiv_keywords(char)
if pkeywords:
data.append(('pixiv', pkeywords))
danbooru_tag = get_danbooru_tag(char)
if danbooru_tag:
data.append(('danbooru', danbooru_tag))
df = {'headers': ['Field', 'Value'], 'data': data}
skins = [(skin.url, skin.name) for skin in char.skins]
return df, skins
_STYLE = """
#skin_gallery {
max-height: 450px !important;
}
"""
if __name__ == '__main__':
with gr.Blocks(css=_STYLE) as demo:
with gr.Row():
with gr.Column():
ch_input = gr.Textbox(value='妖高', label='Character Name')
ch_submit = gr.Button(value='Query', variant='primary')
ch_fields = gr.Dataframe(label='Meta Information', headers=['Field', 'Value'], col_count=2)
with gr.Column():
ch_skins = gr.Gallery(label='Skins', elem_id='skin_gallery').style(grid=(1, 4), height='24')
ch_submit.click(
get_character_info,
inputs=[ch_input],
outputs=[ch_fields, ch_skins],
)
demo.launch()