Skip to content

Commit

Permalink
Update to v1.13
Browse files Browse the repository at this point in the history
  • Loading branch information
BlafKing committed Sep 29, 2023
1 parent 0f26dcb commit 73f84dd
Show file tree
Hide file tree
Showing 7 changed files with 155 additions and 47 deletions.
22 changes: 18 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,31 @@ https://github.com/BlafKing/sd-civitai-browser/assets/9644716/ea873c3e-a7e4-44a8

# Changelog 📋

<h3>v1.13</h3>

* Feature: Updated available content types:
- Upscaler
- MotionModule
- Wildcards
- Workflows
- Other
* Feature: Videos can now also be displayed on preview cards and in the model info.
* Feature: Automatically scans upscaler type by looking through model's description.
* Feature: Automatically identify correct folder for wildcards based on extension.
* Bug fix: Version ID got saved instead of correct Model ID after download.

---
<h3>v1.12.5</h3>

* Bug fix: [Installed] tag was only assigned to latest installed version.
* Bug fix: Folder location didn't update when selecting different version/file
* Bug fix: Version scanning didn't properly scan sha256 in uppercase
* Bug fix: Folder location didn't update when selecting different version/file.
* Bug fix: Version scanning didn't properly scan sha256 in uppercase.

---
<h3>v1.12.4</h3>

* Feature: You can now refresh by pressing Ctrl+Enter and Alt+Enter
* Bug fix: Auto unpack feature was unpacking unintended archives, now only unpacks .zip
* Feature: You can now refresh by pressing Ctrl+Enter and Alt+Enter.
* Bug fix: Auto unpack feature was unpacking unintended archives, now only unpacks .zip.

---
<h3>v1.12.3</h3>
Expand Down
14 changes: 12 additions & 2 deletions javascript/civitai-html.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ function select_model(model_name) {

function updateCardSize(width, height) {
var styleSheet = document.styleSheets[0];
var imgKeyframes = `width: ${width}em !important; height: ${height}em !important;`;
var dimensionsKeyframes = `width: ${width}em !important; height: ${height}em !important;`;

var fontSize = (width / 8) * 100;
var textKeyframes = `font-size: ${fontSize}% !important;`;

addOrUpdateRule(styleSheet, '.civmodelcard img', imgKeyframes);
addOrUpdateRule(styleSheet, '.civmodelcard img', dimensionsKeyframes);
addOrUpdateRule(styleSheet, '.civmodelcard .video-bg', dimensionsKeyframes);
addOrUpdateRule(styleSheet, '.civmodelcard figcaption', textKeyframes);
}

Expand Down Expand Up @@ -150,3 +151,12 @@ document.addEventListener('keydown', function(e) {
}
}
});

function BackToTop() {
const c = Math.max(document.body.scrollTop, document.documentElement.scrollTop);
if (c > 0) {
window.requestAnimationFrame(BackToTop);
document.body.scrollTop = c - c / 8;
document.documentElement.scrollTop = c - c / 8;
}
}
81 changes: 65 additions & 16 deletions scripts/civitai_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from collections import defaultdict
from packaging import version
from modules.shared import cmd_opts, opts
from modules.paths import models_path
from modules.paths import models_path, extensions_dir
from html import escape
import scripts.civitai_global as gl
import scripts.civitai_download as _download
Expand Down Expand Up @@ -47,7 +47,10 @@ def update_dl_url(trained_tags, model_id=None, model_name=None, model_version=No
gr.Button.update(interactive=True if model_version else False) # Download Button
)

def contenttype_folder(content_type):
def contenttype_folder(content_type, desc=None):
folder = None
if desc:
desc = desc.upper()
use_LORA = getattr(opts, "use_LORA", False)
if content_type == "modelFolder":
folder = os.path.join(models_path)
Expand All @@ -65,7 +68,7 @@ def contenttype_folder(content_type):
folder = cmd_opts.embeddings_dir

elif content_type == "AestheticGradient":
folder = "extensions/stable-diffusion-webui-aesthetic-gradients/aesthetic_embeddings"
folder = os.path.join(extensions_dir, "stable-diffusion-webui-aesthetic-gradients", "aesthetic_embeddings")

