Skip to content

Instantly share code, notes, and snippets.

@aviflax
Created February 10, 2011 17:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aviflax/820898 to your computer and use it in GitHub Desktop.
Save aviflax/820898 to your computer and use it in GitHub Desktop.
über-simple screen sharing for anyone running OS X. By Rui Carmo: http://the.taoofmac.com/space/blog/2006/03/12 with a few tweaks by Avi Flax <avif@arc90.com>
#!/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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment