mirror of https://github.com/Nevysha/Cozy-Nest.git
v2.4.3 (#172)
## Minor changes & fixes in 2.4.3 - [x] Fix for SD Next compatibility Version: 3bcca6f9 3bcca6f9 06/07/2023. - [x] Add proper warning to SD Next users if they are using incompatible style parameters. - [x] Fix CozyNest=No which was not properly disabling Cozy Nest. - [x] Various fix and optimizations.pull/178/head 2.4.3
parent
a9bae13427
commit
68660059cc
|
|
@ -1,7 +1,13 @@
|
||||||
## Compatibility
|
## Compatibility
|
||||||
|
|
||||||
- Automatic1111's webui 1.3.2 release.
|
- Automatic1111's webui 1.3.2 release.
|
||||||
- SD Next (Vlad's fork) Version: 4867dafa Fri Jun 23. (Not compatible with latest!)
|
- SD Next (Vlad's fork) Version: 3bcca6f9 06/07/2023
|
||||||
|
|
||||||
|
## Minor changes & fixes in 2.4.3
|
||||||
|
- [x] Fix for SD Next compatibility Version: 3bcca6f9 3bcca6f9 06/07/2023.
|
||||||
|
- [x] Add proper warning to SD Next users if they are using incompatible style parameters.
|
||||||
|
- [x] Fix CozyNest=No which was not properly disabling Cozy Nest.
|
||||||
|
- [x] Various fix and optimizations.
|
||||||
|
|
||||||
## Minor changes & fixes in 2.4.2
|
## Minor changes & fixes in 2.4.2
|
||||||
- [x] Sort folder tree by name
|
- [x] Sort folder tree by name
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,27 @@
|
||||||
|
//post build script run by Nodejs
|
||||||
|
|
||||||
|
//copy cozy-nest-style.css and cozy-nest-style-sdnext.css to cozy-nest-client/assets
|
||||||
|
import {copyFile } from 'fs/promises';
|
||||||
|
import {join} from 'path';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import * as path from "path";
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = path.dirname(__filename);
|
||||||
|
|
||||||
|
const cozyNestStyleCss = join(__dirname, 'main/cozy-nest-style.css');
|
||||||
|
const cozyNestStyleSdnextCss = join(__dirname, 'main/cozy-nest-style-sdnext.css');
|
||||||
|
|
||||||
|
const cozyNestStyleCssDest = join(__dirname, '../client/assets/cozy-nest-style.css');
|
||||||
|
const cozyNestStyleSdnextCssDest = join(__dirname, '../client/assets/cozy-nest-style-sdnext.css');
|
||||||
|
|
||||||
|
async function copyCss() {
|
||||||
|
await copyFile(cozyNestStyleCss, cozyNestStyleCssDest);
|
||||||
|
await copyFile(cozyNestStyleSdnextCss, cozyNestStyleSdnextCssDest);
|
||||||
|
}
|
||||||
|
(async () => {
|
||||||
|
await copyCss();
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -8,17 +8,15 @@ import {CozyLogger} from "./main/CozyLogger.js";
|
||||||
import {startCozyNestImageBrowser} from "@image-browser/main.jsx";
|
import {startCozyNestImageBrowser} from "@image-browser/main.jsx";
|
||||||
import startCozyNestSettings from "@settings/main.jsx";
|
import startCozyNestSettings from "@settings/main.jsx";
|
||||||
import {
|
import {
|
||||||
dummyLoraCard, dummyControlNetBloc, dummySubdirs, getTheme, hasCozyNestNo
|
hasCozyNestNo, checkClientEnv
|
||||||
} from './main/cozy-utils.js';
|
} from './main/cozy-utils.js';
|
||||||
import startCozyPrompt from "./cozy-prompt/main.jsx";
|
import startCozyPrompt from "./cozy-prompt/main.jsx";
|
||||||
import {startExtraNetwork} from "./extra-network/main.jsx";
|
import {startExtraNetwork} from "./extra-network/main.jsx";
|
||||||
import {OverrideUiJs} from "./main/override_ui.js";
|
import {OverrideUiJs} from "./main/override_ui.js";
|
||||||
import CozyNestEventBus from "./CozyNestEventBus.js";
|
import CozyNestEventBus from "./CozyNestEventBus.js";
|
||||||
import {startCozyExtraNetwork} from "./cozy_extra_network/main.jsx";
|
import {startCozyExtraNetwork} from "./cozy_extra_network/main.jsx";
|
||||||
|
import CozyModal from './main/modal/Module.jsx';
|
||||||
window.CozyTools = {
|
window.CozyTools = {
|
||||||
dummyLoraCard,
|
|
||||||
dummyControlNetBloc,
|
|
||||||
dummySubdirs,
|
|
||||||
stop:() => setTimeout(function(){debugger;}, 5000),
|
stop:() => setTimeout(function(){debugger;}, 5000),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -27,6 +25,17 @@ window.CozyTools = {
|
||||||
export default async function cozyNestLoader() {
|
export default async function cozyNestLoader() {
|
||||||
|
|
||||||
await fetchCozyNestConfig();
|
await fetchCozyNestConfig();
|
||||||
|
|
||||||
|
if (COZY_NEST_CONFIG.webui === WEBUI_SDNEXT) {
|
||||||
|
//add sdnext css
|
||||||
|
const link = document.createElement('link');
|
||||||
|
link.rel = 'stylesheet';
|
||||||
|
link.href = import.meta.env.VITE_CONTEXT === 'DEV' ?
|
||||||
|
'/cozy-nest-client/main/cozy-nest-style-sdnext.css'
|
||||||
|
:'/cozy-nest-client/assets/cozy-nest-style-sdnext.css';
|
||||||
|
document.head.appendChild(link);
|
||||||
|
}
|
||||||
|
|
||||||
await cozyNestModuleLoader(async () => {
|
await cozyNestModuleLoader(async () => {
|
||||||
startCozyNestSettings();
|
startCozyNestSettings();
|
||||||
|
|
||||||
|
|
@ -46,9 +55,13 @@ export default async function cozyNestLoader() {
|
||||||
|
|
||||||
startCozyNestImageBrowser();
|
startCozyNestImageBrowser();
|
||||||
|
|
||||||
CozyNestEventBus.emit('cozy-nest-loaded');
|
// load modal module
|
||||||
|
await CozyModal.prepareReactHost();
|
||||||
|
|
||||||
|
CozyNestEventBus.emit('cozy-nest-loaded');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setTimeout(checkClientEnv, 1000); // small timer just for UX purposes
|
||||||
}
|
}
|
||||||
|
|
||||||
window.cozyNestLoader = cozyNestLoader;
|
window.cozyNestLoader = cozyNestLoader;
|
||||||
|
|
@ -71,9 +84,6 @@ window.cozyNestLoader = cozyNestLoader;
|
||||||
cozyNestLoader();
|
cozyNestLoader();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
CozyLogger.init(false);
|
|
||||||
}
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
body {
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nevysha.skip-interrupt-wrapper {
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nevysha.skip-interrupt-wrapper button {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import {CozyLogger} from "./CozyLogger.js";
|
import {CozyLogger} from "./CozyLogger.js";
|
||||||
import DOM_IDS from "./dom_ids.js";
|
import DOM_IDS from "./dom_ids.js";
|
||||||
|
import CozyModal from "./modal/Module.jsx";
|
||||||
|
|
||||||
export const getTheme = (modeFromConfig) => {
|
export const getTheme = (modeFromConfig) => {
|
||||||
modeFromConfig = modeFromConfig || COZY_NEST_CONFIG.color_mode
|
modeFromConfig = modeFromConfig || COZY_NEST_CONFIG.color_mode
|
||||||
|
|
@ -104,34 +105,25 @@ export function hideNativeUiExtraNetworkElement(prefix) {
|
||||||
tabs.style.display = 'none';
|
tabs.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
//dummy method
|
export function checkClientEnv() {
|
||||||
export const dummyLoraCard = () => {
|
//legacy : check if url contains __theme which is deprecated
|
||||||
const container = document.querySelector("#txt2img_lora_cards");
|
if (window.location.href.includes('__theme')) {
|
||||||
|
CozyModal.showToast(
|
||||||
// Get the first child element of the container
|
'warning',
|
||||||
const firstChild = container.firstChild;
|
"Warning",
|
||||||
|
"The __theme parameter is deprecated for CozyNest. Please remove it from URL and use Cozy Nest settings instead.",
|
||||||
// Duplicate the first child element 100 times and append them to the fragment
|
)
|
||||||
for (let i = 0; i < 100; i++) {
|
|
||||||
const clone = container.querySelector('.card').cloneNode(true);
|
|
||||||
container.insertBefore(clone, firstChild);
|
|
||||||
}
|
}
|
||||||
};
|
// check for gradio theme (vlad's fork)
|
||||||
|
if (document.querySelector('#setting_gradio_theme input')) {
|
||||||
export const dummyControlNetBloc = () => {
|
const gradioTheme = document.querySelector('#setting_gradio_theme input').value
|
||||||
const container = document.querySelector("#txt2img_controlnet");
|
if (gradioTheme !== 'gradio/default' && gradioTheme !== '' && gradioTheme !== 'Default') {
|
||||||
|
CozyModal.showToast(
|
||||||
// Get the parent element of the container
|
'error',
|
||||||
const parent = container.parentElement;
|
'Incompatible theme',
|
||||||
|
'Cozy Nest may not be compatible with this theme. Please switch to the default theme. You can do this by going to the settings tab and selecting "gradio/default" or "Default" from the dropdown menu under "User interface > UI theme".',
|
||||||
// Duplicate the first child element 100 times and append them to the fragment
|
90000
|
||||||
for (let i = 0; i < 100; i++) {
|
)
|
||||||
const clone = parent.cloneNode(true);
|
}
|
||||||
parent.parentElement.insertBefore(clone, parent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const dummySubdirs = () => {
|
|
||||||
const $subdirs = $('#txt2img_lora_subdirs');
|
|
||||||
$subdirs.append($subdirs.html());
|
|
||||||
}
|
|
||||||
|
|
@ -12,92 +12,26 @@ import {
|
||||||
useDisclosure, useToast
|
useDisclosure, useToast
|
||||||
} from "@chakra-ui/react";
|
} from "@chakra-ui/react";
|
||||||
|
|
||||||
export function CozyModalSimple() {
|
export function CozyToast({registerReady}) {
|
||||||
|
|
||||||
const listen = 'CozyModalSimple'
|
|
||||||
const { isOpen, onOpen, onClose } = useDisclosure()
|
|
||||||
const [text, setText] = React.useState('')
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// listen to events on listen
|
|
||||||
|
|
||||||
const _eventFn = ({msg}) => {
|
|
||||||
setText(msg)
|
|
||||||
onOpen()
|
|
||||||
}
|
|
||||||
|
|
||||||
EventBus.on(listen, _eventFn)
|
|
||||||
return () => {
|
|
||||||
// unlisten to events on listen
|
|
||||||
EventBus.off(listen, _eventFn)
|
|
||||||
}
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Modal isOpen={isOpen} onClose={onClose}>
|
|
||||||
<ModalOverlay />
|
|
||||||
<ModalContent>
|
|
||||||
<ModalHeader>Modal Title</ModalHeader>
|
|
||||||
<ModalCloseButton />
|
|
||||||
<ModalBody>
|
|
||||||
<p>{text}</p>
|
|
||||||
</ModalBody>
|
|
||||||
|
|
||||||
<ModalFooter>
|
|
||||||
<Button colorScheme='blue' mr={3} onClick={onClose}>
|
|
||||||
Close
|
|
||||||
</Button>
|
|
||||||
<Button variant='ghost'>Secondary Action</Button>
|
|
||||||
</ModalFooter>
|
|
||||||
</ModalContent>
|
|
||||||
</Modal>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function CozyModalRich() {
|
|
||||||
|
|
||||||
const listen = 'CozyModalRich'
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// listen to events on listen
|
|
||||||
|
|
||||||
const _eventFn = (args) => {
|
|
||||||
CozyLogger.debug("CozyModalRoot event", listen, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
EventBus.on(listen, _eventFn)
|
|
||||||
return () => {
|
|
||||||
// unlisten to events on listen
|
|
||||||
EventBus.off(listen, _eventFn)
|
|
||||||
}
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="CozyModalRich">
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function CozyToast() {
|
|
||||||
const listen = 'CozyToast'
|
const listen = 'CozyToast'
|
||||||
const toast = useToast()
|
const toast = useToast()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// listen to events on listen
|
// listen to events on listen
|
||||||
|
|
||||||
const _eventFn = ({title, msg, status}) => {
|
const _eventFn = ({title, msg, status, duration}) => {
|
||||||
|
duration = duration || 9000
|
||||||
toast({
|
toast({
|
||||||
title: title,
|
title: title,
|
||||||
description: msg,
|
description: msg,
|
||||||
status: status,
|
status: status,
|
||||||
duration: 9000,
|
duration: duration,
|
||||||
isClosable: true,
|
isClosable: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.on(listen, _eventFn)
|
EventBus.on(listen, _eventFn)
|
||||||
|
registerReady()
|
||||||
return () => {
|
return () => {
|
||||||
// unlisten to events on listen
|
// unlisten to events on listen
|
||||||
EventBus.off(listen, _eventFn)
|
EventBus.off(listen, _eventFn)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import React from "react";
|
||||||
import ReactDOM from "react-dom/client";
|
import ReactDOM from "react-dom/client";
|
||||||
import {ChakraProvider} from "@chakra-ui/react";
|
import {ChakraProvider} from "@chakra-ui/react";
|
||||||
import {theme} from "../../chakra/chakra-theme.ts";
|
import {theme} from "../../chakra/chakra-theme.ts";
|
||||||
import {CozyModalRich, CozyModalSimple, CozyToast} from "./Modal.jsx";
|
import {CozyToast} from "./Modal.jsx";
|
||||||
import EventEmitter from 'eventemitter3';
|
import EventEmitter from 'eventemitter3';
|
||||||
|
|
||||||
class EventBusClass extends EventEmitter{
|
class EventBusClass extends EventEmitter{
|
||||||
|
|
@ -18,51 +18,44 @@ export const EventBus = new EventBusClass();
|
||||||
|
|
||||||
let _ready = false;
|
let _ready = false;
|
||||||
|
|
||||||
function prepareReactHost() {
|
async function prepareReactHost() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
_prepareReactHost(resolve);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function _prepareReactHost(resolve) {
|
||||||
// insert a div at the end of the body
|
// insert a div at the end of the body
|
||||||
const _hostCozyModalSimple =
|
|
||||||
`<div id="CozyModalSimple"/>`;
|
|
||||||
const _hostCozyModalRich =
|
|
||||||
`<div id="CozyModalRich"/>`;
|
|
||||||
const _hostCozyToast =
|
const _hostCozyToast =
|
||||||
`<div id="CozyToast"/>`;
|
`<div id="CozyToast"/>`;
|
||||||
|
|
||||||
document.body.insertAdjacentHTML("beforeend", _hostCozyModalSimple);
|
|
||||||
document.body.insertAdjacentHTML("beforeend", _hostCozyModalRich);
|
|
||||||
document.body.insertAdjacentHTML("beforeend", _hostCozyToast);
|
document.body.insertAdjacentHTML("beforeend", _hostCozyToast);
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById(`CozyModalSimple`)).render(
|
let _isReady = 0;
|
||||||
<React.StrictMode>
|
let _readyNeed = 0;
|
||||||
<ChakraProvider theme={theme} >
|
const registerReady = () => {
|
||||||
<CozyModalSimple />
|
_readyNeed++;
|
||||||
</ChakraProvider>
|
return () => {
|
||||||
</React.StrictMode>,
|
_isReady++;
|
||||||
)
|
if (_isReady === _readyNeed) {
|
||||||
|
_ready = true;
|
||||||
ReactDOM.createRoot(document.getElementById(`CozyModalRich`)).render(
|
resolve();
|
||||||
<React.StrictMode>
|
}
|
||||||
<ChakraProvider theme={theme} >
|
}
|
||||||
<CozyModalRich />
|
}
|
||||||
</ChakraProvider>
|
|
||||||
</React.StrictMode>,
|
|
||||||
)
|
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById(`CozyToast`)).render(
|
ReactDOM.createRoot(document.getElementById(`CozyToast`)).render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<ChakraProvider theme={theme} >
|
<ChakraProvider theme={theme} >
|
||||||
<CozyToast />
|
<CozyToast registerReady={registerReady()}/>
|
||||||
</ChakraProvider>
|
</ChakraProvider>
|
||||||
</React.StrictMode>,
|
</React.StrictMode>,
|
||||||
)
|
)
|
||||||
|
|
||||||
_ready = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let CozyModal = {
|
let CozyModal = {
|
||||||
prepareReactHost,
|
prepareReactHost,
|
||||||
showModalSimple: (msg) => EventBus.emit('CozyModalSimple', {msg}),
|
showToast: (status, title, msg, duration) => EventBus.emit('CozyToast', {status, title, msg, duration}),
|
||||||
showModalRich: () => EventBus.emit('CozyModalRich'),
|
|
||||||
showToast: (status, title, msg) => EventBus.emit('CozyToast', {status, title, msg}),
|
|
||||||
};
|
};
|
||||||
//hook on modal event
|
//hook on modal event
|
||||||
window.ModalEventBus = EventBus;
|
window.ModalEventBus = EventBus;
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@ import clearGeneratedImage from './tweaks/clear-generated-image.js'
|
||||||
import {createAlertDiv, showAlert} from "./tweaks/cozy-alert.js";
|
import {createAlertDiv, showAlert} from "./tweaks/cozy-alert.js";
|
||||||
import DOM_IDS from "./dom_ids.js";
|
import DOM_IDS from "./dom_ids.js";
|
||||||
import CozyNestEventBus from "../CozyNestEventBus.js";
|
import CozyNestEventBus from "../CozyNestEventBus.js";
|
||||||
import Modal from './modal/Module.jsx'
|
|
||||||
|
|
||||||
|
|
||||||
const addDraggable = ({prefix}) => {
|
const addDraggable = ({prefix}) => {
|
||||||
|
|
@ -1007,17 +1006,6 @@ const onLoad = (done, error) => {
|
||||||
// log time for onLoad execution after gradio has loaded
|
// log time for onLoad execution after gradio has loaded
|
||||||
SimpleTimer.time(COZY_NEST_DOM_TWEAK_LOAD_DURATION);
|
SimpleTimer.time(COZY_NEST_DOM_TWEAK_LOAD_DURATION);
|
||||||
|
|
||||||
// load modal module
|
|
||||||
Modal.prepareReactHost();
|
|
||||||
|
|
||||||
// check for gradio theme (vlad's fork)
|
|
||||||
if (document.querySelector('#setting_gradio_theme input')) {
|
|
||||||
const gradioTheme = document.querySelector('#setting_gradio_theme input').value
|
|
||||||
if (gradioTheme !== 'gradio/default' && gradioTheme !== '' && gradioTheme !== 'Default') {
|
|
||||||
showAlert('Warning','Cozy Nest may not be compatible with this theme. Please switch to the default theme. You can do this by going to the settings tab and selecting "gradio/default" or "Default" from the dropdown menu under "User interface > UI theme".')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//add quicksettings_gap after checkpoint reload button
|
//add quicksettings_gap after checkpoint reload button
|
||||||
// Select the target element
|
// Select the target element
|
||||||
const refresh_sd_model_checkpoint = document.querySelector('#refresh_sd_model_checkpoint');
|
const refresh_sd_model_checkpoint = document.querySelector('#refresh_sd_model_checkpoint');
|
||||||
|
|
@ -1148,14 +1136,6 @@ const onLoad = (done, error) => {
|
||||||
//add observer for .options resize
|
//add observer for .options resize
|
||||||
addOptionsObserver();
|
addOptionsObserver();
|
||||||
|
|
||||||
//legacy : check if url contains __theme which is deprecated
|
|
||||||
if (window.location.href.includes('__theme')) {
|
|
||||||
showAlert(
|
|
||||||
"Warning",
|
|
||||||
"The __theme parameter is deprecated for CozyNest. Please remove it from URL and use Cozy Nest settings instead.",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------- TWEAK SOME EXTENSION --------------- */
|
/* --------------- TWEAK SOME EXTENSION --------------- */
|
||||||
//if AWQ-container is present in COZY_NEST_CONFIG.extensions array from localStorage, tweak AWQ
|
//if AWQ-container is present in COZY_NEST_CONFIG.extensions array from localStorage, tweak AWQ
|
||||||
if (COZY_NEST_CONFIG.extensions
|
if (COZY_NEST_CONFIG.extensions
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
|
"build-cozy": "vite build && node cozy.build.js",
|
||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
|
||||||
|
|
@ -30,17 +30,29 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new link element and set its attributes
|
|
||||||
const cozyNestCss = document.createElement('link');
|
|
||||||
cozyNestCss.rel = 'stylesheet';
|
|
||||||
cozyNestCss.type = 'text/css';
|
|
||||||
cozyNestCss.href = `/cozy-nest-client/assets/index.css?t=${Date.now()}`;
|
|
||||||
|
|
||||||
// Append the link element to the document head
|
|
||||||
document.head.appendChild(cozyNestCss);
|
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", async function() {
|
document.addEventListener("DOMContentLoaded", async function() {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
//check if the param CozyNest=No is present in the url
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
const cozyNestParam = urlParams.get('CozyNest');
|
||||||
|
//if the param is present and set to No,
|
||||||
|
// or if url contains #CozyNest=No
|
||||||
|
// disable Cozy Nest
|
||||||
|
if (cozyNestParam === "No" || window.location.hash.includes("CozyNest=No")) {
|
||||||
|
console.log("CozyNest: disabled by url param")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new link element and set its attributes
|
||||||
|
const cozyNestCss = document.createElement('link');
|
||||||
|
cozyNestCss.rel = 'stylesheet';
|
||||||
|
cozyNestCss.type = 'text/css';
|
||||||
|
cozyNestCss.href = `/cozy-nest-client/assets/index.css?t=${Date.now()}`;
|
||||||
|
|
||||||
|
// Append the link element to the document head
|
||||||
|
document.head.appendChild(cozyNestCss);
|
||||||
|
|
||||||
await jsDynamicLoad(`/cozy-nest-client/assets/index.js?t=${Date.now()}`);
|
await jsDynamicLoad(`/cozy-nest-client/assets/index.js?t=${Date.now()}`);
|
||||||
cozyNestLoader();
|
cozyNestLoader();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,3 @@
|
||||||
import json
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from modules import shared
|
from modules import shared
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -18,22 +14,65 @@ class CozyLoggerClass:
|
||||||
|
|
||||||
def __init__(self, name: str):
|
def __init__(self, name: str):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.tag = f"[{self.name}]"
|
||||||
self.log_enabled = CozyLoggerClass.LOG_ENABLED
|
self.log_enabled = CozyLoggerClass.LOG_ENABLED
|
||||||
|
from scripts.cozy_lib.CozyNestConfig import CozyNestConfig
|
||||||
|
self.config = CozyNestConfig.instance()
|
||||||
|
if self.config.is_sdnext():
|
||||||
|
import logging
|
||||||
|
if CozyLoggerClass.LOG_ENABLED:
|
||||||
|
logging.getLogger(name).setLevel(logging.DEBUG)
|
||||||
|
else:
|
||||||
|
logging.getLogger(name).setLevel(logging.INFO)
|
||||||
|
|
||||||
|
base_log = logging.getLogger("sd")
|
||||||
|
logging.getLogger(name).handlers = base_log.handlers
|
||||||
|
|
||||||
|
def format_message(self, message: str):
|
||||||
|
if self.config.is_sdnext():
|
||||||
|
return f"{self.tag} {message}"
|
||||||
|
else:
|
||||||
|
return message
|
||||||
|
|
||||||
def debug(self, message: str):
|
def debug(self, message: str):
|
||||||
if self.log_enabled:
|
message = self.format_message(message)
|
||||||
print(f"[{self.name}:DEBUG] {message}")
|
if self.config.is_sdnext():
|
||||||
|
import logging
|
||||||
|
logging.getLogger(self.name).debug(message)
|
||||||
|
else:
|
||||||
|
if self.log_enabled:
|
||||||
|
print(f"[{self.name}:DEBUG] {message}")
|
||||||
|
|
||||||
def warning(self, message: str):
|
def warning(self, message: str):
|
||||||
print(f"[{self.name}:WARNING] {message}")
|
message = self.format_message(message)
|
||||||
|
if self.config.is_sdnext():
|
||||||
|
import logging
|
||||||
|
logging.getLogger(self.name).warning(message)
|
||||||
|
else:
|
||||||
|
print(f"[{self.name}:WARNING] {message}")
|
||||||
|
|
||||||
def info(self, message: str):
|
def info(self, message: str):
|
||||||
print(f"[{self.name}:INFO] {message}")
|
message = self.format_message(message)
|
||||||
|
if self.config.is_sdnext():
|
||||||
|
import logging
|
||||||
|
logging.getLogger(self.name).info(message)
|
||||||
|
else:
|
||||||
|
print(f"[{self.name}:INFO] {message}")
|
||||||
|
|
||||||
|
def error(self, message: str, exception: Exception = None):
|
||||||
|
message = self.format_message(message)
|
||||||
|
if self.config.is_sdnext():
|
||||||
|
import logging
|
||||||
|
logging.getLogger(self.name).error(message, exc_info=exception)
|
||||||
|
else:
|
||||||
|
print(f"[{self.name}:ERROR] {message}")
|
||||||
|
if exception is not None:
|
||||||
|
print(exception)
|
||||||
|
|
||||||
|
|
||||||
CozyLogger = CozyLoggerClass("Cozy")
|
CozyLogger = CozyLoggerClass("CozyNest")
|
||||||
if CozyLoggerClass.LOG_ENABLED:
|
if CozyLoggerClass.LOG_ENABLED:
|
||||||
CozyLogger.warning("Logger enabled")
|
CozyLogger.debug("Logger enabled")
|
||||||
|
|
||||||
CozyLoggerExtNe = CozyLoggerClass("Cozy:ExtNe")
|
CozyLoggerExtNe = CozyLoggerClass("Cozy:ExtNe")
|
||||||
CozyLoggerConfig = CozyLoggerClass("Cozy:Config")
|
CozyLoggerConfig = CozyLoggerClass("Cozy:Config")
|
||||||
|
|
|
||||||
|
|
@ -3,27 +3,31 @@ import os
|
||||||
|
|
||||||
from modules import shared
|
from modules import shared
|
||||||
from scripts.cozy_lib import Static
|
from scripts.cozy_lib import Static
|
||||||
from scripts.cozy_lib.tools import output_folder_array
|
|
||||||
from scripts.cozy_lib.CozyLogger import CozyLoggerConfig
|
|
||||||
|
|
||||||
|
|
||||||
class CozyNestConfig:
|
class CozyNestConfig:
|
||||||
|
|
||||||
|
WEBUI_AUTO = 'auto1111'
|
||||||
|
WEBUI_SD_NEXT = 'sd.next'
|
||||||
|
WEBUI_UNKNOWN = 'unknown'
|
||||||
|
_instance = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
config = self.get_dict_from_config()
|
config = self.get_dict_from_config()
|
||||||
self.config = {**CozyNestConfig.get_default_settings(), **config}
|
self.config = {**CozyNestConfig.get_default_settings(), **config}
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
if self.config['webui'] == 'unknown' and hasattr(shared, 'get_version'):
|
if self.config['webui'] == CozyNestConfig.WEBUI_UNKNOWN and hasattr(shared, 'get_version'):
|
||||||
version = shared.get_version()
|
version = shared.get_version()
|
||||||
# check if the 'app' is 'sd.next'
|
# check if the 'app' is 'sd.next'
|
||||||
if version['app'] == 'sd.next':
|
if version['app'] == CozyNestConfig.WEBUI_SD_NEXT:
|
||||||
self.config['webui'] = 'sd.next'
|
self.config['webui'] = CozyNestConfig.WEBUI_SD_NEXT
|
||||||
self.config['fetch_output_folder_from_a1111_settings'] = False
|
self.config['fetch_output_folder_from_a1111_settings'] = False
|
||||||
else:
|
else:
|
||||||
self.config['webui'] = 'auto1111'
|
self.config['webui'] = CozyNestConfig.WEBUI_AUTO
|
||||||
self.save_settings(self.config)
|
self.save_settings(self.config)
|
||||||
|
|
||||||
if self.config['webui'] == 'sd.next':
|
if self.config['webui'] == CozyNestConfig.WEBUI_SD_NEXT:
|
||||||
self.config['fetch_output_folder_from_a1111_settings'] = False
|
self.config['fetch_output_folder_from_a1111_settings'] = False
|
||||||
|
|
||||||
# check if cnib_output_folder is empty and/or need to be fetched from a1111 settings
|
# check if cnib_output_folder is empty and/or need to be fetched from a1111 settings
|
||||||
|
|
@ -34,6 +38,7 @@ class CozyNestConfig:
|
||||||
|
|
||||||
if self.config.get('fetch_output_folder_from_a1111_settings'):
|
if self.config.get('fetch_output_folder_from_a1111_settings'):
|
||||||
# merge cnib_output_folder output_folder_array()
|
# merge cnib_output_folder output_folder_array()
|
||||||
|
from scripts.cozy_lib.Static import output_folder_array
|
||||||
cnib_output_folder = cnib_output_folder + list(set(output_folder_array()) - set(cnib_output_folder))
|
cnib_output_folder = cnib_output_folder + list(set(output_folder_array()) - set(cnib_output_folder))
|
||||||
|
|
||||||
self.config['cnib_output_folder'] = cnib_output_folder
|
self.config['cnib_output_folder'] = cnib_output_folder
|
||||||
|
|
@ -41,6 +46,12 @@ class CozyNestConfig:
|
||||||
# save the merged settings
|
# save the merged settings
|
||||||
self.save_settings(self.config)
|
self.save_settings(self.config)
|
||||||
|
|
||||||
|
def is_sdnext(self):
|
||||||
|
return self.config['webui'] == CozyNestConfig.WEBUI_SD_NEXT
|
||||||
|
|
||||||
|
def is_auto1111(self):
|
||||||
|
return self.config['webui'] == CozyNestConfig.WEBUI_AUTO
|
||||||
|
|
||||||
def migrate(self):
|
def migrate(self):
|
||||||
current_version = CozyNestConfig.get_version()
|
current_version = CozyNestConfig.get_version()
|
||||||
current_version_code = CozyNestConfig.normalize_version(current_version)
|
current_version_code = CozyNestConfig.normalize_version(current_version)
|
||||||
|
|
@ -51,8 +62,6 @@ class CozyNestConfig:
|
||||||
local_version_code = CozyNestConfig.normalize_version(local_version)
|
local_version_code = CozyNestConfig.normalize_version(local_version)
|
||||||
|
|
||||||
if local_version_code < current_version_code:
|
if local_version_code < current_version_code:
|
||||||
CozyLoggerConfig.debug(f"current_version: {current_version} current_version_code: {current_version_code}")
|
|
||||||
CozyLoggerConfig.debug(f"local_version: {local_version} local_version_code: {local_version_code}")
|
|
||||||
if local_version_code < CozyNestConfig.normalize_version('2.4.0'):
|
if local_version_code < CozyNestConfig.normalize_version('2.4.0'):
|
||||||
self.config['enable_extra_network_tweaks'] = False
|
self.config['enable_extra_network_tweaks'] = False
|
||||||
self.config['enable_cozy_extra_networks'] = True
|
self.config['enable_cozy_extra_networks'] = True
|
||||||
|
|
@ -61,6 +70,14 @@ class CozyNestConfig:
|
||||||
|
|
||||||
self.simple_save_settings()
|
self.simple_save_settings()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def instance():
|
||||||
|
if CozyNestConfig._instance is None:
|
||||||
|
CozyNestConfig._instance = CozyNestConfig()
|
||||||
|
CozyNestConfig._instance.init()
|
||||||
|
CozyNestConfig._instance.migrate()
|
||||||
|
return CozyNestConfig._instance
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_version():
|
def get_version():
|
||||||
with open(Static.VERSION_FILENAME, 'r') as f:
|
with open(Static.VERSION_FILENAME, 'r') as f:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,29 @@
|
||||||
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
from modules import shared, scripts
|
||||||
|
|
||||||
EXTENSION_FOLDER = Path(__file__).parent.parent.parent
|
EXTENSION_FOLDER = Path(__file__).parent.parent.parent
|
||||||
CONFIG_FILENAME = Path(EXTENSION_FOLDER, "nevyui_settings.json")
|
CONFIG_FILENAME = Path(EXTENSION_FOLDER, "nevyui_settings.json")
|
||||||
VERSION_FILENAME = Path(EXTENSION_FOLDER, "version_data.json")
|
VERSION_FILENAME = Path(EXTENSION_FOLDER, "version_data.json")
|
||||||
CACHE_FILENAME = Path(EXTENSION_FOLDER, "data", "images.cache")
|
CACHE_FILENAME = Path(EXTENSION_FOLDER, "data", "images.cache")
|
||||||
|
|
||||||
|
|
||||||
|
def output_folder_array():
|
||||||
|
outdir_txt2img_samples = shared.opts.data['outdir_txt2img_samples']
|
||||||
|
outdir_img2img_samples = shared.opts.data['outdir_img2img_samples']
|
||||||
|
outdir_extras_samples = shared.opts.data['outdir_extras_samples']
|
||||||
|
base_dir = scripts.basedir()
|
||||||
|
# check if outdir_txt2img_samples is a relative path
|
||||||
|
if not os.path.isabs(outdir_txt2img_samples):
|
||||||
|
outdir_txt2img_samples = os.path.normpath(os.path.join(base_dir, outdir_txt2img_samples))
|
||||||
|
if not os.path.isabs(outdir_img2img_samples):
|
||||||
|
outdir_img2img_samples = os.path.normpath(os.path.join(base_dir, outdir_img2img_samples))
|
||||||
|
if not os.path.isabs(outdir_extras_samples):
|
||||||
|
outdir_extras_samples = os.path.normpath(os.path.join(base_dir, outdir_extras_samples))
|
||||||
|
images_folders = [
|
||||||
|
outdir_txt2img_samples,
|
||||||
|
outdir_img2img_samples,
|
||||||
|
outdir_extras_samples,
|
||||||
|
]
|
||||||
|
return images_folders
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ from fastapi import Response, Request
|
||||||
|
|
||||||
from modules import sd_hijack, shared, sd_models
|
from modules import sd_hijack, shared, sd_models
|
||||||
from scripts.cozy_lib.CozyLogger import CozyLoggerExtNe
|
from scripts.cozy_lib.CozyLogger import CozyLoggerExtNe
|
||||||
|
from scripts.cozy_lib.CozyNestConfig import CozyNestConfig
|
||||||
|
|
||||||
|
|
||||||
def format_path_array(paths, _type, validator):
|
def format_path_array(paths, _type, validator):
|
||||||
|
|
@ -36,6 +37,11 @@ def format_path_array(paths, _type, validator):
|
||||||
# credit to https://github.com/DominikDoom/a1111-sd-webui-tagcomplete
|
# credit to https://github.com/DominikDoom/a1111-sd-webui-tagcomplete
|
||||||
class CozyExtraNetworksClass:
|
class CozyExtraNetworksClass:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self.MODEL_PATH = None
|
||||||
|
self.LYCO_PATH = None
|
||||||
|
self.LORA_PATH = None
|
||||||
|
self.HYP_PATH = None
|
||||||
|
self.EMB_PATH = None
|
||||||
try:
|
try:
|
||||||
from modules.paths import extensions_dir, script_path
|
from modules.paths import extensions_dir, script_path
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
|
@ -54,24 +60,11 @@ class CozyExtraNetworksClass:
|
||||||
# The extension base path
|
# The extension base path
|
||||||
self.EXT_PATH = self.FILE_DIR.joinpath('extensions')
|
self.EXT_PATH = self.FILE_DIR.joinpath('extensions')
|
||||||
|
|
||||||
self.EMB_PATH = Path(shared.cmd_opts.embeddings_dir)
|
config = CozyNestConfig.instance()
|
||||||
self.HYP_PATH = Path(shared.cmd_opts.hypernetwork_dir)
|
if config.is_auto1111():
|
||||||
|
self.init_for_a1111()
|
||||||
try:
|
else:
|
||||||
self.LORA_PATH = Path(shared.cmd_opts.lora_dir)
|
self.init_for_sdnext()
|
||||||
except AttributeError:
|
|
||||||
self.LORA_PATH = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
self.LYCO_PATH = Path(shared.cmd_opts.lyco_dir)
|
|
||||||
except AttributeError:
|
|
||||||
self.LYCO_PATH = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
ckpt_dir = shared.cmd_opts.ckpt_dir or sd_models.model_path
|
|
||||||
self.MODEL_PATH = Path(ckpt_dir)
|
|
||||||
except AttributeError or TypeError:
|
|
||||||
self.MODEL_PATH = None
|
|
||||||
|
|
||||||
# print all paths
|
# print all paths
|
||||||
CozyLoggerExtNe.debug(f"FILE_DIR: {self.FILE_DIR}")
|
CozyLoggerExtNe.debug(f"FILE_DIR: {self.FILE_DIR}")
|
||||||
|
|
@ -82,6 +75,27 @@ class CozyExtraNetworksClass:
|
||||||
CozyLoggerExtNe.debug(f"LYCO_PATH: {self.LYCO_PATH}")
|
CozyLoggerExtNe.debug(f"LYCO_PATH: {self.LYCO_PATH}")
|
||||||
CozyLoggerExtNe.debug(f"MODEL_PATH: {self.MODEL_PATH}")
|
CozyLoggerExtNe.debug(f"MODEL_PATH: {self.MODEL_PATH}")
|
||||||
|
|
||||||
|
def init_for_a1111(self):
|
||||||
|
self.EMB_PATH = Path(shared.cmd_opts.embeddings_dir)
|
||||||
|
self.HYP_PATH = Path(shared.cmd_opts.hypernetwork_dir)
|
||||||
|
try:
|
||||||
|
self.LORA_PATH = Path(shared.cmd_opts.lora_dir)
|
||||||
|
except AttributeError:
|
||||||
|
self.LORA_PATH = None
|
||||||
|
try:
|
||||||
|
self.LYCO_PATH = Path(shared.cmd_opts.lyco_dir)
|
||||||
|
except AttributeError:
|
||||||
|
self.LYCO_PATH = None
|
||||||
|
try:
|
||||||
|
ckpt_dir = shared.cmd_opts.ckpt_dir or sd_models.model_path
|
||||||
|
self.MODEL_PATH = Path(ckpt_dir)
|
||||||
|
except AttributeError or TypeError:
|
||||||
|
self.MODEL_PATH = None
|
||||||
|
|
||||||
|
def init_for_sdnext(self):
|
||||||
|
# TODO NEVYSHA implement sd next compliant
|
||||||
|
self.init_for_a1111()
|
||||||
|
|
||||||
def get_hypernetworks(self):
|
def get_hypernetworks(self):
|
||||||
"""Write a list of all hypernetworks"""
|
"""Write a list of all hypernetworks"""
|
||||||
|
|
||||||
|
|
@ -171,7 +185,7 @@ class CozyExtraNetworksClass:
|
||||||
|
|
||||||
results = sorted(results, key=lambda x: x["name"].lower())
|
results = sorted(results, key=lambda x: x["name"].lower())
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
print(
|
CozyLoggerExtNe.warning(
|
||||||
"tag_autocomplete_helper: Old webui version or unrecognized model shape, using fallback for embedding completion.")
|
"tag_autocomplete_helper: Old webui version or unrecognized model shape, using fallback for embedding completion.")
|
||||||
# Get a list of all embeddings in the folder
|
# Get a list of all embeddings in the folder
|
||||||
all_embeds = [str(e.relative_to(self.EMB_PATH)) for e in self.EMB_PATH.rglob("*") if
|
all_embeds = [str(e.relative_to(self.EMB_PATH)) for e in self.EMB_PATH.rglob("*") if
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,11 @@ import websockets
|
||||||
from websockets.server import serve
|
from websockets.server import serve
|
||||||
|
|
||||||
from scripts.cozy_lib import tools
|
from scripts.cozy_lib import tools
|
||||||
|
from scripts.cozy_lib.CozyLogger import CozyLoggerImageBrowser as CozyLogger
|
||||||
|
|
||||||
|
|
||||||
async def start_server(images_folders, server_port, stopper):
|
async def start_server(images_folders, server_port, stopper):
|
||||||
print(f"CozyNestSocket: Starting socket server on localhost:{server_port}...")
|
CozyLogger.info(f"CozyNestSocket: Starting socket server on localhost:{server_port}...")
|
||||||
|
|
||||||
CLIENTS = set()
|
CLIENTS = set()
|
||||||
|
|
||||||
|
|
@ -17,7 +18,7 @@ async def start_server(images_folders, server_port, stopper):
|
||||||
CLIENTS.add(websocket)
|
CLIENTS.add(websocket)
|
||||||
while True:
|
while True:
|
||||||
if stopper.is_set():
|
if stopper.is_set():
|
||||||
print(f"CozyNestSocket: Stopping socket server on localhost:{server_port}...")
|
CozyLogger.info(f"CozyNestSocket: Stopping socket server on localhost:{server_port}...")
|
||||||
break
|
break
|
||||||
|
|
||||||
# Receive data from the client
|
# Receive data from the client
|
||||||
|
|
@ -28,8 +29,7 @@ async def start_server(images_folders, server_port, stopper):
|
||||||
try:
|
try:
|
||||||
res = await process(data)
|
res = await process(data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"CozyNestSocket: Error while processing data: {data}")
|
CozyLogger.error(f"CozyNestSocket: Error while processing data: {data}", e)
|
||||||
print(e)
|
|
||||||
res = json.dumps({
|
res = json.dumps({
|
||||||
'what': 'error',
|
'what': 'error',
|
||||||
'data': 'None',
|
'data': 'None',
|
||||||
|
|
@ -64,7 +64,7 @@ async def start_server(images_folders, server_port, stopper):
|
||||||
})
|
})
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print(f"CozyNestSocket: Unknown data: {data}")
|
CozyLogger.info(f"CozyNestSocket: Unknown data: {data}")
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
'what': 'error',
|
'what': 'error',
|
||||||
'data': 'None',
|
'data': 'None',
|
||||||
|
|
@ -103,6 +103,6 @@ async def start_server(images_folders, server_port, stopper):
|
||||||
while True:
|
while True:
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
if stopper.is_set():
|
if stopper.is_set():
|
||||||
print(f"CozyNestSocket: Stopping socket server on localhost:{server_port}...")
|
CozyLogger.info(f"CozyNestSocket: Stopping socket server on localhost:{server_port}...")
|
||||||
stop.set_result(True)
|
stop.set_result(True)
|
||||||
break
|
break
|
||||||
|
|
|
||||||
|
|
@ -12,26 +12,6 @@ from scripts.cozy_lib import Static
|
||||||
from scripts.cozy_lib.CozyLogger import CozyLoggerImageBrowser as Logger
|
from scripts.cozy_lib.CozyLogger import CozyLoggerImageBrowser as Logger
|
||||||
|
|
||||||
|
|
||||||
def output_folder_array():
|
|
||||||
outdir_txt2img_samples = shared.opts.data['outdir_txt2img_samples']
|
|
||||||
outdir_img2img_samples = shared.opts.data['outdir_img2img_samples']
|
|
||||||
outdir_extras_samples = shared.opts.data['outdir_extras_samples']
|
|
||||||
base_dir = scripts.basedir()
|
|
||||||
# check if outdir_txt2img_samples is a relative path
|
|
||||||
if not os.path.isabs(outdir_txt2img_samples):
|
|
||||||
outdir_txt2img_samples = os.path.normpath(os.path.join(base_dir, outdir_txt2img_samples))
|
|
||||||
if not os.path.isabs(outdir_img2img_samples):
|
|
||||||
outdir_img2img_samples = os.path.normpath(os.path.join(base_dir, outdir_img2img_samples))
|
|
||||||
if not os.path.isabs(outdir_extras_samples):
|
|
||||||
outdir_extras_samples = os.path.normpath(os.path.join(base_dir, outdir_extras_samples))
|
|
||||||
images_folders = [
|
|
||||||
outdir_txt2img_samples,
|
|
||||||
outdir_img2img_samples,
|
|
||||||
outdir_extras_samples,
|
|
||||||
]
|
|
||||||
return images_folders
|
|
||||||
|
|
||||||
|
|
||||||
def get_image_exif(path: str):
|
def get_image_exif(path: str):
|
||||||
try:
|
try:
|
||||||
image = Image.open(path)
|
image = Image.open(path)
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ from scripts.cozy_lib import tools
|
||||||
from scripts.cozy_lib.CozyLogger import CozyLogger
|
from scripts.cozy_lib.CozyLogger import CozyLogger
|
||||||
from scripts.cozy_lib.CozyNestConfig import CozyNestConfig
|
from scripts.cozy_lib.CozyNestConfig import CozyNestConfig
|
||||||
from scripts.cozy_lib.cozynest_image_browser import start_server
|
from scripts.cozy_lib.cozynest_image_browser import start_server
|
||||||
from scripts.cozy_lib.tools import output_folder_array
|
from scripts.cozy_lib.Static import output_folder_array
|
||||||
|
|
||||||
|
|
||||||
def request_restart():
|
def request_restart():
|
||||||
|
|
@ -43,7 +43,7 @@ def update():
|
||||||
|
|
||||||
# perform git pull in the extension folder
|
# perform git pull in the extension folder
|
||||||
output = subprocess.check_output([git, '-C', subdir, 'pull', '--autostash'])
|
output = subprocess.check_output([git, '-C', subdir, 'pull', '--autostash'])
|
||||||
print(output.decode('utf-8'))
|
CozyLogger.info(output.decode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
def is_port_free(port):
|
def is_port_free(port):
|
||||||
|
|
@ -62,13 +62,13 @@ def is_port_free(port):
|
||||||
|
|
||||||
def serv_img_browser_socket(server_port=3333, auto_search_port=True, cnib_output_folder=None):
|
def serv_img_browser_socket(server_port=3333, auto_search_port=True, cnib_output_folder=None):
|
||||||
if cnib_output_folder is None or cnib_output_folder == []:
|
if cnib_output_folder is None or cnib_output_folder == []:
|
||||||
print("CozyNest: No output folder specified for image browser. Aborting.")
|
CozyLogger.error("CozyNest: No output folder specified for image browser. Aborting.")
|
||||||
return
|
return
|
||||||
|
|
||||||
# check if port is free
|
# check if port is free
|
||||||
if auto_search_port:
|
if auto_search_port:
|
||||||
while not is_port_free(server_port) and server_port < 64000:
|
while not is_port_free(server_port) and server_port < 64000:
|
||||||
print(f"CozyNest: Port {server_port} is already in use. Searching for a free port.")
|
CozyLogger.info(f"CozyNest: Port {server_port} is already in use. Searching for a free port.")
|
||||||
server_port += 1
|
server_port += 1
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
@ -79,8 +79,7 @@ def serv_img_browser_socket(server_port=3333, auto_search_port=True, cnib_output
|
||||||
start_server_in_dedicated_process(cnib_output_folder, server_port)
|
start_server_in_dedicated_process(cnib_output_folder, server_port)
|
||||||
return server_port
|
return server_port
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("CozyNest: Error while starting socket server")
|
CozyLogger.error("CozyNest: Error while starting socket server", e)
|
||||||
print(e)
|
|
||||||
|
|
||||||
|
|
||||||
def start_server_in_dedicated_process(_images_folders, server_port):
|
def start_server_in_dedicated_process(_images_folders, server_port):
|
||||||
|
|
@ -132,11 +131,9 @@ _server_port = None
|
||||||
def on_ui_tabs():
|
def on_ui_tabs():
|
||||||
global _server_port
|
global _server_port
|
||||||
|
|
||||||
config = CozyNestConfig()
|
config = CozyNestConfig.instance()
|
||||||
config.init()
|
|
||||||
config.migrate()
|
|
||||||
|
|
||||||
CozyLogger.info(f"version: {config.get('version')}")
|
CozyLogger.info(f"version: {config.get('version')} on {config.get('webui')}")
|
||||||
|
|
||||||
# check if the user has disabled the image browser
|
# check if the user has disabled the image browser
|
||||||
disable_image_browser_value = config.get('disable_image_browser')
|
disable_image_browser_value = config.get('disable_image_browser')
|
||||||
|
|
@ -152,7 +149,7 @@ def on_ui_tabs():
|
||||||
)
|
)
|
||||||
_server_port = server_port
|
_server_port = server_port
|
||||||
else:
|
else:
|
||||||
print("CozyNest: Image browser is disabled. To enable it, go to the CozyNest settings.")
|
CozyLogger.info("CozyNest: Image browser is disabled. To enable it, go to the CozyNest settings.")
|
||||||
|
|
||||||
def on_image_saved(gen_params: script_callbacks.ImageSaveParams):
|
def on_image_saved(gen_params: script_callbacks.ImageSaveParams):
|
||||||
base_dir = scripts.basedir()
|
base_dir = scripts.basedir()
|
||||||
|
|
@ -226,7 +223,7 @@ def cozy_nest_api(_: Any, app: FastAPI, **kwargs):
|
||||||
# Access POST parameters
|
# Access POST parameters
|
||||||
data = await request.json()
|
data = await request.json()
|
||||||
|
|
||||||
config = CozyNestConfig()
|
config = CozyNestConfig.instance()
|
||||||
|
|
||||||
config.save_settings(data)
|
config.save_settings(data)
|
||||||
|
|
||||||
|
|
@ -234,7 +231,7 @@ def cozy_nest_api(_: Any, app: FastAPI, **kwargs):
|
||||||
|
|
||||||
@app.delete("/cozy-nest/config")
|
@app.delete("/cozy-nest/config")
|
||||||
async def delete_config():
|
async def delete_config():
|
||||||
config = CozyNestConfig()
|
config = CozyNestConfig.instance()
|
||||||
config.reset_settings()
|
config.reset_settings()
|
||||||
return {"message": "Config deleted successfully"}
|
return {"message": "Config deleted successfully"}
|
||||||
|
|
||||||
|
|
@ -275,7 +272,7 @@ def cozy_nest_api(_: Any, app: FastAPI, **kwargs):
|
||||||
async def delete_index():
|
async def delete_index():
|
||||||
global _server_port
|
global _server_port
|
||||||
|
|
||||||
config = CozyNestConfig()
|
config = CozyNestConfig.instance()
|
||||||
cnib_output_folder = config.get('cnib_output_folder')
|
cnib_output_folder = config.get('cnib_output_folder')
|
||||||
if cnib_output_folder and cnib_output_folder != "":
|
if cnib_output_folder and cnib_output_folder != "":
|
||||||
tools.delete_index()
|
tools.delete_index()
|
||||||
|
|
@ -305,7 +302,7 @@ def cozy_nest_api(_: Any, app: FastAPI, **kwargs):
|
||||||
# do nothing for now
|
# do nothing for now
|
||||||
return Response(status_code=501, content="unimplemented")
|
return Response(status_code=501, content="unimplemented")
|
||||||
|
|
||||||
config = CozyNestConfig()
|
config = CozyNestConfig.instance()
|
||||||
archive_path = config.get('archive_path')
|
archive_path = config.get('archive_path')
|
||||||
if not archive_path or archive_path == "":
|
if not archive_path or archive_path == "":
|
||||||
# return {"message": "archive path not set"}
|
# return {"message": "archive path not set"}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
{
|
{
|
||||||
"version": "2.4.2"
|
"version": "2.4.3"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue