mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2024-06-07 21:20:49 +00:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
54a097a818
34
javascript/notification.js
Normal file
34
javascript/notification.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// Monitors the gallery and sends a browser notification when the leading image is new.
|
||||||
|
|
||||||
|
let lastHeadImg = null;
|
||||||
|
|
||||||
|
onUiUpdate(function(){
|
||||||
|
const galleryPreviews = gradioApp().querySelectorAll('img.h-full.w-full.overflow-hidden');
|
||||||
|
|
||||||
|
if (galleryPreviews == null) return;
|
||||||
|
|
||||||
|
const headImg = galleryPreviews[0]?.src;
|
||||||
|
|
||||||
|
if (headImg == null || headImg == lastHeadImg) return;
|
||||||
|
|
||||||
|
lastHeadImg = headImg;
|
||||||
|
|
||||||
|
if (document.hasFocus()) return;
|
||||||
|
|
||||||
|
// Multiple copies of the images are in the DOM when one is selected. Dedup with a Set to get the real number generated.
|
||||||
|
const imgs = new Set(Array.from(galleryPreviews).map(img => img.src));
|
||||||
|
|
||||||
|
const notification = new Notification(
|
||||||
|
'Stable Diffusion',
|
||||||
|
{
|
||||||
|
body: `Generated ${imgs.size > 1 ? imgs.size - 1 : 1} image${imgs.size > 1 ? 's' : ''}`,
|
||||||
|
icon: headImg,
|
||||||
|
image: headImg,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
notification.onclick = function(_){
|
||||||
|
parent.focus();
|
||||||
|
this.close();
|
||||||
|
};
|
||||||
|
});
|
@ -245,34 +245,42 @@ def resize_image(resize_mode, im, width, height):
|
|||||||
|
|
||||||
|
|
||||||
invalid_filename_chars = '<>:"/\\|?*\n'
|
invalid_filename_chars = '<>:"/\\|?*\n'
|
||||||
|
invalid_filename_prefix = ' '
|
||||||
|
invalid_filename_postfix = ' .'
|
||||||
re_nonletters = re.compile(r'[\s'+string.punctuation+']+')
|
re_nonletters = re.compile(r'[\s'+string.punctuation+']+')
|
||||||
|
max_filename_part_length = 128
|
||||||
|
max_prompt_words = 8
|
||||||
|
|
||||||
|
|
||||||
def sanitize_filename_part(text, replace_spaces=True):
|
def sanitize_filename_part(text, replace_spaces=True):
|
||||||
if replace_spaces:
|
if replace_spaces:
|
||||||
text = text.replace(' ', '_')
|
text = text.replace(' ', '_')
|
||||||
|
|
||||||
return text.translate({ord(x): '_' for x in invalid_filename_chars})[:128]
|
text = text.translate({ord(x): '_' for x in invalid_filename_chars})
|
||||||
|
text = text.lstrip(invalid_filename_prefix)[:max_filename_part_length]
|
||||||
|
text = text.rstrip(invalid_filename_postfix)
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
def apply_filename_pattern(x, p, seed, prompt):
|
def apply_filename_pattern(x, p, seed, prompt):
|
||||||
if seed is not None:
|
if seed is not None:
|
||||||
x = x.replace("[seed]", str(seed))
|
x = x.replace("[seed]", str(seed))
|
||||||
|
|
||||||
if prompt is not None:
|
if prompt is not None:
|
||||||
x = x.replace("[prompt]", sanitize_filename_part(prompt)[:128])
|
x = x.replace("[prompt]", sanitize_filename_part(prompt))
|
||||||
x = x.replace("[prompt_spaces]", sanitize_filename_part(prompt, replace_spaces=False)[:128])
|
x = x.replace("[prompt_spaces]", sanitize_filename_part(prompt, replace_spaces=False))
|
||||||
if "[prompt_words]" in x:
|
if "[prompt_words]" in x:
|
||||||
words = [x for x in re_nonletters.split(prompt or "") if len(x) > 0]
|
words = [x for x in re_nonletters.split(prompt or "") if len(x) > 0]
|
||||||
if len(words) == 0:
|
if len(words) == 0:
|
||||||
words = ["empty"]
|
words = ["empty"]
|
||||||
|
x = x.replace("[prompt_words]", sanitize_filename_part(" ".join(words[0:max_prompt_words]), replace_spaces=False))
|
||||||
|
|
||||||
x = x.replace("[prompt_words]", " ".join(words[0:8]).strip())
|
|
||||||
if p is not None:
|
if p is not None:
|
||||||
x = x.replace("[steps]", str(p.steps))
|
x = x.replace("[steps]", str(p.steps))
|
||||||
x = x.replace("[cfg]", str(p.cfg_scale))
|
x = x.replace("[cfg]", str(p.cfg_scale))
|
||||||
x = x.replace("[width]", str(p.width))
|
x = x.replace("[width]", str(p.width))
|
||||||
x = x.replace("[height]", str(p.height))
|
x = x.replace("[height]", str(p.height))
|
||||||
x = x.replace("[sampler]", sd_samplers.samplers[p.sampler_index].name)
|
x = x.replace("[sampler]", sanitize_filename_part(sd_samplers.samplers[p.sampler_index].name, replace_spaces=False))
|
||||||
|
|
||||||
x = x.replace("[model_hash]", shared.sd_model.sd_model_hash)
|
x = x.replace("[model_hash]", shared.sd_model.sd_model_hash)
|
||||||
x = x.replace("[date]", datetime.date.today().isoformat())
|
x = x.replace("[date]", datetime.date.today().isoformat())
|
||||||
|
@ -875,6 +875,14 @@ def create_ui(txt2img, img2img, run_extras, run_pnginfo):
|
|||||||
outputs=[result]
|
outputs=[result]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
request_notifications = gr.Button(value='Request browser notifications')
|
||||||
|
request_notifications.click(
|
||||||
|
fn=lambda: None,
|
||||||
|
inputs=[],
|
||||||
|
outputs=[],
|
||||||
|
_js='() => Notification.requestPermission()'
|
||||||
|
)
|
||||||
|
|
||||||
interfaces = [
|
interfaces = [
|
||||||
(txt2img_interface, "txt2img", "txt2img"),
|
(txt2img_interface, "txt2img", "txt2img"),
|
||||||
(img2img_interface, "img2img", "img2img"),
|
(img2img_interface, "img2img", "img2img"),
|
||||||
|
Loading…
Reference in New Issue
Block a user