elif content_type == "LORA":
folder = cmd_opts.lora_dir
Expand All @@ -78,7 +81,7 @@ def contenttype_folder(content_type):
else:
folder = os.path.join(models_path,"LyCORIS")
if use_LORA:
folder = cmd_opts.lora_dir
folder = cmd_opts.lora_dir

elif content_type == "VAE":
if cmd_opts.vae_dir:
Expand All @@ -97,7 +100,31 @@ def contenttype_folder(content_type):
folder = os.path.join(os.path.join(cmd_opts.ckpt_dir, os.pardir), "Poses")
else:
folder = os.path.join(models_path,"Poses")

elif content_type == "Upscaler":
if "REALESRGAN" in desc:
folder = os.path.join(models_path,"RealESRGAN")

elif "SWINIR" in desc:
folder = os.path.join(models_path,"SwinIR")

else:
folder = os.path.join(models_path,"ESRGAN")

elif content_type == "MotionModule":
folder = os.path.join(extensions_dir, "sd-webui-animatediff", "model")

elif content_type == "Workflows":
folder = os.path.join(models_path,"Workflows")

elif content_type == "Other":
folder = os.path.join(models_path,"Other")

elif content_type == "Wildcards":
folder = os.path.join(extensions_dir, "UnivAICharGen", "wildcards")
if not os.path.exists(folder):
folder = os.path.join(extensions_dir, "sd-dynamic-prompts", "wildcards")

return folder

def api_to_data(content_type, sort_type, period_type, use_search_term, page_count, search_term=None, timeOut=None, isNext=None):
Expand Down Expand Up @@ -164,6 +191,7 @@ def model_list_html(json_data, model_dict):

if model_name:
selected_content_type = item['type']
desc = item['description']

if not selected_content_type:
print("Model name not found in json_data. (model_list_html)")
Expand Down Expand Up @@ -192,11 +220,15 @@ def model_list_html(json_data, model_dict):
if len(item['modelVersions'][0]['images']) > 0:
if item["modelVersions"][0]["images"][0]['nsfw'] not in ["None", "Soft"]:
nsfw = "civcardnsfw"
imgtag = f'<img src={item["modelVersions"][0]["images"][0]["url"]}"></img>'
media_type = item["modelVersions"][0]["images"][0]["type"]
if media_type == "video":
imgtag = f'<video class="video-bg" autoplay loop muted playsinline><source src="{item["modelVersions"][0]["images"][0]["url"]}" type="video/mp4"></video>'
else:
imgtag = f'<img src="{item["modelVersions"][0]["images"][0]["url"]}"></img>'
else:
imgtag = f'<img src="./file=html/card-no-preview.png"></img>'

model_folder = os.path.join(contenttype_folder(selected_content_type))
model_folder = os.path.join(contenttype_folder(selected_content_type, desc))
existing_files = []
existing_files_sha256 = []

Expand Down Expand Up @@ -321,7 +353,8 @@ def update_next_page(content_type, sort_type, period_type, use_search_term, sear
gr.Button.update(interactive=False), # Save Images Button
gr.Button.update(interactive=False), # Download Button
gr.Textbox.update(interactive=False, value=None), # Install Path
gr.Dropdown.update(choices=[], value="") # Sub Folder List
gr.Dropdown.update(choices=[], value=""), # Sub Folder List
gr.Button.update(visible=False)
)

def pagecontrol(json_data):
Expand Down Expand Up @@ -404,7 +437,8 @@ def update_model_list(content_type, sort_type, period_type, use_search_term, sea
gr.Button.update(interactive=False), # Download Button
gr.Textbox.update(interactive=False, value=None), # Install Path
gr.Dropdown.update(choices=[], value="", interactive=False), # Sub Folder List
gr.Dropdown.update(choices=[], value="", interactive=False) # File List
gr.Dropdown.update(choices=[], value="", interactive=False), # File List
gr.Button.update(visible=False)
)

def update_model_versions(model_name):
Expand All @@ -413,6 +447,7 @@ def update_model_versions(model_name):
for item in gl.json_data['items']:
if item['name'] == model_name:
selected_content_type = item['type']
desc = item['description']
break

