blender/release/io/netrender/utils.py
2009-09-02 00:07:55 +00:00

118 lines
2.8 KiB
Python

import bpy
import sys, os
import http, http.client, http.server, urllib
import subprocess, shutil, time, hashlib
import netrender.model
VERSION = b"0.3"
QUEUED = 0
DISPATCHED = 1
DONE = 2
ERROR = 3
def clientConnection(scene):
netrender = scene.network_render
conn = http.client.HTTPConnection(netrender.server_address, netrender.server_port)
if clientVerifyVersion(conn):
return conn
else:
conn.close()
return None
def clientVerifyVersion(conn):
conn.request("GET", "version")
response = conn.getresponse()
if response.status != http.client.OK:
conn.close()
return False
server_version = response.read()
if server_version != VERSION:
print("Incorrect server version!")
print("expected", VERSION, "received", server_version)
return False
return True
def clientSendJob(conn, scene, anim = False, chunks = 5):
netsettings = scene.network_render
job = netrender.model.RenderJob()
if anim:
for f in range(scene.start_frame, scene.end_frame + 1):
job.addFrame(f)
else:
job.addFrame(scene.current_frame)
filename = bpy.data.filename
job.files.append(filename)
job_name = netsettings.job_name
path, name = os.path.split(filename)
if job_name == "[default]":
job_name = name
for lib in bpy.data.libraries:
lib_path = lib.filename
if lib_path.startswith("//"):
lib_path = path + os.sep + lib_path[2:]
job.files.append(lib_path)
print(job.files)
job.name = job_name
for slave in scene.network_render.slaves_blacklist:
job.blacklist.append(slave.id)
job.chunks = netsettings.chunks
job.priority = netsettings.priority
# try to send path first
conn.request("POST", "job", repr(job.serialize()))
response = conn.getresponse()
job_id = response.getheader("job-id")
# if not ACCEPTED (but not processed), send files
if response.status == http.client.ACCEPTED:
for filepath in job.files:
f = open(filepath, "rb")
conn.request("PUT", "file", f, headers={"job-id": job_id, "job-file": filepath})
f.close()
response = conn.getresponse()
# server will reply with NOT_FOUD until all files are found
return job_id
def clientRequestResult(conn, scene, job_id):
conn.request("GET", "render", headers={"job-id": job_id, "job-frame":str(scene.current_frame)})
def prefixPath(prefix_directory, file_path, prefix_path):
if os.path.isabs(file_path):
# if an absolute path, make sure path exists, if it doesn't, use relative local path
full_path = file_path
if not os.path.exists(full_path):
p, n = os.path.split(full_path)
if main_path and p.startswith(main_path):
directory = prefix_directory + p[len(main_path):]
full_path = directory + n
if not os.path.exists(directory):
os.mkdir(directory)
else:
full_path = prefix_directory + n
else:
full_path = prefix_directory + file_path
return full_path