1
0
Fork 0
mirror of https://github.com/fastogt/fastocloud_admin.git synced 2025-03-09 23:38:52 +00:00
fastocloud_admin/app/stream/view.py
2020-02-11 09:58:41 -05:00

586 lines
24 KiB
Python

import os
import datetime
import re
from flask_classy import FlaskView, route
from flask import render_template, request, jsonify, Response
from flask_login import login_required, current_user
import pyfastocloud_models.constants as constants
from app import get_runtime_stream_folder, omdb
from pyfastocloud_models.stream.entry import IStream
from app.common.stream.forms import ProxyStreamForm, EncodeStreamForm, RelayStreamForm, TimeshiftRecorderStreamForm, \
CatchupStreamForm, TimeshiftPlayerStreamForm, TestLifeStreamForm, VodEncodeStreamForm, VodRelayStreamForm, \
ProxyVodStreamForm, CodEncodeStreamForm, CodRelayStreamForm, EventStreamForm
from app.common.series.forms import SerialForm
# routes
class StreamView(FlaskView):
DEFAULT_PIPELINE_FILENAME_TEMPLATE_1S = '{0}_pipeline.html'
route_base = '/stream/'
@staticmethod
def _get_pipeline_name(sid: str):
return StreamView.DEFAULT_PIPELINE_FILENAME_TEMPLATE_1S.format(sid)
@login_required
@route('/start', methods=['POST'])
def start(self):
server = current_user.get_current_server()
if server:
data = request.get_json()
sids = data['sids']
for sid in sids:
server.start_stream(sid)
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
@route('/stop', methods=['POST'])
def stop(self):
server = current_user.get_current_server()
if server:
data = request.get_json()
sids = data['sids']
for sid in sids:
server.stop_stream(sid)
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
@route('/restart', methods=['POST'])
def restart(self):
server = current_user.get_current_server()
if server:
data = request.get_json()
sids = data['sids']
for sid in sids:
server.restart_stream(sid)
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
@route('/play/<sid>/master.m3u', methods=['GET'])
def play(self, sid):
stream = IStream.objects(id=sid).first()
if stream:
return Response(stream.generate_playlist(), mimetype='application/x-mpequrl'), 200
return jsonify(status='failed'), 404
@login_required
@route('/get_log', methods=['POST'])
def get_log(self):
server = current_user.get_current_server()
if server:
sid = request.form['sid']
server.get_log_stream(sid)
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
@route('/get_pipeline', methods=['POST'])
def get_pipeline(self):
server = current_user.get_current_server()
if server:
sid = request.form['sid']
server.get_pipeline_stream(sid)
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
def view_log(self, sid):
path = os.path.join(get_runtime_stream_folder(), sid)
try:
with open(path, "r") as f:
content = f.read()
return content
except OSError as e:
print('Caught exception OSError : {0}'.format(e))
return '''<pre>Not found, please use get log button firstly.</pre>'''
@login_required
def view_pipeline(self, sid):
path = os.path.join(get_runtime_stream_folder(), StreamView._get_pipeline_name(sid))
try:
with open(path, "r") as f:
content = f.read()
return content
except OSError as e:
print('Caught exception OSError : {0}'.format(e))
return '''<pre>Not found, please use get pipeline button firstly.</pre>'''
# broadcast routes
@login_required
@route('/add/serial', methods=['GET', 'POST'])
def add_serial(self):
server = current_user.get_current_server()
if server:
serial = server.make_serial()
form = SerialForm(obj=serial)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.make_entry()
new_entry.save()
server.add_serial(new_entry)
return jsonify(status='ok'), 200
return render_template('series/add.html', form=form)
return jsonify(status='failed'), 404
@login_required
@route('/add/proxy_stream', methods=['GET', 'POST'])
def add_proxy_stream(self):
server = current_user.get_current_server()
if server:
stream = server.make_proxy_stream()
form = ProxyStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.make_entry()
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/proxy/add.html', form=form)
return jsonify(status='failed'), 404
@login_required
@route('/add/proxy_vod', methods=['GET', 'POST'])
def add_proxy_vod(self):
server = current_user.get_current_server()
if server:
stream = server.make_proxy_vod()
form = ProxyVodStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.make_entry()
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/vod_proxy/add.html', form=form)
return jsonify(status='failed'), 404
@login_required
@route('/add/vod_proxy_omdb/<oid>', methods=['GET', 'POST'])
def add_vod_proxy_omdb(self, oid):
server = current_user.get_current_server()
if server:
stream = server.make_proxy_vod()
form = ProxyVodStreamForm(obj=stream)
if request.method == 'GET':
res = omdb.imdbid(oid)
form.name.data = res['title']
form.tvg_logo.data = res['poster']
if res['type'] == 'series':
form.vod_type.data = constants.VodType.SERIES
form.country.data = res['country']
form.description.data = res['plot']
form.user_score.data = float(res['imdb_rating']) * 10
form.group.data = res['genre'].replace(',', ';')
form.prime_date.data = datetime.datetime.strptime(res['released'], '%d %b %Y')
runt_raw = res['runtime']
minutes = re.findall('\d+', runt_raw)
if minutes:
# runt = datetime.time(minute=int(minutes[0]))
# mseconds = (runt.hour * 60000 + runt.minute) * 60000 + runt.second * 1000 + runt.microsecond / 1000
form.duration.data = int(minutes[0]) * 60000
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.make_entry()
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/vod_proxy/add.html', form=form)
return jsonify(status='failed'), 404
@login_required
@route('/add/relay', methods=['GET', 'POST'])
def add_relay(self):
server = current_user.get_current_server()
if server:
stream = server.make_relay_stream()
form = RelayStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/relay/add.html', form=form, feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/encode', methods=['GET', 'POST'])
def add_encode(self):
server = current_user.get_current_server()
if server:
stream = server.make_encode_stream()
form = EncodeStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/encode/add.html', form=form, feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/timeshift_recorder', methods=['GET', 'POST'])
def add_timeshift_recorder(self):
server = current_user.get_current_server()
if server:
stream = server.make_timeshift_recorder_stream()
form = TimeshiftRecorderStreamForm(obj=stream)
if request.method == 'POST': # FIXME form.validate_on_submit()
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/timeshift_recorder/add.html', form=form,
feedback_dir=stream.generate_feedback_dir(),
timeshift_dir=stream.generate_timeshift_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/test_life', methods=['GET', 'POST'])
def add_test_life(self):
server = current_user.get_current_server()
if server:
stream = server.make_test_life_stream()
form = TestLifeStreamForm(obj=stream)
if request.method == 'POST': # FIXME form.validate_on_submit()
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/test_life/add.html', form=form, feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/catchup', methods=['GET', 'POST'])
def add_catchup(self):
server = current_user.get_current_server()
if server:
stream = server.make_catchup_stream()
form = CatchupStreamForm(obj=stream)
if request.method == 'POST': # FIXME form.validate_on_submit()
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/catchup/add.html', form=form, feedback_dir=stream.generate_feedback_dir(),
timeshift_dir=stream.generate_timeshift_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/timeshift_player', methods=['GET', 'POST'])
def add_timeshift_player(self):
server = current_user.get_current_server()
if server:
stream = server.make_timeshift_player_stream()
form = TimeshiftPlayerStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/timeshift_player/add.html', form=form,
feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/vod_relay', methods=['GET', 'POST'])
def add_vod_relay(self):
server = current_user.get_current_server()
if server:
stream = server.make_vod_relay_stream()
form = VodRelayStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/vod_relay/add.html', form=form,
feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/vod_encode', methods=['GET', 'POST'])
def add_vod_encode(self):
server = current_user.get_current_server()
if server:
stream = server.make_vod_encode_stream()
form = VodEncodeStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/vod_encode/add.html', form=form,
feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/event', methods=['GET', 'POST'])
def add_event(self):
server = current_user.get_current_server()
if server:
stream = server.make_event_stream()
form = EventStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/event/add.html', form=form,
feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/cod_relay', methods=['GET', 'POST'])
def add_cod_relay(self):
server = current_user.get_current_server()
if server:
stream = server.make_cod_relay_stream()
form = CodRelayStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/cod_relay/add.html', form=form,
feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/add/cod_encode', methods=['GET', 'POST'])
def add_cod_encode(self):
server = current_user.get_current_server()
if server:
stream = server.make_cod_encode_stream()
form = CodEncodeStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.update_entry(stream)
new_entry.save()
server.add_stream(new_entry)
return jsonify(status='ok'), 200
return render_template('stream/cod_encode/add.html', form=form,
feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/edit/<sid>', methods=['GET', 'POST'])
def edit(self, sid):
server = current_user.get_current_server()
if server:
stream = server.find_stream_by_id(sid)
if stream:
type = stream.get_type()
if type == constants.StreamType.PROXY:
form = ProxyStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/proxy/edit.html', form=form)
elif type == constants.StreamType.VOD_PROXY:
form = ProxyVodStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/vod_proxy/edit.html', form=form)
elif type == constants.StreamType.RELAY:
form = RelayStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/relay/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.ENCODE:
form = EncodeStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/encode/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.TIMESHIFT_RECORDER:
form = TimeshiftRecorderStreamForm(obj=stream)
if request.method == 'POST': # FIXME form.validate_on_submit()
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/timeshift_recorder/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir(),
timeshift_dir=stream.generate_timeshift_dir())
elif type == constants.StreamType.CATCHUP:
form = CatchupStreamForm(obj=stream)
if request.method == 'POST': # FIXME form.validate_on_submit()
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/catchup/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir(),
timeshift_dir=stream.generate_timeshift_dir())
elif type == constants.StreamType.TIMESHIFT_PLAYER:
form = TimeshiftPlayerStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/timeshift_player/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.TEST_LIFE:
form = TestLifeStreamForm(obj=stream)
if request.method == 'POST': # FIXME form.validate_on_submit()
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/test_life/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.VOD_RELAY:
form = VodRelayStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/vod_relay/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.VOD_ENCODE:
form = VodEncodeStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/vod_encode/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.COD_RELAY:
form = CodRelayStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/cod_relay/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.COD_ENCODE:
form = CodEncodeStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/cod_encode/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
elif type == constants.StreamType.EVENT:
form = EventStreamForm(obj=stream)
if request.method == 'POST' and form.validate_on_submit():
stream = form.update_entry(stream)
server.update_stream(stream)
return jsonify(status='ok'), 200
return render_template('stream/event/edit.html', form=form,
feedback_dir=stream.generate_feedback_dir())
return jsonify(status='failed'), 404
@login_required
@route('/remove', methods=['POST'])
def remove(self):
data = request.get_json()
sids = data['sids']
server = current_user.get_current_server()
if server:
for sid in sids:
server.remove_stream(sid)
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
@route('/remove_all_streams', methods=['GET'])
def remove_all_streams(self):
server = current_user.get_current_server()
if server:
server.remove_all_streams()
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
@route('/stop_all_streams', methods=['GET'])
def stop_all_streams(self):
server = current_user.get_current_server()
if server:
server.stop_all_streams()
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@login_required
@route('/start_all_streams', methods=['GET'])
def start_all_streams(self):
server = current_user.get_current_server()
if server:
server.start_all_streams()
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@route('/log/<sid>', methods=['POST'])
def log(self, sid):
# len = request.headers['content-length']
new_file_path = os.path.join(get_runtime_stream_folder(), sid)
with open(new_file_path, 'wb') as f:
data = request.stream.read()
f.write(b'<pre>')
f.write(data)
f.write(b'</pre>')
f.close()
return jsonify(status='ok'), 200
@route('/pipeline/<sid>', methods=['POST'])
def pipeline(self, sid):
# len = request.headers['content-length']
new_file_path = os.path.join(get_runtime_stream_folder(), StreamView._get_pipeline_name(sid))
with open(new_file_path, 'wb') as f:
data = request.stream.read()
f.write(data)
f.close()
return jsonify(status='ok'), 200