|
|
|
|
|
import os |
|
import time |
|
import ipywidgets as widgets |
|
from ipywidgets import Label, Button, VBox, HBox |
|
from IPython.display import display, HTML, Javascript |
|
|
|
|
|
|
|
def detect_environment(): |
|
free_plan = (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES') / (1024. ** 3) <= 20) |
|
environments = { |
|
'COLAB_GPU': ('Google Colab', "/root" if free_plan else "/content"), |
|
'KAGGLE_URL_BASE': ('Kaggle', "/kaggle/working/content") |
|
} |
|
|
|
for env_var, (environment, path) in environments.items(): |
|
if env_var in os.environ: |
|
return environment, path, free_plan |
|
|
|
env, root_path, free_plan = detect_environment() |
|
webui_path = f"{root_path}/sdw" |
|
|
|
|
|
|
|
|
|
CSS = """ |
|
<style> |
|
/* General Styles */ |
|
|
|
hr { |
|
border-color: grey; |
|
background-color: grey; |
|
opacity: 0.25; |
|
} |
|
|
|
.instruction_AC { |
|
font-family: cursive; |
|
font-size: 18px; |
|
color: grey; |
|
user-select: none; |
|
cursor: default; |
|
} |
|
|
|
|
|
/* Container style */ |
|
|
|
.container_AC { |
|
position: relative; |
|
background-color: #232323; |
|
width: 800px; |
|
height: auto; |
|
padding: 15px; |
|
border-radius: 15px; |
|
box-shadow: 0 0 50px rgba(0, 0, 0, 0.3); |
|
margin-bottom: 5px; |
|
overflow: visible; |
|
} |
|
|
|
.container_AC::before { |
|
position: absolute; |
|
top: 5px; |
|
right: 10px; |
|
content: "AutoCleanerV3.6"; |
|
font-weight: bold; |
|
font-size: 24px; |
|
color: rgba(0, 0, 0, 0.2); |
|
} |
|
|
|
.container_AC::after { |
|
position: absolute; |
|
top: 30px; |
|
right: 10px; |
|
content: "ANXETY"; |
|
font-weight: bold; |
|
font-size: 18px; |
|
color: rgba(0, 0, 0, 0.2); |
|
} |
|
|
|
.custom-select-multiple_AC select { |
|
padding: 10px; |
|
font-family: cursive; |
|
border: 1px solid #262626 !important; |
|
border-radius: 10px; |
|
color: white; |
|
background-color: #1c1c1c; |
|
box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5); |
|
} |
|
|
|
.output_AC { |
|
padding: 10px; |
|
height: auto; |
|
border: 1px solid #262626; |
|
border-radius: 10px; |
|
background-color: #1c1c1c; |
|
box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5); |
|
width: auto; |
|
box-sizing: border-box; |
|
} |
|
|
|
.output_message_AC { |
|
font-family: cursive; |
|
color: white !important; |
|
font-size: 14px; |
|
user-select: none; |
|
cursor: default |
|
} |
|
|
|
|
|
.storage_info_AC { |
|
padding: 5px 20px; |
|
height: auto; |
|
border: 1px solid #262626; |
|
border-radius: 10px; |
|
background-color: #1c1c1c; |
|
box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5); |
|
width: auto; |
|
font-family: cursive; |
|
color: #B2B2B2 !important; |
|
font-size: 14px; |
|
user-select: none; |
|
cursor: default |
|
} |
|
|
|
|
|
/* Button and storage info layout */ |
|
.lower_information_panel_AC { |
|
display: flex; |
|
align-items: center; |
|
justify-content: space-between; |
|
} |
|
|
|
|
|
/* Button style */ |
|
|
|
.button_AC { |
|
width: auto; |
|
font-family: cursive; |
|
color: white !important; |
|
font-size: 14px; |
|
font-weight: bold; |
|
height: 35px; |
|
border-radius: 15px; |
|
background-image: radial-gradient(circle at top left, purple 10%, violet 90%); |
|
background-size: 200% 200%; |
|
background-position: left bottom; |
|
transition: background 0.5s ease-in-out, transform 0.3s ease; |
|
} |
|
|
|
.button_AC:hover { |
|
cursor: pointer; |
|
background-size: 200% 200%; |
|
background-position: right bottom; |
|
transform: translateY(1px); |
|
} |
|
|
|
.button_execute_AC:hover { |
|
background-image: radial-gradient(circle at top left, purple 10%, #93ac47 90%); |
|
} |
|
|
|
.button_clear_AC:hover { |
|
background-image: radial-gradient(circle at top left, purple 10%, #fc3468 90%); |
|
} |
|
|
|
.button_execute_AC:active, |
|
.button_clear_AC:active { |
|
filter: brightness(0.75); |
|
} |
|
|
|
.jupyter-widgets.lm-Widget:focus { |
|
outline: none; |
|
} |
|
|
|
|
|
/* Animation of elements */ |
|
|
|
/* Emergence */ |
|
.container_AC { |
|
animation-name: slideInTopBlur; |
|
animation-duration: 0.7s; |
|
animation-fill-mode: forwards; |
|
} |
|
|
|
@keyframes slideInTopBlur { |
|
0% { |
|
transform: translate3d(0, 50%, 0) scale(0.85) rotate3d(1, 0, 0, -85deg); |
|
filter: blur(5px) grayscale(1) brightness(0.5); |
|
opacity: 0; |
|
} |
|
100% { |
|
transform: translate3d(0, 0, 0) scale(1) rotate3d(1, 0, 0, 0deg); |
|
filter: blur(0) grayscale(0) brightness(1); |
|
opacity: 1; |
|
} |
|
} |
|
|
|
/* Leaving */ |
|
.container_AC.hide { |
|
animation-name: slideOutTopBlur; |
|
animation-duration: 0.5s; |
|
animation-fill-mode: forwards; |
|
} |
|
|
|
@keyframes slideOutTopBlur { |
|
0% { |
|
transform: translate3d(0, 0, 0) scale(1); |
|
filter: blur(0) grayscale(0) brightness(1); |
|
opacity: 1; |
|
} |
|
100% { |
|
transform: translate3d(0, -100%, 0); |
|
filter: blur(5px) grayscale(1) brightness(0); |
|
opacity: 0; |
|
} |
|
} |
|
</style> |
|
""" |
|
|
|
display(HTML(CSS)) |
|
|
|
|
|
|
|
|
|
directories = { |
|
"Images": f"{webui_path}/outputs", |
|
"Models": f"{webui_path}/models/Stable-diffusion/", |
|
"Vae": f"{webui_path}/models/VAE/", |
|
"LoRa": f"{webui_path}/models/Lora/", |
|
"ControlNet Models": f"{webui_path}/models/ControlNet/" |
|
} |
|
|
|
""" functions """ |
|
def clean_directory(directory): |
|
deleted_files = 0 |
|
for root, dirs, files in os.walk(directory): |
|
for file in files: |
|
if file.endswith(".txt"): |
|
continue |
|
os.remove(os.path.join(root, file)) |
|
if not file.endswith(".yaml"): |
|
deleted_files += 1 |
|
return deleted_files |
|
|
|
def update_memory_info(): |
|
disk_space = psutil.disk_usage(os.getcwd()) |
|
total = disk_space.total / (1024 ** 3) |
|
used = disk_space.used / (1024 ** 3) |
|
free = disk_space.free / (1024 ** 3) |
|
|
|
storage_info.value = f''' |
|
<div class="storage_info_AC">Всего: {total:.2f} GB <span style="color: #555">|</span> Используется: {used:.2f} GB <span style="color: #555">|</span> Свободно: {free:.2f} GB</div> |
|
''' |
|
|
|
def on_execute_button_press(button): |
|
selected_cleaners = auto_cleaner_widget.value |
|
deleted_files_dict = {} |
|
|
|
for option in selected_cleaners: |
|
if option in directories: |
|
deleted_files_dict[option] = clean_directory(directories[option]) |
|
|
|
output.clear_output() |
|
|
|
with output: |
|
for message in generate_messages(deleted_files_dict): |
|
message_widget = HTML(f'<p class="output_message_AC">{message}</p>') |
|
display(message_widget) |
|
|
|
update_memory_info() |
|
|
|
def on_clear_button_press(button): |
|
container.add_class("hide") |
|
time.sleep(0.5) |
|
widgets.Widget.close_all() |
|
|
|
def generate_messages(deleted_files_dict): |
|
messages = [] |
|
word_variants = { |
|
"Images": "Images", |
|
"Models": "Models", |
|
"Vae": "Vae", |
|
"LoRa": "LoRa", |
|
"ControlNet Models": "ControlNet Models" |
|
} |
|
for key, value in deleted_files_dict.items(): |
|
object_word = word_variants.get(key) |
|
messages.append(f"Deleted {value} {object_word}") |
|
return messages |
|
|
|
|
|
|
|
|
|
import psutil |
|
disk_space = psutil.disk_usage(os.getcwd()) |
|
total = disk_space.total / (1024 ** 3) |
|
used = disk_space.used / (1024 ** 3) |
|
free = disk_space.free / (1024 ** 3) |
|
|
|
|
|
|
|
AutoCleaner_options = AutoCleaner_options = list(directories.keys()) |
|
instruction_label = widgets.HTML(''' |
|
<span class="instruction_AC">Use <span style="color: #B2B2B2;">ctrl</span> or <span style="color: #B2B2B2;">shift</span> for multiple selections.</span> |
|
''') |
|
auto_cleaner_widget = widgets.SelectMultiple(options=AutoCleaner_options, layout=widgets.Layout(width='auto')).add_class("custom-select-multiple_AC") |
|
output = widgets.Output().add_class("output_AC") |
|
|
|
execute_button = Button(description='Execute Cleaning').add_class("button_execute_AC").add_class("button_AC") |
|
execute_button.on_click(on_execute_button_press) |
|
clear_button = Button(description='Hide Widget').add_class("button_clear_AC").add_class("button_AC") |
|
clear_button.on_click(on_clear_button_press) |
|
|
|
storage_info = widgets.HTML(f''' |
|
<div class="storage_info_AC">Total storage: {total:.2f} GB <span style="color: #555">|</span> Used: {used:.2f} GB <span style="color: #555">|</span> Free: {free:.2f} GB</div> |
|
''') |
|
|
|
buttons = widgets.HBox([execute_button, clear_button]) |
|
lower_information_panel = widgets.HBox([buttons, storage_info]).add_class("lower_information_panel_AC") |
|
|
|
container = VBox([instruction_label, widgets.HTML('<hr>'), auto_cleaner_widget, output, widgets.HTML('<hr>'), lower_information_panel]).add_class("container_AC") |
|
|
|
display(container) |
|
|
|
|