# -*- coding: UTF-8 -*- # This extension can help you manage your models from civitai. It can download preview, add trigger words, open model page and use the prompt from preview image # repo: https://github.com/butaixianran/ import modules.scripts as scripts import gradio as gr import os import webbrowser import requests import random import hashlib import json import shutil import re import modules from modules import script_callbacks from modules import shared from scripts.ch_lib import model from scripts.ch_lib import js_action_civitai from scripts.ch_lib import model_action_civitai from scripts.ch_lib import civitai from scripts.ch_lib import util # init # root path root_path = os.getcwd() # extension path extension_path = scripts.basedir() model.get_custom_model_folder() # Setting now can not be saved from extension tab # All settings now must be saved from setting page. def on_ui_settings(): ch_section = ("civitai_helper", "Civitai Helper") # settings shared.opts.add_option("ch_max_size_preview", shared.OptionInfo(True, "Download Max Size Preview", gr.Checkbox, {"interactive": True}, section=ch_section)) shared.opts.add_option("ch_skip_nsfw_preview", shared.OptionInfo(False, "Skip NSFW Preview Images", gr.Checkbox, {"interactive": True}, section=ch_section)) shared.opts.add_option("ch_open_url_with_js", shared.OptionInfo(True, "Open Url At Client Side", gr.Checkbox, {"interactive": True}, section=ch_section)) shared.opts.add_option("ch_check_new_ver_exist_in_all_folder", shared.OptionInfo(True, "When checking new model version, check new version existing in all model folders", gr.Checkbox, {"interactive": True}, section=ch_section)) shared.opts.add_option("ch_proxy", shared.OptionInfo("", "Civitai Helper Proxy", gr.Textbox, {"interactive": True, "lines":1, "info":"format: socks5h://127.0.0.1:port"}, section=ch_section)) shared.opts.add_option("ch_civiai_api_key", shared.OptionInfo("", "Civitai API Key", gr.Textbox, {"interactive": True, "lines":1, "info":"check doc:https://github.com/zixaphir/Stable-Diffusion-Webui-Civitai-Helper/tree/master#api-key"}, section=ch_section)) shared.opts.add_option("ch_civitai_domain", shared.OptionInfo("civitai.com", "Civitai Domain", gr.Radio, {"interactive": True, "choices": ["civitai.com", "civitai.red"]}, section=ch_section)) def on_ui_tabs(): # init # init_py_msg = { # # relative extension path # "extension_path": util.get_relative_path(extension_path, root_path), # } # init_py_msg_str = json.dumps(init_py_msg) # get prompt textarea # check modules/ui.py, search for txt2img_paste_fields # Negative prompt is the second element txt2img_prompt = modules.ui.txt2img_paste_fields[0][0] txt2img_neg_prompt = modules.ui.txt2img_paste_fields[1][0] img2img_prompt = modules.ui.img2img_paste_fields[0][0] img2img_neg_prompt = modules.ui.img2img_paste_fields[1][0] # get settings max_size_preview = shared.opts.data.get("ch_max_size_preview", True) skip_nsfw_preview = shared.opts.data.get("ch_skip_nsfw_preview", False) open_url_with_js = shared.opts.data.get("ch_open_url_with_js", True) check_new_ver_exist_in_all_folder = shared.opts.data.get("ch_check_new_ver_exist_in_all_folder", False) proxy = shared.opts.data.get("ch_proxy", "") civitai_api_key = shared.opts.data.get("ch_civiai_api_key", "") civitai_domain = shared.opts.data.get("ch_civitai_domain", "civitai.com") util.printD("Settings:") util.printD("max_size_preview: " + str(max_size_preview)) util.printD("skip_nsfw_preview: " + str(skip_nsfw_preview)) util.printD("open_url_with_js: " + str(open_url_with_js)) util.printD("check_new_ver_exist_in_all_folder: " + str(check_new_ver_exist_in_all_folder)) util.printD("proxy: " + str(proxy)) # set civitai_api_key has_api_key = False if civitai_api_key: has_api_key = True util.civitai_api_key = civitai_api_key util.def_headers["Authorization"] = f"Bearer {civitai_api_key}" util.printD(f"use civitai api key: {has_api_key}") # set civitai_domain util.civitai_domain = civitai_domain util.printD(f"civitai domain: {util.civitai_domain}") # set proxy if proxy: util.proxies = { "http": proxy, "https": proxy, } # ====Event's function==== def scan_model(scan_model_types): return model_action_civitai.scan_model(scan_model_types, max_size_preview, skip_nsfw_preview) def get_model_info_by_input(model_type_drop, model_name_drop, model_url_or_id_txtbox): return model_action_civitai.get_model_info_by_input(model_type_drop, model_name_drop, model_url_or_id_txtbox, max_size_preview, skip_nsfw_preview) def dl_model_by_input(dl_model_info, dl_model_type_txtbox, dl_subfolder_drop, dl_version_drop, dl_all_ckb): return model_action_civitai.dl_model_by_input(dl_model_info, dl_model_type_txtbox, dl_subfolder_drop, dl_version_drop, dl_all_ckb, max_size_preview, skip_nsfw_preview) def check_models_new_version_to_md(model_types): return model_action_civitai.check_models_new_version_to_md(model_types, check_new_ver_exist_in_all_folder) def open_model_url(js_msg_txtbox): return js_action_civitai.open_model_url(js_msg_txtbox, open_url_with_js) def dl_model_new_version(js_msg_txtbox, max_size_preview): return js_action_civitai.dl_model_new_version(js_msg_txtbox, max_size_preview, skip_nsfw_preview) def get_model_names_by_input(model_type, empty_info_only): names = civitai.get_model_names_by_input(model_type, empty_info_only) return model_name_drop.update(choices=names) def get_model_info_by_url(url): r = model_action_civitai.get_model_info_by_url(url) model_info = {} model_name = "" model_type = "" subfolders = [] version_strs = [] if r: model_info, model_name, model_type, subfolders, version_strs = r return [model_info, model_name, model_type, dl_subfolder_drop.update(choices=subfolders), dl_version_drop.update(choices=version_strs)] # ====UI==== with gr.Blocks(analytics_enabled=False) as civitai_helper: model_types = list(model.folders.keys()) no_info_model_names = civitai.get_model_names_by_input("ckp", False) # session data dl_model_info = gr.State({}) with gr.Box(elem_classes="ch_box"): with gr.Column(): gr.Markdown("### Scan Models for Civitai") with gr.Row(): scan_model_types_ckbg = gr.CheckboxGroup(choices=model_types, label="Model Types", value=model_types) # with gr.Row(): scan_model_civitai_btn = gr.Button(value="Scan", variant="primary", elem_id="ch_scan_model_civitai_btn") # with gr.Row(): scan_model_log_md = gr.Markdown(value="Scanning takes time, just wait. Check console log for detail", elem_id="ch_scan_model_log_md") with gr.Box(elem_classes="ch_box"): with gr.Column(): gr.Markdown("### Get Model Info from Civitai by URL") gr.Markdown("Use this when scanning can not find a local model on civitai") with gr.Row(): model_type_drop = gr.Dropdown(choices=model_types, label="Model Type", value="ckp", multiselect=False) empty_info_only_ckb = gr.Checkbox(label="Only Show Models have no Info", value=False, elem_id="ch_empty_info_only_ckb", elem_classes="ch_vpadding") model_name_drop = gr.Dropdown(choices=no_info_model_names, label="Model", value="ckp", multiselect=False) model_url_or_id_txtbox = gr.Textbox(label="Civitai URL", lines=1, value="") get_civitai_model_info_by_id_btn = gr.Button(value="Get Model Info from Civitai", variant="primary") get_model_by_id_log_md = gr.Markdown("") with gr.Box(elem_classes="ch_box"): with gr.Column(): gr.Markdown("### Download Model") with gr.Row(): dl_model_url_or_id_txtbox = gr.Textbox(label="Civitai URL", lines=1, value="") dl_model_info_btn = gr.Button(value="1. Get Model Info by Civitai Url", variant="primary") gr.Markdown(value="2. Pick Subfolder and Model Version") with gr.Row(): dl_model_name_txtbox = gr.Textbox(label="Model Name", interactive=False, lines=1, value="") dl_model_type_txtbox = gr.Textbox(label="Model Type", interactive=False, lines=1, value="") dl_subfolder_drop = gr.Dropdown(choices=[], label="Sub-folder", value="", interactive=True, multiselect=False) dl_version_drop = gr.Dropdown(choices=[], label="Model Version", value="", interactive=True, multiselect=False) dl_all_ckb = gr.Checkbox(label="Download All files", value=False, elem_id="ch_dl_all_ckb", elem_classes="ch_vpadding") dl_civitai_model_by_id_btn = gr.Button(value="3. Download Model", variant="primary") dl_log_md = gr.Markdown(value="Check Console log for Downloading Status") with gr.Box(elem_classes="ch_box"): with gr.Column(): gr.Markdown("### Check models' new version") with gr.Row(): model_types_ckbg = gr.CheckboxGroup(choices=model_types, label="Model Types", value=["lora"]) check_models_new_version_btn = gr.Button(value="Check New Version from Civitai", variant="primary") check_models_new_version_log_md = gr.HTML("It takes time, just wait. Check console log for detail") with gr.Box(elem_classes="ch_box"): with gr.Column(): gr.Markdown("### Other") # save_setting_btn = gr.Button(value="Save Setting") gr.Markdown(value="Settings are moved into Settings Tab->Civitai Helper section") # ====Footer==== gr.Markdown(f"