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