if selected_content_type is None:
Expand All @@ -422,7 +457,7 @@ def update_model_versions(model_name):
versions_dict = defaultdict(list)
installed_versions = []

model_folder = os.path.join(contenttype_folder(selected_content_type))
model_folder = os.path.join(contenttype_folder(selected_content_type, desc))
gl.main_folder = model_folder

for item in gl.json_data['items']:
Expand Down Expand Up @@ -455,11 +490,13 @@ def update_model_versions(model_name):
default_value = default_installed or next(iter(version_names), None)

return (
gr.Dropdown.update(choices=display_version_names, value=default_value, interactive=True) # Version List
gr.Dropdown.update(choices=display_version_names, value=default_value, interactive=True), # Version List
gr.Button.update(visible=True) # Back to top
)
else:
return (
gr.Dropdown.update(choices=[], value=None, interactive=False) # Version List
gr.Dropdown.update(choices=[], value=None, interactive=False), # Version List
gr.Button.update(visible=True) # Back to top
)

def update_model_info(model_name=None, model_version=None):
Expand Down Expand Up @@ -487,7 +524,8 @@ def update_model_info(model_name=None, model_version=None):
for item in gl.json_data['items']:
if item['name'] == model_name:
content_type = item['type']
model_folder = os.path.join(contenttype_folder(content_type))
desc = item['description']
model_folder = os.path.join(contenttype_folder(content_type, desc))
model_uploader = item['creator']['username']
uploader_avatar = item['creator']['image']
if uploader_avatar is None:
Expand Down Expand Up @@ -550,16 +588,25 @@ def update_model_info(model_name=None, model_version=None):
if pic['nsfw'] not in ["None", "Soft"]:
nsfw = 'class="civnsfw model-block"'

