Added user-defined output directory
The user can now define a custom output directory, in which the subsequent output folders are generated in
This commit is contained in:
parent
e6aff29a81
commit
9b58cacaf3
@ -8,7 +8,7 @@ import feedparser
|
|||||||
import subprocess
|
import subprocess
|
||||||
import platform
|
import platform
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from v2cmodules.toolbox import extract_version, debug, checkinifile, write2ini, extract_changelog, toggle_save, toggle_show
|
from v2cmodules.toolbox import extract_version, debug, checkinifile, write2ini, extract_changelog, toggle_save, toggle_show, create_output_directory, truncate_path
|
||||||
from v2cmodules.common import *
|
from v2cmodules.common import *
|
||||||
|
|
||||||
checkinifile()
|
checkinifile()
|
||||||
@ -176,21 +176,6 @@ def check_for_updates():
|
|||||||
tk.messagebox.showerror("Error", f"An error occurred: {str(e)}")
|
tk.messagebox.showerror("Error", f"An error occurred: {str(e)}")
|
||||||
debug('ERROR', f"An error occured while checking for updates:\n{str(e)}\n")
|
debug('ERROR', f"An error occured while checking for updates:\n{str(e)}\n")
|
||||||
|
|
||||||
# Function to create the output directory and return its path
|
|
||||||
def create_output_directory(video_filename):
|
|
||||||
debug('DEBUG', f"Creating output directory")
|
|
||||||
base_directory = os.getcwd() # You can change this to specify a different base directory
|
|
||||||
video_filename_base, _ = os.path.splitext(os.path.basename(video_filename))
|
|
||||||
output_folder_path = os.path.join(base_directory, video_filename_base)
|
|
||||||
|
|
||||||
# Create the output directory if it doesn't exist
|
|
||||||
if not os.path.exists(output_folder_path):
|
|
||||||
os.makedirs(output_folder_path)
|
|
||||||
|
|
||||||
debug('DEBUG', f"Processing file: {video_filename}")
|
|
||||||
debug('DEBUG', f"Created output directory at: {output_folder_path}")
|
|
||||||
return output_folder_path
|
|
||||||
|
|
||||||
# Function to calculate ROI position based on alignment and size settings
|
# Function to calculate ROI position based on alignment and size settings
|
||||||
def calculate_roi(video_width, video_height, vertical_alignment, horizontal_alignment, roi_size):
|
def calculate_roi(video_width, video_height, vertical_alignment, horizontal_alignment, roi_size):
|
||||||
y1 = (video_height - roi_size) // 2
|
y1 = (video_height - roi_size) // 2
|
||||||
@ -455,7 +440,7 @@ def cancel_processing():
|
|||||||
# Create a button to process the selected files
|
# Create a button to process the selected files
|
||||||
def process_files():
|
def process_files():
|
||||||
debug('DEBUG', f"Starting file processing ...")
|
debug('DEBUG', f"Starting file processing ...")
|
||||||
global processing, processing_thread, selected_files
|
global processing, processing_thread, selected_files, user_defined_output_dir
|
||||||
if not processing:
|
if not processing:
|
||||||
processing = True
|
processing = True
|
||||||
selected_files = selected_files_listbox.get(0, tk.END)
|
selected_files = selected_files_listbox.get(0, tk.END)
|
||||||
@ -469,7 +454,8 @@ def process_files():
|
|||||||
# Define dynamic process/cancel button
|
# Define dynamic process/cancel button
|
||||||
def process_cancel_toggle():
|
def process_cancel_toggle():
|
||||||
debug('DEBUG', f"Toggling process/cancel button state")
|
debug('DEBUG', f"Toggling process/cancel button state")
|
||||||
global processing, processing_thread, selected_files
|
global processing, processing_thread, selected_files, user_defined_output_dir
|
||||||
|
if os.path.exists(user_defined_output_dir):
|
||||||
if not processing:
|
if not processing:
|
||||||
toggle_process_button(False)
|
toggle_process_button(False)
|
||||||
processing = True
|
processing = True
|
||||||
@ -483,6 +469,9 @@ def process_cancel_toggle():
|
|||||||
if processing_thread.is_alive():
|
if processing_thread.is_alive():
|
||||||
processing_thread.join()
|
processing_thread.join()
|
||||||
debug('DEBUG', f"Processing/Cancel button state switch finished")
|
debug('DEBUG', f"Processing/Cancel button state switch finished")
|
||||||
|
elif not os.path.exists(user_defined_output_dir):
|
||||||
|
debug('DEBUG', f"The provided output directory \'{user_defined_output_dir}\' does not exist, prompting for new path")
|
||||||
|
messagebox.showinfo("Invalid output directory", f"The current output directory does not exist:\n{user_defined_output_dir}\nPlease select a valid directory in your Preferences!")
|
||||||
|
|
||||||
async def toggle_process_button(enable=bool):
|
async def toggle_process_button(enable=bool):
|
||||||
"""True = Set state to 'Process Files' | False = Set state to 'Cancel'"""
|
"""True = Set state to 'Process Files' | False = Set state to 'Cancel'"""
|
||||||
@ -497,6 +486,7 @@ def open_preferences():
|
|||||||
debug('DEBUG', f"Opening preferences window")
|
debug('DEBUG', f"Opening preferences window")
|
||||||
preferences_window = tk.Toplevel(root)
|
preferences_window = tk.Toplevel(root)
|
||||||
preferences_window.title("Preferences")
|
preferences_window.title("Preferences")
|
||||||
|
debug('DEBUG', f"Received truncated path: {truncated_udodir} ({type(truncated_udodir)})")
|
||||||
|
|
||||||
def change_frame_step():
|
def change_frame_step():
|
||||||
global frame_step
|
global frame_step
|
||||||
@ -543,6 +533,24 @@ def open_preferences():
|
|||||||
else:
|
else:
|
||||||
messagebox.showinfo("Info", "Video2Crops is currently processing files!")
|
messagebox.showinfo("Info", "Video2Crops is currently processing files!")
|
||||||
|
|
||||||
|
def change_output_dir():
|
||||||
|
global user_defined_output_dir
|
||||||
|
if not processing:
|
||||||
|
new_user_defined_output_dir = filedialog.askdirectory(title='Select Output Directory', mustexist=True, initialdir=user_defined_output_dir)
|
||||||
|
if new_user_defined_output_dir:
|
||||||
|
user_defined_output_dir = new_user_defined_output_dir
|
||||||
|
write2ini('settings', 'user_defined_output_dir', new_user_defined_output_dir)
|
||||||
|
debug('DEBUG', f"Set output directory to {new_user_defined_output_dir}")
|
||||||
|
|
||||||
|
# Update the text of the Label widget and truncated path
|
||||||
|
truncated_udodir = truncate_path(new_user_defined_output_dir, pre_max=10, post_max=20)
|
||||||
|
else:
|
||||||
|
debug('DEBUG', f"User canceled selection of output directory, reverting to \'{user_defined_output_dir}\'")
|
||||||
|
truncated_udodir = truncate_path(user_defined_output_dir, pre_max=10, post_max=20)
|
||||||
|
udodir_var.set(truncated_udodir)
|
||||||
|
else:
|
||||||
|
messagebox.showinfo("Info", "Video2Crops is currently processing files!")
|
||||||
|
|
||||||
debug('DEBUG', f"Creating preference fields ...")
|
debug('DEBUG', f"Creating preference fields ...")
|
||||||
|
|
||||||
# Create preference fields
|
# Create preference fields
|
||||||
@ -603,6 +611,13 @@ def open_preferences():
|
|||||||
roi_size_button = tk.Button(preferences_window, text="Edit", command=apply_roi_size)
|
roi_size_button = tk.Button(preferences_window, text="Edit", command=apply_roi_size)
|
||||||
roi_size_button.grid(row=8, column=2, padx=20, pady=5)
|
roi_size_button.grid(row=8, column=2, padx=20, pady=5)
|
||||||
|
|
||||||
|
udodir_label = tk.Label(preferences_window, text="Output Directory: ")
|
||||||
|
udodir_label.grid(row=9, column=0, columnspan=3, padx=20, pady=5)
|
||||||
|
udodir_value = tk.Label(preferences_window, textvariable=udodir_var)
|
||||||
|
udodir_value.grid(row=10, column=0, columnspan=2, padx=20, pady=5)
|
||||||
|
udodir_button = tk.Button(preferences_window, text="Edit", command=change_output_dir)
|
||||||
|
udodir_button.grid(row=10, column=2, padx=20, pady=5)
|
||||||
|
|
||||||
debug('DEBUG', f"Done creating preference fields")
|
debug('DEBUG', f"Done creating preference fields")
|
||||||
|
|
||||||
debug('DEBUG', 'Functions defined')
|
debug('DEBUG', 'Functions defined')
|
||||||
@ -615,8 +630,9 @@ root.config(menu=menu)
|
|||||||
frame_step_var = tk.StringVar()
|
frame_step_var = tk.StringVar()
|
||||||
contrast_threshold_var = tk.StringVar()
|
contrast_threshold_var = tk.StringVar()
|
||||||
duplicate_threshold_var = tk.StringVar()
|
duplicate_threshold_var = tk.StringVar()
|
||||||
save_var = tk.BooleanVar()
|
save_var = tk.BooleanVar() # Save Output
|
||||||
show_var = tk.BooleanVar()
|
show_var = tk.BooleanVar() # Show Output
|
||||||
|
udodir_var = tk.StringVar() # User Defined Output DIRectory
|
||||||
|
|
||||||
# Variables for ROI
|
# Variables for ROI
|
||||||
vertical_alignment_var = tk.StringVar()
|
vertical_alignment_var = tk.StringVar()
|
||||||
@ -624,12 +640,14 @@ horizontal_alignment_var = tk.StringVar()
|
|||||||
roi_size_var = tk.StringVar()
|
roi_size_var = tk.StringVar()
|
||||||
|
|
||||||
# Set initial values for preference variables
|
# Set initial values for preference variables
|
||||||
|
truncated_udodir = truncate_path(user_defined_output_dir, pre_max=10, post_max=20)
|
||||||
frame_step_var.set(str(frame_step))
|
frame_step_var.set(str(frame_step))
|
||||||
contrast_threshold_var.set(str(contrast_threshold))
|
contrast_threshold_var.set(str(contrast_threshold))
|
||||||
duplicate_threshold_var.set(str(duplicate_threshold))
|
duplicate_threshold_var.set(str(duplicate_threshold))
|
||||||
save_var.set(SAVE)
|
save_var.set(SAVE)
|
||||||
show_var.set(SHOW)
|
show_var.set(SHOW)
|
||||||
roi_size_var.set(roi_size)
|
roi_size_var.set(roi_size)
|
||||||
|
udodir_var.set(truncated_udodir)
|
||||||
|
|
||||||
# Create a "Queue" submenu
|
# Create a "Queue" submenu
|
||||||
queue_menu = tk.Menu(menu, tearoff=0)
|
queue_menu = tk.Menu(menu, tearoff=0)
|
||||||
|
Loading…
Reference in New Issue
Block a user