from server import * import os.path 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'] schedule_job('transcode', data, queue="background") @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)