* Fix processes not ending when stopped
* Fix error when removing a job
* Better error handling
* Refactored killprocess code and fixed windows support
* Improved error handling
* Add try to code that deletes project files
* Wait for the thread to finish after killing the process
* Don't try to stop process multiple times
* Misc cleanup
* 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 main.spec
* Fix issue where fetching supported extensions would crash with no default installation
* Engines return version as 'error' if cannot determine version
* EngineManager will now filter out corrupted engine installs by default
* Zeroconf logging improvements
* Ignore RuntimeErrors in background threads - Prevents issues during shutdown
* Migrate start up code from api_server.py to init.py
* Add error handlers to the API server to handle detached instances
* Integrate RenderQueue eval loop into RenderQueue object
* Silently catch RuntimeErrors on evaluate_queue
* Stop background queue updates in prepare_for_shutdown
* 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
* Add script to get GPU information from Blender
* Change run_python_script to allow it to run without a project file
* Simplify run_python_script code
* Fix mistake
* Add system_info to engine classes and api_server. /api/renderer_info now supports standard and full response modes.
* Get full renderer_info response for add job UI
* Enable setting specific Blender render_device using args
* Add Blender render device options to UI
* Streamline fetching renderer_info from API - use threading for performance improvements
* Use concurrent.futures instead of Threading
* Fix timeout issue with server proxy
* Minor fixes to code that handles proxy server online / offline status
* 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
* Do a better job of storing hostnames =
* Remove hostname from Zeroconf cache if server goes offline
* Add cpu / disk benchmark APIs
* Add cpu_benchmark method to distributed_job_manager.py
* Do a better job of storing hostnames =
* Remove hostname from Zeroconf cache if server goes offline
* Wrap main code in try finally block to always stop zeroconf
* Add missing import
* 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
* Misc fixes
* Misc cleanup
* Add all_versions to blender_downloader.py
* More cleanup
* Fix issue with status not reporting engine info
* Misc fixes
* Misc cleanup
* Add all_versions to blender_downloader.py
* More cleanup
* Fix issue with status not reporting engine info
* 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
* Make sure progress UI updates occur on main thread
* Cleanup unnecessary code in FFMPEG
* Cleanup extension matching
* Make sure supported_extensions is now called as a method everywhere
* Fix add_job crashing
* Update the renderer to reflect the current file type
* Sort engine versions from newest to oldest
* Consolidate Project Group and Server Group
* Split UI options into its own file for easier updating
* Add ffmpeg ui stem
* 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