mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 08:48:13 +00:00
More client cleanup work
This commit is contained in:
@@ -15,14 +15,6 @@ sys.path.append("../")
|
|||||||
from lib.server.zeroconf_server import ZeroconfServer
|
from lib.server.zeroconf_server import ZeroconfServer
|
||||||
|
|
||||||
|
|
||||||
def request_data(server_ip, payload, server_port=8080, timeout=2):
|
|
||||||
try:
|
|
||||||
req = requests.get(f'http://{server_ip}:{server_port}/api/{payload}', timeout=timeout)
|
|
||||||
if req.ok:
|
|
||||||
return req.json()
|
|
||||||
except Exception as e:
|
|
||||||
pass
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def sort_column(tree, col, reverse=False):
|
def sort_column(tree, col, reverse=False):
|
||||||
@@ -73,17 +65,18 @@ class ZordonClient:
|
|||||||
# Create server tree
|
# Create server tree
|
||||||
self.server_tree = ttk.Treeview(server_frame, show="headings")
|
self.server_tree = ttk.Treeview(server_frame, show="headings")
|
||||||
self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
|
self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
|
||||||
self.server_tree["columns"] = ("server")
|
self.server_tree["columns"] = ("Server")
|
||||||
self.server_tree.column("server", width=50)
|
self.server_tree.column("Server", width=50)
|
||||||
self.server_tree.bind("<<TreeviewSelect>>", self.server_picked)
|
self.server_tree.bind("<<TreeviewSelect>>", self.server_picked)
|
||||||
self.server_tree.column("server", width=200)
|
self.server_tree.column("Server", width=200)
|
||||||
|
make_sortable(self.server_tree)
|
||||||
|
|
||||||
# Create separator
|
# Create separator
|
||||||
separator = ttk.Separator(server_frame, orient=tk.VERTICAL)
|
separator = ttk.Separator(server_frame, orient=tk.VERTICAL)
|
||||||
separator.pack(side=tk.LEFT, padx=5, pady=5, fill=tk.Y)
|
separator.pack(side=tk.LEFT, padx=5, pady=5, fill=tk.Y)
|
||||||
|
|
||||||
# Setup the Tree
|
# Setup the Tree
|
||||||
self.job_tree = ttk.Treeview(server_frame, show="headings", height=20)
|
self.job_tree = ttk.Treeview(server_frame, show="headings", height=10)
|
||||||
self.job_tree.tag_configure('running', background='lawn green', font=('', 0, 'bold'))
|
self.job_tree.tag_configure('running', background='lawn green', font=('', 0, 'bold'))
|
||||||
self.job_tree.bind("<<TreeviewSelect>>", self.on_row_select)
|
self.job_tree.bind("<<TreeviewSelect>>", self.on_row_select)
|
||||||
self.job_tree["columns"] = ("id", "Name", "Renderer", "Priority", "Status", "Time Elapsed", "Frames", "")
|
self.job_tree["columns"] = ("id", "Name", "Renderer", "Priority", "Status", "Time Elapsed", "Frames", "")
|
||||||
@@ -114,6 +107,8 @@ class ZordonClient:
|
|||||||
delete_button = tk.Button(button_frame, text="Delete", command=self.delete_job)
|
delete_button = tk.Button(button_frame, text="Delete", command=self.delete_job)
|
||||||
add_job_button = tk.Button(button_frame, text="Add Job", command=self.show_new_job_window)
|
add_job_button = tk.Button(button_frame, text="Add Job", command=self.show_new_job_window)
|
||||||
|
|
||||||
|
self.stop_button.config(state='disabled')
|
||||||
|
|
||||||
# Pack the buttons in the frame
|
# Pack the buttons in the frame
|
||||||
self.stop_button.pack(side=tk.LEFT)
|
self.stop_button.pack(side=tk.LEFT)
|
||||||
delete_button.pack(side=tk.LEFT)
|
delete_button.pack(side=tk.LEFT)
|
||||||
@@ -124,7 +119,7 @@ class ZordonClient:
|
|||||||
# Start the Tkinter event loop
|
# Start the Tkinter event loop
|
||||||
self.root.geometry("500x600+300+300")
|
self.root.geometry("500x600+300+300")
|
||||||
self.root.maxsize(width=2000, height=1200)
|
self.root.maxsize(width=2000, height=1200)
|
||||||
self.root.minsize(width=900, height=1000)
|
self.root.minsize(width=900, height=800)
|
||||||
make_sortable(self.job_tree)
|
make_sortable(self.job_tree)
|
||||||
|
|
||||||
# update jobs
|
# update jobs
|
||||||
@@ -213,8 +208,8 @@ class ZordonClient:
|
|||||||
subprocess.run(['open', output_dir])
|
subprocess.run(['open', output_dir])
|
||||||
|
|
||||||
def open_logs(self):
|
def open_logs(self):
|
||||||
job = next((d for d in self.job_cache if d.get('id') == self.selected_job_id()), None)
|
url = f'http://{self.server_proxy.hostname}:{self.server_proxy.port}/api/job/{self.selected_job_id()}/logs'
|
||||||
subprocess.run(['open', job['log_path']])
|
subprocess.run(['open', url])
|
||||||
|
|
||||||
def mainloop(self):
|
def mainloop(self):
|
||||||
self.root.mainloop()
|
self.root.mainloop()
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ def job_detail(job_id):
|
|||||||
@server.route('/api/job/<job_id>/thumbnail')
|
@server.route('/api/job/<job_id>/thumbnail')
|
||||||
def job_thumbnail(job_id):
|
def job_thumbnail(job_id):
|
||||||
big_thumb = request.args.get('size', False) == "big"
|
big_thumb = request.args.get('size', False) == "big"
|
||||||
|
video_ok = request.args.get('video_ok', True)
|
||||||
found_job = RenderQueue.job_with_id(job_id, none_ok=True)
|
found_job = RenderQueue.job_with_id(job_id, none_ok=True)
|
||||||
if found_job:
|
if found_job:
|
||||||
|
|
||||||
@@ -81,18 +82,21 @@ def job_thumbnail(job_id):
|
|||||||
big_video_path = os.path.join(server.config['THUMBS_FOLDER'], found_job.id + '_big.mp4')
|
big_video_path = os.path.join(server.config['THUMBS_FOLDER'], found_job.id + '_big.mp4')
|
||||||
big_image_path = os.path.join(server.config['THUMBS_FOLDER'], found_job.id + '_big.jpg')
|
big_image_path = os.path.join(server.config['THUMBS_FOLDER'], found_job.id + '_big.jpg')
|
||||||
|
|
||||||
|
# generate regular thumb if it doesn't exist
|
||||||
if not os.path.exists(thumb_video_path) and not os.path.exists(thumb_video_path + '_IN-PROGRESS') and \
|
if not os.path.exists(thumb_video_path) and not os.path.exists(thumb_video_path + '_IN-PROGRESS') and \
|
||||||
found_job.status not in [RenderStatus.CANCELLED, RenderStatus.ERROR]:
|
found_job.status not in [RenderStatus.CANCELLED, RenderStatus.ERROR]:
|
||||||
generate_thumbnail_for_job(found_job, thumb_video_path, thumb_image_path, max_width=240)
|
generate_thumbnail_for_job(found_job, thumb_video_path, thumb_image_path, max_width=240)
|
||||||
|
|
||||||
if big_thumb and os.path.exists(big_video_path) and not os.path.exists(big_video_path + '_IN-PROGRESS'):
|
# generate big thumb if it doesn't exist
|
||||||
|
if not os.path.exists(big_video_path) and not os.path.exists(big_image_path + '_IN-PROGRESS') and \
|
||||||
|
found_job.status not in [RenderStatus.CANCELLED, RenderStatus.ERROR]:
|
||||||
|
generate_thumbnail_for_job(found_job, big_video_path, big_image_path, max_width=800)
|
||||||
|
|
||||||
|
if big_thumb and video_ok and os.path.exists(big_video_path) and not os.path.exists(big_video_path + '_IN-PROGRESS'):
|
||||||
return send_file(big_video_path, mimetype="video/mp4")
|
return send_file(big_video_path, mimetype="video/mp4")
|
||||||
elif big_thumb and os.path.exists(big_image_path):
|
elif big_thumb and os.path.exists(big_image_path):
|
||||||
return send_file(big_image_path, mimetype='image/jpeg')
|
return send_file(big_image_path, mimetype='image/jpeg')
|
||||||
elif not os.path.exists(big_video_path) and not os.path.exists(big_image_path + '_IN-PROGRESS') and \
|
elif video_ok and os.path.exists(thumb_video_path) and not os.path.exists(thumb_video_path + '_IN-PROGRESS'):
|
||||||
found_job.status not in [RenderStatus.CANCELLED, RenderStatus.ERROR]:
|
|
||||||
generate_thumbnail_for_job(found_job, big_video_path, big_image_path, max_width=800)
|
|
||||||
if os.path.exists(thumb_video_path) and not os.path.exists(thumb_video_path + '_IN-PROGRESS'):
|
|
||||||
return send_file(thumb_video_path, mimetype="video/mp4")
|
return send_file(thumb_video_path, mimetype="video/mp4")
|
||||||
elif os.path.exists(thumb_image_path):
|
elif os.path.exists(thumb_image_path):
|
||||||
return send_file(thumb_image_path, mimetype='image/jpeg')
|
return send_file(thumb_image_path, mimetype='image/jpeg')
|
||||||
|
|||||||
Reference in New Issue
Block a user