John6666 commited on
Commit
98f6657
·
verified ·
1 Parent(s): 60653f1

Upload 5 files

Browse files
Files changed (3) hide show
  1. app.py +19 -38
  2. lora_dict.json +98 -0
  3. modutils.py +156 -121
app.py CHANGED
@@ -294,7 +294,7 @@ def get_my_lora(link_url):
294
  new_lora_model_list.insert(0, "None")
295
 
296
  return gr.update(
297
- choices=get_lora_tupled_list(new_lora_model_list)
298
  ), gr.update(
299
  choices=get_lora_tupled_list(new_lora_model_list)
300
  ), gr.update(
@@ -907,8 +907,8 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
907
  with gr.Accordion("Negative prompt, etc.", open=False) as menu_negative:
908
  neg_prompt_gui = gr.Textbox(lines=3, placeholder="lowres, (bad), ...", label="Negative prompt", show_copy_button=True)
909
  #translate_prompt_button = gr.Button(value="Translate prompt to English", size="sm", variant="secondary")
910
- with gr.Accordion(label="Advanced options", open=False):
911
- insert_prompt_gui = gr.Radio(label="Insert reccomended positive / negative prompt", choices=["None", "Animagine", "Pony"], value="None", interactive=True, scale=2)
912
  prompt_type_gui = gr.Radio(label="Convert tags to", choices=["danbooru", "e621"], value="e621", visible=False)
913
  prompt_type_button = gr.Button(value="Convert prompt to Pony e621 style", size="sm", variant="secondary")
914
  with gr.Row():
@@ -1052,9 +1052,7 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
1052
  vae_model_gui = gr.Dropdown(label="VAE Model", choices=vae_model_list)
1053
 
1054
  with gr.Accordion("Hires fix", open=False, visible=True) as menu_hires:
1055
-
1056
  upscaler_keys = list(upscaler_dict_gui.keys())
1057
-
1058
  upscaler_model_path_gui = gr.Dropdown(label="Upscaler", choices=upscaler_keys, value=None)
1059
  upscaler_increases_size_gui = gr.Slider(minimum=1.1, maximum=6., step=0.1, value=1.0, label="Upscale by")
1060
  esrgan_tile_gui = gr.Slider(minimum=0, value=100, maximum=500, step=1, label="ESRGAN Tile")
@@ -1101,30 +1099,18 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
1101
  lora5_trigger_gui = gr.Textbox(label="Lora5 prompts", info="Example of prompt", value="", show_copy_button=True, interactive=False, visible=False)
1102
  lora5_copy_button = gr.Button(value="Copy example to prompt", visible=False)
1103
  lora5_desc_gui = gr.Markdown(value="", visible=False)
1104
-
1105
  with gr.Accordion("From URL", open=True, visible=True):
1106
  text_lora = gr.Textbox(label="URL", placeholder="http://...my_lora_url.safetensors", lines=1)
1107
  button_lora = gr.Button("Get and update lists of LoRAs")
1108
- button_lora.click(
1109
- get_my_lora,
1110
- [text_lora],
1111
- [lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui]
1112
- )
1113
  with gr.Row():
1114
  search_civitai_query_lora = gr.Textbox(label="Query", placeholder="oomuro sakurako...", lines=1)
1115
  search_civitai_basemodel_lora = gr.CheckboxGroup(label="Search LoRA for", choices=["Pony", "SD 1.5", "SDXL 1.0"], value=["Pony", "SDXL 1.0"])
1116
  search_civitai_button_lora = gr.Button("Search on Civitai")
1117
  search_civitai_result_lora = gr.Dropdown(label="Search Results", choices=[("", "")], value="", allow_custom_value=True, visible=False)
1118
  search_civitai_desc_lora = gr.Markdown(value="", visible=False)
1119
-
1120
  with gr.Accordion("From Local", open=True, visible=True):
1121
  file_output_lora = gr.File(label="Uploaded LoRA", file_types=['.ckpt', '.pt', '.pth', '.safetensors', '.bin'], file_count="multiple", interactive=False, visible=False)
1122
  upload_button_lora = gr.UploadButton(label="Upload LoRA from your disk (very slow)", file_types=['.ckpt' , '.pt', '.pth', '.safetensors', '.bin'], file_count="multiple")
1123
- upload_button_lora.upload(upload_file_lora, upload_button_lora, file_output_lora).success(
1124
- move_file_lora,
1125
- [file_output_lora],
1126
- [lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui]
1127
- )
1128
 
1129
  with gr.Accordion("IP-Adapter", open=False, visible=True) as menu_ipa:##############
1130
 
@@ -1650,15 +1636,15 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
1650
  optimization_gui.change(set_optimization, [optimization_gui, steps_gui, cfg_gui, sampler_gui, clip_skip_gui, lora5_gui, lora_scale_5_gui], [steps_gui, cfg_gui, sampler_gui, clip_skip_gui, lora5_gui, lora_scale_5_gui])
1651
 
1652
  lora1_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1653
- .then(set_lora_trigger, [lora1_gui], [lora1_trigger_gui, lora1_copy_button, lora1_desc_gui, lora1_gui])
1654
  lora2_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1655
- .then(set_lora_trigger, [lora2_gui], [lora2_trigger_gui, lora2_copy_button, lora2_desc_gui, lora2_gui])
1656
  lora3_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1657
- .then(set_lora_trigger, [lora3_gui], [lora3_trigger_gui, lora3_copy_button, lora3_desc_gui, lora3_gui])
1658
  lora4_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1659
- .then(set_lora_trigger, [lora4_gui], [lora4_trigger_gui, lora4_copy_button, lora4_desc_gui, lora4_gui])
1660
  lora5_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1661
- .then(set_lora_trigger, [lora5_gui], [lora5_trigger_gui, lora5_copy_button, lora5_desc_gui, lora5_gui])
1662
  lora_scale_1_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])
1663
  lora_scale_2_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])
1664
  lora_scale_3_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])
@@ -1670,26 +1656,21 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
1670
  lora3_copy_button.click(apply_lora_prompt, [prompt_gui, lora3_trigger_gui], [prompt_gui])
1671
  lora4_copy_button.click(apply_lora_prompt, [prompt_gui, lora4_trigger_gui], [prompt_gui])
1672
  lora5_copy_button.click(apply_lora_prompt, [prompt_gui, lora5_trigger_gui], [prompt_gui])
