Skip to content
Snippets Groups Projects
Commit c54c4ac8 authored by Julian Rother's avatar Julian Rother
Browse files

Merge branch 'master' of git.fsmpi.rwth-aachen.de:videoagwebsite/videoagwebsite

parents 7990ea9a 7d41f17f
No related branches found
No related tags found
No related merge requests found
...@@ -386,7 +386,13 @@ def suggest_chapter(lectureid): ...@@ -386,7 +386,13 @@ def suggest_chapter(lectureid):
time = request.values['time'] time = request.values['time']
text = request.values['text'] text = request.values['text']
assert(time and text) assert(time and text)
try:
x = datetime.strptime(time,'%H:%M:%S')
time= timedelta(hours=x.hour,minutes=x.minute,seconds=x.second).total_seconds()
time = int(time) time = int(time)
except ValueError:
flash('Falsches Zeitformat, "%H:%M:%S" wird erwartet. Z.B. "01:39:42" für eine Kapitel bei Stunde 1, Minute 39, Sekunde 42')
submitter = None submitter = None
if not ismod(): if not ismod():
submitter = request.environ['REMOTE_ADDR'] submitter = request.environ['REMOTE_ADDR']
...@@ -396,6 +402,16 @@ def suggest_chapter(lectureid): ...@@ -396,6 +402,16 @@ def suggest_chapter(lectureid):
return redirect(request.values['ref']) return redirect(request.values['ref'])
return 'OK', 200 return 'OK', 200
@app.route('/chapters/<int:lectureid>')
def chapters(lectureid):
chapters = query("SELECT * FROM chapters WHERE lecture_id = ? and visible ORDER BY time DESC", lectureid)
last = None
for c in chapters:
c['start'] = c['time']
c['end'] = last['start'] if last else 9999
last = c
return Response(render_template('chapters.srt',chapters=chapters), 200, {'Content-Type':'text/vtt'})
@app.route('/sitemap.xml') @app.route('/sitemap.xml')
def sitemap(): def sitemap():
pages=[] pages=[]
......
{% from 'macros.html' import vtttime %}
WEBVTT
{% for c in chapters|sort(attribute='start') %}
{{ loop.index }}
{# time format is 'minutes:seconds.ms' we expect full seconds #}
{{ vtttime(c['start']) }} --> {{ vtttime(c['end']) }}
{{ c['text'] }}
{% else %}
00:00:00.000 --> 23:59:59.999
Video
{% endfor %}
...@@ -12,11 +12,14 @@ ...@@ -12,11 +12,14 @@
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
{% for msg in get_announcements() %} {% for msg in get_announcements() %}
<div class="alert alert-{{levels.get(msg.level, ('info', ''))[0]}}" role="alert"> <div class="alert alert-{{levels.get(msg.level, ('info', ''))[0]}} row" role="alert">
<ul class="list-unstyled"> <div class="col-xs-12" style="padding: 0px;">
<li>{{ valueeditor(('announcements',msg.id,'text'), msg.text|safe) }}</li> <div class="pull-right">{{ valuedeletebtn(('announcements',msg.id,'deleted')) }}</div>
<li class="pull-right">{{ valuedeletebtn(('announcements',msg.id,'deleted')) }}</li> <div>{{ valueeditor(('announcements',msg.id,'text'), msg.text) }}</div>
<li class="pull-right" style="padding-right: 5px;"> </div>
<div class="col-xs-12" style="padding: 0px;">
<ul class="list-inline">
<li>
{% if not msg.visible %} {% if not msg.visible %}
<a href="{{ url_for('edit', prefix='announcements.'+msg.id|string+'.', ref=request.url, visible=1) }}" class="btn btn-primary">Veröffentlichen</a> <a href="{{ url_for('edit', prefix='announcements.'+msg.id|string+'.', ref=request.url, visible=1) }}" class="btn btn-primary">Veröffentlichen</a>
{% elif msg.time_expire and msg.time_expire < datetime.now() %} {% elif msg.time_expire and msg.time_expire < datetime.now() %}
...@@ -27,7 +30,7 @@ ...@@ -27,7 +30,7 @@
<a href="#" class="btn btn-success disabled">Öffentlich</a> <a href="#" class="btn btn-success disabled">Öffentlich</a>
{% endif %} {% endif %}
</li> </li>
<li class="dropdown pull-right" style="padding-right: 5px;"> <li class="dropdown">
<span class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">{{levels.get(msg.level, ('', 'Unbekannt'))[1]}} <span class="caret"></span></span> <span class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">{{levels.get(msg.level, ('', 'Unbekannt'))[1]}} <span class="caret"></span></span>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{% for level, descr in levels.items() %} {% for level, descr in levels.items() %}
...@@ -37,10 +40,13 @@ ...@@ -37,10 +40,13 @@
</li> </li>
<li> <li>
Aktiv von {{ valueeditor(('announcements',msg.id,'time_publish'), msg.time_publish) }} Aktiv von {{ valueeditor(('announcements',msg.id,'time_publish'), msg.time_publish) }}
</li>
<li>
bis {{ valueeditor(('announcements',msg.id,'time_expire'), msg.time_expire) }} bis {{ valueeditor(('announcements',msg.id,'time_expire'), msg.time_expire) }}
</li> </li>
</ul> </ul>
</div> </div>
</div>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
......
{% from 'macros.html' import player %} {% from 'macros.html' import player %}
{% from 'macros.html' import video_download_btn %} {% from 'macros.html' import video_download_btn %}
{% from 'macros.html' import video_embed_btn %} {% from 'macros.html' import video_embed_btn %}
{% from 'macros.html' import vtttime %}
{% from 'macros.html' import valueeditor %}
{% from 'macros.html' import valuedeletebtn %}
{% from 'macros.html' import valuecheckbox %}
{% set page_border = 0 -%} {% set page_border = 0 -%}
{% extends "base.html" %} {% extends "base.html" %}
...@@ -16,6 +20,7 @@ ...@@ -16,6 +20,7 @@
</div> </div>
<div class="col-sm-6 col-xs-12"> <div class="col-sm-6 col-xs-12">
<ul class="list-inline pull-right"> <ul class="list-inline pull-right">
<li><button class="btn btn-default" id="hintnewchapter">Kapitelmarker vorschlagen</button></li>
<li>{{ video_embed_btn(lecture.id) }}</li> <li>{{ video_embed_btn(lecture.id) }}</li>
<li class="dropdown">{{ video_download_btn(videos) }}</li> <li class="dropdown">{{ video_download_btn(videos) }}</li>
</ul> </ul>
...@@ -25,8 +30,51 @@ ...@@ -25,8 +30,51 @@
<div class="col-xs-12" style="padding: 0px"> <div class="col-xs-12" style="padding: 0px">
{{ player(lecture, videos) }} {{ player(lecture, videos) }}
</div> </div>
<div class="col-xs-12" style="padding-top: 10px;">
<p>Kapitel:</p>
<table class="table table-hover">
<tr>
<th>Index</th>
<th>Start</th>
<th>Kapitel</th>
<th>Sichtbar</th>
<th></th>
</tr>
{% for c in chapters|sort(attribute='time') %}
<tr onclick=" $('.player video')[0].setCurrentTime({{c['time']}})">
<td>{{ loop.index }}</td>
<td>{{ vtttime(c['time']) }}</td>
<td>{{ valueeditor(['chapters',c.id,'text'],c['text']) }}</td>
<td>{{ valuecheckbox(['chapters',c.id,'visible'], c.visible) }}</td>
<td>{{ valuedeletebtn(['chapters',c.id,'deleted']) }}</td>
</tr>
{% endfor %}
</table>
</div> </div>
</div> </div>
</div> </div>
</div>
<script>
$(function() {
$( "#hintnewchapter" ).popover(
{
html:true,
title:'Kapitelmarkierung vorschlagen',
content: function() {
var zeropad = function (num, places) {
var zero = places - num.toString().length + 1;
return Array(+(zero > 0 && zero)).join("0") + num;
};
var timestamp = $('.player video')[0].currentTime
var h = zeropad( Math.trunc(timestamp/3600),2);
var m = zeropad( Math.trunc((timestamp%3600)/60),2);
var s = zeropad( Math.trunc(timestamp%60),2);
var timeasstring = h+':'+m+':'+s
return '<form method="post" action="{{url_for('suggest_chapter', ref=request.url, lectureid=lecture.id)}}"><input placeholder="00:00.000" name="time" type="text" value="'+timeasstring+'"><br><input placeholder="Kapitel" name="text" type="texz"><br><input type="submit" value="Vorschlagen"></form>'
}
})
});
</script>
{% endblock %} {% endblock %}
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
{% for v in videos|sort(attribute='player_prio', reverse=True) %} {% for v in videos|sort(attribute='player_prio', reverse=True) %}
<source type="video/mp4" src="{{ config.VIDEOPREFIX }}/{{ v.path }}" title="{{ v.format_description }}"/> <source type="video/mp4" src="{{ config.VIDEOPREFIX }}/{{ v.path }}" title="{{ v.format_description }}"/>
{% endfor %} {% endfor %}
<track srclang="en" kind="chapters" src="{{ url_for('chapters',lectureid=lecture.id) }}" />
</video> </video>
<script> <script>
$(function($) $(function($)
...@@ -186,3 +187,5 @@ $('#embedcodebtn').popover( ...@@ -186,3 +187,5 @@ $('#embedcodebtn').popover(
</button> </button>
{% endif %} {% endif %}
{% endmacro %} {% endmacro %}
{% macro vtttime(time) %}{{ '%02d:%02d:%02d.000'|format( time//3600, (time//60)%60, time%60) }}{% endmacro %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment