dikdimon's picture
Upload extensions using SD-Hub extension
c336648 verified
raw
history blame
No virus
7.72 kB
import os
import random
import datetime
import gradio as gr
from modules import script_callbacks, generation_parameters_copypaste, ui
# Directory of the current script
base_dir = os.path.dirname(__file__)
# Directory where data files are expected to be stored
data_dir = os.path.join(base_dir, 'Data')
def find_file_in_directory(filename, search_directory):
"""Recursively search for a file in a directory."""
for root, _, files in os.walk(search_directory):
if filename in files:
return os.path.join(root, filename)
return None
def read_tags_from_file(filename):
# First, check in the data directory
filepath = os.path.join(data_dir, filename)
if not os.path.exists(filepath):
# If not found, search in the entire PonyHelper directory
pony_helper_dir = os.path.dirname(base_dir)
filepath = find_file_in_directory(filename, pony_helper_dir)
if not filepath:
print(f"Warning: No such file: '{filename}' in the PonyHelper directory")
return []
with open(filepath, 'r') as file:
return [tag.strip() for tag in file]
# Read tags from the text files
tags = {
'general': read_tags_from_file('General'),
'civitAI-Prompt': read_tags_from_file('civitAI-Prompt'),
'characters': read_tags_from_file('Character'),
'clothes': read_tags_from_file('clothes'),
'accessory': read_tags_from_file('Accessory'),
'copyright': read_tags_from_file('Copyright'),
'artist': read_tags_from_file('Artist'),
'nsfw': read_tags_from_file('NSFW'),
'meta': read_tags_from_file('meta'),
'hair': read_tags_from_file('hair'),
'Age': read_tags_from_file('Age'),
'Poses': read_tags_from_file('Poses'),
'Backgrounds': read_tags_from_file('Backgrounds'),
'Lighting': read_tags_from_file('Lighting'),
'Quality': read_tags_from_file('Quality'),
'Tattoos': read_tags_from_file('Tattoos'),
'Emotions_Expressions': read_tags_from_file('Emotions_Expressions'),
'Environment_Setting': read_tags_from_file('Environment_Setting'),
'Season': read_tags_from_file('Season'),
'Weather': read_tags_from_file('Weather'),
'Themes': read_tags_from_file('Themes'),
'Body_Types': read_tags_from_file('Body_Types'),
'clothing_materials': read_tags_from_file('clothing_materials'),
'Ethnicity_Nationality': read_tags_from_file('Ethnicity_Nationality'),
'Perspective': read_tags_from_file('Perspective'),
'Animals_Creatures': read_tags_from_file('Animals_Creatures'),
'Props_Objects': read_tags_from_file('Props_Objects'),
}
def generate_words(num_words, category):
return random.sample(tags[category], min(num_words, len(tags[category])))
def generate_mixed_tags(num_words, rating_safe, rating_explicit, rating_questionable, rating_realistic, undanbooru_tags, *enabled_categories):
pony_options = {
'rating_safe': rating_safe,
'rating_explicit': rating_explicit,
'rating_questionable': rating_questionable,
'rating_realistic': rating_realistic,
'undanbooru_tags': undanbooru_tags,
}
clean_tags = undanbooru_tags
categories = [category for category, enabled in zip(tags.keys(), enabled_categories) if enabled]
mixed_tags_result = []
for category in categories:
words = generate_words(num_words, category)
if clean_tags:
words = [word.replace('_', ' ').replace('(', ' ').replace(')', ' ').replace('{', ' ').replace('}', ' ').replace('-', ' ').replace('!?', ' ').replace('&', ' ').replace('+', ' ').replace('=', ' ').replace('@', ' ').replace('^', ' ').replace('<', ' ').replace('>', ' ') for word in words]
mixed_tags_result.extend(words)
if pony_options.get('Pony_score', False):
score_string1 = 'score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up'
score_string2 = 'score_10, score_9_up, score_8_up, score_7_up, score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up'
current_minute = datetime.datetime.now().minute
selected_score_string = score_string1 if current_minute % 2 == 0 else score_string2
mixed_tags_result.append(selected_score_string)
if pony_options.get('rating_safe', False):
mixed_tags_result.append('rating_safe')
if pony_options.get('rating_explicit', False):
mixed_tags_result.append('rating_explicit')
if pony_options.get('rating_questionable', False):
mixed_tags_result.append('rating_questionable')
if pony_options.get('rating_realistic', False):
mixed_tags_result.append('score_hyper-realistic, realistic, ((Full Body:1.2))')
for word, selected in pony_options.items():
if word.startswith('source_') and selected:
mixed_tags_result.append(word)
mixed_tags_str = ', '.join(mixed_tags_result)
return mixed_tags_str
def find_prompts(fields):
field_prompt = [x for x in fields if x[1] == "Prompt"][0]
field_negative_prompt = [x for x in fields if x[1] == "Negative prompt"][0]
return [field_prompt[0], field_negative_prompt[0]]
def send_prompts(text):
if not text:
return "", gr.update()
params = generation_parameters_copypaste.parse_generation_parameters(text)
negative_prompt = params.get("Negative prompt", "")
return params.get("Prompt", ""), negative_prompt or gr.update()
def add_tag_tab(enabled_categories):
with gr.Blocks(css=".slider { margin: 0.5em 0; } .checkbox { margin: 0.5em 0; } .btn { margin: 1em 0; padding: 0.5em 1em; background-color: #4CAF50; color: white; border: none; cursor: pointer; }") as interface:
with gr.Tab("Pony Helper"):
with gr.Row():
num_words = gr.Slider(label="Number of Tags __________________________Pony Scores- 'score_9, score_8_up, score_7_up, score_6_up, score_5_up, score_4_up' ", minimum=1, maximum=5, step=1, value=1)
with gr.Row():
rating_safe = gr.Checkbox(label="Safe", value=False)
rating_explicit = gr.Checkbox(label="Explicit", value=False)
rating_questionable = gr.Checkbox(label="Questionable", value=False)
rating_realistic = gr.Checkbox(label="Realistic", value=False)
undanbooru_tags = gr.Checkbox(label="Undanbooru Tags", value=False)
with gr.Row():
# Use the provided enabled_categories argument
enabled_categories = [gr.Checkbox(label=category.replace('_', ' ').title(), value=enabled) for category, enabled in enabled_categories.items()]
with gr.Row():
btn_generate = gr.Button("Generate Mixed Tags", css="btn")
with gr.Row():
output = gr.Textbox(label="Generated Tags")
with gr.Row():
btn_send_txt2img = gr.Button("Send to txt2img", css="btn")
btn_send_img2img = gr.Button("Send to img2img", css="btn")
btn_generate.click(fn=generate_mixed_tags, inputs=[num_words, rating_safe, rating_explicit, rating_questionable, rating_realistic, undanbooru_tags] + enabled_categories, outputs=output)
btn_send_txt2img.click(fn=lambda tags: send_prompts(tags), inputs=output, outputs=find_prompts(ui.txt2img_paste_fields))
btn_send_img2img.click(fn=lambda tags: send_prompts(tags), inputs=output, outputs=find_prompts(ui.img2img_paste_fields))
return [(interface, "Pony Helper", "pony-helper")]
# Use the modified add_tag_tab function as the callback for ui_tabs
script_callbacks.on_ui_tabs(lambda: add_tag_tab(tags))