More client cleanup work

This commit is contained in:
Brett Williams
2023-06-03 13:15:13 -05:00
parent af24bc6beb
commit eb8b8d0b90
2 changed files with 19 additions and 20 deletions

View File

@@ -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()

View File

@@ -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')