diff --git a/lib/client/client.py b/lib/client/client.py index 8bb3603..a138b77 100644 --- a/lib/client/client.py +++ b/lib/client/client.py @@ -15,14 +15,6 @@ sys.path.append("../") 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): @@ -73,17 +65,18 @@ class ZordonClient: # Create server tree self.server_tree = ttk.Treeview(server_frame, show="headings") self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH) - self.server_tree["columns"] = ("server") - self.server_tree.column("server", width=50) + self.server_tree["columns"] = ("Server") + self.server_tree.column("Server", width=50) self.server_tree.bind("<>", self.server_picked) - self.server_tree.column("server", width=200) + self.server_tree.column("Server", width=200) + make_sortable(self.server_tree) # Create separator separator = ttk.Separator(server_frame, orient=tk.VERTICAL) separator.pack(side=tk.LEFT, padx=5, pady=5, fill=tk.Y) # 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.bind("<>", self.on_row_select) 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) 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 self.stop_button.pack(side=tk.LEFT) delete_button.pack(side=tk.LEFT) @@ -124,7 +119,7 @@ class ZordonClient: # Start the Tkinter event loop self.root.geometry("500x600+300+300") 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) # update jobs @@ -213,8 +208,8 @@ class ZordonClient: subprocess.run(['open', output_dir]) def open_logs(self): - job = next((d for d in self.job_cache if d.get('id') == self.selected_job_id()), None) - subprocess.run(['open', job['log_path']]) + url = f'http://{self.server_proxy.hostname}:{self.server_proxy.port}/api/job/{self.selected_job_id()}/logs' + subprocess.run(['open', url]) def mainloop(self): self.root.mainloop() diff --git a/lib/server/job_server.py b/lib/server/job_server.py index 1bafca5..e9565ae 100755 --- a/lib/server/job_server.py +++ b/lib/server/job_server.py @@ -72,6 +72,7 @@ def job_detail(job_id): @server.route('/api/job//thumbnail') def job_thumbnail(job_id): 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) 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_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 \ found_job.status not in [RenderStatus.CANCELLED, RenderStatus.ERROR]: 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") elif big_thumb and os.path.exists(big_image_path): 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 \ - 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'): + elif video_ok and 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") elif os.path.exists(thumb_image_path): return send_file(thumb_image_path, mimetype='image/jpeg')