Skip to content
Snippets Groups Projects
Select Git revision
  • 91ed667bf4b8fcb0f96a15713ddabbc108a674db
  • master default protected
  • intros
  • live_sources
  • bootstrap4
  • modules
6 results

livestreams.py

Blame
  • Forked from Video AG Infrastruktur / website
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    livestreams.py 2.39 KiB
    from server import *
    
    @sched_func(30)
    def livestream_thumbnail():
    	livestreams = query('SELECT streams.lecture_id, streams.handle AS livehandle FROM streams WHERE streams.active')
    	for v in genlive(livestreams):
    		schedule_job('thumbnail', {'lectureid': str(v['lecture_id']), 'path': v['path']})
    
    @app.route('/internal/streaming/legacy_auth', methods=['GET', 'POST'])
    @app.route('/internal/streaming/legacy_auth/<server>', methods=['GET', 'POST'])
    def streamauth(server=None):
    	internal = False
    	for net in config.get('FSMPI_IP_RANGES', []):
    		if ip_address(request.headers['X-Real-IP']) in ip_network(net):
    			internal = True
    	if request.values['app'] != 'live':
    		return 'Bad request', 400
    	if not internal:
    		return 'Forbidden', 403
    	if request.values['call'] == 'publish':
    		if request.values['pass'] != 'caisoh8aht0wuSu':
    			return 'Forbidden', 403
    		matches = query("SELECT lectures.* FROM lectures JOIN courses ON lectures.course_id = courses.id WHERE courses.handle = ? ORDER BY lectures.time DESC", request.values['name'])
    		now = datetime.now()
    		match = {'id': -1}
    		for lecture in matches:
    			if lecture['time']-timedelta(minutes=30) <= now and \
    				now <= lecture['time']+timedelta(minutes=lecture['duration']):
    				match = lecture
    				break
    		if 'lecture' in request.values:
    			match = {'id': request.values['lecture']}
    		try:
    			modify("INSERT INTO streams (handle, active, visible, lecture_id, description, poster) VALUES (?, 0, 1, -1, "", "")", request.values['name'])
    		except:
    			pass
    		if server:
    			data = {'src': 'rtmp://%s/live/%s'%(server, request.values['name']),
    				'destbase': 'rtmp://%s/hls/%s'%(server, request.values['name'])}
    			job_id = schedule_job('simple_live_transcode', data, priority=10)
    			modify("UPDATE streams SET active = 1, lecture_id = ?, job_id = ? WHERE handle = ?",
    					match['id'], job_id, request.values['name'])
    		else:
    			modify("UPDATE streams SET active = 1, lecture_id = ? WHERE handle = ?",
    					match['id'], request.values['name'])
    	elif request.values['call'] == 'publish_done':
    		job_id = query('SELECT job_id FROM streams WHERE handle = ?', request.values['name'])[0]['job_id']
    		modify("UPDATE streams SET active = 0 WHERE handle = ?", request.values['name'])
    		if job_id:
    			cancel_job(job_id)
    	else:
    		return 'Bad request', 400
    	return 'OK', 200
    
    @job_handler('simple_live_transcode', state='failed')
    def restart_failed_live_transcode(id, type, data, state, status):
    	restart_job(id)