|
#!/usr/bin/env python |
|
|
|
## uber-simple screen sharing for OS X |
|
## by Rui Carmo - http://the.taoofmac.com/space/blog/2006/03/12 |
|
## with a few tweaks by Avi Flax <avif@arc90.com> |
|
|
|
import os, socket, datetime, SimpleHTTPServer, SocketServer, StringIO, sys |
|
|
|
if len(sys.argv) >= 2: |
|
PORT = int(sys.argv[1]) |
|
else: |
|
PORT = 80 |
|
|
|
IMAGE_PATH = '/tmp/screen.png' |
|
INTERVAL = 2 |
|
HTTP_DATE_FORMAT = "%a, %d %b %Y %H:%M:%S %Z" |
|
|
|
def screenCapture(path): |
|
"""Take screenshot if necessary""" |
|
try: |
|
# See if the current screenshot is stale |
|
t = os.stat(path) |
|
if((datetime.datetime.now() - datetime.datetime.fromtimestamp(t.st_mtime)) < datetime.timedelta(seconds=INTERVAL)): |
|
return |
|
except OSError: |
|
# File was not found |
|
pass |
|
os.system('screencapture -xC ' + path) |
|
os.system('sips -Z 1200 ' + path) |
|
|
|
def formatPage(): |
|
"""Render HTML Page""" |
|
return """<html> |
|
<head> |
|
<title>Screen Sharing: %s</title> |
|
<script language="JavaScript"> |
|
counter = 0; |
|
function update() { |
|
document.getElementById("screenshot").src = "/screen.png?" + counter; |
|
self.setTimeout("update()",%s); |
|
counter++; |
|
} |
|
</script> |
|
<style> |
|
body { font-family: Lucida, Arial, "MS Trebuchet", sans-serif; } |
|
.info { background-color: #DDD; padding: 4px; } |
|
</style> |
|
</head> |
|
<body onload="update();"> |
|
<center> |
|
<img id="screenshot" src="/screen.png"><br><p class="info">Updated every %s seconds</p> |
|
</center> |
|
</body> |
|
</html>""" % (socket.gethostname(), INTERVAL * 1000, INTERVAL) |
|
|
|
class LocalRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): |
|
"""Custom HTTP Request Handler""" |
|
def send_head(self): |
|
"""Common handler for GET and HEAD requests""" |
|
if self.path == "/": |
|
self.send_response(200) |
|
self.send_header("Content-type","text/html") |
|
self.end_headers() |
|
return StringIO.StringIO(formatPage()) |
|
|
|
if self.path[:11] == "/screen.png": |
|
try: |
|
screenCapture(IMAGE_PATH) |
|
f = open(IMAGE_PATH,'rb') |
|
self.send_response(200) |
|
self.send_header("Content-type","image/png") |
|
self.send_header("Content-Length", str(os.fstat(f.fileno()).st_size)) |
|
mtime = datetime.datetime.fromtimestamp(os.fstat(f.fileno()).st_mtime) |
|
self.send_header("Last-Modified", mtime.strftime(HTTP_DATE_FORMAT)) |
|
expires = mtime + datetime.timedelta(seconds=INTERVAL) |
|
self.send_header("Expires", expires.strftime(HTTP_DATE_FORMAT)) |
|
self.end_headers() |
|
return f |
|
except IOError: |
|
pass |
|
|
|
self.send_error(404, "File not found") |
|
return None |
|
|
|
if __name__=='__main__': |
|
screenCapture(IMAGE_PATH) |
|
httpd = SocketServer.TCPServer(('', PORT),LocalRequestHandler) |
|
print "Listening on port " + str(PORT) |
|
httpd.serve_forever() |