diff --git a/pandora/annotation/views.py b/pandora/annotation/views.py index f1f48510..c87af88e 100644 --- a/pandora/annotation/views.py +++ b/pandora/annotation/views.py @@ -7,6 +7,8 @@ from ox.django.decorators import login_required_json from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response import models +from item.models import Item + from api.actions import actions @@ -38,8 +40,8 @@ def addAnnotation(request): param data { item: itemId, layer: layerId, - start: float, - end: float, + in: float, + out: float, value: string } return {'status': {'code': int, 'text': string}, @@ -49,19 +51,19 @@ def addAnnotation(request): } ''' data = json.loads(request.POST['data']) - for key in ('item', 'layer', 'start', 'end', 'value'): + for key in ('item', 'layer', 'in', 'out', 'value'): if key not in data: return render_to_json_response(json_response(status=400, text='invalid data')) - item = get_object_or_404_json(models.Item, itemId=data['item']) - layer = get_object_or_404_json(models.Layer, layerId=data['layer']) + item = get_object_or_404_json(Item, itemId=data['item']) + layer = get_object_or_404_json(models.Layer, name=data['layer']) annotation = models.Annotation( item=item, layer=layer, user=request.user, - start=float(data['start']), end=float(data['end']), + start=float(data['in']), end=float(data['out']), value=data['value']) annotation.save() response = json_response() @@ -94,8 +96,8 @@ def editAnnotation(request): ''' param data { id:, - start: float, - end: float, + in: float, + out: float, value: string, } return {'status': {'code': int, 'text': string}, @@ -105,9 +107,12 @@ def editAnnotation(request): ''' response = json_response({}) data = json.loads(request.POST['data']) - layer = get_object_or_404_json(models.Layer, pk=data['id']) - if layer.editable(request.user): - response = json_response(status=501, text='not implemented') + a = get_object_or_404_json(models.Annotation, pk=data['id']) + if a.editable(request.user): + a.value = data['value'] + a.start = data['in'] + a.end = data['out'] + a.save() else: response = json_response(status=403, text='permission denied') return render_to_json_response(response) diff --git a/pandora/archive/models.py b/pandora/archive/models.py index fbde9fb7..26ee8f0f 100644 --- a/pandora/archive/models.py +++ b/pandora/archive/models.py @@ -209,9 +209,12 @@ class File(models.Model): return srt srts = re.compile('(\d\d:\d\d:\d\d[,.]\d\d\d)\s*-->\s*(\d\d:\d\d:\d\d[,.]\d\d\d)\s*(.+?)\n\n', re.DOTALL) + i = 0 for s in srts.findall(data): - _s = {'in': parseTime(s[0]), 'out': parseTime(s[1]), 'value': s[2].strip()} + _s = {'id': str(i), + 'in': parseTime(s[0]), 'out': parseTime(s[1]), 'value': s[2].strip()} srt.append(_s) + i += 1 return srt def editable(self, user): diff --git a/static/js/pandora.js b/static/js/pandora.js index c14a33c3..e2314277 100755 --- a/static/js/pandora.js +++ b/static/js/pandora.js @@ -5,6 +5,7 @@ // fixme: never set ui.videoPosition to 0 ... set to null a.k.a. delete // fixme: sort=-director doesn't work // fixme: don't reload full right panel on sortSelect +// fixme: clear items cache after login/logout (function() { @@ -1443,6 +1444,7 @@ title: folder.title }) .bindEvent({ + // fixme: duplicated click: function(event, data) { var $list = app.$ui.folderList[i], hasFocus, id; @@ -1761,26 +1763,34 @@ } : data); }, enterfullscreen: enterFullscreen, - exitfullscreen: exitFullscreen - }))/*.bindEvent({ + exitfullscreen: exitFullscreen, resize: function(event, data) { - app.$ui.player.options({ - height: data - }); + app.$ui.player.options({ + height: data + }); } - })*/; + })); } else if (app.user.ui.itemView == 'timeline') { - var video = result.data.item.stream, + var layers = [], + video = result.data.item.stream, cuts = result.data.item.cuts || {}, - subtitles = result.data.item.layers.subtitles || [{ - 'in': 5, - 'out': 10, - 'value': 'This subtitle is just a test...' - }], - format = Ox.supportedVideoFormat(video.formats); + format = Ox.supportedVideoFormat(video.formats), + subtitles = result.data.item.layers.subtitles; video.height = video.profiles[0]; video.width = parseInt(video.height * video.aspectRatio / 2) * 2; video.url = video.baseUrl + '/' + video.height + 'p.' + format; + $.each(app.config.layers, function(i, layer) { + layers[i] = $.extend({}, layer); + if (result.data.item.layers[layer.id]) + layers[i]['items'] = result.data.item.layers[layer.id]; + else + layers[i]['items'] = [{ + 'in': 5, + 'out': 10, + 'value': 'This annotation is just a test...' + }]; + + }); app.$ui.contentPanel.replace(1, app.$ui.editor = new Ox.VideoEditor({ annotationsSize: app.user.ui.annotationsSize, cuts: cuts, @@ -1792,7 +1802,7 @@ height: app.$ui.contentPanel.size(1), id: 'editor', largeTimeline: true, - layers: app.config.layers, + layers: layers, matches: [], points: [0, 0], position: app.user.ui.videoPosition[app.user.ui.item] || 0, @@ -1806,16 +1816,19 @@ videoURL: video.url, width: app.$ui.document.width() - app.$ui.mainPanel.size(0) - 1 }).bindEvent({ - /* - resize: function(event, data) { - app.$ui.editor.options({ - width: data - }); - }, - */ + resize: function(event, data) { + app.$ui.editor.options({ + height: data + }); + }, togglesize: function(event, data) { UI.set({videoSize: data.size}); - } + }, + updateAnnotation: function(event, data) { + //fixme: check that edit was successfull + Ox.print('updateAnnotation', data); + pandora.api.editAnnotation(data); + } })); that.bindEvent('resize', function(event, data) { //Ox.print('resize item', data) @@ -3367,7 +3380,7 @@ function resizeWindow() { resizeFolders(); - if (app.user.ui.item == '') { + if (!app.user.ui.item) { app.$ui.list.size(); resizeGroups(app.$ui.rightPanel.width()); if (app.user.ui.listView == 'map') {