1673
-
1674
- search_civitai_button_lora.click(
1675
- search_civitai_lora,
1676
- [search_civitai_query_lora, search_civitai_basemodel_lora],
1677
- [search_civitai_result_lora, search_civitai_desc_lora],
1678
- queue=True,
1679
  show_progress="minimal",
1680
  )
1681
- search_civitai_query_lora.submit(
1682
- search_civitai_lora,
1683
- [search_civitai_query_lora, search_civitai_basemodel_lora],
1684
- [search_civitai_result_lora, search_civitai_desc_lora],
1685
- queue=True,
 
1686
  show_progress="minimal",
1687
  )
1688
- search_civitai_result_lora.change(
1689
- select_civitai_lora,
1690
- [search_civitai_result_lora],
1691
- [text_lora, search_civitai_desc_lora],
1692
- )
1693
 
1694
  use_textual_inversion_gui.change(set_textual_inversion_prompt, [use_textual_inversion_gui, prompt_gui, neg_prompt_gui, prompt_syntax_gui], [prompt_gui, neg_prompt_gui])
1695
 
 
294
  new_lora_model_list.insert(0, "None")
295
 
296
  return gr.update(
297
+ choices=get_lora_tupled_list(new_lora_model_list), value=new_lora_model_list[-1]
298
  ), gr.update(
299
  choices=get_lora_tupled_list(new_lora_model_list)
300
  ), gr.update(
 
907
  with gr.Accordion("Negative prompt, etc.", open=False) as menu_negative:
908
  neg_prompt_gui = gr.Textbox(lines=3, placeholder="lowres, (bad), ...", label="Negative prompt", show_copy_button=True)
909
  #translate_prompt_button = gr.Button(value="Translate prompt to English", size="sm", variant="secondary")
910
+ insert_prompt_gui = gr.Radio(label="Insert reccomended positive / negative prompt", choices=["None", "Animagine", "Pony"], value="None", interactive=True, scale=2)
911
+ with gr.Accordion(label="Advanced options", open=False):
912
  prompt_type_gui = gr.Radio(label="Convert tags to", choices=["danbooru", "e621"], value="e621", visible=False)
913
  prompt_type_button = gr.Button(value="Convert prompt to Pony e621 style", size="sm", variant="secondary")
914
  with gr.Row():
 
1052
  vae_model_gui = gr.Dropdown(label="VAE Model", choices=vae_model_list)
1053
 
1054
  with gr.Accordion("Hires fix", open=False, visible=True) as menu_hires:
 
1055
  upscaler_keys = list(upscaler_dict_gui.keys())
 
1056
  upscaler_model_path_gui = gr.Dropdown(label="Upscaler", choices=upscaler_keys, value=None)
1057
  upscaler_increases_size_gui = gr.Slider(minimum=1.1, maximum=6., step=0.1, value=1.0, label="Upscale by")
1058
  esrgan_tile_gui = gr.Slider(minimum=0, value=100, maximum=500, step=1, label="ESRGAN Tile")
 
1099
  lora5_trigger_gui = gr.Textbox(label="Lora5 prompts", info="Example of prompt", value="", show_copy_button=True, interactive=False, visible=False)
1100
  lora5_copy_button = gr.Button(value="Copy example to prompt", visible=False)
1101
  lora5_desc_gui = gr.Markdown(value="", visible=False)
 
1102
  with gr.Accordion("From URL", open=True, visible=True):
1103
  text_lora = gr.Textbox(label="URL", placeholder="http://...my_lora_url.safetensors", lines=1)
1104
  button_lora = gr.Button("Get and update lists of LoRAs")
 
 
 
 
 
1105
  with gr.Row():
1106
  search_civitai_query_lora = gr.Textbox(label="Query", placeholder="oomuro sakurako...", lines=1)
1107
  search_civitai_basemodel_lora = gr.CheckboxGroup(label="Search LoRA for", choices=["Pony", "SD 1.5", "SDXL 1.0"], value=["Pony", "SDXL 1.0"])
1108
  search_civitai_button_lora = gr.Button("Search on Civitai")
1109
  search_civitai_result_lora = gr.Dropdown(label="Search Results", choices=[("", "")], value="", allow_custom_value=True, visible=False)
1110
  search_civitai_desc_lora = gr.Markdown(value="", visible=False)
 
1111
  with gr.Accordion("From Local", open=True, visible=True):
1112
  file_output_lora = gr.File(label="Uploaded LoRA", file_types=['.ckpt', '.pt', '.pth', '.safetensors', '.bin'], file_count="multiple", interactive=False, visible=False)
1113
  upload_button_lora = gr.UploadButton(label="Upload LoRA from your disk (very slow)", file_types=['.ckpt' , '.pt', '.pth', '.safetensors', '.bin'], file_count="multiple")
 
 
 
 
 
1114
 
1115
  with gr.Accordion("IP-Adapter", open=False, visible=True) as menu_ipa:##############
1116
 
 
1636
  optimization_gui.change(set_optimization, [optimization_gui, steps_gui, cfg_gui, sampler_gui, clip_skip_gui, lora5_gui, lora_scale_5_gui], [steps_gui, cfg_gui, sampler_gui, clip_skip_gui, lora5_gui, lora_scale_5_gui])
1637
 
1638
  lora1_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1639
+ .then(set_lora_trigger, [lora1_gui], [lora1_trigger_gui, lora1_copy_button, lora1_desc_gui, lora1_gui], scroll_to_output=True)
1640
  lora2_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1641
+ .then(set_lora_trigger, [lora2_gui], [lora2_trigger_gui, lora2_copy_button, lora2_desc_gui, lora2_gui], scroll_to_output=True)
1642
  lora3_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1643
+ .then(set_lora_trigger, [lora3_gui], [lora3_trigger_gui, lora3_copy_button, lora3_desc_gui, lora3_gui], scroll_to_output=True)
1644
  lora4_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1645
+ .then(set_lora_trigger, [lora4_gui], [lora4_trigger_gui, lora4_copy_button, lora4_desc_gui, lora4_gui], scroll_to_output=True)
1646
  lora5_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])\
1647
+ .then(set_lora_trigger, [lora5_gui], [lora5_trigger_gui, lora5_copy_button, lora5_desc_gui, lora5_gui], scroll_to_output=True)
1648
  lora_scale_1_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])
1649
  lora_scale_2_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])
1650
  lora_scale_3_gui.change(set_lora_prompt, [prompt_gui, prompt_syntax_gui, lora1_gui, lora_scale_1_gui, lora2_gui, lora_scale_2_gui, lora3_gui, lora_scale_3_gui, lora4_gui, lora_scale_4_gui, lora5_gui, lora_scale_5_gui], [prompt_gui])
 
