File size: 11,515 Bytes
85226b0
 
 
 
 
 
264c7c2
85226b0
 
 
 
 
1448430
 
 
 
85226b0
 
 
 
 
 
 
1448430
 
 
85226b0
 
 
 
 
 
1448430
 
85226b0
 
 
8650fd3
1448430
 
 
 
 
 
 
 
e60fe6a
85226b0
0579f6b
1448430
 
0579f6b
85226b0
fbd1c26
 
1448430
 
 
 
 
 
3fc69ea
85226b0
 
 
 
 
 
 
 
 
1448430
 
 
 
 
 
 
 
 
85226b0
9618844
 
 
 
1448430
9618844
 
901270b
 
 
 
1448430
901270b
 
 
 
 
 
85226b0
 
 
 
 
8650fd3
1448430
 
 
 
 
 
 
 
 
e60fe6a
85226b0
 
 
 
 
 
9618844
 
 
85226b0
13cdfc8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1448430
85226b0
1448430
85226b0
 
8650fd3
 
1448430
 
 
 
 
 
 
85226b0
1448430
0579f6b
1448430
0579f6b
85226b0
1448430
85226b0
 
 
b0fc198
8650fd3
b0fc198
85226b0
b0fc198
85226b0
 
1448430
85226b0
1448430
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85226b0
 
 
 
0579f6b
1448430
b1ae3c1
85226b0
 
 
1448430
 
 
85226b0
1448430
b0fc198
1448430
 
 
 
b0fc198
 
1448430
b0fc198
 
1448430
b0fc198
 
1448430
 
 
 
b0fc198
1448430
b0fc198
 
85226b0
0f87755
1448430
 
 
 
 
0f87755
 
 
 
f076f06
0f87755
 
1448430
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b0fc198
 
85226b0
e60fe6a
 
 
2ac2300
901270b
1448430
85226b0
2ac2300
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
import gzip
import hashlib
import os
import requests
import json
import base64

from io import BytesIO
from PIL import Image

# Language
LANG_EN = {
    "character1": "Anima EN",
    "character2": "IL EN",
    "character3": "Anima CN",
    "character4": "IL CN",
    "action": "Action list",
    "original_character": "Original Character",    
}

LANG = LANG_EN

TITLE = "WAI Character Select Preview"
CAT =       "CSP"
CAT_IL =    "IL "
CAT_ANIMA = "ANI"
ENGLISH_CHARACTER_NAME = True

current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
json_folder = os.path.join(parent_dir, 'json')

THUMB_PLACEHOLDER_SIZE = (307, 460)

character_list = ''
character_dict = {}
wai_image_dict = {}
character_list_cn = ''
il_tag_assist = {}

anima_character_list = ''
anima_character_dict = {}
wai_anima_image_dict = {}
anima_character_list_cn = ''
anima_tag_assist = {}

PROMPT_MANAGER = None

total_counter = 0
total_counter_il = 0
total_counter_anima = 0

wai_illustrious_character_select_files = [
    {'name': 'wai_character', 'file_path': os.path.join(json_folder, 'wai_characters.csv'), 'url':'https://huggingface.co/datasets/flagrantia/character_select_stand_alone_app/resolve/main/wai_characters_v160.csv?download=true'},
    {'name': 'wai_image', 'file_path': os.path.join(json_folder, 'wai_character_thumbs.json'), 'url': 'https://huggingface.co/datasets/flagrantia/character_select_stand_alone_app/resolve/main/wai_character_thumbs_v160.json?download=true'},
    {'name': 'wai_tag_assist', 'file_path': os.path.join(json_folder, 'wai_tag_assist.json'), 'url': 'https://huggingface.co/datasets/flagrantia/character_select_stand_alone_app/resolve/main/waiIllustriousSDXL_v160_tag_assist.json?download=true'},
    
    {'name': 'wai_anima_character', 'file_path': os.path.join(json_folder, 'wai_anima_characters.csv'), 'url':'https://huggingface.co/datasets/flagrantia/character_select_stand_alone_app/resolve/main/waiANIMA_v10Base10_characters.csv?download=true'},
    {'name': 'wai_anima_image', 'file_path': os.path.join(json_folder, 'wai_anima_character_thumbs.json'), 'url': 'https://huggingface.co/datasets/flagrantia/character_select_stand_alone_app/resolve/main/waiANIMA_v10Base10_thumbs.json?download=true'},
    {'name': 'wai_anima_tag_assist', 'file_path': os.path.join(json_folder, 'wai_anima_tag_assist.json'), 'url': 'https://huggingface.co/datasets/flagrantia/character_select_stand_alone_app/resolve/main/waiANIMA_v10Base10_tag_assist.json?download=true'},
    
    # {'name': 'e621_sfw', 'file_path': os.path.join(json_folder, 'e621_sfw.csv'), 'url': 'https://raw.githubusercontent.com/DominikDoom/a1111-sd-webui-tagcomplete/refs/heads/main/tags/e621_sfw.csv'},
]
def get_md5_hash(input_str):
    md5_hash = hashlib.md5()
    md5_hash.update(input_str.encode('utf-8'))
    return md5_hash.hexdigest()

