import io import json import os import gradio as gr import markdown import pandas as pd from gchar.games.dispatch.access import get_character from gchar.resources.pixiv import get_pixiv_keywords, get_pixiv_posts from gchar.resources.sites import list_available_sites, get_site_tag from gchar.utils import get_requests_session from huggingface_hub import hf_hub_url, configure_http_backend from pycivitai import civitai_find_online from pycivitai.client import ModelNotFound from character import get_ch_name from civitai import try_find_title from huggingface import get_hf_fs hf_fs = get_hf_fs() configure_http_backend(get_requests_session) def query(chr_name): ch = get_character(chr_name, allow_fuzzy=True) # get character info info_columns = ['Property', 'Value'] info_data = [] info_data.append(('Index', ch.index)) ennames = [str(enname) for enname in ch.ennames] if ennames: info_data.append(('EN Name', ', '.join(ennames))) cnnames = [str(cnname) for cnname in ch.cnnames] if cnnames: info_data.append(('CN Name', ', '.join(cnnames))) jpnames = [str(jpname) for jpname in ch.jpnames] if jpnames: info_data.append(('JP Name', ', '.join(jpnames))) if hasattr(ch, 'krnames'): krnames = [str(krname) for krname in ch.krnames] if krnames: info_data.append(('KR Name', ', '.join(krnames))) info_data.append(('Sex', ch.gender.name)) info_data.append(('Source', ch.__official_name__)) info_df = pd.DataFrame(columns=info_columns, data=info_data) # get skins skin_dir = f'datasets/deepghs/game_character_skins/{ch.__game_name__}/{ch.index}' meta_json = f'{skin_dir}/.meta.json' skin_urls = [] if hf_fs.exists(meta_json): meta = json.loads(hf_fs.read_text(meta_json)) for item in meta['files']: skin_url = hf_hub_url( 'deepghs/game_character_skins', filename=f'{ch.__game_name__}/{ch.index}/{item["name"]}', repo_type='dataset', ) skin_name = item['metadata']['name'] skin_urls.append((skin_url, skin_name)) # get repo info repo = f'CyberHarem/{get_ch_name(ch)}' with io.StringIO() as sf: if hf_fs.exists(f'{repo}/meta.json'): model_url = f'https://huggingface.co/{repo}' print(f'Model: [{model_url}]({model_url})', file=sf) else: print(f'Model not found.', file=sf) print(file=sf) if hf_fs.exists(f'datasets/{repo}/dataset-raw.zip'): ds_url = f'https://huggingface.co/datasets/{repo}' print(f'Dataset: [{ds_url}]({ds_url})', file=sf) else: print('Dataset not found.', file=sf) print(file=sf) try: model_name = try_find_title(str(ch.enname), ch.__game_name__) resource = civitai_find_online(model_name) civit_url = f'https://civitai.com/models/{resource.model_id}' print(f'CivitAI Model: [{civit_url}]({civit_url})', file=sf) except ModelNotFound: print('No CivitAI published model found.', file=sf) print(file=sf) html = markdown.markdown(sf.getvalue()) # get tags on all sites tags_columns = ['Site', 'Posts', 'Tag'] tags_data = [] tags_data.append(('Pixiv (ALL)', get_pixiv_posts(ch)[0], get_pixiv_keywords(ch))) tags_data.append(('Pixiv (R18)', get_pixiv_posts(ch)[1], get_pixiv_keywords(ch, includes=['R-18']))) for site in list_available_sites(): tag_retval = get_site_tag(ch, site, with_posts=True, sure_only=True) if tag_retval is not None: tag_name, tag_cnt = tag_retval tags_data.append((site, tag_cnt, tag_name)) tags_data = sorted(tags_data, key=lambda x: (-x[1], x[0])) tags_df = pd.DataFrame(columns=tags_columns, data=tags_data) return info_df, skin_urls, html, tags_df if __name__ == '__main__': with gr.Blocks() as demo: gr_input = gr.Textbox( label='Character Name', placeholder='Enter name or alias of the character.' ) gr_submit = gr.Button(value='Find My Waifu', variant='primary') with gr.Row(): with gr.Column(): with gr.Row(): gr_info = gr.DataFrame(label='Character Info') with gr.Row(): gr_skins = gr.Gallery(label='Skins') with gr.Column(): with gr.Row(): gr_html = gr.HTML(label='Entry of Model and Dataset', value='(N/A)') with gr.Row(): gr_tags = gr.DataFrame(label='Character Tags') gr_submit.click( query, inputs=[ gr_input, ], outputs=[ gr_info, gr_skins, gr_html, gr_tags, ] ) demo.queue(os.cpu_count()).launch()