first
This commit is contained in:
parent
dc76e4ecc4
commit
1a7a86bff0
4
__init__.py
Normal file
4
__init__.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import screen
|
||||||
|
import screenshare
|
27
screen.py
Normal file
27
screen.py
Normal 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
26
screenshare.py
Normal 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
7
static/css/common.css
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
.fullwidth {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.livescreen {
|
||||||
|
height: 56vw;
|
||||||
|
}
|
9
static/css/jquery-confirm.min.css
vendored
Normal file
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
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
30
static/js/screen.js
Normal 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
43
templates/screen.html
Normal 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 %}
|
Loading…
Reference in New Issue
Block a user