Update tab_category_sorter.py

This commit is contained in:
2026-01-17 15:30:35 +01:00
parent 0d856a44b8
commit fbf11fd7b1

View File

@@ -2,38 +2,50 @@ import streamlit as st
import os, shutil import os, shutil
from engine import SorterEngine from engine import SorterEngine
def render(path_t, path_out, quality, naming_mode): def render(path_s, path_o, quality, naming_mode):
images = SorterEngine.get_images(path_t) if not path_s or not os.path.exists(path_s):
st.warning("Please provide a valid Source Folder path.")
return
if not path_o:
st.warning("Please provide a Category Output folder.")
return
images = SorterEngine.get_images(path_s)
categories = SorterEngine.get_categories() categories = SorterEngine.get_categories()
if st.session_state.idx_cat < len(images): if st.session_state.idx_cat < len(images):
curr_p = os.path.join(path_t, images[st.session_state.idx_cat]) curr_file = images[st.session_state.idx_cat]
curr_p = os.path.join(path_s, curr_file)
# Filmstrip (Current + Next 6) # 🎞️ Filmstrip Preview (Source script feature)
st.write("### 🎞️ Filmstrip") st.write("### 🎞️ Filmstrip")
fs_cols = st.columns(7) fs_cols = st.columns(7)
# Show current + next 6
for i, img_name in enumerate(images[st.session_state.idx_cat : st.session_state.idx_cat + 7]): for i, img_name in enumerate(images[st.session_state.idx_cat : st.session_state.idx_cat + 7]):
fs_cols[i].image(SorterEngine.compress_for_web(os.path.join(path_t, img_name), 10)) fs_cols[i].image(SorterEngine.compress_for_web(os.path.join(path_s, img_name), 10))
st.divider() st.divider()
col_img, col_btns = st.columns([2, 1]) col_img, col_btns = st.columns([2, 1])
col_img.image(SorterEngine.compress_for_web(curr_p, quality), caption=images[st.session_state.idx_cat]) with col_img:
st.image(SorterEngine.compress_for_web(curr_p, quality), caption=curr_file)
with col_btns: with col_btns:
fid = SorterEngine.get_folder_id(path_t) fid = SorterEngine.get_folder_id(path_s)
st.write(f"**Folder ID:** {fid}") st.write(f"**Folder ID:** `{fid}`")
# Dynamic Category Buttons from SQL # Dynamic Category Buttons from Database
for cat in categories: for cat in categories:
if st.button(cat, use_container_width=True): if st.button(cat, use_container_width=True, key=f"btn_{cat}"):
_, ext = os.path.splitext(curr_p) _, ext = os.path.splitext(curr_p)
name = images[st.session_state.idx_cat] if naming_mode == "original" else f"{fid}{ext}" # Use naming mode from database profile
dst_dir = os.path.join(path_out, cat) name = curr_file if naming_mode == "original" else f"{fid}{ext}"
dst_dir = os.path.join(path_o, cat)
os.makedirs(dst_dir, exist_ok=True) os.makedirs(dst_dir, exist_ok=True)
dst_p = os.path.join(dst_dir, name) dst_p = os.path.join(dst_dir, name)
# Handle collisions # Prevent overwriting
count = 2 count = 2
final_dst = dst_p final_dst = dst_p
while os.path.exists(final_dst): while os.path.exists(final_dst):
@@ -42,11 +54,21 @@ def render(path_t, path_out, quality, naming_mode):
count += 1 count += 1
shutil.move(curr_p, final_dst) shutil.move(curr_p, final_dst)
st.session_state.history.append({'type': 'cat_move', 't_src': curr_p, 't_dst': final_dst})
st.toast(f"Moved to {cat}") st.toast(f"Moved to {cat}")
st.rerun() st.rerun()
if st.button("⏭️ SKIP", type="secondary", use_container_width=True): st.divider()
new_cat = st.text_input(" Quick Add Category")
if st.button("Add Category") and new_cat:
SorterEngine.add_category(new_cat)
st.rerun()
if st.button("⏭️ SKIP", use_container_width=True):
st.session_state.idx_cat += 1 st.session_state.idx_cat += 1
st.rerun() st.rerun()
else: else:
st.success("Finished Categorizing.") st.success("Categorization complete for this folder.")
if st.button("Reset Category Counter"):
st.session_state.idx_cat = 0
st.rerun()