rename menu

pull/85/head
joonsun01 2023-09-18 00:59:29 +09:00
parent 4d3d8172bb
commit f897209302
15 changed files with 439 additions and 812 deletions

View File

@ -1,4 +1,3 @@
# 이 업데이트는 Gradio 버전 3.41.2 이상과 호환됩니다. 올바르게 작동하려면 A1111의 최신 업데이트가 필요합니다.
# Civitai Shortcut
@ -14,45 +13,48 @@ Stable Diffusion Webui의 Extension 탭에서 'URL에서 설치' 서브 탭으
# Usage instructions
![screenshot 2023-08-10 105556](https://github.com/sunnyark/civitai-shortcut/assets/40237431/77e103b6-6767-456b-8073-a4dbe7d0c042)
![screenshot 2023-09-15 203613](https://github.com/sunnyark/civitai-shortcut/assets/40237431/fdac59c0-0ced-41fb-8faa-83029b3ffc3f)
* Upload : 이 기능은 Civitai 사이트의 모델 URL을 이용하여 확장 프로그램에서 사용할 수 있는 바로 가기를 생성합니다. 주소 창에서 URL을 클릭하고 드래그하거나 저장된 인터넷 바로 가기를 드래그앤드롭할 수 있습니다. 또한 여러 개의 인터넷 바로 가기를 선택하고 한 번에 드롭할 수도 있습니다.
* Browsing : 이 기능은 등록된 바로 가기를 섬네일 형식으로 표시하며, 선택 시 창의 오른쪽에 해당 바로 가기의 세부 정보를 표시합니다.
* Register Model : 이 기능은 Civitai 사이트의 모델 URL을 이용하여 모델의 정보를 Civitai에서 가져와 드록합니다.
주소 창에서 URL을 클릭하고 드래그하거나 저장된 인터넷 바로 가기를 드래그앤드롭할 수 있습니다. 또한 여러 개의 인터넷 바로 가기를 선택하고 한 번에 드롭할 수도 있습니다.
* Model Browser : 이 기능은 등록된 모델을 섬네일 형식으로 표시하며, 선택 시 창의 오른쪽에 해당 모델의 세부 정보를 표시합니다.
* Scan New Version : 이 기능은 Civitai 사이트에서 다운로드한 모델의 최신 버전을 검색하는 기능입니다. 사이트에서 정보를 가져오며, 사이트가 정상 작동할 때에만 정상적으로 작동합니다.
* Model Information 의 정보를 최신 상태로 유지하기 위해서는 주기적인 데이터 업데이트가 필요합니다.
방법에는 model information 하면에서 Update Shortcut 기능을 이용해서 개별적으로 업데이트 하거나, manage->setting->option 의 자동 업데이트를 활성화 , Manage->Scan and Update Models->Update the model information for the shortcut 기능을 이용하는 방법이 있습니다.
![drag_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4f0bd60-0c81-45fe-aa60-652027579247)
![file_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/efdee43a-795e-4cb9-8c5e-322b5824bb8f)
![file_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dbcbc789-89a9-45fd-b8a9-388ba33c916f)
* Classification : Shortcut에서 사용하는 분류항목을 관리하는 기능입니다.
![screenshot 2023-08-10 101404](https://github.com/sunnyark/civitai-shortcut/assets/40237431/bd8ed2b4-5551-4d4a-bd64-91a99a0e5187)
![screenshot 2023-08-10 101352](https://github.com/sunnyark/civitai-shortcut/assets/40237431/66b4bace-7b89-4938-aef2-c957dd3a5a06)
![register_model_direct](https://github.com/sunnyark/civitai-shortcut/assets/40237431/c6db4ced-9cec-4488-ac3f-9a17fadb42b8)
![register_model_shortcut](https://github.com/sunnyark/civitai-shortcut/assets/40237431/a18cc188-0d7a-4860-91fa-b9b2b27f4bdc)
* Prompt Recipe : Prompt recipe는 자주 사용하는 Prompt를 등록하고 관리 할수 있는 기능입니다.
![screenshot 2023-08-10 110136](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4ef04b3-b82d-420b-a73b-87ceeada3c1d)
![screenshot 2023-09-15 201815](https://github.com/sunnyark/civitai-shortcut/assets/40237431/d3d61c0a-c749-40ee-bc8c-69c35e9c6ba7)
![screenshot 2023-08-10 110147](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7034ac04-b4e0-415b-af38-58b4e5789dac)
![screenshot 2023-09-15 201833](https://github.com/sunnyark/civitai-shortcut/assets/40237431/773dc92f-3fd5-4509-94bb-99a9e50bec34)
![screenshot 2023-08-10 110158](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dd737ca1-34c6-48c2-b694-98f42972988b)
![screenshot 2023-09-15 201853](https://github.com/sunnyark/civitai-shortcut/assets/40237431/ecf6e1a7-59f8-4eb5-a58f-5a7ff7824437)
* Scan and Update Models
* Assistance :
1. Classification : Shortcut에서 사용하는 분류항목을 관리하는 기능입니다.
![screenshot 2023-09-15 201933](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7881d3d8-d2a3-4502-b39c-fb40a17cf21c)
![screenshot 2023-09-15 201956](https://github.com/sunnyark/civitai-shortcut/assets/40237431/94b2b2a1-f148-42dc-b6a8-21c1381dc55f)
![screenshot 2023-09-15 202004](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9003d94d-5a13-4613-9fa6-722b1e892874)
2. Scan and Update Models
Scan Models : 현재 보유 중인 모델 정보가 없는 모델에 대해 스캔하여 바로 가기를 등록하는 기능입니다.
Update the model information for the shortcut : 등록된 바로 가기의 정보를 최신 정보로 업데이트합니다.
Scan downloaded models for shortcut registration : 삭제되거나 모델 정보가 누락된 다운로드된 모델에 대해 새로운 바로 가기를 등록합니다.
Update Downloaded Model : 이 기능은 Lora 메타데이터 파일이 없는 다운로드된 모델을 위한 Lora 메타데이터 파일을 생성합니다.
![screenshot 2023-08-10 110607](https://github.com/sunnyark/civitai-shortcut/assets/40237431/927fc11b-6e08-4360-a968-0f63130cb3c5)
![screenshot 2023-09-15 202018](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7f200d24-a4ca-4e23-834a-71470590ee49)
* Setting : 확장프로그램의 다양한 설정값을 관리합니다.
![screenshot 2023-05-24 134749](https://github.com/sunnyark/civitai-shortcut/assets/40237431/3758bee5-71ea-4fb1-a411-e55213f701d4)
![screenshot 2023-09-15 202037](https://github.com/sunnyark/civitai-shortcut/assets/40237431/67e2e7c5-0cd6-4917-a4c8-b9ffb45832f9)
# Features
@ -76,51 +78,66 @@ Civitai 사이트의 모델 URL을 저장하여 나중에 참조하고 보관할
* CivitaiShortCutBackupUrl.json : Shortcut 등록시의 URL을 백업하는 파일
# Change Log
v 1.6.7
* 기능에 맞도록 각 매뉴의 명칭을 변경했습니다.
v 1.6.6
* Prompt Recipe에서 레퍼런스를 관리할때 Delete from references when selecting a thumbnail 을 선택해제하고 리퍼런스 모델을 클릭했을시 모델 인포메이션으로 이동하지 않고 상단에 간략한 정보를 보여주도록 변경됨.
* Prompt Recipe에서 선택한 reference model 의 type 에 따라 프롬프트에 지시어를 입력할 수 있는 기능추가
* classification의 Delete from classification when selecting a thumbnail 을 선택해제하고 classification 에 속한 모델을 클릭했을시 모델 인포메이션으로 이동하지 않고 우측애 간략한 정보를 보여주도록 변경됨.
v 1.6.5
* 이 업데이트는 Gradio 버전 3.41.2 이상과 호환됩니다.
v 1.6.5
* 이 업데이트는 Gradio 버전 3.41.2 이상과 호환됩니다.
* 올바르게 작동하려면 A1111의 최신 업데이트가 필요합니다.
v 1.6.4
* sdui의 LoRa metadata editor에 사용가능한 model meta data를 저장.(단, 기존것이 없을경우에만 저장됩니다.)
* 일부 메뉴의 명칭을 변경
* 일부 메뉴의 명칭을 변경
* Assistance->Scan and Update Models 에 누락된 lora metadata file을 생성할 수 있는 기능 추가(2023-08-19)
v 1,6.3
* classification 의 인터페이스 변경
* classification 의 shortcut browser 기능추가, 편의성 개선
* shortcut information의 이미지에서 recipe로 prompt를 보낼때 해당 shortcut을 기본 레퍼런스 모델로 추가하게 수정.
v 1.6.2
* shortcut의 등록날짜를 업데이트
* shortcut의 등록날짜를 업데이트
(기존데이터는 Assistance->Update Shortcuts:Update the model information for the shortcut 수행필요)
* gallery의 설정을 직관적으로 변경
v 1.6.1
* recipe의 reference shortcut model의 인터페이스 변경
* 섬네일이 자동으로 생성될때 nsfw level이 가장 낮은 (건전한) 모델이 선정되게 변경.
* 전체 모든 범위에서 nsfw filter 가 작동하게 변경
* classification 에서 표시되는 shortcut model중 삭제된 모델이 표시되도록 변경
v 1.6.0
* NSFW Filter 기능 추가
* prompt recipe 리뉴얼
* prompt recipe에 reference model을 등록 할수 있는 tab추가
* prompt recipe 검색기능 보강
* shortcut broswer의 검색창의 위치를 섬네일 목록의 상/하중 원하는 위치로 변경할 수 있도록 setting 에 추가.
v 1.5.8
* 모델 인포메이션에 personal note 항목을 추가, 검색에서 "@" 를 이용해서 검색가능
v 1.5.7
* Civitai에서 제공하는 기본 모델을 사용하여 필터링하는 기능이 추가되었습니다.
* 분류 항목을 검색 섹션에서 검색하는 대신 드롭다운 목록에서 선택할 수 있도록 변경합니다. 선택된 분류 항목은 'AND' 연산으로 작동하여 교집합처럼 동작합니다. 이렇게 하면 다중 카테고리에 속하는 바로 가기들을 더 자세하게 관리할 수 있습니다.
v 1.5.6
* Civitai에서 권장하는 대로 "user gallery paging" 방법을 cursor paging 으로 변경합니다.
v 1.5.5
@ -325,30 +342,19 @@ v 1.1
*전체 모델 정보를 업데이트하는 "Update Shortcut's Model Information" 버튼 외에 개별적으로 모델 정보를 업데이트할 수 있는 "Update Model Information" 버튼이 "Saved Model Information" 탭에 추가됩니다.
# Screenshot
![screenshot 2023-08-10 105556](https://github.com/sunnyark/civitai-shortcut/assets/40237431/77e103b6-6767-456b-8073-a4dbe7d0c042)
![screenshot 2023-08-10 101352](https://github.com/sunnyark/civitai-shortcut/assets/40237431/66b4bace-7b89-4938-aef2-c957dd3a5a06)
![screenshot 2023-08-10 101404](https://github.com/sunnyark/civitai-shortcut/assets/40237431/bd8ed2b4-5551-4d4a-bd64-91a99a0e5187)
![screenshot 2023-08-10 110136](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4ef04b3-b82d-420b-a73b-87ceeada3c1d)
![screenshot 2023-08-10 110147](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7034ac04-b4e0-415b-af38-58b4e5789dac)
![screenshot 2023-08-10 110158](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dd737ca1-34c6-48c2-b694-98f42972988b)
![screenshot 2023-08-10 110607](https://github.com/sunnyark/civitai-shortcut/assets/40237431/927fc11b-6e08-4360-a968-0f63130cb3c5)
![screenshot 2023-05-24 134749](https://github.com/sunnyark/civitai-shortcut/assets/40237431/3758bee5-71ea-4fb1-a411-e55213f701d4)
![drag_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4f0bd60-0c81-45fe-aa60-652027579247)
![file_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/efdee43a-795e-4cb9-8c5e-322b5824bb8f)
![file_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dbcbc789-89a9-45fd-b8a9-388ba33c916f)
![classification_action](https://github.com/sunnyark/civitai-shortcut/assets/40237431/ec0ddb51-6b8b-485a-a560-9c174a962001)
![prompt_recipe_create01](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7f8db7b5-f3d0-45bc-a8b9-181f3befe4ef)
![prompt_recipe_create02](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9218f2bd-9bf9-47ee-b61f-80cc1816da1e)
![prompt_recipe_send_txt2image](https://github.com/sunnyark/civitai-shortcut/assets/40237431/abeb0af6-fe97-4cef-b4b5-92110237c6b2)
![screenshot 2023-09-15 203613](https://github.com/sunnyark/civitai-shortcut/assets/40237431/fdac59c0-0ced-41fb-8faa-83029b3ffc3f)
![screenshot 2023-09-15 202037](https://github.com/sunnyark/civitai-shortcut/assets/40237431/67e2e7c5-0cd6-4917-a4c8-b9ffb45832f9)
![screenshot 2023-09-15 202018](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7f200d24-a4ca-4e23-834a-71470590ee49)
![screenshot 2023-09-15 202004](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9003d94d-5a13-4613-9fa6-722b1e892874)
![screenshot 2023-09-15 201956](https://github.com/sunnyark/civitai-shortcut/assets/40237431/94b2b2a1-f148-42dc-b6a8-21c1381dc55f)
![screenshot 2023-09-15 201933](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7881d3d8-d2a3-4502-b39c-fb40a17cf21c)
![screenshot 2023-09-15 201909](https://github.com/sunnyark/civitai-shortcut/assets/40237431/d3a300da-bccf-4452-ad59-11904c44f585)
![screenshot 2023-09-15 201853](https://github.com/sunnyark/civitai-shortcut/assets/40237431/ecf6e1a7-59f8-4eb5-a58f-5a7ff7824437)
![screenshot 2023-09-15 201845](https://github.com/sunnyark/civitai-shortcut/assets/40237431/c1726ab5-15b7-499f-9067-9755fba332c0)
![screenshot 2023-09-15 201833](https://github.com/sunnyark/civitai-shortcut/assets/40237431/773dc92f-3fd5-4509-94bb-99a9e50bec34)
![screenshot 2023-09-15 201815](https://github.com/sunnyark/civitai-shortcut/assets/40237431/d3d61c0a-c749-40ee-bc8c-69c35e9c6ba7)
![screenshot 2023-09-15 201738](https://github.com/sunnyark/civitai-shortcut/assets/40237431/b8673673-ea42-43ad-942f-15437fce6b26)
![screenshot 2023-09-15 201708](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9f8f7ab3-245c-4878-b722-5cb7de2f1c9d)
![register_model_shortcut](https://github.com/sunnyark/civitai-shortcut/assets/40237431/a18cc188-0d7a-4860-91fa-b9b2b27f4bdc)
![register_model_direct](https://github.com/sunnyark/civitai-shortcut/assets/40237431/c6db4ced-9cec-4488-ac3f-9a17fadb42b8)

View File

@ -12,44 +12,45 @@ Stable Diffusion Webui's Extension tab, go to Install from url sub-tab. Copy thi
# Usage instructions
![screenshot 2023-08-10 105556](https://github.com/sunnyark/civitai-shortcut/assets/40237431/77e103b6-6767-456b-8073-a4dbe7d0c042)
![screenshot 2023-09-15 203613](https://github.com/sunnyark/civitai-shortcut/assets/40237431/fdac59c0-0ced-41fb-8faa-83029b3ffc3f)
* Upload : This function creates a shortcut that can be used by the extension when you enter the Civitai site's model URL. It only works when the site is functioning properly. You can either click and drag the URL from the address bar or drag and drop saved internet shortcuts. You can also select multiple internet shortcuts and drop them at once.
* Browsing : This function displays the registered shortcuts in thumbnail format, and when selected, displays their details on the right-hand side of the window. This function works independently of the Civitai site.
* Model Browsing : "This feature displays registered models in thumbnail format and, upon selection, shows detailed information about the model on the right side of the window.
* Scan New Version : This is a function that searches for the latest version of downloaded models on the Civitai site. It retrieves information from the site and only functions properly when the site is operational.
![drag_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4f0bd60-0c81-45fe-aa60-652027579247)
![file_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/efdee43a-795e-4cb9-8c5e-322b5824bb8f)
![file_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dbcbc789-89a9-45fd-b8a9-388ba33c916f)
* Classification : Function for managing shortcuts by classification.
![screenshot 2023-08-10 101404](https://github.com/sunnyark/civitai-shortcut/assets/40237431/bd8ed2b4-5551-4d4a-bd64-91a99a0e5187)
![screenshot 2023-08-10 101352](https://github.com/sunnyark/civitai-shortcut/assets/40237431/66b4bace-7b89-4938-aef2-c957dd3a5a06)
![register_model_direct](https://github.com/sunnyark/civitai-shortcut/assets/40237431/c6db4ced-9cec-4488-ac3f-9a17fadb42b8)
![register_model_shortcut](https://github.com/sunnyark/civitai-shortcut/assets/40237431/a18cc188-0d7a-4860-91fa-b9b2b27f4bdc)
* Prompt Recipe : The Prompt Recipe feature allows you to register and manage frequently used prompts.
![screenshot 2023-08-10 110136](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4ef04b3-b82d-420b-a73b-87ceeada3c1d)
![screenshot 2023-09-15 201815](https://github.com/sunnyark/civitai-shortcut/assets/40237431/d3d61c0a-c749-40ee-bc8c-69c35e9c6ba7)
![screenshot 2023-08-10 110147](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7034ac04-b4e0-415b-af38-58b4e5789dac)
![screenshot 2023-09-15 201833](https://github.com/sunnyark/civitai-shortcut/assets/40237431/773dc92f-3fd5-4509-94bb-99a9e50bec34)
![screenshot 2023-08-10 110158](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dd737ca1-34c6-48c2-b694-98f42972988b)
![screenshot 2023-09-15 201853](https://github.com/sunnyark/civitai-shortcut/assets/40237431/ecf6e1a7-59f8-4eb5-a58f-5a7ff7824437)
* Scan and Update Models
* Assistance
1. Classification : Function for managing shortcuts by classification.
![screenshot 2023-09-15 201933](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7881d3d8-d2a3-4502-b39c-fb40a17cf21c)
![screenshot 2023-09-15 201956](https://github.com/sunnyark/civitai-shortcut/assets/40237431/94b2b2a1-f148-42dc-b6a8-21c1381dc55f)
![screenshot 2023-09-15 202004](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9003d94d-5a13-4613-9fa6-722b1e892874)
2. Scan and Update Models
Scan Models - Scan and register shortcut for models without model information that are currently held.
Update Shortcut - Move the shortcut update function from the Upload tab.
Update the model information for the shortcut - Update the information of registered shortcuts with the latest information.
Scan downloaded models for shortcut registration - Register new shortcuts for downloaded models that have been deleted or have missing model information.
![screenshot 2023-08-10 110607](https://github.com/sunnyark/civitai-shortcut/assets/40237431/927fc11b-6e08-4360-a968-0f63130cb3c5)
![screenshot 2023-09-15 202018](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7f200d24-a4ca-4e23-834a-71470590ee49)
* Setting tab - Set the number of columns in the image gallery.
![screenshot 2023-05-24 134749](https://github.com/sunnyark/civitai-shortcut/assets/40237431/3758bee5-71ea-4fb1-a411-e55213f701d4)
![screenshot 2023-09-15 202037](https://github.com/sunnyark/civitai-shortcut/assets/40237431/67e2e7c5-0cd6-4917-a4c8-b9ffb45832f9)
# Features
@ -72,6 +73,9 @@ Four folders and five JSON files will be created, each serving the following rol
* CivitaiShortCutBackupUrl.json : JSON file for backing up the URL during shortcut registration.
# Change Log
v 1.6.7
* Changed the names of each menu to correspond to their functions.
v 1.6.6
* In Prompt Recipe, the option 'Delete from references when selecting a thumbnail' has been deselected, and when clicking on a model within the references, it now displays brief information on the top instead of navigating to the model information.
* An added feature in Prompt Recipe allows the input of directives in the prompt based on the type of the selected reference model.
@ -290,30 +294,18 @@ v 1.1
* "Update Model Information" button is added to "Saved Model Information" Tab for individual updating of model information, in addition to "Update Shortcut's Model Information" that updates all model information.
# Screenshot
![screenshot 2023-08-10 105556](https://github.com/sunnyark/civitai-shortcut/assets/40237431/77e103b6-6767-456b-8073-a4dbe7d0c042)
![screenshot 2023-08-10 101352](https://github.com/sunnyark/civitai-shortcut/assets/40237431/66b4bace-7b89-4938-aef2-c957dd3a5a06)
![screenshot 2023-08-10 101404](https://github.com/sunnyark/civitai-shortcut/assets/40237431/bd8ed2b4-5551-4d4a-bd64-91a99a0e5187)
![screenshot 2023-08-10 110136](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4ef04b3-b82d-420b-a73b-87ceeada3c1d)
![screenshot 2023-08-10 110147](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7034ac04-b4e0-415b-af38-58b4e5789dac)
![screenshot 2023-08-10 110158](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dd737ca1-34c6-48c2-b694-98f42972988b)
![screenshot 2023-08-10 110607](https://github.com/sunnyark/civitai-shortcut/assets/40237431/927fc11b-6e08-4360-a968-0f63130cb3c5)
![screenshot 2023-05-24 134749](https://github.com/sunnyark/civitai-shortcut/assets/40237431/3758bee5-71ea-4fb1-a411-e55213f701d4)
![drag_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/e4f0bd60-0c81-45fe-aa60-652027579247)
![file_drop_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/efdee43a-795e-4cb9-8c5e-322b5824bb8f)
![file_upload](https://github.com/sunnyark/civitai-shortcut/assets/40237431/dbcbc789-89a9-45fd-b8a9-388ba33c916f)
![classification_action](https://github.com/sunnyark/civitai-shortcut/assets/40237431/ec0ddb51-6b8b-485a-a560-9c174a962001)
![prompt_recipe_create01](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7f8db7b5-f3d0-45bc-a8b9-181f3befe4ef)
![prompt_recipe_create02](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9218f2bd-9bf9-47ee-b61f-80cc1816da1e)
![prompt_recipe_send_txt2image](https://github.com/sunnyark/civitai-shortcut/assets/40237431/abeb0af6-fe97-4cef-b4b5-92110237c6b2)
![screenshot 2023-09-15 203613](https://github.com/sunnyark/civitai-shortcut/assets/40237431/fdac59c0-0ced-41fb-8faa-83029b3ffc3f)
![screenshot 2023-09-15 202037](https://github.com/sunnyark/civitai-shortcut/assets/40237431/67e2e7c5-0cd6-4917-a4c8-b9ffb45832f9)
![screenshot 2023-09-15 202018](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7f200d24-a4ca-4e23-834a-71470590ee49)
![screenshot 2023-09-15 202004](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9003d94d-5a13-4613-9fa6-722b1e892874)
![screenshot 2023-09-15 201956](https://github.com/sunnyark/civitai-shortcut/assets/40237431/94b2b2a1-f148-42dc-b6a8-21c1381dc55f)
![screenshot 2023-09-15 201933](https://github.com/sunnyark/civitai-shortcut/assets/40237431/7881d3d8-d2a3-4502-b39c-fb40a17cf21c)
![screenshot 2023-09-15 201909](https://github.com/sunnyark/civitai-shortcut/assets/40237431/d3a300da-bccf-4452-ad59-11904c44f585)
![screenshot 2023-09-15 201853](https://github.com/sunnyark/civitai-shortcut/assets/40237431/ecf6e1a7-59f8-4eb5-a58f-5a7ff7824437)
![screenshot 2023-09-15 201845](https://github.com/sunnyark/civitai-shortcut/assets/40237431/c1726ab5-15b7-499f-9067-9755fba332c0)
![screenshot 2023-09-15 201833](https://github.com/sunnyark/civitai-shortcut/assets/40237431/773dc92f-3fd5-4509-94bb-99a9e50bec34)
![screenshot 2023-09-15 201815](https://github.com/sunnyark/civitai-shortcut/assets/40237431/d3d61c0a-c749-40ee-bc8c-69c35e9c6ba7)
![screenshot 2023-09-15 201738](https://github.com/sunnyark/civitai-shortcut/assets/40237431/b8673673-ea42-43ad-942f-15437fce6b26)
![screenshot 2023-09-15 201708](https://github.com/sunnyark/civitai-shortcut/assets/40237431/9f8f7ab3-245c-4878-b722-5cb7de2f1c9d)
![register_model_shortcut](https://github.com/sunnyark/civitai-shortcut/assets/40237431/a18cc188-0d7a-4860-91fa-b9b2b27f4bdc)
![register_model_direct](https://github.com/sunnyark/civitai-shortcut/assets/40237431/c6db4ced-9cec-4488-ac3f-9a17fadb42b8)

View File

@ -28,17 +28,18 @@ def on_ui(recipe_input, shortcut_input, civitai_tabs):
with gr.Column(scale=setting.shortcut_browser_screen_split_ratio):
with gr.Tabs() as civitai_shortcut_tabs:
with gr.TabItem("Register Shortcut"):
with gr.TabItem("Register Model"):
with gr.Row(visible=False):
register_information_only = gr.Checkbox(label="Register only model information", value=False)
with gr.Row():
with gr.Column():
gr.Markdown(value="Using the model URL from the Civitai site, you register the information of the model. You can click and drag the Civitai Model's URL or drag and drop a saved internet shortcut. Additionally, you can select multiple internet shortcuts and drop them all at once.", visible=True)
civitai_internet_url_txt = gr.Textbox(placeholder="Copy & Paste or Drag & Drop Civitai Model Url", show_label=False, interactive=True)
civitai_internet_url = gr.File(label="Civitai Internet Shortcut", file_count="multiple", file_types=[".url"])
update_modelfolder_btn = gr.Button(value="Update Downloaded Model Information", variant="primary")
gr.Markdown(value="If you have made direct modifications(e.g. moving or renaming a folder) to the downloaded model during runtime, please execute the \"Update Downloaded Model Information\" function, which rescans the downloaded model and updates its information accordingly. ", visible=True)
# update_modelfolder_btn = gr.Button(value="Update Downloaded Model Information", variant="primary")
# gr.Markdown(value="If you have made direct modifications(e.g. moving or renaming a folder) to the downloaded model during runtime, please execute the \"Update Downloaded Model Information\" function, which rescans the downloaded model and updates its information accordingly. ", visible=True)
with gr.TabItem("Shortcut Browser"):
with gr.TabItem("Model Browser"):
with gr.Row():
with gr.Column():
sc_gallery, refresh_sc_browser, refresh_sc_gallery = sc_browser_page.on_ui()
@ -125,7 +126,7 @@ def on_ui(recipe_input, shortcut_input, civitai_tabs):
scan_new_version_btn.click(on_scan_new_version_btn,shortcut_new_version_type,sc_new_version_gallery)
sc_gallery.select(on_sc_gallery_select, None, [sc_modelid], show_progress=False)
sc_new_version_gallery.select(on_sc_gallery_select, None, [sc_modelid], show_progress=False)
update_modelfolder_btn.click(on_update_modelfolder_btn_click,None,refresh_sc_browser)
# update_modelfolder_btn.click(on_update_modelfolder_btn_click,None,refresh_sc_browser)
civitai_shortcut_tabs.select(on_civitai_shortcut_tabs_select,None,[refresh_sc_browser,refresh_NSFW],show_progress=False)
update_informations.change(

View File

@ -146,7 +146,6 @@ def on_ui(shortcut_input):
refresh_gallery,
classification_gallery, # 이거는 None으로 할 필요는 gallery를 미선택으로 만드는 방법을 몰라서 일단 이렇게 해보자
shortcut_modelid
# shortcut_input
],
show_progress=False
)
@ -302,69 +301,24 @@ def on_ui(shortcut_input):
],
show_progress=False
)
# close_shortcut_model_information_btn.click(lambda :gr.update(visible=False),None,shortcut_model_information)
return refresh_classification
def get_model_information(modelid:str=None, versionid:str=None, ver_index:int=None):
# 현재 모델의 정보를 가져온다.
model_info = None
version_info = None
files = list()
if modelid:
model_info = ishortcut.get_model_info(modelid)
version_info = dict()
if model_info:
if not versionid and not ver_index:
if "modelVersions" in model_info.keys():
version_info = model_info["modelVersions"][0]
if version_info["id"]:
versionid = version_info["id"]
elif versionid:
if "modelVersions" in model_info.keys():
for ver in model_info["modelVersions"]:
if versionid == ver["id"]:
version_info = ver
else:
if "modelVersions" in model_info.keys():
if len(model_info["modelVersions"]) > 0:
version_info = model_info["modelVersions"][ver_index]
if version_info["id"]:
versionid = version_info["id"]
# 존재 하는지 판별하고 있다면 내용을 얻어낸다.
if model_info and version_info:
file_name = None
output_training = None
version_name = version_info["name"]
model_type = model_info['type']
model_basemodels = version_info["baseModel"]
versions_list = list()
for ver in model_info['modelVersions']:
versions_list.append(ver['name'])
if 'files' in version_info:
for file in version_info['files']:
files.append(file['name'])
if len(files) > 0:
file_name = files[0]
if 'trainedWords' in version_info:
output_training = ", ".join(version_info['trainedWords'])
title_name = f"# {model_info['name']} : {version_info['name']}"
return model_info,model_type,versionid,version_name,output_training,model_basemodels,versions_list,files,file_name,title_name
return None,None,None,None,None,None,None,None,None,None
def load_model_information(modelid=None, ver_index=None):
if modelid:
model_info,model_type,versionid,version_name,triger,model_basemodels,versions_list,files,file_name,title_name = get_model_information(modelid,None,ver_index)
if model_info:
return gr.update(value=setting.get_ui_typename(model_type)), gr.update(choices=versions_list,value=version_name), gr.update(choices=files,value=file_name), gr.update(value=triger), gr.update(label=title_name,visible=True)
if modelid:
model_info,version_info,versionid,version_name,model_type,model_basemodels,versions_list, dhtml, triger, files = ishortcut.get_model_information(modelid,None,ver_index)
if model_info:
flist = list()
for file in files:
flist.append(file['name'])
file_name = ''
if len(flist) > 0:
file_name = flist[0]
title_name = f"# {model_info['name']} : {version_name}"
return gr.update(value=setting.get_ui_typename(model_type)), gr.update(choices=versions_list,value=version_name), gr.update(choices=flist,value=file_name), gr.update(value=triger), gr.update(label=title_name,visible=True)
return None, None, None, gr.update(value=None), gr.update(label="#",visible=False)
def on_shortcut_modelid_change(modelid=None):
@ -519,23 +473,6 @@ def on_classification_gallery_loading(shortcuts, page=0):
current_time = datetime.datetime.now()
return gr.update(value=result_list), gr.update(minimum=1, value=cur_page, maximum=max_page, step=1, label=f"Total {max_page} Pages"), current_time
# def on_classification_gallery_select(evt: gr.SelectData, shortcuts, delete_opt=True):
# if evt.value:
# shortcut = evt.value
# sc_model_id = setting.get_modelid_from_shortcutname(shortcut)
# current_time = datetime.datetime.now()
# if not shortcuts:
# shortcuts = list()
# if delete_opt and sc_model_id in shortcuts:
# shortcuts.remove(sc_model_id)
# return shortcuts, current_time, None, gr.update(visible=False)
# return shortcuts, gr.update(visible=False), gr.update(visible=True), sc_model_id
# return shortcuts, gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)
def on_classification_gallery_select(evt: gr.SelectData, shortcuts, delete_opt=True):
if evt.value:
shortcut = evt.value

View File

@ -15,8 +15,8 @@ ALL_DOWNLOADED_MODEL = "All"
def on_ui(ex_shortcuts=None,search_open=True,user_shortcut_browser_search_up=None,user_shortcut_column=None, user_shortcut_rows_per_page=None):
shortcut_browser_search_up = setting.shortcut_browser_search_up
shortcut_column = setting.shortcut_column
shortcut_rows_per_page = setting.shortcut_rows_per_page
shortcut_column = setting.classification_shortcut_column
shortcut_rows_per_page = setting.classification_shortcut_rows_per_page
if user_shortcut_browser_search_up:
if user_shortcut_browser_search_up == "UP":
@ -31,15 +31,16 @@ def on_ui(ex_shortcuts=None,search_open=True,user_shortcut_browser_search_up=Non
shortcut_rows_per_page = user_shortcut_rows_per_page
thumb_list , thumb_totals, thumb_max_page = get_thumbnail_list(None,False,None,None,None,1,shortcut_column,shortcut_rows_per_page)
show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
if shortcut_browser_search_up:
if shortcut_browser_search_up:
with gr.Accordion("Search", open=search_open):
shortcut_type = gr.Dropdown(label='Filter Model Type', multiselect=True, choices=[k for k in setting.ui_typenames], interactive=True)
sc_search = gr.Textbox(label="Search", value="", placeholder="Search name, #tags, @personal note ....",interactive=True, lines=1)
sc_classification_list = gr.Dropdown(label='Classification',info="The selection options of classification are subject to the AND operation.", multiselect=True, choices=classification.get_list(), interactive=True)
shortcut_basemodel = gr.Dropdown(label='Filter Model BaseModel', multiselect=True, choices=[k for k in setting.model_basemodels.keys()], interactive=True)
show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
# show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
reset_filter_btn = gr.Button(value="Reset Filter",variant="primary")
sc_gallery_page = gr.Slider(minimum=1, maximum=thumb_max_page, value=1, step=1, label=f"Total {thumb_max_page} Pages", interactive=True, visible=True if shortcut_rows_per_page > 0 else False)
@ -59,7 +60,7 @@ def on_ui(ex_shortcuts=None,search_open=True,user_shortcut_browser_search_up=Non
sc_search = gr.Textbox(label="Search", value="", placeholder="Search name, #tags, @personal note ....",interactive=True, lines=1)
sc_classification_list = gr.Dropdown(label='Classification',info="The selection options of classification are subject to the AND operation.", multiselect=True, choices=classification.get_list(), interactive=True)
shortcut_basemodel = gr.Dropdown(label='Filter Model BaseModel', multiselect=True, choices=[k for k in setting.model_basemodels.keys()], interactive=True)
show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
# show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
reset_filter_btn = gr.Button(value="Reset Filter",variant="primary")
with gr.Row(visible=False):

View File

@ -15,6 +15,162 @@ from . import classification
from PIL import Image
thumbnail_max_size = (400, 400)
def get_model_information(modelid:str=None, versionid:str=None, ver_index:int=None):
# 현재 모델의 정보를 가져온다.
model_info = None
version_info = None
if modelid:
model_info = get_model_info(modelid)
version_info = dict()
if model_info:
if not versionid and not ver_index:
if "modelVersions" in model_info.keys():
version_info = model_info["modelVersions"][0]
if version_info["id"]:
versionid = version_info["id"]
elif versionid:
if "modelVersions" in model_info.keys():
for ver in model_info["modelVersions"]:
if versionid == ver["id"]:
version_info = ver
else:
if "modelVersions" in model_info.keys():
if len(model_info["modelVersions"]) > 0:
version_info = model_info["modelVersions"][ver_index]
if version_info["id"]:
versionid = version_info["id"]
# 존재 하는지 판별하고 있다면 내용을 얻어낸다.
if model_info and version_info:
version_name = version_info["name"]
model_type = model_info['type']
model_basemodels = version_info["baseModel"]
versions_list = list()
for ver in model_info['modelVersions']:
versions_list.append(ver['name'])
# model_basemodels.append(ver['baseModel'])
dhtml, triger, files = get_version_description(version_info, model_info)
return model_info,version_info,versionid,version_name,model_type,model_basemodels,versions_list,dhtml,triger,files
return None,None,None,None,None,None,None,None,None,None
def get_version_description_gallery(version_info):
modelid = None
versionid = None
ver_images = dict()
if not version_info:
return None, None
if "modelId" in version_info.keys():
modelid = str(version_info['modelId'])
if "id" in version_info.keys():
versionid = str(version_info['id'])
if "images" in version_info.keys():
ver_images = version_info['images']
images_url = list()
images_meta = list()
try:
for ver in ver_images:
description_img = setting.get_image_url_to_shortcut_file(modelid,versionid,ver['url'])
meta_string = ""
# NSFW filtering ....
if setting.NSFW_filtering_enable:
# if not setting.NSFW_level[ver["nsfw"]]:
if setting.NSFW_levels.index(ver["nsfw"]) > setting.NSFW_levels.index(setting.NSFW_level_user):
description_img = setting.nsfw_disable_image
meta_string = ""
if os.path.isfile(description_img):
meta_string = util.convert_civitai_meta_to_stable_meta(ver['meta'])
images_url.append(description_img)
images_meta.append(meta_string)
except:
return None, None
return images_url, images_meta
def get_version_description(version_info:dict,model_info:dict=None):
output_html = ""
output_training = ""
files = []
html_typepart = ""
html_creatorpart = ""
html_trainingpart = ""
html_modelpart = ""
html_versionpart = ""
html_descpart = ""
html_dnurlpart = ""
html_imgpart = ""
html_modelurlpart = ""
html_model_tags = ""
model_id = None
if version_info:
if 'modelId' in version_info:
model_id = version_info['modelId']
if not model_info:
model_info = get_model_info(model_id)
if version_info and model_info:
html_typepart = f"<br><b>Type: {model_info['type']}</b>"
model_url = civitai.Url_Page()+str(model_id)
html_modelpart = f'<br><b>Model: <a href="{model_url}" target="_blank">{model_info["name"]}</a></b>'
html_modelurlpart = f'<br><b><a href="{model_url}" target="_blank">Civitai Hompage << Here</a></b><br>'
model_version_name = version_info['name']
if 'trainedWords' in version_info:
output_training = ", ".join(version_info['trainedWords'])
html_trainingpart = f'<br><b>Training Tags:</b> {output_training}'
model_uploader = model_info['creator']['username']
html_creatorpart = f"<br><b>Uploaded by:</b> {model_uploader}"
html_descpart = f"<br><b>Version : {version_info['name']}</b><br> BaseModel : {version_info['baseModel']}<br>"
if 'description' in version_info:
if version_info['description']:
html_descpart = html_descpart + f"<b>Description</b><br>{version_info['description']}<br>"
if 'tags' in model_info:
model_tags = model_info["tags"]
if len(model_tags) > 0:
html_model_tags = "<br><b>Model Tags:</b>"
for tag in model_tags:
html_model_tags = html_model_tags + f"<b> [{tag}]</b>"
if 'description' in model_info:
if model_info['description']:
html_descpart = html_descpart + f"<br><b>Description</b><br>{model_info['description']}<br>"
html_versionpart = f"<br><b>Version:</b> {model_version_name}"
if 'files' in version_info:
for file in version_info['files']:
files.append(file)
html_dnurlpart = html_dnurlpart + f"<br><a href={file['downloadUrl']}><b>Download << Here</b></a>"
output_html = html_typepart + html_modelpart + html_versionpart + html_creatorpart + html_trainingpart + "<br>" + html_model_tags + "<br>" + html_modelurlpart + html_dnurlpart + "<br>" + html_descpart + "<br>" + html_imgpart
return output_html, output_training, files
return "", None, None
def sort_shortcut_by_value(ISC, key, reverse=False):
sorted_data = sorted(ISC.items(), key=lambda x: x[1][key], reverse=reverse)

View File

@ -17,10 +17,7 @@ from . import downloader
def on_ui(refresh_sc_browser:gr.Textbox(), recipe_input):
with gr.Column(scale=3):
with gr.Accordion("#", open=True) as model_title_name:
# with gr.Row():
# nsfw_level = gr.Dropdown(label="NSFW LEVEL", choices=["None","Soft","Mature","X"], interactive=True, value="None")
# with gr.Row():
with gr.Accordion("#", open=True) as model_title_name:
versions_list = gr.Dropdown(label="Model Version", choices=[setting.NORESULT], interactive=True, value=setting.NORESULT)
with gr.Tabs():
@ -34,7 +31,6 @@ def on_ui(refresh_sc_browser:gr.Textbox(), recipe_input):
with gr.TabItem("Description" , id="Model_Description"):
description_html = gr.HTML()
with gr.TabItem("Download" , id="Model_Download"):
# gr.Markdown("Downloadable Files")
gr.Markdown("When you click on the file name, an information window appears where you can change the file name.")
downloadable_files = gr.DataFrame(
headers=["","ID","Filename","Type","SizeKB","Primary","DownloadUrl"],
@ -61,11 +57,10 @@ def on_ui(refresh_sc_browser:gr.Textbox(), recipe_input):
with gr.Row():
with gr.Column(scale=2):
ms_foldername = gr.Textbox(label="Model folder name for the downloaded model. Please set it to the desired name.", value="", interactive=True, lines=1, visible=True, container=True)
# ms_foldername = gr.Dropdown(label='This is the name for the model folder to be created. You can either choose from the suggested names or enter your own.', multiselect=False, choices=None, value=None, interactive=True, allow_custom_value=True)
with gr.Column(scale=1):
ms_suggestedname = gr.Dropdown(label='Suggested names', multiselect=False, choices=None, value=None, interactive=True)
vs_folder = gr.Checkbox(label="Create separate independent folders for each version under the generated model folder.", value=False, visible=True , interactive=True)
vs_folder = gr.Checkbox(label="Create separate independent folders for each version under the generated model folder. You can change it to the desired folder name.", value=False, visible=True , interactive=True)
vs_foldername = gr.Textbox(label="Folder name to create", value="", show_label=False, interactive=True, lines=1, visible=False, container=True)
download_model = gr.Button(value="Download", variant="primary")
@ -737,11 +732,11 @@ def on_file_gallery_loading(image_url):
chk_image_url = [img if os.path.isfile(img) else setting.no_card_preview_image for img in image_url]
return chk_image_url, chk_image_url
return None, None
def load_saved_model(modelid=None, ver_index=None):
if modelid:
model_info,versionid,version_name,model_url,downloaded_versions,model_type,model_basemodels,versions_list,dhtml,triger,files,title_name,images_url,images_meta,vs_foldername = get_model_information(modelid,None,ver_index)
if model_info:
model_info,version_info,versionid,version_name,model_type,model_basemodels,versions_list, dhtml, triger, files = ishortcut.get_model_information(modelid,None,ver_index)
if model_info:
downloaded_info = None
is_downloaded = False
is_visible_openfolder = False
@ -828,7 +823,7 @@ def load_saved_model(modelid=None, ver_index=None):
suggested_names.extend(tags)
# util.printD(suggested_names)
downloaded_versions = model.get_model_downloaded_versions(modelid)
if downloaded_versions:
downloaded_info = "\n".join(downloaded_versions.values())
@ -849,6 +844,11 @@ def load_saved_model(modelid=None, ver_index=None):
downloadable.append(['',file['id'],file['name'],file['type'],round(file['sizeKB']),primary,file['downloadUrl']])
note = ishortcut.get_shortcut_model_note(modelid)
title_name = f"# {model_info['name']} : {version_name}"
vs_foldername = setting.generate_version_foldername(model_info['name'],version_name,versionid)
model_url = civitai.Url_Page() + str(modelid)
images_url, images_meta = ishortcut.get_version_description_gallery(version_info)
return gr.update(value=versionid),gr.update(value=model_url),\
gr.update(visible = is_downloaded),gr.update(value=downloaded_info),\
@ -880,169 +880,7 @@ def load_saved_model(modelid=None, ver_index=None):
gr.update(value=None),\
gr.update(visible=False),\
gr.update(choices=None, value=None),\
gr.update(value=None)
def get_model_information(modelid:str=None, versionid:str=None, ver_index:int=None):
# 현재 모델의 정보를 가져온다.
model_info = None
version_info = None
if modelid:
model_info = ishortcut.get_model_info(modelid)
version_info = dict()
if model_info:
if not versionid and not ver_index:
if "modelVersions" in model_info.keys():
version_info = model_info["modelVersions"][0]
if version_info["id"]:
versionid = version_info["id"]
elif versionid:
if "modelVersions" in model_info.keys():
for ver in model_info["modelVersions"]:
if versionid == ver["id"]:
version_info = ver
else:
if "modelVersions" in model_info.keys():
if len(model_info["modelVersions"]) > 0:
version_info = model_info["modelVersions"][ver_index]
if version_info["id"]:
versionid = version_info["id"]
# 존재 하는지 판별하고 있다면 내용을 얻어낸다.
if model_info and version_info:
version_name = version_info["name"]
model_type = model_info['type']
model_basemodels = version_info["baseModel"]
downloaded_versions = model.get_model_downloaded_versions(modelid)
versions_list = list()
for ver in model_info['modelVersions']:
versions_list.append(ver['name'])
# model_basemodels.append(ver['baseModel'])
model_url = civitai.Url_Page() + str(modelid)
dhtml, triger, files = get_version_description(version_info,model_info)
title_name = f"# {model_info['name']} : {version_info['name']}"
images_url, images_meta = get_version_description_gallery(version_info)
vs_foldername = setting.generate_version_foldername(model_info['name'],version_name,versionid)
return model_info,versionid,version_name,model_url,downloaded_versions,model_type,model_basemodels,versions_list,dhtml,triger,files,title_name,images_url,images_meta, vs_foldername
return None,None,None,None,None,None,None,None,None,None,None,None,None,None,None
def get_version_description_gallery(version_info):
modelid = None
versionid = None
ver_images = dict()
if not version_info:
return None, None
if "modelId" in version_info.keys():
modelid = str(version_info['modelId'])
if "id" in version_info.keys():
versionid = str(version_info['id'])
if "images" in version_info.keys():
ver_images = version_info['images']
images_url = list()
images_meta = list()
try:
for ver in ver_images:
description_img = setting.get_image_url_to_shortcut_file(modelid,versionid,ver['url'])
meta_string = ""
# NSFW filtering ....
if setting.NSFW_filtering_enable:
# if not setting.NSFW_level[ver["nsfw"]]:
if setting.NSFW_levels.index(ver["nsfw"]) > setting.NSFW_levels.index(setting.NSFW_level_user):
description_img = setting.nsfw_disable_image
meta_string = ""
if os.path.isfile(description_img):
meta_string = util.convert_civitai_meta_to_stable_meta(ver['meta'])
images_url.append(description_img)
images_meta.append(meta_string)
except:
return None, None
return images_url, images_meta
def get_version_description(version_info:dict,model_info:dict=None):
output_html = ""
output_training = ""
files = []
html_typepart = ""
html_creatorpart = ""
html_trainingpart = ""
html_modelpart = ""
html_versionpart = ""
html_descpart = ""
html_dnurlpart = ""
html_imgpart = ""
html_modelurlpart = ""
html_model_tags = ""
model_id = None
if version_info:
if 'modelId' in version_info:
model_id = version_info['modelId']
if not model_info:
model_info = ishortcut.get_model_info(model_id)
if version_info and model_info:
html_typepart = f"<br><b>Type: {model_info['type']}</b>"
model_url = civitai.Url_Page()+str(model_id)
html_modelpart = f'<br><b>Model: <a href="{model_url}" target="_blank">{model_info["name"]}</a></b>'
html_modelurlpart = f'<br><b><a href="{model_url}" target="_blank">Civitai Hompage << Here</a></b><br>'
model_version_name = version_info['name']
if 'trainedWords' in version_info:
output_training = ", ".join(version_info['trainedWords'])
html_trainingpart = f'<br><b>Training Tags:</b> {output_training}'
model_uploader = model_info['creator']['username']
html_creatorpart = f"<br><b>Uploaded by:</b> {model_uploader}"
html_descpart = f"<br><b>Version : {version_info['name']}</b><br> BaseModel : {version_info['baseModel']}<br>"
if 'description' in version_info:
if version_info['description']:
html_descpart = html_descpart + f"<b>Description</b><br>{version_info['description']}<br>"
if 'tags' in model_info:
model_tags = model_info["tags"]
if len(model_tags) > 0:
html_model_tags = "<br><b>Model Tags:</b>"
for tag in model_tags:
html_model_tags = html_model_tags + f"<b> [{tag}]</b>"
if 'description' in model_info:
if model_info['description']:
html_descpart = html_descpart + f"<br><b>Description</b><br>{model_info['description']}<br>"
html_versionpart = f"<br><b>Version:</b> {model_version_name}"
if 'files' in version_info:
for file in version_info['files']:
files.append(file)
html_dnurlpart = html_dnurlpart + f"<br><a href={file['downloadUrl']}><b>Download << Here</b></a>"
output_html = html_typepart + html_modelpart + html_versionpart + html_creatorpart + html_trainingpart + "<br>" + html_model_tags + "<br>" + html_modelurlpart + html_dnurlpart + "<br>" + html_descpart + "<br>" + html_imgpart
return output_html, output_training, files
return "", None, None
gr.update(value=None)
def upload_shortcut_by_files(files, register_information_only, progress):
modelids = list()

View File

@ -120,85 +120,3 @@ def get_model_path()->dict:
return models, infopaths
return None,None
# def get_version_images(versionid:str):
# if not Downloaded_Versions:
# return
# file_list = list()
# vfolder = None
# if versionid in Downloaded_Versions.keys():
# path = Downloaded_Versions[versionid]
# vinfo = get_version_info(versionid)
# base = downloader.get_save_base_name(vinfo)
# try:
# vfolder , vfile = os.path.split(path)
# for file in os.listdir(vfolder):
# if os.path.isdir(file):
# continue
# if file.endswith(setting.preview_image_ext) and file.startswith(base):
# file_list.append(os.path.join(vfolder, file))
# except:
# return
# return file_list if len(file_list) > 0 else None
# def get_model_info(modelid):
# def_info = None
# versions_list = None
# model_info = None
# if modelid:
# if Downloaded_Models:
# if str(modelid) in Downloaded_Models.keys():
# file_list = dict()
# for vid, version_paths in Downloaded_Models[str(modelid)]:
# file_list[os.path.basename(version_paths)] = version_paths
# versions_list = list()
# for file,path in file_list.items():
# vinfo = util.read_json(path)
# if vinfo:
# versions_list.append(vinfo)
# if not def_info:
# def_info = vinfo
# if def_info:
# if "model" in def_info.keys():
# model_info = dict()
# creator = dict()
# creator['username'] =""
# creator['image'] = ""
# model_info['type'] = def_info['model']['type']
# model_info['id'] = def_info['modelId']
# model_info['name'] = def_info['model']['name']
# model_info['creator'] = creator
# model_info['description'] = ""
# model_info['tags'] = ""
# model_info['modelVersions'] = versions_list
# # 모델 인포 를 만들어준다.
# return model_info
# def get_version_info(versionid:str)->dict:
# if not versionid:
# return None
# if not Downloaded_Versions:
# return None
# try:
# return util.read_json(Downloaded_Versions[versionid])
# except:
# pass
# return None
# def get_primary_file_by_version_info(version_info:dict)->dict:
# if not version_info:
# return
# for file in version_info['files']:
# if file['primary']:
# return file
# return

View File

@ -53,7 +53,7 @@ def on_ui(recipe_input, shortcut_input, civitai_tabs):
pass
recipe_classification = gr.Dropdown(label="Prompt Recipe Classification", choices=[setting.PLACEHOLDER] + recipe.get_classifications(), value=setting.PLACEHOLDER, info="You can choose from a list or enter manually. If you enter a classification that didn't exist before, a new classification will be created." ,interactive=True, allow_custom_value=True)
with gr.TabItem("Additional Shortcut Models for Reference"):
reference_sc_gallery, refresh_reference_sc_browser, refresh_reference_sc_gallery = sc_browser_page.on_ui(False,"DOWN",8,4)
reference_sc_gallery, refresh_reference_sc_browser, refresh_reference_sc_gallery = sc_browser_page.on_ui(False,"DOWN",setting.prompt_reference_shortcut_column,setting.prompt_reference_shortcut_rows_per_page)
with gr.Row():
recipe_create_btn = gr.Button(value="Create", variant="primary")
recipe_update_btn = gr.Button(value="Update", variant="primary", visible=False)
@ -420,62 +420,9 @@ def on_ui(recipe_input, shortcut_input, civitai_tabs):
return refresh_recipe
def get_model_information(modelid:str=None, versionid:str=None, ver_index:int=None):
# 현재 모델의 정보를 가져온다.
model_info = None
version_info = None
files = list()
if modelid:
model_info = ishortcut.get_model_info(modelid)
version_info = dict()
if model_info:
if not versionid and not ver_index:
if "modelVersions" in model_info.keys():
version_info = model_info["modelVersions"][0]
if version_info["id"]:
versionid = version_info["id"]
elif versionid:
if "modelVersions" in model_info.keys():
for ver in model_info["modelVersions"]:
if versionid == ver["id"]:
version_info = ver
else:
if "modelVersions" in model_info.keys():
if len(model_info["modelVersions"]) > 0:
version_info = model_info["modelVersions"][ver_index]
if version_info["id"]:
versionid = version_info["id"]
# 존재 하는지 판별하고 있다면 내용을 얻어낸다.
if model_info and version_info:
file_name = None
output_training = None
version_name = version_info["name"]
model_type = model_info['type']
model_basemodels = version_info["baseModel"]
versions_list = list()
for ver in model_info['modelVersions']:
versions_list.append(ver['name'])
if 'files' in version_info:
for file in version_info['files']:
files.append(file['name'])
if len(files) > 0:
file_name = files[0]
if 'trainedWords' in version_info:
output_training = ", ".join(version_info['trainedWords'])
title_name = f"# {model_info['name']} : {version_info['name']}"
return model_info,model_type,versionid,version_name,output_training,model_basemodels,versions_list,files,file_name,title_name
return None,None,None,None,None,None,None,None,None,None
def load_model_information(modelid=None, ver_index=None):
if modelid:
model_info,model_type,versionid,version_name,triger,model_basemodels,versions_list,files,file_name,title_name = get_model_information(modelid,None,ver_index)
model_info,version_info,versionid,version_name,model_type,model_basemodels,versions_list, dhtml, triger, files = ishortcut.get_model_information(modelid,None,ver_index)
if model_info:
insert_btn_visible=False
weight_visible=False
@ -486,8 +433,18 @@ def load_model_information(modelid=None, ver_index=None):
triger_visible=True
elif model_type == 'TextualInversion':
insert_btn_visible=True
return gr.update(value=model_type),gr.update(value=setting.get_ui_typename(model_type)), gr.update(choices=versions_list,value=version_name), gr.update(choices=files,value=file_name), gr.update(value=triger,visible=triger_visible), \
flist = list()
for file in files:
flist.append(file['name'])
file_name = ''
if len(flist) > 0:
file_name = flist[0]
title_name = f"# {model_info['name']} : {version_name}"
return gr.update(value=model_type),gr.update(value=setting.get_ui_typename(model_type)), gr.update(choices=versions_list,value=version_name), gr.update(choices=flist,value=file_name), gr.update(value=triger,visible=triger_visible), \
gr.update(visible=weight_visible), gr.update(visible=insert_btn_visible), gr.update(label=title_name,visible=True)
return None, None, None, None, gr.update(value=None,visible=True),\
gr.update(visible=True), gr.update(visible=True), gr.update(label="#",visible=False)
@ -687,23 +644,6 @@ def on_recipe_input_change(recipe_input, shortcuts):
gr.update(choices=[setting.PLACEHOLDER] + recipe.get_classifications(), value=setting.PLACEHOLDER), gr.update(label=setting.NEWRECIPE),\
gr.update(visible=True), gr.update(visible=False),\
shortcuts,None, None, gr.update(visible=False)
# def on_recipe_input_change(recipe_input, shortcuts):
# current_time = datetime.datetime.now()
# if recipe_input:
# return gr.update(value=""), recipe_input, recipe_input, current_time, None, \
# gr.update(selected="Recipe"),gr.update(selected="Prompt"),gr.update(selected="reference_image"),\
# gr.update(value=""), gr.update(value=""), \
# gr.update(choices=[setting.PLACEHOLDER] + recipe.get_classifications(), value=setting.PLACEHOLDER) ,gr.update(label=setting.NEWRECIPE),\
# gr.update(visible=True), gr.update(visible=False),\
# None, current_time
# return gr.update(visible=False),gr.update(visible=True),gr.update(visible=True),gr.update(visible=False),gr.update(visible=False),\
# gr.update(selected="Recipe"),gr.update(selected="Prompt"),gr.update(selected="reference_image"),\
# gr.update(value=""), gr.update(value=""), \
# gr.update(choices=[setting.PLACEHOLDER] + recipe.get_classifications(), value=setting.PLACEHOLDER), gr.update(label=setting.NEWRECIPE),\
# gr.update(visible=True), gr.update(visible=False),\
# shortcuts, gr.update(visible=False)
def on_recipe_drop_image_upload(recipe_img):
if recipe_img:

View File

@ -16,16 +16,16 @@ def on_ui():
reference_list, reference_totals, reference_max_page = get_recipe_reference_list(1)
recipe_gallery_page = gr.Slider(minimum=1, maximum=thumb_max_page, value=1, step=1, label=f"Total {thumb_max_page} Pages", interactive=True, visible=True)
recipe_gallery = gr.Gallery(value=thumb_list, columns=5, height="100%", object_fit=setting.gallery_thumbnail_image_style, preview=False, allow_preview=False, show_label=False)
recipe_gallery = gr.Gallery(value=thumb_list, columns=setting.prompt_shortcut_column, height="100%", object_fit=setting.gallery_thumbnail_image_style, preview=False, allow_preview=False, show_label=False)
with gr.Accordion(label="Search Recipe", open=True):
recipe_search = gr.Textbox(label="Search", value="", placeholder="Search name, #description ....",interactive=True, lines=1)
recipe_classification_list = gr.Dropdown(label="Filter Recipe Classification", choices=[setting.PLACEHOLDER] + recipe.get_classifications(), value=setting.PLACEHOLDER, interactive=True, multiselect=False)
with gr.Accordion(label="Filter Reference Shortcut Items", open=False):
recipe_reference_select_gallery = gr.Gallery(elem_id="recipe_select_reference_gallery", label="Filter Reference Models", columns=setting.shortcut_column, height="auto", object_fit=setting.gallery_thumbnail_image_style, preview=False, allow_preview=False)
recipe_reference_select_gallery = gr.Gallery(elem_id="recipe_select_reference_gallery", label="Filter Reference Models", columns=setting.prompt_shortcut_column, height="auto", object_fit=setting.gallery_thumbnail_image_style, preview=False, allow_preview=False)
recipe_reference_gallery_page = gr.Slider(minimum=1, maximum=reference_max_page, value=1, step=1, label=f"Total {reference_max_page} Pages", interactive=True, visible=True)
recipe_reference_gallery = gr.Gallery(value=reference_list, show_label=False, columns=5, height="100%", object_fit=setting.gallery_thumbnail_image_style, preview=False, allow_preview=False)
recipe_reference_gallery = gr.Gallery(value=reference_list, show_label=False, columns=setting.prompt_shortcut_column, height="100%", object_fit=setting.gallery_thumbnail_image_style, preview=False, allow_preview=False)
with gr.Row(visible=False):
# recipe_browser 갱신 트리거
@ -198,7 +198,7 @@ def get_recipe_reference_list(page = 0):
if total > 0:
# page 즉 페이징이 아닌 전체가 필요할때도 총페이지 수를 구할때도 있으므로..
# page == 0 은 전체 리스트를 반환한다
shortcut_count_per_page = setting.shortcut_column * setting.shortcut_rows_per_page
shortcut_count_per_page = setting.prompt_shortcut_column * setting.prompt_shortcut_rows_per_page
if shortcut_count_per_page > 0:
max_page = math.ceil(total / shortcut_count_per_page)
@ -270,7 +270,7 @@ def get_recipe_list(search=None, classification=None, shortcut=None, page = 0):
if total > 0:
# page 즉 페이징이 아닌 전체가 필요할때도 총페이지 수를 구할때도 있으므로..
# page == 0 은 전체 리스트를 반환한다
shortcut_count_per_page = setting.shortcut_column * setting.shortcut_rows_per_page
shortcut_count_per_page = setting.prompt_shortcut_column * setting.prompt_shortcut_rows_per_page
if shortcut_count_per_page > 0:
max_page = math.ceil(total / shortcut_count_per_page)

View File

@ -31,14 +31,16 @@ def on_ui(search_open=True,user_shortcut_browser_search_up=None,user_shortcut_co
shortcut_rows_per_page = user_shortcut_rows_per_page
thumb_list , thumb_totals, thumb_max_page = get_thumbnail_list(None,False,None,None,None,1,shortcut_column,shortcut_rows_per_page)
show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
if shortcut_browser_search_up:
with gr.Accordion("Search", open=search_open):
shortcut_type = gr.Dropdown(label='Filter Model Type', multiselect=True, choices=[k for k in setting.ui_typenames], interactive=True)
sc_search = gr.Textbox(label="Search", value="", placeholder="Search name, #tags, @personal note ....",interactive=True, lines=1)
sc_classification_list = gr.Dropdown(label='Classification',info="The selection options of classification are subject to the AND operation.", multiselect=True, choices=classification.get_list(), interactive=True)
shortcut_basemodel = gr.Dropdown(label='Filter Model BaseModel', multiselect=True, choices=[k for k in setting.model_basemodels.keys()], interactive=True)
show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
# show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
reset_filter_btn = gr.Button(value="Reset Filter",variant="primary")
sc_gallery_page = gr.Slider(minimum=1, maximum=thumb_max_page, value=1, step=1, label=f"Total {thumb_max_page} Pages", interactive=True, visible=True if shortcut_rows_per_page > 0 else False)
@ -56,7 +58,7 @@ def on_ui(search_open=True,user_shortcut_browser_search_up=None,user_shortcut_co
sc_search = gr.Textbox(label="Search", value="", placeholder="Search name, #tags, @personal note ....",interactive=True, lines=1)
sc_classification_list = gr.Dropdown(label='Classification',info="The selection options of classification are subject to the AND operation.", multiselect=True, choices=classification.get_list(), interactive=True)
shortcut_basemodel = gr.Dropdown(label='Filter Model BaseModel', multiselect=True, choices=[k for k in setting.model_basemodels.keys()], interactive=True)
show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
# show_downloaded_sc = gr.Dropdown(label='Filter Downloaded', multiselect=False, choices=[ALL_DOWNLOADED_MODEL,DOWNLOADED_MODEL,NOT_DOWNLOADED_MODEL], value=ALL_DOWNLOADED_MODEL, interactive=True)
reset_filter_btn = gr.Button(value="Reset Filter",variant="primary")
with gr.Row(visible=False):

View File

@ -12,7 +12,7 @@ extension_base = scripts.basedir()
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.68'}
Extensions_Name = "Civitai Shortcut"
Extensions_Version = "v1.6.6"
Extensions_Version = "v1.6.7"
PLACEHOLDER = "[No Select]"
NORESULT = "[No Result]"
@ -115,17 +115,28 @@ shortcut_browser_screen_split_ratio_max = 10
shortcut_browser_search_up = False
# 갤러리 ui설정
gallery_column = 7
# model browser 설정
shortcut_column = 5
# shortcut_count_per_page = 20
shortcut_rows_per_page = 4
classification_gallery_column = 8
classification_gallery_rows_per_page = 4
gallery_column = 7
# 유저 갤러리 설정
usergallery_images_column = 6
# usergallery_images_page_limit = 12
usergallery_images_rows_per_page = 2
# prompt recipe 설정
prompt_shortcut_column = 5
prompt_shortcut_rows_per_page = 4
prompt_reference_shortcut_column = 8
prompt_reference_shortcut_rows_per_page = 4
# classification 설정
classification_shortcut_column = 5
classification_shortcut_rows_per_page = 4
classification_gallery_column = 8
classification_gallery_rows_per_page = 4
shortcut_max_download_image_per_version = 0 # 버전당 최대 다운로드 이미지 수 , 0이면 전체다운 받는다
gallery_thumbnail_image_style = "scale-down"
@ -167,40 +178,6 @@ def set_NSFW(enable, level="None"):
NSFW_filtering_enable = enable
NSFW_level_user = level
# if level == "Soft":
# NSFW_level["None"] = True
# NSFW_level["Soft"] = True
# NSFW_level["Mature"] = False
# NSFW_level["X"] = False
# elif level == "Mature":
# NSFW_level["None"] = True
# NSFW_level["Soft"] = True
# NSFW_level["Mature"] = True
# NSFW_level["X"] = False
# elif level == "X":
# NSFW_level["None"] = True
# NSFW_level["Soft"] = True
# NSFW_level["Mature"] = True
# NSFW_level["X"] = True
# else:
# # level == 1
# NSFW_level["None"] = True
# NSFW_level["Soft"] = False
# NSFW_level["Mature"] = False
# NSFW_level["X"] = False
# def get_NSFW_Level():
# return NSFW_level_user
# prev = "None"
# for level, v in NSFW_level.items():
# if not v:
# return prev
# else:
# prev = level
# return prev
def save_NSFW():
global NSFW_filtering_enable
@ -250,10 +227,18 @@ def load_data():
global shortcut_column
global shortcut_rows_per_page
global gallery_column
global classification_shortcut_column
global classification_shortcut_rows_per_page
global classification_gallery_column
global classification_gallery_rows_per_page
global usergallery_images_column
global usergallery_images_rows_per_page
global prompt_shortcut_column
global prompt_shortcut_rows_per_page
global prompt_reference_shortcut_column
global prompt_reference_shortcut_rows_per_page
global shortcut_max_download_image_per_version
global gallery_thumbnail_image_style
global shortcut_browser_search_up
@ -318,6 +303,11 @@ def load_data():
if "gallery_column" in image_style.keys():
gallery_column = int(image_style['gallery_column'])
if "classification_shortcut_column" in image_style.keys():
classification_shortcut_column = int(image_style['classification_shortcut_column'])
if "classification_shortcut_rows_per_page" in image_style.keys():
classification_shortcut_rows_per_page = int(image_style['classification_shortcut_rows_per_page'])
if "classification_gallery_column" in image_style.keys():
classification_gallery_column = int(image_style['classification_gallery_column'])
if "classification_gallery_rows_per_page" in image_style.keys():
@ -327,7 +317,16 @@ def load_data():
usergallery_images_column = int(image_style['usergallery_images_column'])
if "usergallery_images_rows_per_page" in image_style.keys():
usergallery_images_rows_per_page = int(image_style['usergallery_images_rows_per_page'])
if "prompt_shortcut_column" in image_style.keys():
prompt_shortcut_column = int(image_style['prompt_shortcut_column'])
if "prompt_shortcut_rows_per_page" in image_style.keys():
prompt_shortcut_rows_per_page = int(image_style['prompt_shortcut_rows_per_page'])
if "prompt_reference_shortcut_column" in image_style.keys():
prompt_reference_shortcut_column = int(image_style['prompt_reference_shortcut_column'])
if "prompt_reference_shortcut_rows_per_page" in image_style.keys():
prompt_reference_shortcut_rows_per_page = int(image_style['prompt_reference_shortcut_rows_per_page'])
if "model_folders" in environment.keys():
user_folders = environment['model_folders']

View File

@ -18,35 +18,50 @@ def on_setting_ui():
with gr.Row():
with gr.Accordion("Screen Style", open=False):
with gr.Row():
scbrowser_screen_split_ratio = gr.Slider(minimum=0, maximum=setting.shortcut_browser_screen_split_ratio_max, value=setting.shortcut_browser_screen_split_ratio, step=1, info="You can specify the size ratio between the shortcut browser and the information screen.", label='Shortcut Browser screen ratio', interactive=True)
scbrowser_screen_split_ratio = gr.Slider(minimum=0, maximum=setting.shortcut_browser_screen_split_ratio_max, value=setting.shortcut_browser_screen_split_ratio, step=1, info="You can specify the size ratio between the shortcut browser and the information screen.", label='Model Browser screen ratio', interactive=True)
with gr.Row():
info_gallery_height = gr.Dropdown(choices=["auto"], value=setting.information_gallery_height, allow_custom_value=True, interactive=True, info="You can also specify a specific size other than 'auto'" , label="Information Gallery Height")
gallery_thumbnail_image_style = gr.Dropdown(choices=["scale-down","cover","contain","fill","none"], value=setting.gallery_thumbnail_image_style, interactive=True, info="This specifies the shape of the displayed thumbnail." , label="Gallery Thumbnail Image Style")
shortcut_browser_search_up = gr.Dropdown(choices=["Up","Down"], value="Up" if setting.shortcut_browser_search_up else "Down", interactive=True, label="Set the position of the search bar in the shortcut browser.", info="If you select 'Up', the search bar will be placed above the thumbnail pane.")
with gr.Row():
with gr.Accordion("Shortcut Browser and Information Images", open=False):
with gr.Row():
gallery_column = gr.Slider(minimum=1, maximum=14, value=setting.gallery_column, step=1, label='Model Information Image Counts per Row', interactive=True)
with gr.Row():
shortcut_column = gr.Slider(minimum=1, maximum=14, value=setting.shortcut_column, step=1, label='Shortcut Browser Thumbnail Counts per Row', interactive=True)
shortcut_rows_per_page = gr.Slider(minimum=0, maximum=14, value=setting.shortcut_rows_per_page, step=1, label='Shortcut Browser Thumbnails Rows per Page : setting it to 0 means displaying the entire list without a page.', interactive=True)
with gr.Row():
classification_gallery_column = gr.Slider(minimum=1, maximum=14, value=setting.classification_gallery_column, step=1, label='Classification Model Counts per Row', interactive=True)
classification_gallery_rows_per_page = gr.Slider(minimum=0, maximum=14, value=setting.classification_gallery_rows_per_page, step=1, label='Classification Model Rows per Page : setting it to 0 means displaying the entire list without a page.', interactive=True)
# with gr.Row():
# shortcut_max_download_image_per_version = gr.Slider(minimum=0, maximum=30, value=setting.shortcut_max_download_image_per_version, step=1,info="When registering a shortcut of a model, you can specify the maximum number of images to download. \n This is the maximum per version, and setting it to 0 means unlimited downloads.", label='Maximum number of download images per version', interactive=True)
# gr.Markdown(value="When registering a shortcut of a model, you can specify the maximum number of images to download. \n This is the maximum per version, and setting it to 0 means unlimited downloads.", visible=True)
with gr.Tabs():
with gr.TabItem("Model Browser and Model Information"):
with gr.Row():
shortcut_column = gr.Slider(minimum=1, maximum=14, value=setting.shortcut_column, step=1, label='Model Browser Thumbnail Counts per Row', interactive=True)
shortcut_rows_per_page = gr.Slider(minimum=0, maximum=14, value=setting.shortcut_rows_per_page, step=1, label='Model Browser Thumbnails Rows per Page : setting it to 0 means displaying the entire list without a page.', interactive=True)
with gr.Row():
gallery_column = gr.Slider(minimum=1, maximum=14, value=setting.gallery_column, step=1, label='Model Information Image Counts per Row', interactive=True)
with gr.TabItem("Civitai User Gallery"):
with gr.Row():
usergallery_images_column = gr.Slider(minimum=1, maximum=14, value=setting.usergallery_images_column, step=1, label='Civitai User Gallery Image Counts per Row', interactive=True)
usergallery_images_rows_per_page = gr.Slider(minimum=1, maximum=14, value=setting.usergallery_images_rows_per_page, step=1, label='Civitai User Gallery Image Rows Per Page', interactive=True)
with gr.Row():
usergallery_openfolder_btn = gr.Button(value="Open Civitai User Gallery Cache Folder", variant="primary")
with gr.Accordion("Clean User Gallery Cache", open=False):
usergallery_cleangallery_btn = gr.Button(value="Clean Civitai User Gallery Cache", variant="primary")
with gr.Row():
with gr.Accordion("User Gallery Images", open=False):
with gr.Row():
usergallery_images_column = gr.Slider(minimum=1, maximum=14, value=setting.usergallery_images_column, step=1, label='User Gallery Image Counts per Row', interactive=True)
usergallery_images_rows_per_page = gr.Slider(minimum=1, maximum=14, value=setting.usergallery_images_rows_per_page, step=1, label='User Gallery Image Rows Per Page', interactive=True)
with gr.Row():
usergallery_openfolder_btn = gr.Button(value="Open User Gallery Cache Folder", variant="primary")
with gr.Accordion("Clean User Gallery Cache", open=False):
usergallery_cleangallery_btn = gr.Button(value="Clean User Gallery Cache", variant="primary")
with gr.Tabs():
with gr.TabItem("Prompt Recipe"):
with gr.Row():
prompt_shortcut_column = gr.Slider(minimum=1, maximum=14, value=setting.prompt_shortcut_column, step=1, label='Prompt Recipe Browser Thumbnail Counts per Row', interactive=True)
prompt_shortcut_rows_per_page = gr.Slider(minimum=1, maximum=14, value=setting.prompt_shortcut_rows_per_page, step=1, label='Prompt Recipe Browser Thumbnails Rows per Page', interactive=True)
# with gr.TabItem("Shortcut Models for Reference"):
with gr.Row():
prompt_reference_shortcut_column = gr.Slider(minimum=1, maximum=14, value=setting.prompt_reference_shortcut_column, step=1, label='Reference\'s Models Browser Thumbnail Counts per Row', interactive=True)
prompt_reference_shortcut_rows_per_page = gr.Slider(minimum=1, maximum=14, value=setting.prompt_reference_shortcut_rows_per_page, step=1, label=' Reference\'s Models Browser Thumbnails Rows per Page', interactive=True)
with gr.Row():
with gr.Tabs():
with gr.TabItem("Classification"):
with gr.Row():
classification_shortcut_column = gr.Slider(minimum=1, maximum=14, value=setting.classification_shortcut_column, step=1, label='Classification\'s Model Browser Thumbnail Counts per Row', interactive=True)
classification_shortcut_rows_per_page = gr.Slider(minimum=0, maximum=14, value=setting.classification_shortcut_rows_per_page, step=1, label='Classification\'s Model Browser Thumbnails Rows per Page : setting it to 0 means displaying the entire list without a page.', interactive=True)
with gr.Row():
classification_gallery_column = gr.Slider(minimum=1, maximum=14, value=setting.classification_gallery_column, step=1, label='Classification Model Counts per Row', interactive=True)
classification_gallery_rows_per_page = gr.Slider(minimum=0, maximum=14, value=setting.classification_gallery_rows_per_page, step=1, label='Classification Model Rows per Page : setting it to 0 means displaying the entire list without a page.', interactive=True)
with gr.Row():
with gr.Accordion("Download Folder for Extensions", open=False):
@ -74,10 +89,18 @@ def on_setting_ui():
shortcut_column,
shortcut_rows_per_page,
gallery_column,
classification_shortcut_column,
classification_shortcut_rows_per_page,
classification_gallery_column,
classification_gallery_rows_per_page,
usergallery_images_column,
usergallery_images_rows_per_page,
usergallery_images_rows_per_page,
prompt_shortcut_column,
prompt_shortcut_rows_per_page,
prompt_reference_shortcut_column,
prompt_reference_shortcut_rows_per_page,
shortcut_max_download_image_per_version,
gallery_thumbnail_image_style,
shortcut_browser_search_up,
@ -116,10 +139,18 @@ def on_setting_ui():
shortcut_column,
shortcut_rows_per_page,
gallery_column,
classification_shortcut_column,
classification_shortcut_rows_per_page,
classification_gallery_column,
classification_gallery_rows_per_page,
usergallery_images_column,
usergallery_images_rows_per_page,
prompt_shortcut_column,
prompt_shortcut_rows_per_page,
prompt_reference_shortcut_column,
prompt_reference_shortcut_rows_per_page,
shortcut_max_download_image_per_version,
gallery_thumbnail_image_style,
shortcut_browser_search_up,
@ -138,8 +169,10 @@ def on_setting_ui():
def on_save_btn_click(shortcut_update_when_start,
scbrowser_screen_split_ratio, info_gallery_height,
shortcut_column, shortcut_rows_per_page,
gallery_column, classification_gallery_column, classification_gallery_rows_per_page, usergallery_images_column, usergallery_images_rows_per_page,
shortcut_column, shortcut_rows_per_page, gallery_column,
classification_shortcut_column, classification_shortcut_rows_per_page, classification_gallery_column, classification_gallery_rows_per_page,
usergallery_images_column, usergallery_images_rows_per_page,
prompt_shortcut_column, prompt_shortcut_rows_per_page, prompt_reference_shortcut_column, prompt_reference_shortcut_rows_per_page,
shortcut_max_download_image_per_version,
gallery_thumbnail_image_style,
shortcut_browser_search_up,
@ -148,8 +181,10 @@ def on_save_btn_click(shortcut_update_when_start,
save_setting(shortcut_update_when_start,
scbrowser_screen_split_ratio, info_gallery_height,
shortcut_column, shortcut_rows_per_page,
gallery_column, classification_gallery_column, classification_gallery_rows_per_page, usergallery_images_column, usergallery_images_rows_per_page,
shortcut_column, shortcut_rows_per_page, gallery_column,
classification_shortcut_column, classification_shortcut_rows_per_page, classification_gallery_column, classification_gallery_rows_per_page,
usergallery_images_column, usergallery_images_rows_per_page,
prompt_shortcut_column, prompt_shortcut_rows_per_page, prompt_reference_shortcut_column, prompt_reference_shortcut_rows_per_page,
shortcut_max_download_image_per_version,
gallery_thumbnail_image_style,
shortcut_browser_search_up,
@ -158,8 +193,10 @@ def on_save_btn_click(shortcut_update_when_start,
def save_setting(shortcut_update_when_start,
scbrowser_screen_split_ratio, info_gallery_height,
shortcut_column, shortcut_rows_per_page,
gallery_column, classification_gallery_column, classification_gallery_rows_per_page, usergallery_images_column, usergallery_images_rows_per_page,
shortcut_column, shortcut_rows_per_page, gallery_column,
classification_shortcut_column, classification_shortcut_rows_per_page, classification_gallery_column, classification_gallery_rows_per_page,
usergallery_images_column, usergallery_images_rows_per_page,
prompt_shortcut_column, prompt_shortcut_rows_per_page, prompt_reference_shortcut_column, prompt_reference_shortcut_rows_per_page,
shortcut_max_download_image_per_version,
gallery_thumbnail_image_style,
shortcut_browser_search_up,
@ -187,12 +224,20 @@ def save_setting(shortcut_update_when_start,
image_style['shortcut_rows_per_page'] = shortcut_rows_per_page
image_style['gallery_column'] = gallery_column
image_style['classification_shortcut_column'] = classification_shortcut_column
image_style['classification_shortcut_rows_per_page'] = classification_shortcut_rows_per_page
image_style['classification_gallery_column'] = classification_gallery_column
image_style['classification_gallery_rows_per_page'] = classification_gallery_rows_per_page
image_style['usergallery_images_column'] = usergallery_images_column
image_style['usergallery_images_rows_per_page'] = usergallery_images_rows_per_page
image_style['usergallery_images_rows_per_page'] = usergallery_images_rows_per_page
image_style['prompt_shortcut_column'] = prompt_shortcut_column
image_style['prompt_shortcut_rows_per_page'] = prompt_shortcut_rows_per_page
image_style['prompt_reference_shortcut_column'] = prompt_reference_shortcut_column
image_style['prompt_reference_shortcut_rows_per_page'] = prompt_reference_shortcut_rows_per_page
environment['image_style'] = image_style
model_folders = dict()
@ -257,10 +302,16 @@ def on_refresh_setting_change():
setting.shortcut_column,\
setting.shortcut_rows_per_page,\
setting.gallery_column,\
setting.classification_shortcut_column,\
setting.classification_shortcut_rows_per_page,\
setting.classification_gallery_column,\
setting.classification_gallery_rows_per_page,\
setting.usergallery_images_column,\
setting.usergallery_images_rows_per_page,\
setting.prompt_shortcut_column,\
setting.prompt_shortcut_rows_per_page,\
setting.prompt_reference_shortcut_column,\
setting.prompt_reference_shortcut_rows_per_page,\
setting.shortcut_max_download_image_per_version,\
setting.gallery_thumbnail_image_style,\
"Up" if setting.shortcut_browser_search_up else "Down",\

View File

@ -12,48 +12,6 @@ from modules import scripts, script_callbacks, shared
from . import setting
from tqdm import tqdm
# from modules import images
# def run_pnginfo(image, image_path, image_file_name):
# if image is None:
# return '', '', '', '', ''
# try:
# geninfo, items = images.read_info_from_image(image)
# items = {**{'parameters': geninfo}, **items}
# info = ''
# for key, text in items.items():
# info += f"""
# <div>
# <p><b>{plaintext_to_html(str(key))}</b></p>
# <p>{plaintext_to_html(str(text))}</p>
# </div>
# """.strip()+"\n"
# except UnidentifiedImageError as e:
# geninfo = None
# info = ""
# if geninfo is None:
# try:
# filename = os.path.splitext(image_file_name)[0] + ".txt"
# geninfo = ""
# with open(filename) as f:
# for line in f:
# geninfo += line
# except Exception:
# logger.warning(f"run_pnginfo: No EXIF in image or txt file")
# if openoutpaint:
# prompt, neg_prompt = wib_db.select_prompts(image_file_name)
# if prompt == "0":
# prompt = ""
# if neg_prompt == "0":
# neg_prompt = ""
# else:
# prompt = ""
# neg_prompt = ""
# return '', geninfo, info, prompt, neg_prompt
def printD(msg):
print(f"{setting.Extensions_Name}: {msg}")
@ -188,66 +146,6 @@ def get_search_keyword(search:str):
keys.append(word)
return keys if len(keys) > 0 else None, tags if len(tags) > 0 else None, notes if len(notes) > 0 else None
# def get_search_keyword(search:str):
# tags = []
# keys = []
# clfs = []
# if not search:
# return None , None, None
# for word in search.split(","):
# word = word.strip()
# if word.startswith("#"):
# if len(word) > 1:
# tag = word[1:].lower()
# if tag not in tags:
# tags.append(tag)
# elif word.startswith("@"):
# if len(word) > 1:
# clf = word[1:]
# if clf not in clfs:
# clfs.append(clf)
# else:
# word = word.lower()
# if word not in keys:
# keys.append(word)
# return keys if len(keys) > 0 else None, tags if len(tags) > 0 else None, clfs if len(clfs) > 0 else None
# def get_search_keyword(search:str):
# tags = []
# keys = []
# clfs = []
# filenames = []
# if not search:
# return None , None, None
# for word in search.split(","):
# word = word.strip()
# if word.startswith("#"):
# if len(word) > 1:
# tag = word[1:].lower()
# if tag not in tags:
# tags.append(tag)
# elif word.startswith("@"):
# if len(word) > 1:
# clf = word[1:]
# if clf not in clfs:
# clfs.append(clf)
# elif word.startswith("!"):
# if len(word) > 1:
# filename = word[1:].lower()
# if filename not in filenames:
# filenames.append(filename)
# else:
# word = word.lower()
# if word not in keys:
# keys.append(word)
# return keys if len(keys) > 0 else None, tags if len(tags) > 0 else None, clfs if len(clfs) > 0 else None, filenames if len(filenames) > 0 else None
def read_json(path)->dict:
contents = None
@ -281,40 +179,6 @@ def scan_folder_for_info(folder):
return None
return info_list
# def make_version_folder(version_info, vs_folder=True, vs_foldername=None, ms_foldername=None):
# if not version_info:
# return
# if "model" not in version_info.keys():
# return
# content_type = version_info['model']['type']
# if not ms_foldername:
# ms_foldername = version_info['model']['name']
# elif len(ms_foldername.strip()) <= 0:
# ms_foldername = version_info['model']['name']
# ms_foldername = ms_foldername.strip()
# model_folder = setting.generate_model_foldername(content_type, ms_foldername)
# if not model_folder:
# return
# if vs_folder:
# if not vs_foldername:
# vs_foldername = setting.generate_version_foldername(ms_foldername,version_info['name'],version_info['id'])
# elif len(vs_foldername.strip()) <= 0:
# vs_foldername = setting.generate_version_foldername(ms_foldername,version_info['name'],version_info['id'])
# model_folder = os.path.join(model_folder, replace_dirname(vs_foldername.strip()))
# if not os.path.exists(model_folder):
# os.makedirs(model_folder)
# return model_folder
def get_download_image_folder(ms_foldername):
@ -347,44 +211,6 @@ def make_download_image_folder(ms_foldername):
return model_folder
# 다정하면 임의의 분류뒤에 모델폴더를 생성하고 그뒤에 버전까지 생성가능
# def make_download_model_folder(version_info, ms_folder=True, vs_folder=True, vs_foldername=None, cs_foldername=None):
# if not version_info:
# return
# if "model" not in version_info.keys():
# return
# content_type = version_info['model']['type']
# ms_foldername = version_info['model']['name']
# model_folder = setting.generate_type_basefolder(content_type)
# if not model_folder:
# return
# if not cs_foldername and not ms_folder:
# return
# if cs_foldername:
# model_folder = os.path.join(model_folder, replace_dirname(cs_foldername.strip()))
# if ms_folder:
# model_folder = os.path.join(model_folder, replace_dirname(ms_foldername.strip()))
# if vs_folder:
# if not vs_foldername:
# vs_foldername = setting.generate_version_foldername(ms_foldername,version_info['name'],version_info['id'])
# elif len(vs_foldername.strip()) <= 0:
# vs_foldername = setting.generate_version_foldername(ms_foldername,version_info['name'],version_info['id'])
# model_folder = os.path.join(model_folder, replace_dirname(vs_foldername.strip()))
# if not os.path.exists(model_folder):
# os.makedirs(model_folder)
# return model_folder
def make_download_model_folder(version_info, ms_folder=True, vs_folder=True, vs_foldername=None, cs_foldername=None, ms_foldername=None):
if not version_info:
@ -440,21 +266,6 @@ def write_InternetShortcut(path, url):
return False
return True
# def load_InternetShortcut(path)->str:
# urls = ""
# try:
# with open(path, 'r') as f:
# #with open(path, 'r', encoding='utf8') as f:
# content = f.readlines()
# for line in content:
# if line.startswith('URL='):
# urls = line[4:]
# except Exception as e:
# printD(e)
# return
# return urls.strip()
def load_InternetShortcut(path)->str:
urls = list()
try:
@ -477,31 +288,6 @@ def get_full_size_image_url(image_url, width):
def change_width_from_image_url(image_url, width):
return re.sub('/width=\d+/', '/width=' + str(width) + '/', image_url)
# get id from url
# def get_model_id_from_url(url):
# id = ""
# if not url:
# return ""
# if url.isnumeric():
# # is already an id
# id = str(url)
# return id
# s = url.split("/")
# if len(s) < 2:
# return ""
# if s[-2].isnumeric():
# id = s[-2]
# elif s[-1].isnumeric():
# id = s[-1]
# else:
# return ""
# return id
def get_model_id_from_url(url):
if not url:
return ""

View File

@ -45,7 +45,7 @@ def civitai_shortcut_ui():
recipe_input = gr.Textbox()
shortcut_input = gr.Textbox()
with gr.TabItem("Civitai Shortcut" , id="Shortcut"):
with gr.TabItem("Model Browser" , id="Shortcut"):
with gr.Row():
refresh_civitai_sc_browser, refresh_civitai_information = civitai_shortcut_action.on_ui(recipe_input, shortcut_input, civitai_tabs)