Update to v3.5.1 (Temp-fix)

pull/279/head
BlafKing 2024-03-27 02:07:58 +01:00
parent fd6a6c861a
commit b39a2c2128
No known key found for this signature in database
GPG Key ID: 862BBCA1D265AEFF
7 changed files with 148 additions and 62 deletions

View File

@ -100,6 +100,15 @@ https://github.com/BlafKing/sd-civitai-browser-plus/assets/9644716/44c5c7a0-4854
# Changelog 📋
<h3>v3.5.1</h3>
* Temp fix: Quick fix for the new NSFW system
- NSFW models may be returned when NSFW is disabled, this is an issue with the public CivitAI API.
- Search results currently do not get influenced by the NSFW setting, also an issue with the API.
* Bug fix: Better automatic coloring for white theme
---
<h3>v3.5.0</h3>
* Bug fix: Extension now works again with the latest CivitAI API version!

View File

@ -42,20 +42,22 @@ function updateCardSize(width, height) {
// Toggles NSFW display
function toggleNSFWContent(hideAndBlur) {
const sheet = document.styleSheets[0];
const nsfwCards = document.querySelectorAll('.civcardnsfw');
nsfwCards.forEach(card => {
card.style.display = hideAndBlur ? 'block' : 'none';
})
const toggleRule = (selector, rules) => addOrUpdateRule(sheet, selector, rules);
toggleRule('.civcardnsfw', hideAndBlur ? 'display: block;' : 'display: none;');
toggleRule('.civnsfw img', hideAndBlur ? 'filter: none;' : 'filter: blur(10px);');
const nsfwImages = document.querySelectorAll('.civnsfw img');
nsfwImages.forEach(img => {
img.style.filter = hideAndBlur ? 'none' : 'blur(10px)';
});
const dateSections = document.querySelectorAll('.date-section');
dateSections.forEach((section) => {
dateSections.forEach(section => {
const cards = section.querySelectorAll('.civmodelcard');
const nsfwCards = section.querySelectorAll('.civmodelcard.civcardnsfw');
section.style.display = !hideAndBlur && cards.length === nsfwCards.length ? 'none' : 'block';
});
}
// Updates site with css insertions
@ -239,6 +241,10 @@ function updateSVGIcons() {
const filterIconUrl = isDark ? "https://gistcdn.githack.com/BlafKing/a20124cedafad23d4eecc1367ec22896/raw/04a4dae0771353377747dadf57c91d55bf841bed/filter-light.svg" : "https://gistcdn.githack.com/BlafKing/686c3438f5d0d13e7e47135f25445ef3/raw/46477777faac7209d001829a171462d9a2ff1467/filter-dark.svg";
const searchIconUrl = isDark ? "https://gistcdn.githack.com/BlafKing/3f95619089bac3b4fd5470a986e1b3bb/raw/ebaa9cceee3436711eb560a7a65e151f1d651c6a/search-light.svg" : "https://gistcdn.githack.com/BlafKing/57573592d5857e102a4bfde852f62639/raw/aa213e9e82d705651603507e26545eb0ffe60c90/search-dark.svg";
if (isDark) {
}
const element = document.querySelector("#filterBox, #filterBoxL");
const childDiv = element?.querySelector("div:nth-child(3)");
@ -334,12 +340,13 @@ function updateBackToTopVisibility(entries) {
}
// Create the accordion dropdown inside the settings tab
function createAccordion(containerDiv, subfolders, name) {
function createAccordion(containerDiv, subfolders, name, id_name) {
if (containerDiv == null || subfolders.length == 0) {
return;
}
var accordionContainer = document.createElement('div');
accordionContainer.id = 'settings-accordion';
accordionContainer.id = id_name;
accordionContainer.className = 'settings-accordion';
var toggleButton = document.createElement('button');
toggleButton.id = 'accordionToggle';
toggleButton.innerHTML = name + '<div style="transition: transform 0.15s; transform: rotate(90deg)">▼</div>';
@ -435,11 +442,7 @@ function addOnClickToButtons() {
buttonIds.forEach(buttonId => {
let button = document.getElementById(buttonId);
if (button) {
const originalOnclick = button.onclick;
button.onclick = null;
button.addEventListener('click', (event) => {
if(originalOnclick) originalOnclick.call(button, event);
createCivitAICardButtons(button);
});
}
@ -449,11 +452,7 @@ function addOnClickToButtons() {
if (tab) {
const buttons = tab.querySelectorAll('div > button:not(:first-child)');
buttons.forEach(button => {
const originalOnclick = button.onclick;
button.onclick = null;
button.addEventListener('click', (event) => {
if(originalOnclick) originalOnclick.call(button, event);
createCivitAICardButtons(button);
});
});
@ -931,29 +930,23 @@ function onPageLoad() {
let subfolderDiv = document.querySelector("#settings_civitai_browser_plus > div > div");
let downloadDiv = document.querySelector("#settings_civitai_browser_download > div > div");
let upscalerDiv = document.querySelector("#settings_civitai_browser_plus > div > div > #settings-accordion > div");
let downloadDivSub = document.querySelector("#settings_civitai_browser_download > div > div > #settings-accordion > div");
let upscalerDiv = document.querySelector("#settings_civitai_browser_plus > div > div > #default-sub-accordion > div");
let downloadDivSub = document.querySelector("#settings_civitai_browser_download > div > div > #default-sub-accordion > div");
let settingsDiv = document.querySelector("#settings_civitai_browser > div > div");
if (subfolderDiv || downloadDiv) {
let div = subfolderDiv || downloadDiv;
let subfolders = div.querySelectorAll("[id$='subfolder']");
createAccordion(div, subfolders, "Default sub folders");
}
createAccordion(div, subfolders, "Default sub folders", 'default-sub-accordion');
if (upscalerDiv || downloadDivSub) {
let div = upscalerDiv || downloadDivSub;
let upscalers = div.querySelectorAll("[id$='upscale_subfolder']");
createAccordion(div, upscalers, "Upscalers");
subfolders = div.querySelectorAll("[id^='setting_insert_sub']");
createAccordion(div, subfolders, "Insert sub folder options", 'insert-sub-accordion');
}
if (subfolderDiv || settingsDiv) {
let div = subfolderDiv || settingsDiv;
let subfolders = div.querySelectorAll("[id^='setting_insert_sub']");
createAccordion(div, subfolders, "Insert sub folder options");
let proxy = div.querySelectorAll("[id$='proxy']");
createAccordion(div, proxy, "Proxy options");
createAccordion(div, proxy, "Proxy options", 'proxy-accordion');
}
let toggle4L = document.getElementById('toggle4L');

View File

@ -16,7 +16,7 @@ from modules.images import read_info_from_image
from modules.shared import cmd_opts, opts
from modules.paths import models_path, extensions_dir, data_path
from html import escape
from scripts.civitai_global import print
from scripts.civitai_global import print, debug_print
import scripts.civitai_global as gl
import scripts.civitai_download as _download
try:
@ -214,15 +214,18 @@ def model_list_html(json_data):
date = item['modelVersions'][0]['publishedAt'].split('T')[0]
except:
date = "Not Found"
nsfw = item.get("nsfw")
debug_print(f"{item['name']} NSFW is: {nsfw}")
if nsfw:
nsfw = "civcardnsfw"
if gl.sortNewest:
if date not in sorted_models:
sorted_models[date] = []
if any(item['modelVersions']):
if len(item['modelVersions'][0]['images']) > 0:
if item["modelVersions"][0]["images"][0]['nsfw'] not in ["None", "Soft"]:
nsfw = "civcardnsfw"
media_type = item["modelVersions"][0]["images"][0]["type"]
image = item["modelVersions"][0]["images"][0]["url"]
if media_type == "video":
@ -283,7 +286,9 @@ def create_api_url(content_type=None, sort_type=None, period_type=None, use_sear
base_url = "https://civitai.com/api/v1/models"
if isNext is not None:
return gl.json_data['metadata']['nextPage' if isNext else 'prevPage']
api_url = gl.json_data['metadata']['nextPage' if isNext else 'prevPage']
debug_print(api_url)
return api_url
params = {'limit': tile_count, 'sort': sort_type, 'period': period_type.replace(" ", "") if period_type else None}
@ -291,7 +296,7 @@ def create_api_url(content_type=None, sort_type=None, period_type=None, use_sear
params["types"] = content_type
if use_search_term != "None" and search_term:
search_term = search_term.replace("\\", "\\\\")
search_term = search_term.replace("\\", "\\\\").lower()
if "civitai.com" in search_term:
model_number = re.search(r'models/(\d+)', search_term).group(1)
params = {'ids': model_number}
@ -318,9 +323,10 @@ def create_api_url(content_type=None, sort_type=None, period_type=None, use_sear
query_parts.append((key, value))
query_string = urllib.parse.urlencode(query_parts, doseq=True, quote_via=urllib.parse.quote)
full_url = f"{base_url}?{query_string}"
api_url = f"{base_url}?{query_string}"
return full_url
debug_print(api_url)
return api_url
def convert_LORA_LoCon(content_type):
use_LORA = getattr(opts, "use_LORA", False)
@ -687,12 +693,12 @@ def update_model_info(model_string=None, model_version=None, only_html=False, in
if from_preview:
index = f"preview_{index}"
nsfw = 'class="model-block"'
if pic['nsfw'] not in ["None", "Soft"]:
nsfw = 'class="civnsfw model-block"'
class_name = 'class="model-block"'
if pic.get('nsfwLevel') >= 4:
class_name = 'class="civnsfw model-block"'
img_html += f'''
<div {nsfw} style="display:flex;align-items:flex-start;">
<div {class_name} style="display:flex;align-items:flex-start;">
<div class="civitai-image-container">
<input type="radio" name="zoomRadio" id="zoomRadio{index}" class="zoom-radio">
<label for="zoomRadio{index}" class="zoom-img-container">

View File

@ -12,7 +12,7 @@ import json
import time
from pathlib import Path
from modules.shared import opts, cmd_opts
from scripts.civitai_global import print
from scripts.civitai_global import print, debug_print
import scripts.civitai_global as gl
import scripts.civitai_api as _api
import scripts.civitai_file_manage as _file

View File

@ -235,7 +235,7 @@ def save_images(preview_html, model_filename, install_path, sub_folder, api_resp
urllib.request.install_opener(opener)
for i, img_url in enumerate(img_urls):
filename = f'{name}_{i}.png'
filename = f'{name}_{i}.jpg'
img_url = urllib.parse.quote(img_url, safe=':/=')
try:
with urllib.request.urlopen(img_url) as url:
@ -437,8 +437,10 @@ def model_from_sent(model_name, content_type, tile_count):
'#80a6c8': 'var(--secondary-300)',
'#60A5FA': 'var(--link-text-color-hover)',
'#1F2937': 'var(--neutral-700)',
'#1F2937': 'var(--button-secondary-background-fill-hover)',
'#374151': 'var(--input-border-color)',
'#111827': 'var(--neutral-800)',
'#111827': 'var(--button-secondary-background-fill)',
'top: 50%;': '',
'padding-top: 0px;': 'padding-top: 475px;',
'.civitai_txt2img': '.civitai_placeholder'
@ -528,7 +530,7 @@ def save_model_info(install_path, file_name, sub_folder, sha256=None, preview_ht
if use_local:
img_urls = re.findall(r'data-sampleimg="true" src=[\'"]?([^\'" >]+)', preview_html)
for i, img_url in enumerate(img_urls):
img_name = f'{filename}_{i}.png'
img_name = f'{filename}_{i}.jpg'
preview_html = preview_html.replace(img_url,f'{os.path.join(image_path, img_name)}')
match = re.search(r'(\s*)<div class="model-block">', preview_html)
@ -1018,6 +1020,7 @@ def finish_returns():
gr.Button.update(interactive=True, visible=True),
gr.Button.update(interactive=True, visible=True),
gr.Button.update(interactive=True, visible=True),
gr.Button.update(interactive=True, visible=False), # Organize models hidden until implemented
gr.Button.update(interactive=False, visible=False)
)
@ -1029,33 +1032,49 @@ def start_returns(number):
gr.Button.update(interactive=False, visible=True),
gr.Button.update(interactive=False, visible=True),
gr.Button.update(interactive=False, visible=True),
gr.Button.update(interactive=False, visible=False), # Organize models hidden until implemented
gr.HTML.update(value='<div style="min-height: 100px;"></div>')
)
def set_globals(input_global):
global from_tag, from_ver, from_installed, from_preview, from_organize
from_tag = from_ver = from_installed = from_preview = from_organize = False
if input_global == "from_tag":
from_tag = True
elif input_global == "from_ver":
from_ver = True
elif input_global == "from_installed":
from_installed = True
elif input_global == "from_preview":
from_preview = True
elif input_global == "from_organize":
from_organize = True
def save_tag_start(tag_start):
global from_tag, from_ver, from_installed, from_preview
from_tag, from_ver, from_installed, from_preview = True, False, False, False
set_globals('from_tag')
number = _download.random_number(tag_start)
return start_returns(number)
def save_preview_start(preview_start):
global from_tag, from_ver, from_installed, from_preview
from_preview, from_tag, from_ver, from_installed = True, False, False, False
set_globals('from_preview')
number = _download.random_number(preview_start)
return start_returns(number)
def installed_models_start(installed_start):
global from_installed, from_ver, from_tag, from_preview
from_installed, from_ver, from_tag, from_preview = True, False, False, False
set_globals('from_installed')
number = _download.random_number(installed_start)
return start_returns(number)
def ver_search_start(ver_start):
global from_ver, from_tag, from_installed, from_preview
from_ver, from_tag, from_installed, from_preview = True, False, False, False
set_globals('from_ver')
number = _download.random_number(ver_start)
return start_returns(number)
def organize_start(organize_start):
set_globals('from_organize')
number = _download.random_number(organize_start)
return start_returns(number)
def save_tag_finish():
global from_tag
from_tag = False
@ -1072,6 +1091,7 @@ def scan_finish():
gr.Button.update(interactive=no_update, visible=no_update),
gr.Button.update(interactive=no_update, visible=no_update),
gr.Button.update(interactive=no_update, visible=no_update),
gr.Button.update(interactive=no_update, visible=False),
gr.Button.update(interactive=False, visible=False),
gr.Button.update(interactive=not no_update, visible=not no_update)
)

View File

@ -7,7 +7,7 @@ import re
import subprocess
from modules.shared import opts, cmd_opts
from modules.paths import extensions_dir
from scripts.civitai_global import print
from scripts.civitai_global import print, debug_print
import scripts.civitai_global as gl
import scripts.civitai_download as _download
import scripts.civitai_file_manage as _file
@ -36,7 +36,6 @@ if not forge:
from modules import launch_utils
ver = launch_utils.git_tag()
except:
print("Failed to fetch SD-WebUI version")
ver_bool = False
if ver:
ver = ver.split('-')[0].rsplit('-', 1)[0]
@ -247,7 +246,7 @@ def on_ui_tabs():
back_to_top = gr.Button(value="", elem_id="backToTop")
with gr.Tab("Update Models"):
with gr.Row():
selected_tags = gr.CheckboxGroup(elem_id="selected_tags", label="Scan for:", choices=scan_choices)
selected_tags = gr.CheckboxGroup(elem_id="selected_tags", label="Selected content types:", choices=scan_choices)
with gr.Row(elem_id="civitai_update_toggles"):
overwrite_toggle = gr.Checkbox(elem_id="overwrite_toggle", label="Overwrite any existing previews, tags or descriptions.", value=True, min_width=300)
skip_hash_toggle = gr.Checkbox(elem_id="skip_hash_toggle", label="One-Time Hash Generation for externally downloaded models.", value=True, min_width=300)
@ -274,6 +273,11 @@ def on_ui_tabs():
load_to_browser_installed = gr.Button(value="Load installed models to browser", interactive=False, visible=False)
with gr.Row():
installed_progress = gr.HTML(value='<div style="min-height: 0px;"></div>')
with gr.Row():
organize_models = gr.Button(value="Organize model files", interactive=True, visible=False) # Organize models hidden until implemented
cancel_organize = gr.Button(value="Cancel loading models", interactive=False, visible=False)
with gr.Row():
organize_progress = gr.HTML(value='<div style="min-height: 0px;"></div>')
with gr.Tab("Download Queue"):
def get_style(size, left_border):
@ -322,6 +326,8 @@ def on_ui_tabs():
ver_finish = gr.Textbox(visible=False)
installed_start = gr.Textbox(visible=None)
installed_finish = gr.Textbox(visible=None)
organize_start = gr.Textbox(visible=None)
organize_finish = gr.Textbox(visible=None)
delete_finish = gr.Textbox(visible=False)
current_model = gr.Textbox(visible=False)
current_sha256 = gr.Textbox(visible=False)
@ -771,6 +777,7 @@ def on_ui_tabs():
load_installed,
save_all_tags,
update_preview,
organize_models,
version_progress
]
)
@ -791,6 +798,7 @@ def on_ui_tabs():
save_all_tags,
load_installed,
update_preview,
organize_models,
cancel_ver_search,
load_to_browser
]
@ -806,6 +814,7 @@ def on_ui_tabs():
ver_search,
save_all_tags,
update_preview,
organize_models,
installed_progress
]
)
@ -826,6 +835,7 @@ def on_ui_tabs():
save_all_tags,
load_installed,
update_preview,
organize_models,
cancel_installed,
load_to_browser_installed
]
@ -841,6 +851,7 @@ def on_ui_tabs():
load_installed,
ver_search,
update_preview,
organize_models,
tag_progress
]
)
@ -861,6 +872,7 @@ def on_ui_tabs():
save_all_tags,
load_installed,
update_preview,
organize_models,
cancel_all_tags
]
)
@ -875,6 +887,7 @@ def on_ui_tabs():
load_installed,
ver_search,
save_all_tags,
organize_models,
preview_progress
]
)
@ -895,10 +908,48 @@ def on_ui_tabs():
save_all_tags,
load_installed,
update_preview,
organize_models,
cancel_update_preview
]
)
organize_models.click(
fn=_file.organize_start,
inputs=[organize_start],
outputs=[
organize_start,
organize_models,
cancel_organize,
load_installed,
ver_search,
save_all_tags,
update_preview,
organize_progress
]
)
organize_start.change(
fn=_file.file_scan,
inputs=file_scan_inputs,
outputs=[
organize_progress,
organize_finish
]
)
organize_finish.change(
fn=_file.save_preview_finish,
outputs=[
ver_search,
save_all_tags,
load_installed,
update_preview,
organize_models,
cancel_update_preview
]
)
load_to_browser_installed.click(
fn=_file.load_to_browser,
inputs=load_to_browser_inputs,
@ -1277,7 +1328,7 @@ def on_ui_settings():
shared.OptionInfo(
False,
f"Insert: [{string}]",
section=browser,
section=download,
**({'category_id': cat_id} if ver_bool else {})
)
)

View File

@ -336,7 +336,7 @@
.civitai-tag,
.civitai-meta,
.civitai-meta-btn {
background-color: var(--neutral-800);
background-image: var(--button-secondary-background-fill);
border-radius: 8px;
padding: 4px 6px;
border: 1px solid var(--input-border-color);
@ -344,7 +344,7 @@
.civitai-meta-btn:hover {
cursor: pointer;
background-color: var(--neutral-700);
background-image: var(--button-secondary-background-fill-hover);
}
#select_all_models_container {
@ -530,9 +530,9 @@
}
/* Custom settings Accordion */
#settings-accordion {
.settings-accordion {
border: 1px solid var(--block-border-color);
border-radius: 8px;
border-radius: 8px !important;
margin: 15px 0px 2px 0px;
padding: 8px 8px;
}
@ -551,7 +551,7 @@
}
#civitai_preview_html .model-block {
box-shadow: 0px 0px 1px 3px #3339ff30;
box-shadow: 0px 0px 1px 3px var(--button-secondary-border-color);
border-radius: 10px;
padding: 1px 20px 10px;
margin-bottom: 20px;
@ -712,10 +712,17 @@
}
#civitai_preview_html dt {
font-size: medium;
font-size: medium;
color: #80a6c8!important;
}
/*
#civitai_preview_html dt {
font-size: medium;
color: #3966bb !important;
}
*/
#civitai_preview_html dd {
padding: 0px 0px 10px 10px;
}