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()