* Parent worker now creates subjob on local host and waits for it
* Improve wait_for_subjobs logic
* Fix setting end_time for base_worker
* API cleanup
* Code refactoring
* Cleanup
* Add a watchdog to base_worker
* Logging cleanup
* Prevent multiple watchdogs from running if render process restarts
* Add process timeout parameter to Config
* Refactor
* Add error handling to process output parsing
* Fix issue where start_time was not getting set consistently
* Add a frame complete notification to BaseWorker and distributed_job_manager.py
* Add API to download individual files to API server and ServerProxy
* Rename subjob notification API and add download_missing_frames_from_subjob
* Subjobs will now notify parent when a frame is complete
* Fix missed rename
* Add some misc logging
* Better error handling
* Fix frame download file path issue
* Download missing frames at job completion and misc cleanup
* Misc cleanup
* Code cleanup
* Force start in render queue only starts NOT_STARTED and SCHEDULED jobs
* Refactor adding jobs / subjobs
* Remove dead code
* Fixed issue with bulk job submission
* Cancel job now cancels all subjobs
* Misc fixes
* JSON now returns job hostname
* Add hostname as optional column in DB
* Misc fixes
* Error handling for removing zip file after download
* Clean up imports
* Fixed issue where worker child information would not be saved
* Add benchmark.py
* Add cpu / disk benchmark APIs
* Add cpu_benchmark method to distributed_job_manager.py
* Make sure cpu_benchmark is an int
* Improve distributed_job_manager test
* Stop previously running zeroconf instances
* Lots of formatting fixes
* Use f-strings for time delta
* More line fixes
* Update requirements.txt
* More misc cleanup
* Simplify README.md
* Remove legacy client
* Misc cleanup
* Add message box after submission success / fail
* Use a new is_localhost method to handle localhost not including '.local'
* Code cleanup
* Fix issue where engine browser would think we're downloading forever
* Add message box after submission success / fail
* Use a new is_localhost method to handle localhost not including '.local'
* Code cleanup
* Fix issue where engine browser would think we're downloading forever
* Add pubsub messages to serverproxy_manager.py
* Add resolution, fps and renderer versions to add_job.py
* Add cameras to add_job.py
* Add message box after submission success / fail
* Use a new is_localhost method to handle localhost not including '.local'
* Code cleanup
* Fix issue where engine browser would think we're downloading forever
* Add message box after submission success / fail
* Code cleanup
* Add cameras to add_job.py
* Add dynamic engine options and output format
* Move UI work out of BG threads and add engine presubmission tasks
* Submit dynamic args when creating a new job
* Hide groups and show messagebox after submission
* Choose file when pressing New Job in main window now
* Zeroconf.found_clients() now returns dicts of clients, not just hostnames
* Adjustments to distributed_job_manager.py
* Undo config change
* Report system metrics (cpu, os, etc) via zeroconf_server.py
* Zeroconf.found_clients() now returns dicts of clients, not just hostnames
* Adjustments to distributed_job_manager.py
* Undo config change
* Zeroconf.found_clients() now returns dicts of clients, not just hostnames
* Adjustments to distributed_job_manager.py
* Undo config change
* Adjustments to distributed_job_manager.py
* Undo config change
* Rename ZeroconfServer.found_clients() to found_hostnames()
* Fix issue with engine not being available to download
* Add version caches to ffmpeg downloader
* Remove some test parameters
* "releases" should be "release" in linux ffmpeg url
* CPU was incorrectly reported as OS
* Fix naming structure for FFMPEG downloads for linux
* More linux ffmpeg work
* Improved error handling
* WIP
* Consolidate platform reporting to not use platform directly
* Fix missing folder name
* Fix project output naming
* Undo config.yaml commit
* Add is_engine_available API call
* Fix issue where subjobs would not find servers
* Render worker makes multiple attempts if file_path increases on each run
* Change blender_worker.py to not overwrite existing files
* Chmod +x to client