def base64_to_image(base64_data):
    compressed_data = base64.b64decode(base64_data)
    webp_data = gzip.decompress(compressed_data)
    image = Image.open(BytesIO(webp_data))
    return image

def make_thumb_placeholder(size=THUMB_PLACEHOLDER_SIZE):
    return Image.new('RGB', size, (39, 39, 42))

def ensure_thumb_size(image, size=THUMB_PLACEHOLDER_SIZE):
    if image.size != size:
        return image.resize(size, Image.LANCZOS)
    return image

def download_file(url, file_path):   
    response = requests.get(url)
    response.raise_for_status() 
    print(f'[{CAT}] Downloading... {url}')
    with open(file_path, 'wb') as file:
        file.write(response.content)        

def load_text_file(file_path):
    raw_text = ''
    if os.path.exists(file_path):
        print(f'[{CAT}] Loading {file_path}')
        with open(file_path, 'r', encoding='utf-8') as js_file:
            raw_text = js_file.read()
    else:
        print(f"[{CAT}] ERROR: {file_path} file missing!!!")
        
    return raw_text
            
def load_jsons():
    global character_list
    global character_dict
    global wai_image_dict
    global character_list_cn
    
    global anima_character_list
    global anima_character_dict
    global wai_anima_image_dict
    global anima_character_list_cn
    
    global il_tag_assist
    global anima_tag_assist
    
    global PROMPT_MANAGER
    
    # download file
    for item in wai_illustrious_character_select_files:
        name = item['name']
        file_path = item['file_path']
        url = item['url']        
        
        if not os.path.exists(file_path):
            download_file(url, file_path)
            
        with open(file_path, 'r', encoding='utf-8') as file:        
            if 'wai_character' == name:
                print(f"[{CAT}] Loading wai_character...")
                lines = file.readlines()
                for line in lines:
                    key, value = line.split(',')
                    character_dict[key.strip()]=value.strip()
            elif 'wai_image' == name:
                print(f"[{CAT}] Loading wai_image...")
                wai_image_dict = json.load(file)
            elif 'wai_anima_character' == name:
                print(f"[{CAT}] Loading wai_anima_character...")
                lines = file.readlines()
                for line in lines:
                    key, value = line.split(',')
                    anima_character_dict[key.strip()]=value.strip()
            elif 'wai_anima_image' == name:
                print(f"[{CAT}] Loading wai_anima_image...")
                wai_anima_image_dict = json.load(file)
            elif 'wai_tag_assist' == name:
                print(f"[{CAT}] Loading wai_tag_assist...")
                il_tag_assist = json.load(file)
            elif 'wai_anima_tag_assist' == name:
                print(f"[{CAT}] Loading wai_anima_tag_assist...")
                anima_tag_assist = json.load(file)
                
                                        
    # Create IL list        
    character_list = list(character_dict.values())   
    character_list.insert(0, "none")
    character_list_cn = list(character_dict.keys())   
    character_list_cn.insert(0, "none")
    
    # Create Anima List
    anima_character_list = list(anima_character_dict.values())   
    anima_character_list.insert(0, "none")
    anima_character_list_cn = list(anima_character_dict.keys())   
    anima_character_list_cn.insert(0, "none")


def illustrious_character_select_ex(character = 'none', optimise_tags = True, use_cn=False):
    global total_counter
    global total_counter_il
    
    chara = ''
    tag_assist = ''
    
    if 'none' == character:
        return '', '', None
            
    if not use_cn:
        chara = character
    else:
        chara = character_dict[character]
        
    md5_chara = get_md5_hash(chara.replace('(','\\(').replace(')','\\)'))                
    thumb_image = make_thumb_placeholder()
    if wai_image_dict.keys().__contains__(md5_chara):
        thumb_image = ensure_thumb_size(base64_to_image(wai_image_dict.get(md5_chara)))
    
    opt_chara = chara
    if optimise_tags:
        opt_chara = opt_chara.replace('(', '\\(').replace(')', '\\)')  
        total_counter = total_counter + 1
        total_counter_il = total_counter_il + 1
        print(f'{CAT_IL}:{total_counter_il}/{total_counter}:[{chara}]->[{opt_chara}]')
    
    if not opt_chara.endswith(','):
        opt_chara = f'{opt_chara},'  
    
    if il_tag_assist.keys().__contains__(chara):
        tag_assist = il_tag_assist[chara]
            
    return character, opt_chara, thumb_image, tag_assist

def anima_character_select_ex(character = 'none', optimise_tags = True, use_cn=False):
    global total_counter
    global total_counter_anima
        
    chara = ''
    tag_assist = ''
    
    if 'none' == character:
        return '', '', None
            
    if not use_cn:
        chara = character
    else:
        chara = anima_character_dict[character]
        
    md5_chara = get_md5_hash(chara.replace('(','\\(').replace(')','\\)'))                
    thumb_image = make_thumb_placeholder()
    if wai_anima_image_dict.keys().__contains__(md5_chara):
        thumb_image = ensure_thumb_size(base64_to_image(wai_anima_image_dict.get(md5_chara)))
    
    opt_chara = chara
    if optimise_tags:
        opt_chara = opt_chara.replace('(', '\\(').replace(')', '\\)')  
        total_counter = total_counter + 1
        total_counter_anima = total_counter_anima + 1
        print(f'{CAT_ANIMA}:{total_counter_anima}/{total_counter}:[{chara}]->[{opt_chara}]')
    
    if not opt_chara.endswith(','):
        opt_chara = f'{opt_chara},'   
        
    if anima_tag_assist.keys().__contains__(chara):
        tag_assist = anima_tag_assist[chara]
            
    return character, opt_chara, thumb_image, tag_assist

def create_prompt_info(rnd_character1, opt_chara1, tag_assist1,
                        rnd_character2, opt_chara2, tag_assist2,
                        rnd_character3, opt_chara3, tag_assist3,
                        rnd_character4, opt_chara4, tag_assist4):
    info = ''    
    if '' != opt_chara1:
        info += f'Anima EN: {rnd_character1}\nPrompt: {opt_chara1}\nTag Assist: {tag_assist1}\n\n'
        
    if '' != opt_chara2:
        info += f'ILLUS EN: {rnd_character2}\nPrompt: {opt_chara2}\nTag Assist: {tag_assist2}\n\n'
    
    if '' != opt_chara3:
        info += f'Anima CN: {rnd_character3}\n提示词: {opt_chara3}\n标签辅助: {tag_assist3}\n\n'
    
    if '' != opt_chara4:
        info += f'ILLUS CN: {rnd_character4}\n提示词: {opt_chara4}\n标签辅助: {tag_assist4}'

    prompt = f'{opt_chara1}{opt_chara2}{opt_chara3}{opt_chara4}'

    return prompt, info

def refresh_character_thumb_image(*args):
    thumb_image = [make_thumb_placeholder() for _ in range(4)]
    rnd_character = [''] *4
    opt_chara = [''] *4
    tag_assist = [''] * 4
    
    num_inputs = len(args)
    if num_inputs == 4:
        character1, character2, character3, character4 = args
    else:
        print(f'[refresh_character_thumb_image] Ignore old/incorrect inputs, num_inputs={num_inputs}')    
        return thumb_image, 'Refresh your page'
    
    if 'none' != character1:
        rnd_character[0], opt_chara[0], thumb_image1, tag_assist[0] = anima_character_select_ex(character = character1)        
        thumb_image[0] = thumb_image1
    if 'none' != character2:
        rnd_character[1], opt_chara[1], thumb_image2, tag_assist[1] = illustrious_character_select_ex(character = character2)
        thumb_image[1] = thumb_image2
    if 'none' != character3:
        rnd_character[2], opt_chara[2], thumb_image3, tag_assist[2] = anima_character_select_ex(character = character3, use_cn=True)
        thumb_image[2] = thumb_image3
    if 'none' != character4:
        rnd_character[3], opt_chara[3], thumb_image4, tag_assist[3] = illustrious_character_select_ex(character = character4, use_cn=True)        
        thumb_image[3] = thumb_image4
    
    _, character_info = create_prompt_info(
                        rnd_character[0], opt_chara[0], tag_assist[0],
                        rnd_character[1], opt_chara[1], tag_assist[1],
                        rnd_character[2], opt_chara[2], tag_assist[2],
                        rnd_character[3], opt_chara[3], tag_assist[3])
    
    return thumb_image, character_info

def get_prompt_manager():
    return PROMPT_MANAGER

def init():    
    load_jsons()   
    print(f'[{CAT}] Starting...')
    
    return character_list, character_list_cn, LANG, anima_character_list, anima_character_list_cn