43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
import streamlit as st
|
|
from callbacks import toggle_all_audio_checkboxes, callback_delete_selected_audios
|
|
|
|
@st.fragment
|
|
def audio_management_fragment(paths: dict):
|
|
"""A self-contained fragment for managing and deleting project audio files."""
|
|
with st.expander("🎧 管理專案音訊素材"):
|
|
audio_dir = paths["audio"]
|
|
output_dir = paths["output"]
|
|
|
|
audio_files = []
|
|
if audio_dir.exists():
|
|
audio_files.extend(sorted(audio_dir.glob('*.wav')))
|
|
if output_dir.exists():
|
|
audio_files.extend(sorted(output_dir.glob('*.wav')))
|
|
|
|
if not audio_files:
|
|
st.info("專案的 `audio` 和 `output` 資料夾中目前沒有音訊檔。")
|
|
else:
|
|
all_selected = all(st.session_state.get(f"delete_audio_cb_{f.name}", False) for f in audio_files)
|
|
if st.session_state.get('select_all_audios', False) != all_selected:
|
|
st.session_state.select_all_audios = all_selected
|
|
|
|
st.markdown("勾選您想要刪除的音訊檔案,然後點擊下方的按鈕。")
|
|
|
|
st.checkbox(
|
|
"全選/取消全選",
|
|
key="select_all_audios",
|
|
on_change=toggle_all_audio_checkboxes,
|
|
args=(audio_files,)
|
|
)
|
|
|
|
with st.form("delete_audios_form"):
|
|
for audio_file in audio_files:
|
|
file_size_kb = audio_file.stat().st_size / 1024
|
|
label = f"**{audio_file.parent.name}/{audio_file.name}** ({file_size_kb:.2f} KB)"
|
|
st.checkbox(label, key=f"delete_audio_cb_{audio_file.name}")
|
|
|
|
submitted = st.form_submit_button("🟥 確認刪除選取的音訊", use_container_width=True, type="primary")
|
|
|
|
if submitted:
|
|
callback_delete_selected_audios(paths)
|
|
st.rerun(scope="fragment") |