img_html = img_html + f'''
img_html += f'''
<div {nsfw} style="display:flex;align-items:flex-start;">
<input type="radio" name="zoomRadio" id="zoomRadio{index}" class="zoom-radio">
<label for="zoomRadio{index}" class="zoom-img-container">
<img {preview_attr} data-sampleimg="true" src={image_url}>
'''

# Check if the pic is an image or video
if pic['type'] == "video":
img_html += f'<video {preview_attr} data-sampleimg="true" autoplay loop muted playsinline><source src="{image_url}" type="video/mp4"></video>'
else:
img_html += f'<img {preview_attr} data-sampleimg="true" src="{image_url}">'

img_html += '''
</label>
<label for="resetZoom" class="zoom-overlay"></label>
'''

if pic['meta']:
img_html = img_html + '<div style="margin:1em 0em 1em 1em;text-align:left;line-height: 1.5em;"><dl>'
img_html += '<div style="margin:1em 0em 1em 1em;text-align:left;line-height: 1.5em;"><dl>'
# Define the preferred order of keys
preferred_order = ["prompt", "negativePrompt", "seed", "Size", "Model", "clipSkip", "sampler", "steps", "cfgScale"]
# Loop through the keys in the preferred order and add them to the HTML
Expand Down Expand Up @@ -590,6 +637,7 @@ def update_model_info(model_name=None, model_version=None):
img_html = img_html + '</div>'
img_html = img_html + '</div>'
output_html = f'''
<div class="model-block">
<h2><a href={model_main_url} target="_blank">{escape(str(model_name))}</a></h2>
<h3 class="model-uploader">Uploaded by <a href="https://civitai.com/user/{escape(str(model_uploader))}" target="_blank">{escape(str(model_uploader))}</a>{uploader_avatar}</h3>
Expand Down Expand Up @@ -693,6 +741,7 @@ def update_file_info(model_name, model_version, file_metadata):
for item in gl.json_data['items']:
if item['name'] == model_name:
content_type = item['type']
desc = item['description']
for model in item['modelVersions']:
if model['name'] == model_version:
for file in model['files']:
Expand All @@ -709,7 +758,7 @@ def update_file_info(model_name, model_version, file_metadata):
if f"{file_size} {file_format} {file_fp} ({filesize})" == file_metadata:
installed = False
folder_location = "None"
model_folder = os.path.join(contenttype_folder(content_type))
model_folder = os.path.join(contenttype_folder(content_type, desc))
for root, _, files in os.walk(model_folder):
if file_name in files:
installed = True
Expand Down
6 changes: 4 additions & 2 deletions scripts/civitai_download.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ def download_start(download_start, model_name, model_filename, version, sha256,
gl.cancel_status = False
gl.recent_model = model_name
current_sha256 = sha256.upper()
current_id = modelId
for item in gl.json_data['items']:
if item['name'] == model_name:
current_id = item['id']
number = random_number(download_start)
return (
gr.Button.update(interactive=False, visible=False), # Download Button
Expand All @@ -95,7 +97,7 @@ def download_start(download_start, model_name, model_filename, version, sha256,

def download_finish(model_filename, version, model_name):
gr_components = _api.update_model_versions(model_name)
version_choices = gr_components['choices']
version_choices = gr_components[0]['choices']

prev_version = gl.last_version + " [Installed]"

Expand Down
33 changes: 24 additions & 9 deletions scripts/civitai_file_manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,14 @@ def delete_model(delete_finish, model_filename, model_name, list_versions, sha25
for item in gl.json_data['items']:
if item['name'] == model_name_search:
selected_content_type = item['type']
desc = item['description']
break

if selected_content_type is None:
print("Model name not found in json_data. (delete_model)")
return

model_folder = os.path.join(_api.contenttype_folder(selected_content_type))
model_folder = os.path.join(_api.contenttype_folder(selected_content_type, desc))

# Delete based on provided SHA-256 hash
if sha256:
Expand Down Expand Up @@ -213,7 +214,7 @@ def save_json(file_name, install_path, trained_tags):
return trained_tags

def card_update(gr_components, model_name, list_versions, is_install):
version_choices = gr_components['choices']
version_choices = gr_components[0]['choices']

if is_install and not gl.download_fail and not gl.cancel_status:
version_value_clean = list_versions + " [Installed]"
Expand Down Expand Up @@ -444,10 +445,24 @@ def file_scan(folders, ver_finish, tag_finish, installed_finish, progress=gr.Pro

folders_to_check = []
for item in folders:
folder = _api.contenttype_folder(item)
if folder:
folders_to_check.append(folder)

upscaler = False
if item == "Upscaler":
upscaler = True
if upscaler:
folder = _api.contenttype_folder(item, "ESRGAN")
if folder:
folders_to_check.append(folder)
folder = _api.contenttype_folder(item, "RealESRGAN")
if folder:
folders_to_check.append(folder)
folder = _api.contenttype_folder(item, "SwinIR")
if folder:
folders_to_check.append(folder)
else:
folder = _api.contenttype_folder(item)
if folder:
folders_to_check.append(folder)

total_files = 0
files_done = 0

Expand Down Expand Up @@ -601,16 +616,16 @@ def load_to_browser():
global from_ver, from_installed
_ = None
if from_ver:
(lm,lv,lh,pp,np,p,st,si,dm,ip,sf,fl) = _api.update_model_list(_,_,_,_,_,_,_,_,True)
(lm,lv,lh,pp,np,p,st,si,dm,ip,sf,fl,bt) = _api.update_model_list(_,_,_,_,_,_,_,_,True)
if from_installed:
(lm,lv,lh,pp,np,p,st,si,dm,ip,sf,fl) = _api.update_model_list(_,_,_,_,_,_,_,_,False,True)
(lm,lv,lh,pp,np,p,st,si,dm,ip,sf,fl,bt) = _api.update_model_list(_,_,_,_,_,_,_,_,False,True)

from_ver, from_installed = False, False
return (
gr.Button.update(interactive=True, visible=True),
gr.Button.update(interactive=False, visible=False),
gr.Button.update(interactive=False, visible=False),
lm,lv,lh,pp,np,p,st,si,dm,ip,sf,fl,
lm,lv,lh,pp,np,p,st,si,dm,ip,sf,fl,bt,
gr.HTML.update(value='<div style="font-size: 24px; text-align: center; margin: 50px !important;">Models loaded into the browser!</div>')
)

Expand Down

0 comments on commit 73f84dd

Please sign in to comment.