diff --git a/README.md b/README.md index 6be91d7..c14ad78 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ and restart your stable-diffusion-webui, then you can see the new tab "Image Bro Please be aware that when scanning a directory for the first time, the png-cache will be built. This can take several minutes, depending on the amount of images. ## Recent updates +- Save ranking to EXIF option - Maintenance tab - Custom tabs - Copy/Move to directory diff --git a/scripts/image_browser.py b/scripts/image_browser.py index d529ad5..cdfe485 100644 --- a/scripts/image_browser.py +++ b/scripts/image_browser.py @@ -11,6 +11,7 @@ import sys import tempfile import time import modules.extras +import modules.images import modules.ui from modules import paths from modules import script_callbacks @@ -582,14 +583,14 @@ def get_all_images(dir_name, sort_by, sort_order, keyword, tab_base_tag_box, img filenames = [finfo for finfo in fileinfos] return filenames -def get_image_page(img_path, page_index, filenames, keyword, sort_by, sort_order, tab_base_tag_box, img_path_depth, ranking_filter, aes_filter, exif_keyword, negative_prompt_search, delete_state): +def get_image_page(img_path, page_index, filenames, keyword, sort_by, sort_order, tab_base_tag_box, img_path_depth, ranking_filter, aes_filter, exif_keyword, negative_prompt_search, delete_state, hidden): if img_path == "": - return [], page_index, [], "", "", "", 0, "", delete_state + return [], page_index, [], "", "", "", 0, "", delete_state, None # Set temp_dir from webui settings, so gradio uses it if shared.opts.temp_dir != "": tempfile.tempdir = shared.opts.temp_dir - + img_path, _ = pure_path(img_path) if page_index == 1 or page_index == 0 or len(filenames) == 0: filenames = get_all_images(img_path, sort_by, sort_order, keyword, tab_base_tag_box, img_path_depth, ranking_filter, aes_filter, exif_keyword, negative_prompt_search) @@ -610,7 +611,7 @@ def get_image_page(img_path, page_index, filenames, keyword, sort_by, sort_order load_info += "" delete_state = False - return filenames, gr.update(value=page_index, label=f"Page Index ({page_index}/{max_page_index})"), image_list, "", "", "", visible_num, load_info, delete_state + return filenames, gr.update(value=page_index, label=f"Page Index ({page_index}/{max_page_index})"), image_list, "", "", "", visible_num, load_info, delete_state, None def get_current_file(tab_base_tag_box, num, page_index, filenames): file = filenames[int(num) + int((page_index - 1) * num_of_imgs_per_page)] @@ -629,13 +630,6 @@ def show_image_info(tab_base_tag_box, num, page_index, filenames, turn_page_swit tm = "
" + time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(os.path.getmtime(file))) + "
" return file, tm, num, file, turn_page_switch -def show_next_image_info(tab_base_tag_box, num, page_index, filenames, auto_next): - file = filenames[int(num) + int((page_index - 1) * num_of_imgs_per_page)] - tm = "
" + time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(os.path.getmtime(file))) + "
" - if auto_next: - num = int(num) + 1 - return file, tm, num, file, "" - def change_dir(img_dir, path_recorder, load_switch, img_path_browser, img_path_depth, img_path): warning = None img_path, _ = pure_path(img_path) @@ -671,6 +665,30 @@ def get_ranking(filename): ranking_value = wib_db.select_ranking(filename) return ranking_value +def update_ranking(img_file_name, ranking, img_file_info): + saved_ranking = get_ranking(img_file_name) + if saved_ranking != ranking: + # Update db + wib_db.update_ranking(img_file_name, ranking) + if opts.image_browser_ranking_pnginfo and any(img_file_name.endswith(ext) for ext in image_ext_list[:3]): + # Update exif + image = Image.open(img_file_name) + geninfo, items = images.read_info_from_image(image) + if geninfo is not None: + if "Ranking: " in geninfo: + if ranking == "None": + geninfo = re.sub(r', Ranking: \d+', '', geninfo) + else: + geninfo = re.sub(r'Ranking: \d+', f'Ranking: {ranking}', geninfo) + else: + geninfo = f'{geninfo}, Ranking: {ranking}' + + original_time = os.path.getmtime(img_file_name) + images.save_image(image, os.path.dirname(img_file_name), "", extension=os.path.splitext(img_file_name)[1][1:], info=geninfo, forced_filename=os.path.splitext(os.path.basename(img_file_name))[0], save_to_dirs=False) + os.utime(img_file_name, (original_time, original_time)) + img_file_info = geninfo + return img_file_info + def create_tab(tab: ImageBrowserTab, current_gr_tab: gr.Tab): global init, exif_cache, aes_cache dir_name = None @@ -744,7 +762,6 @@ def create_tab(tab: ImageBrowserTab, current_gr_tab: gr.Tab): end_page = gr.Button('End Page') with gr.Row(): ranking = gr.Radio(value="None", choices=["1", "2", "3", "4", "5", "None"], label="ranking", elem_id=f"{tab.base_tag}_image_browser_ranking", interactive=True, visible=False) - auto_next = gr.Checkbox(label="Next Image After Ranking (To be implemented)", interactive=False, visible=False) with gr.Row(): image_gallery = gr.Gallery(show_label=False, elem_id=f"{tab.base_tag}_image_browser_gallery").style(grid=opts.image_browser_page_columns) with gr.Row() as delete_panel: @@ -880,7 +897,7 @@ def create_tab(tab: ImageBrowserTab, current_gr_tab: gr.Tab): turn_page_switch.change( fn=get_image_page, inputs=[img_path, page_index, filenames, keyword, sort_by, sort_order, tab_base_tag_box, img_path_depth, ranking_filter, aes_filter, exif_keyword, negative_prompt_search, delete_state], - outputs=[filenames, page_index, image_gallery, img_file_name, img_file_time, img_file_info, visible_img_num, warning_box, delete_state] + outputs=[filenames, page_index, image_gallery, img_file_name, img_file_time, img_file_info, visible_img_num, warning_box, delete_state, hidden] ) turn_page_switch.change(fn=None, inputs=[tab_base_tag_box], outputs=None, _js="image_browser_turnpage") turn_page_switch.change(fn=lambda:(gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False)), inputs=None, outputs=[delete_panel, button_panel, ranking, to_dir_panel]) @@ -935,8 +952,7 @@ def create_tab(tab: ImageBrowserTab, current_gr_tab: gr.Tab): hidden.change(fn=run_pnginfo, inputs=[hidden, img_path, img_file_name], outputs=[info1, img_file_info, info2]) #ranking - ranking.change(wib_db.update_ranking, inputs=[img_file_name, ranking]) - #ranking.change(show_next_image_info, _js="image_browser_get_current_img", inputs=[tab_base_tag_box, image_index, page_index, auto_next], outputs=[img_file_name, img_file_time, image_index, hidden]) + ranking.change(update_ranking, inputs=[img_file_name, ranking, img_file_info], outputs=[img_file_info]) try: modules.generation_parameters_copypaste.bind_buttons(send_to_buttons, hidden, img_file_info) @@ -1027,8 +1043,8 @@ def on_ui_settings(): image_browser_options.append(("image_browser_scan_exif", True, "Scan Exif-/.txt-data (slower, but required for exif-keyword-search)", "images_scan_exif")) image_browser_options.append(("image_browser_mod_shift", False, "Change CTRL keybindings to SHIFT", None)) image_browser_options.append(("image_browser_mod_ctrl_shift", False, "or to CTRL+SHIFT", None)) - #image_browser_options.append(("image_browser_ranking_pnginfo", False, "Save ranking in image's pnginfo", None)) image_browser_options.append(("image_browser_enable_maint", True, "Enable Maintenance tab", None)) + image_browser_options.append(("image_browser_ranking_pnginfo", False, "Save ranking in image's pnginfo", None)) image_browser_options.append(("image_browser_page_columns", 6, "Number of columns on the page", "images_history_page_columns")) image_browser_options.append(("image_browser_page_rows", 6, "Number of rows on the page", "images_history_page_rows"))