1656
  lora3_copy_button.click(apply_lora_prompt, [prompt_gui, lora3_trigger_gui], [prompt_gui])
1657
  lora4_copy_button.click(apply_lora_prompt, [prompt_gui, lora4_trigger_gui], [prompt_gui])
1658
  lora5_copy_button.click(apply_lora_prompt, [prompt_gui, lora5_trigger_gui], [prompt_gui])
1659
+ gr.on(
1660
+ triggers=[search_civitai_button_lora.click, search_civitai_query_lora.submit],
1661
+ fn=search_civitai_lora,
1662
+ inputs=[search_civitai_query_lora, search_civitai_basemodel_lora],
1663
+ outputs=[search_civitai_result_lora, search_civitai_desc_lora],
 
1664
  show_progress="minimal",
1665
  )
1666
+ search_civitai_result_lora.change(select_civitai_lora, [search_civitai_result_lora], [text_lora, search_civitai_desc_lora])
1667
+ button_lora.click(get_my_lora, [text_lora], [lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui])
1668
+ upload_button_lora.upload(upload_file_lora, upload_button_lora, file_output_lora, show_progress="minimal").success(
1669
+ move_file_lora,
1670
+ [file_output_lora],
1671
+ [lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui],
1672
  show_progress="minimal",
1673
  )
 
 
 
 
 
1674
 
1675
  use_textual_inversion_gui.change(set_textual_inversion_prompt, [use_textual_inversion_gui, prompt_gui, neg_prompt_gui, prompt_syntax_gui], [prompt_gui, neg_prompt_gui])
1676
 
lora_dict.json CHANGED
@@ -230,6 +230,13 @@
230
  "https://civitai.com/models/547794",
231
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/574d516b-f2f7-465f-850c-6ad1730aa746/width=450/17847694.jpeg"
232
  ],
 
 
 
 
 
 
 
233
  "Cat_Costume_Pony": [
234
  "cat costume",
235
  "Pony",
@@ -300,6 +307,13 @@
300
  "https://civitai.com/models/17610",
301
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ce7d0709-f4e0-4183-bcf1-f2091470503b/width=450/8866158.jpeg"
302
  ],
 
 
 
 
 
 
 
303
  "Defloration": [
304
  "Defloration / Defloration by Penis / After Defloration / Cum in Pussy",
305
  "Pony",
@@ -622,6 +636,13 @@
622
  "https://civitai.com/models/550384",
623
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a337f088-579c-4713-9424-2c3f2b9530ed/width=450/18019685.jpeg"
624
  ],
 
 
 
 
 
 
 
625
  "MdaStarouXL_P6_lokr_V4312NF": [
626
  "",
627
  "Pony",
@@ -1252,6 +1273,13 @@
1252
  "https://civitai.com/models/526774",
1253
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b40d42c4-66df-4c6e-9351-2b0343007979/width=450/16455415.jpeg"
1254
  ],
 
 
 
 
 
 
 
1255
  "asanagiArtistStylePonyxl_dora": [
1256
  "",
1257
  "Pony",
@@ -1546,6 +1574,13 @@
1546
  "https://civitai.com/models/526757",
1547
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d1d557b6-4b95-4b82-94eb-5ca367e71d90/width=450/16452076.jpeg"
1548
  ],
 
 
 
 
 
 
 
1549
  "cat_girl_pony_v21": [
1550
  "nekomata, cat girl, cat ears, animal ears, animal ear fluff",
1551
  "Pony",
@@ -1567,6 +1602,13 @@
1567
  "https://civitai.com/models/476691",
1568
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e2c7f23f-fa78-4121-9ed7-37944c025ada/width=450/13846218.jpeg"
1569
  ],
 
 
 
 
 
 
 
1570
  "cheerleader_XL_V1_0": [
1571
  "jyojifuku, cheerleader, pom pom \\(cheerleading\\)",
1572
  "SDXL 1.0",
@@ -1868,6 +1910,13 @@
1868
  "https://civitai.com/models/521379",
1869
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2e4a4ce2-1da9-40f6-be94-16e4cf5f8c1a/width=450/16141376.jpeg"
1870
  ],
 
 
 
 
 
 
 
1871
  "fisting_pony_V1_0": [
1872
  "fisting / vaginal / anal",
1873
  "Pony",
@@ -2344,6 +2393,13 @@
2344
  "https://civitai.com/models/458386",
2345
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a19e2608-4612-408a-9937-35c03b5e5947/width=450/12644488.jpeg"
2346
  ],
 
 
 
 
 
 
 
2347
  "loose_socks_XL_V1_1": [
2348
  "jyojifuku,loose socks / school uniform",
2349
  "SDXL 1.0",
@@ -2463,6 +2519,13 @@
2463
  "https://civitai.com/models/488098",
2464
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/58767062-22a1-4f52-ac2e-7f01fae26908/width=450/14206684.jpeg"
2465
  ],
 
 
 
 
 
 
 
2466
  "menstrual_pad_XL": [
2467
  "menstrual_pad / panties",
2468
  "Pony",
@@ -3002,6 +3065,20 @@
3002
  "https://civitai.com/models/451983",
3003
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a239680f-38bb-456c-89f2-e87505162cf2/width=450/12311203.jpeg"
3004
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3005
  "reel-XL-v2-ep20": [
3006
  "",
3007
  "SDXL 1.0",
@@ -3219,6 +3296,13 @@
3219
  "https://civitai.com/models/196347",
3220
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0566083e-39fd-46b5-964d-86f69b2f24b0/width=450/3534457.jpeg"
3221
  ],
 
 
 
 
 
 
 
3222
  "slurpingcum_locon_v1": [
3223
  "slurpingcum, gokkun, cupping hands, own hands together, cum on hands, hands up, drinking",
3224
  "Pony",
@@ -3226,6 +3310,13 @@
3226
  "https://civitai.com/models/512829",
3227
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/efd73ff0-bf53-4e63-a898-ea65ff03e228/width=450/15633329.jpeg"
3228
  ],
 
 
 
 
 
 
 
3229
  "spagainstScreenXLPony": [
3230
  "against glass, breast press, cheek press",
3231
  "Pony",
@@ -3394,6 +3485,13 @@
3394
  "https://civitai.com/models/12542",
3395
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c7d19f74-7fab-46ed-ae96-231d12092adc/width=450/8220286.jpeg"
3396
  ],
 
 
 
 
 
 
 
3397
  "tehepero_XL_v1": [
3398
  "tehepero, dojikko pose",
3399
  "SDXL 1.0",
 
230
  "https://civitai.com/models/547794",
231
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/574d516b-f2f7-465f-850c-6ad1730aa746/width=450/17847694.jpeg"
232
  ],
233
+ "Cage_Sex": [
234
+ "inside cage",
235
+ "Pony",
236
+ "Cage Sex Fetish",
237
+ "https://civitai.com/models/551923",
238
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/20da4500-1f88-4a9e-9398-e19a119495de/width=450/18161397.jpeg"
239
+ ],
240
  "Cat_Costume_Pony": [
241
  "cat costume",
242
  "Pony",
 
307
  "https://civitai.com/models/17610",
308
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ce7d0709-f4e0-4183-bcf1-f2091470503b/width=450/8866158.jpeg"
309
  ],
310
+ "Curtsey": [
311
+ "Curtsey / FULLBODY, LONG DRESS / KNEES BENT, FEET CROSSED, BOWING",
312
+ "SDXL 1.0",
313
+ "Curtsey | Lift Dress Bow",
314
+ "https://civitai.com/models/550529",
315
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/4b4a2f69-4fec-478f-8e5f-67418f056ee7/width=450/18140555.jpeg"
316
+ ],
317
  "Defloration": [
318
  "Defloration / Defloration by Penis / After Defloration / Cum in Pussy",
319
  "Pony",
 
636
  "https://civitai.com/models/550384",
637
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a337f088-579c-4713-9424-2c3f2b9530ed/width=450/18019685.jpeg"
638
  ],
639
+ "MdaStarouXL_ANI31_lokr_V43P1NF": [
640
+ "",
641
+ "SDXL 1.0",
642
+ "[SDXL] Artist Style: Mda Starou/M\u3060S\u305f\u308d\u3046",
643
+ "https://civitai.com/models/544619",
644
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/25f6a02a-9793-4d59-8279-51a12bc01fbb/width=450/18209541.jpeg"
645
+ ],
646
  "MdaStarouXL_P6_lokr_V4312NF": [
647
  "",
648
  "Pony",
 
1273
  "https://civitai.com/models/526774",
1274
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b40d42c4-66df-4c6e-9351-2b0343007979/width=450/16455415.jpeg"
1275
  ],
1276
+ "asanagi": [
1277
+ "4s4n4g1",
1278
+ "Pony",
1279
+ "Oktaze's Hentai Pony Styles Collection",
1280
+ "https://civitai.com/models/549761",
1281
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/ce41c563-2180-4e57-beea-199db558ff65/width=450/18155333.jpeg"
1282
+ ],
1283
  "asanagiArtistStylePonyxl_dora": [
1284
  "",
1285
  "Pony",
 
1574
  "https://civitai.com/models/526757",
1575
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/d1d557b6-4b95-4b82-94eb-5ca367e71d90/width=450/16452076.jpeg"
1576
  ],
1577
+ "car_trunk_pony_v1_0a": [
1578
+ "hd5,car_trunk",
1579
+ "Pony",
1580
+ "Car Trunk concept | Pony",
1581
+ "https://civitai.com/models/553281",
1582
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/8f82bc88-60a1-478f-a0cf-2d961a791e45/width=450/18213320.jpeg"
1583
+ ],
1584
  "cat_girl_pony_v21": [
1585
  "nekomata, cat girl, cat ears, animal ears, animal ear fluff",
1586
  "Pony",
 
1602
  "https://civitai.com/models/476691",
1603
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e2c7f23f-fa78-4121-9ed7-37944c025ada/width=450/13846218.jpeg"
1604
  ],
1605
+ "checkpoint-e94_s752": [
1606
+ "cute, kawaii, cutecore, kawaiicore, cutegore, kawaiigore, colorful stars, pastel colors, hearts, rainbow, rainbow text",
1607
+ "Pony",
1608
+ "cutecore/kawaiicore/cutegore/kawaiigore edits style ! (for PonyXL)",
1609
+ "https://civitai.com/models/553231",
1610
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/fa0c6d2b-b873-4a6d-8300-b57b67665711/width=450/18205337.jpeg"
1611
+ ],
1612
  "cheerleader_XL_V1_0": [
1613
  "jyojifuku, cheerleader, pom pom \\(cheerleading\\)",
1614
  "SDXL 1.0",
 
1910
  "https://civitai.com/models/521379",
1911
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2e4a4ce2-1da9-40f6-be94-16e4cf5f8c1a/width=450/16141376.jpeg"
1912
  ],
1913
+ "fingering_pony_V1_0": [
1914
+ "fingering",
1915
+ "Pony",
1916
+ "\u30d5\u30a3\u30f3\u30ac\u30ea\u30f3\u30b0/fingering",
1917
+ "https://civitai.com/models/551963",
1918
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/f664aca0-7a27-434b-b3bf-9d748c892b99/width=450/18124227.jpeg"
1919
+ ],
1920
  "fisting_pony_V1_0": [
1921
  "fisting / vaginal / anal",
1922
  "Pony",
 
2393
  "https://civitai.com/models/458386",
2394
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a19e2608-4612-408a-9937-35c03b5e5947/width=450/12644488.jpeg"
2395
  ],
2396
+ "lollipop_Pony_v1": [
2397
+ "lollipop",
2398
+ "Pony",
2399
+ "[SDXL&Pony] lollipop / Chupa Chups / \u30ed\u30ea\u30dd\u30c3\u30d7 / \u30da\u30ed\u30da\u30ed\u30ad\u30e3\u30f3\u30c7\u30a3 / \u30c1\u30e5\u30c3\u30d1\u30c1\u30e3\u30c3\u30d7\u30b9",
2400
+ "https://civitai.com/models/292798",
2401
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/95169a25-d709-46fa-86e9-801a959a592b/width=450/18155754.jpeg"
2402
+ ],
2403
  "loose_socks_XL_V1_1": [
2404
  "jyojifuku,loose socks / school uniform",
2405
  "SDXL 1.0",
 
2519
  "https://civitai.com/models/488098",
2520
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/58767062-22a1-4f52-ac2e-7f01fae26908/width=450/14206684.jpeg"
2521
  ],
2522
+ "maron_maron__kotosanomaa": [
2523
+ "m4r0n_m4r0n",
2524
+ "Pony",
2525
+ "Oktaze's Hentai Pony Styles Collection",
2526
+ "https://civitai.com/models/549761",
2527
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/5059fb4e-8cb0-4870-babe-2e62d93ec592/width=450/18112025.jpeg"
2528
+ ],
2529
  "menstrual_pad_XL": [
2530
  "menstrual_pad / panties",
2531
  "Pony",
 
3065
  "https://civitai.com/models/451983",
3066
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/a239680f-38bb-456c-89f2-e87505162cf2/width=450/12311203.jpeg"
3067
  ],
3068
+ "recorderXLv1": [
3069
+ "recorder,",
3070
+ "SDXL 1.0",
3071
+ "[SDXL&Pony] recorder / \u30ea\u30b3\u30fc\u30c0\u30fc",
3072
+ "https://civitai.com/models/297814",
3073
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/b35ad39b-a10f-448f-bd73-f024b9375a2a/width=450/6406129.jpeg"
3074
+ ],
3075
+ "recorder_Pony_v1": [
3076
+ "recorder",
3077
+ "Pony",
3078
+ "[SDXL&Pony] recorder / \u30ea\u30b3\u30fc\u30c0\u30fc",
3079
+ "https://civitai.com/models/297814",
3080
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/e2146f98-f65e-4f86-a4af-401bc5c9229b/width=450/18126719.jpeg"
3081
+ ],
3082
  "reel-XL-v2-ep20": [
3083
  "",
3084
  "SDXL 1.0",
 
3296
  "https://civitai.com/models/196347",
3297
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/0566083e-39fd-46b5-964d-86f69b2f24b0/width=450/3534457.jpeg"
3298
  ],
3299
+ "skirt_tug": [
3300
+ "skirt tug",
3301
+ "Pony",
3302
+ "skirt tug",
3303
+ "https://civitai.com/models/551940",
3304
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/92934659-099b-4b4a-8f61-b4a94e1cf951/width=450/18122948.jpeg"
3305
+ ],
3306
  "slurpingcum_locon_v1": [
3307
  "slurpingcum, gokkun, cupping hands, own hands together, cum on hands, hands up, drinking",
3308
  "Pony",
 
3310
  "https://civitai.com/models/512829",
3311
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/efd73ff0-bf53-4e63-a898-ea65ff03e228/width=450/15633329.jpeg"
3312
  ],
3313
+ "soapland_PONY_V2": [
3314
+ "soapland, scenery, sink, scenery, towel, mirror, indoors, faucet, bathroom, window, soap bottle, shelf, cup, reflection, bottle, shadow, tiles, door, sunlight, cabinet, toothbrush, bathtub, bath stool, kuguriisu,",
3315
+ "Pony",
3316
+ "\u7279\u6b8a\u6d74\u5834 (SoapLand) / PONY",
3317
+ "https://civitai.com/models/552152",
3318
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/9ee78490-d6c5-45c1-a1a0-92cb965faa10/width=450/18135129.jpeg"
3319
+ ],
3320
  "spagainstScreenXLPony": [
3321
  "against glass, breast press, cheek press",
3322
  "Pony",
 
3485
  "https://civitai.com/models/12542",
3486
  "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/c7d19f74-7fab-46ed-ae96-231d12092adc/width=450/8220286.jpeg"
3487
  ],
3488
+ "takorin": [
3489
+ "t4k0r1n",
3490
+ "Pony",
3491
+ "Oktaze's Hentai Pony Styles Collection",
3492
+ "https://civitai.com/models/549761",
3493
+ "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/30be2c21-3373-4640-b3cc-8d341d4480e7/width=450/18120705.jpeg"
3494
+ ],
3495
  "tehepero_XL_v1": [
3496
  "tehepero, dojikko pose",
3497
  "SDXL 1.0",
modutils.py CHANGED
@@ -2,7 +2,8 @@ import os
2
  import json
3
  import gradio as gr
4
  from PIL import Image
5
-
 
6
 
7
  HF_LORA_PRIVATE_REPOS = ['John6666/loratest1', 'John6666/loratest3', 'John6666/loratest4', 'John6666/loratest6', 'John6666/loratest10', 'John6666/loratest']
8
  HF_LORA_ESSENTIAL_PRIVATE_REPO = 'John6666/loratest1'
@@ -76,13 +77,17 @@ def download_private_repo(repo_id, dir_path, is_replace):
76
  from huggingface_hub import snapshot_download
77
  hf_read_token = os.environ.get('HF_READ_TOKEN')
78
  if not hf_read_token: return
79
- snapshot_download(repo_id=repo_id, local_dir=dir_path, allow_patterns=['*.ckpt', '*.pt', '*.pth', '*.safetensors', '*.bin'], use_auth_token=hf_read_token)
80
- if is_replace:
81
- from pathlib import Path
82
- for file in Path(dir_path).glob("*"):
83
- if file.exists() and "." in file.stem or " " in file.stem and file.suffix in ['.ckpt', '.pt', '.pth', '.safetensors', '.bin']:
84
- newpath = Path(f'{file.parent.name}/{escape_lora_basename(file.stem)}{file.suffix}')
85
- file.rename(newpath)
 
 
 
 
86
 
87
 
88
  private_model_path_repo_dict = {}
@@ -90,20 +95,23 @@ private_model_path_repo_dict = {}
90
 
91
  def get_private_model_list(repo_id, dir_path):
92
  global private_model_path_repo_dict
93
- from huggingface_hub import HfApi
94
  api = HfApi()
95
  hf_read_token = os.environ.get('HF_READ_TOKEN')
96
  if not hf_read_token: return []
97
- files = api.list_repo_files(repo_id, token=hf_read_token)
98
- model_list = []
99
- for file in files:
100
- from pathlib import Path
101
- path = Path(f"{dir_path}/{file}")
102
- if path.suffix in ['.ckpt', '.pt', '.pth', '.safetensors', '.bin']:
103
- model_list.append(str(path))
104
- for model in model_list:
105
- private_model_path_repo_dict[model] = repo_id
106
- return model_list
 
 
 
 
107
 
108
 
109
  def get_private_model_lists(repo_id_list, dir_path):
@@ -123,9 +131,13 @@ def download_private_file(repo_id, path, is_replace):
123
  if not hf_read_token or newpath.exists(): return
124
  filename = file.name
125
  dirname = file.parent.name
126
- hf_hub_download(repo_id=repo_id, filename=filename, local_dir=dirname, use_auth_token=hf_read_token)
127
- if is_replace:
128
- file.rename(newpath)
 
 
 
 
129
 
130
 
131
  def download_private_file_from_somewhere(path, is_replace):
@@ -135,79 +147,79 @@ def download_private_file_from_somewhere(path, is_replace):
135
 
136
 
137
  def get_model_id_list():
138
- from huggingface_hub import HfApi
139
  api = HfApi()
140
  model_ids = []
141
-
142
- models_vp = api.list_models(author="votepurchase", cardData=True, sort="likes")
143
- models_john = api.list_models(author="John6666", cardData=True, sort="last_modified")
144
-
145
- for model in models_vp:
146
- model_ids.append(model.id) if not model.private else ""
147
-
148
- anime_models = []
149
- real_models = []
150
- for model in models_john:
151
- if not model.private:
152
- anime_models.append(model.id) if 'anime' in model.tags else real_models.append(model.id)
153
-
154
- model_ids.extend(anime_models)
155
- model_ids.extend(real_models)
156
-
157
- return model_ids
158
 
159
 
160
  def get_t2i_model_info(repo_id: str):
161
- from huggingface_hub import HfApi
162
  api = HfApi()
163
- if " " in repo_id or not api.repo_exists(repo_id): return ""
164
- model = api.model_info(repo_id=repo_id)
165
- if model.private or model.gated: return ""
166
-
167
- tags = model.tags
168
- info = []
169
- url = f"https://huggingface.co/{repo_id}/"
170
- if not 'diffusers' in tags: return ""
171
- if 'diffusers:StableDiffusionXLPipeline' in tags:
172
- info.append("SDXL")
173
- elif 'diffusers:StableDiffusionPipeline' in tags:
174
- info.append("SD1.5")
175
- if model.card_data and model.card_data.tags:
176
- info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
177
- info.append(f"DLs: {model.downloads}")
178
- info.append(f"likes: {model.likes}")
179
- info.append(model.last_modified.strftime("lastmod: %Y-%m-%d"))
180
-
181
- md = f"Model Info: {', '.join(info)}, [Model Repo]({url})"
182
- return gr.update(value=md)
183
-
184
-
185
- def get_tupled_model_list(model_list):
186
- if not model_list: return []
187
- tupled_list = []
188
- for repo_id in model_list:
189
- from huggingface_hub import HfApi
190
- api = HfApi()
191
- if not api.repo_exists(repo_id): continue
192
  model = api.model_info(repo_id=repo_id)
193
- if model.private or model.gated: continue
194
-
 
 
195
  tags = model.tags
196
  info = []
197
- if not 'diffusers' in tags: continue
 
198
  if 'diffusers:StableDiffusionXLPipeline' in tags:
199
  info.append("SDXL")
200
  elif 'diffusers:StableDiffusionPipeline' in tags:
201
  info.append("SD1.5")
202
  if model.card_data and model.card_data.tags:
203
  info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
 
 
 
 
 
204
 
205
- if "pony" in info:
206
- info.remove("pony")
207
- name = f"{repo_id} (Pony🐴, {', '.join(info)})"
 
 
 
 
 
 
 
 
208
  else:
209
- name = f"{repo_id} ({', '.join(info)})"
210
- tupled_list.append((name, repo_id))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
  return tupled_list
212
 
213
 
@@ -319,6 +331,8 @@ civitai_not_exists_list = []
319
  def get_civitai_info(path):
320
  global civitai_not_exists_list
321
  import requests
 
 
322
  if path in set(civitai_not_exists_list): return ["", "", "", "", ""]
323
  from pathlib import Path
324
  if not Path(path).exists(): return None
@@ -326,24 +340,31 @@ def get_civitai_info(path):
326
  headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
327
  base_url = 'https://civitai.com/api/v1/model-versions/by-hash/'
328
  params = {}
 
 
 
329
  import hashlib
330
  with open(path, 'rb') as file:
331
  file_data = file.read()
332
  hash_sha256 = hashlib.sha256(file_data).hexdigest()
333
  url = base_url + hash_sha256
334
- r = requests.get(url, params=params, headers=headers, timeout=(3.0, 7.5))
335
- if not r.ok: return None
336
- json = r.json()
337
- if not 'baseModel' in json:
338
- civitai_not_exists_list.append(path)
339
  return ["", "", "", "", ""]
340
- items = []
341
- items.append(" / ".join(json['trainedWords']))
342
- items.append(json['baseModel'])
343
- items.append(json['model']['name'])
344
- items.append(f"https://civitai.com/models/{json['modelId']}")
345
- items.append(json['images'][0]['url'])
346
- return items
 
 
 
 
 
 
347
 
348
 
349
  def update_lora_dict(path):
@@ -443,6 +464,7 @@ def upload_file_lora(files):
443
  file_paths = [file.name for file in files]
444
  return gr.update(value=file_paths, visible=True)
445
 
 
446
  def move_file_lora(filepaths):
447
  import shutil
448
  from pathlib import Path
@@ -456,7 +478,7 @@ def move_file_lora(filepaths):
456
  new_lora_model_list.insert(0, "None")
457
 
458
  return gr.update(
459
- choices=get_lora_tupled_list(new_lora_model_list)
460
  ), gr.update(
461
  choices=get_lora_tupled_list(new_lora_model_list)
462
  ), gr.update(
@@ -470,30 +492,39 @@ def move_file_lora(filepaths):
470
 
471
  def search_lora_on_civitai(query: str, allow_model: list[str]):
472
  import requests
 
 
473
  if not query: return None
474
  user_agent = get_user_agent()
475
  headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
476
  base_url = 'https://civitai.com/api/v1/models'
477
  params = {'query': query, 'types': ['LORA'], 'sort': 'Highest Rated', 'period': 'AllTime',
478
  'nsfw': 'true'}
479
- r = requests.get(base_url, params=params, headers=headers, timeout=(3.0, 30))
480
- if not r.ok: return None
481
- json = r.json()
482
- if not 'items' in json: return None
483
- items = []
484
- for j in json['items']:
485
- for model in j['modelVersions']:
486
- item = {}
487
- if not model['baseModel'] in set(allow_model): continue
488
- item['name'] = j['name']
489
- item['creator'] = j['creator']['username']
490
- item['tags'] = j['tags']
491
- item['model_name'] = model['name']
492
- item['base_model'] = model['baseModel']
493
- item['dl_url'] = model['downloadUrl']
494
- item['md'] = f'<img src="{model["images"][0]["url"]}" alt="thumbnail" width="150" height="240"><br>[LoRA Model URL](https://civitai.com/models/{j["id"]})'
495
- items.append(item)
496
- return items
 
 
 
 
 
 
 
497
 
498
 
499
  civitai_lora_last_results = {}
@@ -507,7 +538,7 @@ def search_civitai_lora(query, base_model):
507
  choices = []
508
  for item in items:
509
  base_model_name = "Pony🐴" if item['base_model'] == "Pony" else item['base_model']
510
- name = f"{item['name']} (for {base_model_name} / By {item['creator']} / Tags={', '.join(item['tags'])})"
511
  value = item['dl_url']
512
  choices.append((name, value))
513
  civitai_lora_last_results[value] = item['md']
@@ -819,15 +850,19 @@ def get_model_pipeline(repo_id: str):
819
  from huggingface_hub import HfApi
820
  api = HfApi()
821
  default = "StableDiffusionPipeline"
822
- if " " in repo_id or not api.repo_exists(repo_id): return default
823
- model = api.model_info(repo_id=repo_id)
824
- if model.private or model.gated: return default
825
-
826
- tags = model.tags
827
- if not 'diffusers' in tags: return default
828
- if 'diffusers:StableDiffusionXLPipeline' in tags:
829
- return "StableDiffusionXLPipeline"
830
- elif 'diffusers:StableDiffusionPipeline' in tags:
831
- return "StableDiffusionPipeline"
832
- else:
833
  return default
 
 
 
 
 
 
 
 
 
 
 
 
2
  import json
3
  import gradio as gr
4
  from PIL import Image
5
+ from huggingface_hub import HfApi
6
+ from requests import HTTPError, Timeout
7
 
8
  HF_LORA_PRIVATE_REPOS = ['John6666/loratest1', 'John6666/loratest3', 'John6666/loratest4', 'John6666/loratest6', 'John6666/loratest10', 'John6666/loratest']
9
  HF_LORA_ESSENTIAL_PRIVATE_REPO = 'John6666/loratest1'
 
77
  from huggingface_hub import snapshot_download
78
  hf_read_token = os.environ.get('HF_READ_TOKEN')
79
  if not hf_read_token: return
80
+ try:
81
+ snapshot_download(repo_id=repo_id, local_dir=dir_path, allow_patterns=['*.ckpt', '*.pt', '*.pth', '*.safetensors', '*.bin'], use_auth_token=hf_read_token)
82
+ except (EnvironmentError, OSError, ValueError, HTTPError, Timeout) as e:
83
+ return
84
+ else:
85
+ if is_replace:
86
+ from pathlib import Path
87
+ for file in Path(dir_path).glob("*"):
88
+ if file.exists() and "." in file.stem or " " in file.stem and file.suffix in ['.ckpt', '.pt', '.pth', '.safetensors', '.bin']:
89
+ newpath = Path(f'{file.parent.name}/{escape_lora_basename(file.stem)}{file.suffix}')
90
+ file.rename(newpath)
91
 
92
 
93
  private_model_path_repo_dict = {}
 
95
 
96
  def get_private_model_list(repo_id, dir_path):
97
  global private_model_path_repo_dict
 
98
  api = HfApi()
99
  hf_read_token = os.environ.get('HF_READ_TOKEN')
100
  if not hf_read_token: return []
101
+ try:
102
+ files = api.list_repo_files(repo_id, token=hf_read_token)
103
+ except (EnvironmentError, OSError, ValueError, HTTPError, Timeout) as e:
104
+ return []
105
+ else:
106
+ model_list = []
107
+ for file in files:
108
+ from pathlib import Path
109
+ path = Path(f"{dir_path}/{file}")
110
+ if path.suffix in ['.ckpt', '.pt', '.pth', '.safetensors', '.bin']:
111
+ model_list.append(str(path))
112
+ for model in model_list:
113
+ private_model_path_repo_dict[model] = repo_id
114
+ return model_list
115
 
116
 
117
  def get_private_model_lists(repo_id_list, dir_path):
 
131
  if not hf_read_token or newpath.exists(): return
132
  filename = file.name
133
  dirname = file.parent.name
134
+ try:
135
+ hf_hub_download(repo_id=repo_id, filename=filename, local_dir=dirname, use_auth_token=hf_read_token)
136
+ except (EnvironmentError, OSError, ValueError, HTTPError, Timeout) as e:
137
+ return
138
+ else:
139
+ if is_replace:
140
+ file.rename(newpath)
141
 
142
 
143
  def download_private_file_from_somewhere(path, is_replace):
 
147
 
148
 
149
  def get_model_id_list():
 
150
  api = HfApi()
151
  model_ids = []
152
+ try:
153
+ models_vp = api.list_models(author="votepurchase", cardData=True, sort="likes")
154
+ models_john = api.list_models(author="John6666", cardData=True, sort="last_modified")
155
+ except (EnvironmentError, OSError, ValueError, HTTPError, Timeout) as e:
156
+ return model_ids
157
+ else:
158
+ for model in models_vp:
159
+ model_ids.append(model.id) if not model.private else ""
160
+ anime_models = []
161
+ real_models = []
162
+ for model in models_john:
163
+ if not model.private:
164
+ anime_models.append(model.id) if 'anime' in model.tags else real_models.append(model.id)
165
+ model_ids.extend(anime_models)
166
+ model_ids.extend(real_models)
167
+ return model_ids
 
168
 
169
 
170
  def get_t2i_model_info(repo_id: str):
 
171
  api = HfApi()
172
+ try:
173
+ if " " in repo_id or not api.repo_exists(repo_id): return ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  model = api.model_info(repo_id=repo_id)
175
+ except (EnvironmentError, OSError, ValueError, HTTPError, Timeout) as e:
176
+ return ""
177
+ else:
178
+ if model.private or model.gated: return ""
179
  tags = model.tags
180
  info = []
181
+ url = f"https://huggingface.co/{repo_id}/"
182
+ if not 'diffusers' in tags: return ""
183
  if 'diffusers:StableDiffusionXLPipeline' in tags:
184
  info.append("SDXL")
185
  elif 'diffusers:StableDiffusionPipeline' in tags:
186
  info.append("SD1.5")
187
  if model.card_data and model.card_data.tags:
188
  info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
189
+ info.append(f"DLs: {model.downloads}")
190
+ info.append(f"likes: {model.likes}")
191
+ info.append(model.last_modified.strftime("lastmod: %Y-%m-%d"))
192
+ md = f"Model Info: {', '.join(info)}, [Model Repo]({url})"
193
+ return gr.update(value=md)
194
 
195
+
196
+ def get_tupled_model_list(model_list):
197
+ if not model_list: return []
198
+ tupled_list = []
199
+ for repo_id in model_list:
200
+ api = HfApi()
201
+ try:
202
+ if not api.repo_exists(repo_id): continue
203
+ model = api.model_info(repo_id=repo_id)
204
+ except (EnvironmentError, OSError, ValueError, HTTPError, Timeout) as e:
205
+ continue
206
  else:
207
+ if model.private or model.gated: continue
208
+ tags = model.tags
209
+ info = []
210
+ if not 'diffusers' in tags: continue
211
+ if 'diffusers:StableDiffusionXLPipeline' in tags:
212
+ info.append("SDXL")
213
+ elif 'diffusers:StableDiffusionPipeline' in tags:
214
+ info.append("SD1.5")
215
+ if model.card_data and model.card_data.tags:
216
+ info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
217
+ if "pony" in info:
218
+ info.remove("pony")
219
+ name = f"{repo_id} (Pony🐴, {', '.join(info)})"
220
+ else:
221
+ name = f"{repo_id} ({', '.join(info)})"
222
+ tupled_list.append((name, repo_id))
223
  return tupled_list
224
 
225
 
 
331
  def get_civitai_info(path):
332
  global civitai_not_exists_list
333
  import requests
334
+ from urllib3.util import Retry
335
+ from requests.adapters import HTTPAdapter
336
  if path in set(civitai_not_exists_list): return ["", "", "", "", ""]
337
  from pathlib import Path
338
  if not Path(path).exists(): return None
 
340
  headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
341
  base_url = 'https://civitai.com/api/v1/model-versions/by-hash/'
342
  params = {}
343
+ session = requests.Session()
344
+ retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
345
+ session.mount("https://", HTTPAdapter(max_retries=retries))
346
  import hashlib
347
  with open(path, 'rb') as file:
348
  file_data = file.read()
349
  hash_sha256 = hashlib.sha256(file_data).hexdigest()
350
  url = base_url + hash_sha256
351
+ try:
352
+ r = session.get(url, params=params, headers=headers, stream=True, timeout=(3.0, 15))
353
+ except (HTTPError, Timeout) as e:
 
 
354
  return ["", "", "", "", ""]
355
+ else:
356
+ if not r.ok: return None
357
+ json = r.json()
358
+ if not 'baseModel' in json:
359
+ civitai_not_exists_list.append(path)
360
+ return ["", "", "", "", ""]
361
+ items = []
362
+ items.append(" / ".join(json['trainedWords']))
363
+ items.append(json['baseModel'])
364
+ items.append(json['model']['name'])
365
+ items.append(f"https://civitai.com/models/{json['modelId']}")
366
+ items.append(json['images'][0]['url'])
367
+ return items
368
 
369
 
370
  def update_lora_dict(path):
 
464
  file_paths = [file.name for file in files]
465
  return gr.update(value=file_paths, visible=True)
466
 
467
+
468
  def move_file_lora(filepaths):
469
  import shutil
470
  from pathlib import Path
 
478
  new_lora_model_list.insert(0, "None")
479
 
480
  return gr.update(
481
+ choices=get_lora_tupled_list(new_lora_model_list), value=new_lora_model_list[-1]
482
  ), gr.update(
483
  choices=get_lora_tupled_list(new_lora_model_list)
484
  ), gr.update(
 
492
 
493
  def search_lora_on_civitai(query: str, allow_model: list[str]):
494
  import requests
495
+ from urllib3.util import Retry
496
+ from requests.adapters import HTTPAdapter
497
  if not query: return None
498
  user_agent = get_user_agent()
499
  headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
500
  base_url = 'https://civitai.com/api/v1/models'
501
  params = {'query': query, 'types': ['LORA'], 'sort': 'Highest Rated', 'period': 'AllTime',
502
  'nsfw': 'true'}
503
+ session = requests.Session()
504
+ retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
505
+ session.mount("https://", HTTPAdapter(max_retries=retries))
506
+ try:
507
+ r = session.get(base_url, params=params, headers=headers, stream=True, timeout=(3.0, 30))
508
+ except (HTTPError, Timeout) as e:
509
+ return None
510
+ else:
511
+ if not r.ok: return None
512
+ json = r.json()
513
+ if not 'items' in json: return None
514
+ items = []
515
+ for j in json['items']:
516
+ for model in j['modelVersions']:
517
+ item = {}
518
+ if not model['baseModel'] in set(allow_model): continue
519
+ item['name'] = j['name']
520
+ item['creator'] = j['creator']['username']
521
+ item['tags'] = j['tags']
522
+ item['model_name'] = model['name']
523
+ item['base_model'] = model['baseModel']
524
+ item['dl_url'] = model['downloadUrl']
525
+ item['md'] = f'<img src="{model["images"][0]["url"]}" alt="thumbnail" width="150" height="240"><br>[LoRA Model URL](https://civitai.com/models/{j["id"]})'
526
+ items.append(item)
527
+ return items
528
 
529
 
530
  civitai_lora_last_results = {}
 
538
  choices = []
539
  for item in items:
540
  base_model_name = "Pony🐴" if item['base_model'] == "Pony" else item['base_model']
541
+ name = f"{item['name']} (for {base_model_name} / By: {item['creator']} / Tags: {', '.join(item['tags'])})"
542
  value = item['dl_url']
543
  choices.append((name, value))
544
  civitai_lora_last_results[value] = item['md']
 
850
  from huggingface_hub import HfApi
851
  api = HfApi()
852
  default = "StableDiffusionPipeline"
853
+ try:
854
+ if " " in repo_id or not api.repo_exists(repo_id): return default
855
+ model = api.model_info(repo_id=repo_id)
856
+ except (EnvironmentError, OSError, ValueError, HTTPError, Timeout) as e:
 
 
 
 
 
 
 
857
  return default
858
+ else:
859
+ if model.private or model.gated: return default
860
+
861
+ tags = model.tags
862
+ if not 'diffusers' in tags: return default
863
+ if 'diffusers:StableDiffusionXLPipeline' in tags:
864
+ return "StableDiffusionXLPipeline"
865
+ elif 'diffusers:StableDiffusionPipeline' in tags:
866
+ return "StableDiffusionPipeline"
867
+ else:
868
+ return default