This commit is contained in:
qijungu 2018-03-31 12:43:14 -05:00
parent dc76e4ecc4
commit 1a7a86bff0
8 changed files with 156 additions and 0 deletions

4
__init__.py Normal file
View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
import screen
import screenshare

27
screen.py Normal file
View File

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
import threading, StringIO, time, base64
import pyscreenshot as ig
class Screen():
def __init__(self):
self.FPS = 10
self.screenbuf = ""
self.screenfile = StringIO.StringIO()
threading.Thread(target=self.getframes).start()
def __del__(self):
self.screenfile.close()
def getframes(self):
while True:
im = ig.grab(childprocess=False)
self.screenfile.truncate(0)
im.save(self.screenfile, format="jpeg", quality=75, progressive=True)
self.screenbuf = base64.b64encode(self.screenfile.getvalue())
time.sleep(1.0/self.FPS)
def gen(self):
return self.screenbuf
screenlive = Screen()

26
screenshare.py Normal file
View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from flask import Flask
from flask_bootstrap import Bootstrap
from flask.templating import render_template
import json
from screen import screenlive
secret_key = u'f71b10b68b1bc00019cfc50d6ee817e75d5441bd5db0bd83453b398225cede69'
app = Flask(__name__)
app.secret_key = secret_key
Bootstrap(app)
###### general ##########################################
@app.route('/')
def welcome():
return render_template("screen.html")
@app.route('/screenfeed/', methods=["POST"])
def screenfeed():
return json.dumps([True, screenlive.gen()])
### main ###
if __name__ == '__main__':
app.run(host='0.0.0.0', threaded=True)

7
static/css/common.css Normal file
View File

@ -0,0 +1,7 @@
.fullwidth {
width: 100%;
}
.livescreen {
height: 56vw;
}

9
static/css/jquery-confirm.min.css vendored Normal file

File diff suppressed because one or more lines are too long

10
static/js/jquery-confirm.min.js vendored Normal file

File diff suppressed because one or more lines are too long

30
static/js/screen.js Normal file
View File

@ -0,0 +1,30 @@
var frameinterval = 200; // 200 milliseconds means 5 frames per second
var frameerrcount = 0;
var screenfeedtimeout = null;
$(function() {
screenfeed();
});
function screenfeed() {
if (frameerrcount < 0) return;
$.post('../screenfeed/')
.then(function(r){
ret = $.parseJSON(r);
$('img.livescreen').attr('src', 'data:image/jpeg;base64,'+ret[1]);
frameerrcount = 0;
screenfeedtimeout = setTimeout(screenfeed, frameinterval)
}, function(r) {
if (frameerrcount < 0) return;
frameerrcount++;
screenfeedtimeout = setTimeout(screenfeed, frameinterval)
if (frameerrcount > 20) {
clearTimeout(screenfeedtimeout);
frameerrcount = -1;
$.alert({
title: 'Error!',
content: 'Lost screen from server. Refresh this page later...'
});
}
});
}

43
templates/screen.html Normal file
View File

@ -0,0 +1,43 @@
<!DOCTYPE html>
{% extends "bootstrap/base.html" %}
{% block title %}Screen Share{% endblock %}
{% block metas %}
{{super()}}
<meta charset="UTF-8"/>
{% endblock %}
{% block styles %}
{{super()}}
<link rel="stylesheet" href="{{url_for('static', filename='css/jquery-confirm.min.css')}}"/>
<link rel="stylesheet" href="{{url_for('static', filename='css/common.css')}}?ver=2"/>
{% endblock %}
{% block scripts %}
{{super()}}
<script src="{{url_for('static', filename='js/jquery-confirm.min.js')}}"></script>
<script src="{{url_for('static', filename='js/screen.js')}}?ver=3"></script>
{% endblock %}
{% block body_attribs %}
ontouchstart=""
class="homepage"
{% endblock %}
{% block navbar %}
<header id="header">
</header>
{% endblock %}
{% block content %}
<section id="feature" class="fullwidth">
<div class="container fullwidth">
<div class="center fullwidth">
<img src="" class="livescreen fullwidth">
</div>
</div>
</section>
{% endblock %}