Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
S
stable-diffusion-webui
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
stable-diffusion-webui
Commits
763b893f
Commit
763b893f
authored
Oct 16, 2022
by
yfszzx
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
images history sorting files by date
parent
6e4f5566
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
202 additions
and
71 deletions
+202
-71
images_history.js
javascript/images_history.js
+6
-6
images_history.py
modules/images_history.py
+196
-65
No files found.
javascript/images_history.js
View file @
763b893f
...
...
@@ -88,10 +88,10 @@ function images_history_set_image_info(button){
}
function
images_history_get_current_img
(
tabname
,
im
age_path
,
files
){
function
images_history_get_current_img
(
tabname
,
im
g_index
,
files
){
return
[
gradioApp
().
getElementById
(
tabname
+
'_images_history_set_index'
).
getAttribute
(
"img_index"
)
,
image_path
,
tabname
,
gradioApp
().
getElementById
(
tabname
+
'_images_history_set_index'
).
getAttribute
(
"img_index"
),
files
];
}
...
...
@@ -129,7 +129,7 @@ function images_history_delete(del_num, tabname, img_file_name, page_index, file
setTimeout
(
function
(
btn
){
btn
.
click
()},
30
,
btn
);
}
images_history_disabled_del
();
return
[
del_num
,
tabname
,
img_
path
,
img_
file_name
,
page_index
,
filenames
,
image_index
];
return
[
del_num
,
tabname
,
img_file_name
,
page_index
,
filenames
,
image_index
];
}
function
images_history_turnpage
(
img_path
,
page_index
,
image_index
,
tabname
,
date_from
,
date_to
){
...
...
@@ -170,8 +170,8 @@ function images_history_init(){
}
tabs_box
.
classList
.
add
(
images_history_tab_list
[
0
]);
// same as above, at page load
//
load_txt2img_button.click();
// same as above, at page load
-- load very fast now
load_txt2img_button
.
click
();
}
else
{
setTimeout
(
images_history_init
,
500
);
}
...
...
modules/images_history.py
View file @
763b893f
import
os
import
shutil
import
time
import
hashlib
import
gradio
show_max_dates_num
=
3
system_bak_path
=
"webui_log_and_bak"
def
is_valid_date
(
date
):
try
:
time
.
strptime
(
date
,
"
%
Y
%
m
%
d"
)
return
True
except
:
return
False
def
reduplicative_file_move
(
src
,
dst
):
def
same_name_file
(
basename
,
path
):
name
,
ext
=
os
.
path
.
splitext
(
basename
)
f_list
=
os
.
listdir
(
path
)
max_num
=
0
for
f
in
f_list
:
if
len
(
f
)
<=
len
(
basename
):
continue
f_ext
=
f
[
-
len
(
ext
):]
if
len
(
ext
)
>
0
else
""
if
f
[:
len
(
name
)]
==
name
and
f_ext
==
ext
:
if
f
[
len
(
name
)]
==
"("
and
f
[
-
len
(
ext
)
-
1
]
==
")"
:
number
=
f
[
len
(
name
)
+
1
:
-
len
(
ext
)
-
1
]
if
number
.
isdigit
():
if
int
(
number
)
>
max_num
:
max_num
=
int
(
number
)
return
f
"{name}({max_num + 1}){ext}"
name
=
os
.
path
.
basename
(
src
)
save_name
=
os
.
path
.
join
(
dst
,
name
)
if
not
os
.
path
.
exists
(
save_name
):
shutil
.
move
(
src
,
dst
)
else
:
name
=
same_name_file
(
name
,
dst
)
shutil
.
move
(
src
,
os
.
path
.
join
(
dst
,
name
))
def
traverse_all_files
(
output_dir
,
image_list
,
curr_dir
=
None
):
curr_path
=
output_dir
if
curr_dir
is
None
else
os
.
path
.
join
(
output_dir
,
curr_dir
)
def
traverse_all_files
(
curr_path
,
image_list
,
all_type
=
False
):
try
:
f_list
=
os
.
listdir
(
curr_path
)
except
:
if
curr_dir
[
-
10
:]
.
rfind
(
"."
)
>
0
and
curr_dir
[
-
4
:]
!=
".txt"
:
image_list
.
append
(
curr_
dir
)
if
all_type
or
curr_path
[
-
10
:]
.
rfind
(
"."
)
>
0
and
curr_path
[
-
4
:]
!=
".txt"
:
image_list
.
append
(
curr_
path
)
return
image_list
for
file
in
f_list
:
file
=
file
if
curr_dir
is
None
else
os
.
path
.
join
(
curr_dir
,
file
)
file_path
=
os
.
path
.
join
(
curr_path
,
file
)
if
file
[
-
4
:]
==
".txt"
:
file
=
os
.
path
.
join
(
curr_path
,
file
)
if
(
not
all_type
)
and
file
[
-
4
:]
==
".txt"
:
pass
elif
os
.
path
.
isfile
(
file
_path
)
and
file
[
-
10
:]
.
rfind
(
"."
)
>
0
:
elif
os
.
path
.
isfile
(
file
)
and
file
[
-
10
:]
.
rfind
(
"."
)
>
0
:
image_list
.
append
(
file
)
else
:
image_list
=
traverse_all_files
(
output_dir
,
image_list
,
file
)
image_list
=
traverse_all_files
(
file
,
image_list
)
return
image_list
def
get_recent_images
(
dir_name
,
page_index
,
step
,
image_index
,
tabname
):
page_index
=
int
(
page_index
)
f_list
=
os
.
listdir
(
dir_name
)
def
get_recent_images
(
dir_name
,
page_index
,
step
,
image_index
,
tabname
,
date_from
,
date_to
):
#print(f"turn_page {page_index}",date_from)
if
date_from
is
None
or
date_from
==
""
:
return
None
,
1
,
None
,
""
image_list
=
[]
image_list
=
traverse_all_files
(
dir_name
,
image_list
)
image_list
=
sorted
(
image_list
,
key
=
lambda
file
:
-
os
.
path
.
getctime
(
os
.
path
.
join
(
dir_name
,
file
)))
date_list
=
auto_sorting
(
dir_name
)
page_index
=
int
(
page_index
)
today
=
time
.
strftime
(
"
%
Y
%
m
%
d"
,
time
.
localtime
(
time
.
time
()))
for
date
in
date_list
:
if
date
>=
date_from
and
date
<=
date_to
:
path
=
os
.
path
.
join
(
dir_name
,
date
)
if
date
==
today
and
not
os
.
path
.
exists
(
path
):
continue
image_list
=
traverse_all_files
(
path
,
image_list
)
image_list
=
sorted
(
image_list
,
key
=
lambda
file
:
-
os
.
path
.
getctime
(
file
))
num
=
48
if
tabname
!=
"extras"
else
12
max_page_index
=
len
(
image_list
)
//
num
+
1
page_index
=
max_page_index
if
page_index
==
-
1
else
page_index
+
step
...
...
@@ -38,40 +79,101 @@ def get_recent_images(dir_name, page_index, step, image_index, tabname):
image_index
=
int
(
image_index
)
if
image_index
<
0
or
image_index
>
len
(
image_list
)
-
1
:
current_file
=
None
hidden
=
None
else
:
current_file
=
image_list
[
int
(
image_index
)]
hidden
=
os
.
path
.
join
(
dir_name
,
current_file
)
return
[
os
.
path
.
join
(
dir_name
,
file
)
for
file
in
image_list
],
page_index
,
image_list
,
current_file
,
hidden
,
""
current_file
=
image_list
[
image_index
]
return
image_list
,
page_index
,
image_list
,
""
def
auto_sorting
(
dir_name
):
#print(f"auto sorting")
bak_path
=
os
.
path
.
join
(
dir_name
,
system_bak_path
)
if
not
os
.
path
.
exists
(
bak_path
):
os
.
mkdir
(
bak_path
)
log_file
=
None
files_list
=
[]
f_list
=
os
.
listdir
(
dir_name
)
for
file
in
f_list
:
if
file
==
system_bak_path
:
continue
file_path
=
os
.
path
.
join
(
dir_name
,
file
)
if
not
is_valid_date
(
file
):
if
file
[
-
10
:]
.
rfind
(
"."
)
>
0
:
files_list
.
append
(
file_path
)
else
:
files_list
=
traverse_all_files
(
file_path
,
files_list
,
all_type
=
True
)
for
file
in
files_list
:
date_str
=
time
.
strftime
(
"
%
Y
%
m
%
d"
,
time
.
localtime
(
os
.
path
.
getctime
(
file
)))
file_path
=
os
.
path
.
dirname
(
file
)
hash_path
=
hashlib
.
md5
(
file_path
.
encode
())
.
hexdigest
()
path
=
os
.
path
.
join
(
dir_name
,
date_str
,
hash_path
)
if
not
os
.
path
.
exists
(
path
):
os
.
makedirs
(
path
)
if
log_file
is
None
:
log_file
=
open
(
os
.
path
.
join
(
bak_path
,
"path_mapping.csv"
),
"a"
)
log_file
.
write
(
f
"{hash_path},{file_path}
\n
"
)
reduplicative_file_move
(
file
,
path
)
date_list
=
[]
f_list
=
os
.
listdir
(
dir_name
)
for
f
in
f_list
:
if
is_valid_date
(
f
):
date_list
.
append
(
f
)
elif
f
==
system_bak_path
:
continue
else
:
reduplicative_file_move
(
os
.
path
.
join
(
dir_name
,
f
),
bak_path
)
today
=
time
.
strftime
(
"
%
Y
%
m
%
d"
,
time
.
localtime
(
time
.
time
()))
if
today
not
in
date_list
:
date_list
.
append
(
today
)
return
sorted
(
date_list
)
def
first_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
1
,
0
,
image_index
,
tabname
)
def
end_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
-
1
,
0
,
image_index
,
tabname
)
def
archive_images
(
dir_name
):
date_list
=
auto_sorting
(
dir_name
)
date_from
=
date_list
[
-
show_max_dates_num
]
if
len
(
date_list
)
>
show_max_dates_num
else
date_list
[
0
]
return
(
gradio
.
update
(
visible
=
False
),
gradio
.
update
(
visible
=
True
),
gradio
.
Dropdown
.
update
(
choices
=
date_list
,
value
=
date_list
[
-
1
]),
gradio
.
Dropdown
.
update
(
choices
=
date_list
,
value
=
date_from
)
)
def
date_to_change
(
dir_name
,
page_index
,
image_index
,
tabname
,
date_from
,
date_to
):
#print("date_to", date_to)
date_list
=
auto_sorting
(
dir_name
)
date_from_list
=
[
date
for
date
in
date_list
if
date
<=
date_to
]
date_from
=
date_from_list
[
0
]
if
len
(
date_from_list
)
<
show_max_dates_num
else
date_from_list
[
-
show_max_dates_num
]
image_list
,
page_index
,
image_list
,
_
=
get_recent_images
(
dir_name
,
1
,
0
,
image_index
,
tabname
,
date_from
,
date_to
)
return
image_list
,
page_index
,
image_list
,
_
,
gradio
.
Dropdown
.
update
(
choices
=
date_from_list
,
value
=
date_from
)
def
prev_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
page_index
,
-
1
,
image_index
,
tabname
)
def
first_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
,
date_from
,
date_to
):
return
get_recent_images
(
dir_name
,
1
,
0
,
image_index
,
tabname
,
date_from
,
date_to
)
def
next_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
page_index
,
1
,
image_index
,
tabname
)
def
end_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
,
date_from
,
date_to
):
return
get_recent_images
(
dir_name
,
-
1
,
0
,
image_index
,
tabname
,
date_from
,
date_to
)
def
p
age_index_change
(
dir_name
,
page_index
,
image_index
,
tabname
):
return
get_recent_images
(
dir_name
,
page_index
,
0
,
image_index
,
tabname
)
def
p
rev_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
,
date_from
,
date_to
):
return
get_recent_images
(
dir_name
,
page_index
,
-
1
,
image_index
,
tabname
,
date_from
,
date_to
)
def
show_image_info
(
num
,
image_path
,
filenames
):
# print(f"select image {num}")
file
=
filenames
[
int
(
num
)]
return
file
,
num
,
os
.
path
.
join
(
image_path
,
file
)
def
next_page_click
(
dir_name
,
page_index
,
image_index
,
tabname
,
date_from
,
date_to
):
return
get_recent_images
(
dir_name
,
page_index
,
1
,
image_index
,
tabname
,
date_from
,
date_to
)
def
page_index_change
(
dir_name
,
page_index
,
image_index
,
tabname
,
date_from
,
date_to
):
return
get_recent_images
(
dir_name
,
page_index
,
0
,
image_index
,
tabname
,
date_from
,
date_to
)
def
delete_image
(
delete_num
,
tabname
,
dir_name
,
name
,
page_index
,
filenames
,
image_index
):
def
show_image_info
(
tabname_box
,
num
,
filenames
):
# #print(f"select image {num}")
file
=
filenames
[
int
(
num
)]
return
file
,
num
,
file
def
delete_image
(
delete_num
,
tabname
,
name
,
page_index
,
filenames
,
image_index
):
if
name
==
""
:
return
filenames
,
delete_num
else
:
...
...
@@ -81,21 +183,19 @@ def delete_image(delete_num, tabname, dir_name, name, page_index, filenames, ima
new_file_list
=
[]
for
name
in
filenames
:
if
i
>=
index
and
i
<
index
+
delete_num
:
path
=
os
.
path
.
join
(
dir_name
,
name
)
if
os
.
path
.
exists
(
path
):
print
(
f
"Delete file {path}"
)
os
.
remove
(
path
)
txt_file
=
os
.
path
.
splitext
(
path
)[
0
]
+
".txt"
if
os
.
path
.
exists
(
name
):
#print(f"Delete file {name}")
os
.
remove
(
name
)
txt_file
=
os
.
path
.
splitext
(
name
)[
0
]
+
".txt"
if
os
.
path
.
exists
(
txt_file
):
os
.
remove
(
txt_file
)
else
:
print
(
f
"Not exists file {path
}"
)
#print(f"Not exists file {name
}")
else
:
new_file_list
.
append
(
name
)
i
+=
1
return
new_file_list
,
1
def
show_images_history
(
gr
,
opts
,
tabname
,
run_pnginfo
,
switch_dict
):
if
tabname
==
"txt2img"
:
dir_name
=
opts
.
outdir_txt2img_samples
...
...
@@ -107,16 +207,32 @@ def show_images_history(gr, opts, tabname, run_pnginfo, switch_dict):
dir_name
=
d
[
0
]
for
p
in
d
[
1
:]:
dir_name
=
os
.
path
.
join
(
dir_name
,
p
)
with
gr
.
Row
():
renew_page
=
gr
.
Button
(
'Renew Page'
,
elem_id
=
tabname
+
"_images_history_renew_page"
)
first_page
=
gr
.
Button
(
'First Page'
)
prev_page
=
gr
.
Button
(
'Prev Page'
)
page_index
=
gr
.
Number
(
value
=
1
,
label
=
"Page Index"
)
next_page
=
gr
.
Button
(
'Next Page'
)
end_page
=
gr
.
Button
(
'End Page'
)
with
gr
.
Row
(
elem_id
=
tabname
+
"_images_history"
):
f_list
=
os
.
listdir
(
dir_name
)
sorted_flag
=
os
.
path
.
exists
(
os
.
path
.
join
(
dir_name
,
system_bak_path
))
or
len
(
f_list
)
==
0
date_list
,
date_from
,
date_to
=
None
,
None
,
None
if
sorted_flag
:
#print(sorted_flag)
date_list
=
auto_sorting
(
dir_name
)
date_to
=
date_list
[
-
1
]
date_from
=
date_list
[
-
show_max_dates_num
]
if
len
(
date_list
)
>
show_max_dates_num
else
date_list
[
0
]
with
gr
.
Column
(
visible
=
sorted_flag
)
as
page_panel
:
with
gr
.
Row
():
renew_page
=
gr
.
Button
(
'Refresh'
,
elem_id
=
tabname
+
"_images_history_renew_page"
,
interactive
=
sorted_flag
)
first_page
=
gr
.
Button
(
'First Page'
)
prev_page
=
gr
.
Button
(
'Prev Page'
)
page_index
=
gr
.
Number
(
value
=
1
,
label
=
"Page Index"
)
next_page
=
gr
.
Button
(
'Next Page'
)
end_page
=
gr
.
Button
(
'End Page'
)
with
gr
.
Row
(
elem_id
=
tabname
+
"_images_history"
):
with
gr
.
Column
(
scale
=
2
):
with
gr
.
Row
():
newest
=
gr
.
Button
(
'Newest'
)
date_to
=
gr
.
Dropdown
(
choices
=
date_list
,
value
=
date_to
,
label
=
"Date to"
)
date_from
=
gr
.
Dropdown
(
choices
=
date_list
,
value
=
date_from
,
label
=
"Date from"
)
history_gallery
=
gr
.
Gallery
(
show_label
=
False
,
elem_id
=
tabname
+
"_images_history_gallery"
)
.
style
(
grid
=
6
)
with
gr
.
Row
():
delete_num
=
gr
.
Number
(
value
=
1
,
interactive
=
True
,
label
=
"number of images to delete consecutively next"
)
...
...
@@ -128,22 +244,31 @@ def show_images_history(gr, opts, tabname, run_pnginfo, switch_dict):
with
gr
.
Row
():
with
gr
.
Column
():
img_file_info
=
gr
.
Textbox
(
label
=
"Generate Info"
,
interactive
=
False
)
img_file_name
=
gr
.
Textbox
(
label
=
"File Name"
,
interactive
=
False
)
with
gr
.
Row
():
img_file_name
=
gr
.
Textbox
(
value
=
""
,
label
=
"File Name"
,
interactive
=
False
)
# hiden items
with
gr
.
Row
(
visible
=
False
):
img_path
=
gr
.
Textbox
(
dir_name
)
tabname_box
=
gr
.
Textbox
(
tabname
)
image_index
=
gr
.
Textbox
(
value
=-
1
)
set_index
=
gr
.
Button
(
'set_index'
,
elem_id
=
tabname
+
"_images_history_set_index"
)
filenames
=
gr
.
State
()
hidden
=
gr
.
Image
(
type
=
"pil"
)
info1
=
gr
.
Textbox
()
info2
=
gr
.
Textbox
()
with
gr
.
Column
(
visible
=
not
sorted_flag
)
as
init_warning
:
with
gr
.
Row
():
gr
.
Textbox
(
"The system needs to archive the files according to the date. This requires changing the directory structure of the files"
,
label
=
"Waring"
,
css
=
""
)
with
gr
.
Row
():
sorted_button
=
gr
.
Button
(
'Confirme'
)
img_path
=
gr
.
Textbox
(
dir_name
.
rstrip
(
"/"
),
visible
=
False
)
tabname_box
=
gr
.
Textbox
(
tabname
,
visible
=
False
)
image_index
=
gr
.
Textbox
(
value
=-
1
,
visible
=
False
)
set_index
=
gr
.
Button
(
'set_index'
,
elem_id
=
tabname
+
"_images_history_set_index"
,
visible
=
False
)
filenames
=
gr
.
State
()
hidden
=
gr
.
Image
(
type
=
"pil"
,
visible
=
False
)
info1
=
gr
.
Textbox
(
visible
=
False
)
info2
=
gr
.
Textbox
(
visible
=
False
)
# turn pages
gallery_inputs
=
[
img_path
,
page_index
,
image_index
,
tabname_box
]
gallery_outputs
=
[
history_gallery
,
page_index
,
filenames
,
img_file_name
,
hidden
,
img_file_name
]
gallery_inputs
=
[
img_path
,
page_index
,
image_index
,
tabname_box
,
date_from
,
date_to
]
gallery_outputs
=
[
history_gallery
,
page_index
,
filenames
,
img_file_name
]
first_page
.
click
(
first_page_click
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
next_page
.
click
(
next_page_click
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
)
...
...
@@ -154,15 +279,21 @@ def show_images_history(gr, opts, tabname, run_pnginfo, switch_dict):
# page_index.change(page_index_change, inputs=[tabname_box, img_path, page_index], outputs=[history_gallery, page_index])
# other funcitons
set_index
.
click
(
show_image_info
,
_js
=
"images_history_get_current_img"
,
inputs
=
[
tabname_box
,
im
g_path
,
filenames
],
outputs
=
[
img_file_name
,
image_index
,
hidden
])
set_index
.
click
(
show_image_info
,
_js
=
"images_history_get_current_img"
,
inputs
=
[
tabname_box
,
im
age_index
,
filenames
],
outputs
=
[
img_file_name
,
image_index
,
hidden
])
img_file_name
.
change
(
fn
=
None
,
_js
=
"images_history_enable_del_buttons"
,
inputs
=
None
,
outputs
=
None
)
delete
.
click
(
delete_image
,
_js
=
"images_history_delete"
,
inputs
=
[
delete_num
,
tabname_box
,
img_
path
,
img_
file_name
,
page_index
,
filenames
,
image_index
],
outputs
=
[
filenames
,
delete_num
])
delete
.
click
(
delete_image
,
_js
=
"images_history_delete"
,
inputs
=
[
delete_num
,
tabname_box
,
img_file_name
,
page_index
,
filenames
,
image_index
],
outputs
=
[
filenames
,
delete_num
])
hidden
.
change
(
fn
=
run_pnginfo
,
inputs
=
[
hidden
],
outputs
=
[
info1
,
img_file_info
,
info2
])
date_to
.
change
(
date_to_change
,
_js
=
"images_history_turnpage"
,
inputs
=
gallery_inputs
,
outputs
=
gallery_outputs
+
[
date_from
])
# pnginfo.click(fn=run_pnginfo, inputs=[hidden], outputs=[info1, img_file_info, info2])
switch_dict
[
"fn"
](
pnginfo_send_to_txt2img
,
switch_dict
[
"t2i"
],
img_file_info
,
'switch_to_txt2img'
)
switch_dict
[
"fn"
](
pnginfo_send_to_img2img
,
switch_dict
[
"i2i"
],
img_file_info
,
'switch_to_img2img_img2img'
)
sorted_button
.
click
(
archive_images
,
inputs
=
[
img_path
],
outputs
=
[
init_warning
,
page_panel
,
date_to
,
date_from
])
newest
.
click
(
archive_images
,
inputs
=
[
img_path
],
outputs
=
[
init_warning
,
page_panel
,
date_to
,
date_from
])
def
create_history_tabs
(
gr
,
opts
,
run_pnginfo
,
switch_dict
):
with
gr
.
Blocks
(
analytics_enabled
=
False
)
as
images_history
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment