Skip to content
Snippets Groups Projects
Select Git revision
  • bullseye
  • buster default protected
  • master protected
3 results

0010-library-add-_adcli_call_external_program.patch

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    encoding.py NaN GiB
    from server import *
    from sorter import insert_video
    import os.path
    import json
    
    def set_metadata(dest, course, lecture):
    	chapters = query('SELECT text, time FROM chapters WHERE lecture_id = ? AND visible ORDER BY time', lecture['id'])
    	metadata = {'title': lecture['title'], 'album': course['title'],
    		'description': lecture['comment'],
    		'date': lecture['time'].strftime('%m/%d/%Y'),
    		'artist': lecture['speaker'] if lecture['speaker'] else course['organizer']}
    	dest['metadata'] = metadata
    	dest['chapters'] = chapters
    
    def schedule_remux(lectureid, videoid=None):
    	lecture = query('SELECT * FROM lectures WHERE id = ?', lectureid)[0]
    	course = query('SELECT * FROM courses WHERE id = ?', lecture['course_id'])[0]
    	videos = query('''SELECT videos.*, sources.path AS srcpath, sources.hash AS srchash, formats.options AS fmtopts
    			FROM videos
    			JOIN sources ON videos.source = sources.id
    			JOIN formats ON videos.video_format = formats.id
    			WHERE videos.lecture_id = ?''', lectureid)
    	for video in videos:
    		if not video['source']:
    			continue
    		if videoid and video['id'] != videoid:
    			continue
    		data = {'path': video['path'], 'srcpath': video['srcpath'],
    			'srchash': video['srchash'], 'video_id': video['id']}
    		fmt = json.loads(video['fmtopts'])
    		if 'format' in fmt:
    			data['format'] = fmt['format']
    		data['options'] = fmt.get('options', {})
    		set_metadata(data, course, lecture)
    		schedule_job('remux', data)
    
    @app.route('/internal/jobs/add/remux', methods=['GET', 'POST'])
    @mod_required
    @csrf_protect
    def add_remux_job():
    	lectureid = request.values.get('lectureid')
    	videoid = int(request.values.get('videoid', 0))
    	if not lectureid:
    		lectureid = query('SELECT lecture_id FROM videos WHERE id = ?', videoid)[0]['lecture_id']
    	schedule_remux(lectureid, videoid)
    	return redirect(request.values.get('ref', url_for('jobs_overview')))
    
    def schedule_transcode(source, fmt_id=None, video=None):
    	if video:
    		fmt_id = video['video_format']
    		assert(video['lecture_id'] == source['lecture_id'])
    	assert(fmt_id != None)
    	fmt = query('SELECT * FROM formats WHERE id = ?', fmt_id)[0]
    	lecture = query('SELECT * FROM lectures WHERE id = ?', source['lecture_id'])[0]
    	course = query('SELECT * FROM courses WHERE id = ?', lecture['course_id'])[0]
    	data = {'input': {'path': source['path'], 'streams': []}, 'output': json.loads(fmt['options']), 'filters': []}
    	if source['type'] == 'plain':
    		stream = {'name': 'video', 'type': 'video'}
    		data['input']['streams'].append(stream)
    		stream = {'name': 'audio', 'type': 'audio'}
    		data['input']['streams'].append(stream)
    	else:
    		assert(False)
    	set_metadata(data['output'], course, lecture)
    	basename = os.path.basename(source['path']).rsplit('.', 1)[0]
    	data['output']['path'] = 'pub/'+course['handle']+'/'+basename+fmt['suffix']
    	if video:
    		old_source = query('SELECT * FROM sources WHERE id = ?', video['source'])[0]
    		data['output']['path'] = video['path']
    		data['video_id'] = video['id']
    		data['srcpath'] = old_source['path']
    		data['srchash'] = old_source['hash']
    	else:
    		data['lecture_id'] = lecture['id']
    	data['format_id'] = fmt['id']
    	data['source_id'] = source['id']
    	return schedule_job('transcode', data, queue="background")
    
    @job_handler('transcode')
    def insert_transcoded_video(jobid, jobtype, data, state, status):
    	if 'lecture_id' not in data or 'source_id' not in data or 'format_id' not in data:
    		return
    	if 'video_id' in data:
    		return
    	video_id = insert_video(data['lecture_id'], data['output']['path'], data['format_id'], status['hash'], status['filesize'], status['duration'], data['source_id'])
    	schedule_remux(data['lecture_id'], video_id)
    
    @app.route('/internal/jobs/add/reencode', methods=['GET', 'POST'])
    @mod_required
    @csrf_protect
    @handle_errors('jobs_overview', 'Video nicht gefunden!', 404, IndexError)
    def add_reencode_job():
    	video = query('SELECT * FROM videos WHERE id = ?', request.values['videoid'])[0]
    	if not video['source']:
    		flash('Manuell erstellte Videos können nicht neukodiert werden!')
    	else:
    		source = query('''SELECT sources.* FROM sources WHERE sources.id = ? ORDER BY time_created''', video['source'])[-1]
    		schedule_transcode(source, video=video)
    	return redirect(request.values.get('ref', url_for('jobs_overview')))
    
    @job_handler('probe-raw')
    def update_lecture_videos(jobid, jobtype, data, state, status):
    	if 'lecture_id' not in data:
    		return
    	if 'source_id' not in data:
    		modify('INSERT INTO sources (lecture_id, path, type, hash, time_created) VALUES (?, ?, ?, ?, ?)',
    				data['lecture_id'], data['path'], 'plain', status['hash'], datetime.now())
    	sources = query('SELECT * FROM sources WHERE sources.lecture_id = ? ORDER BY time_created', data['lecture_id'])
    	if not sources:
    		return
    	latest = sources[-1]
    	videos = query('SELECT * FROM videos WHERE videos.lecture_id = ?', data['lecture_id'])
    	current_fmts = [v['video_format'] for v in videos]
    	formats = query('''SELECT formats.* FROM formats
    			JOIN profiles ON formats.id = profiles.format
    			JOIN courses ON profiles.name = courses.profile
    			JOIN lectures ON courses.id = lectures.course_id
    			WHERE lectures.id = ?''', data['lecture_id'])
    	for fmt in formats:
    		if fmt['id'] not in current_fmts:
    			schedule_transcode(latest, fmt_id=fmt['id'])
    	for video in videos:
    		if video['source'] != latest['id']:
    			schedule_transcode(latest, video=video)
    
    @edit_handler('chapters')
    def chapter_changed(table, column, value, id, user):
    	chapters = query('SELECT * FROM chapters WHERE id = ?', id)
    	if not chapters:
    		return
    	chapter = chapters[0]
    	if column in ['visible', 'deleted'] or (chapter['visible'] and not chapter['deleted']):
    		schedule_remux(chapter['lecture_id'])
    
    @edit_handler('courses')
    def course_changed(table, column, value, id, user):
    	if column not in ['title', 'organizer']:
    		return
    	lectures = query('SELECT * FROM lectures WHERE course_id = ?', id)
    	for lecture in lectures:
    		schedule_remux(lecture['id'])
    
    @edit_handler('lectures')
    def lecture_changed(table, column, value, id, user):
    	if column in ['title', 'comment', 'time', 'speaker']:
    		schedule_remux(id)