From 000362c05c14ab44acc36b30baa167bde20ce16e Mon Sep 17 00:00:00 2001 From: j <0x006A@0x2620.org> Date: Wed, 28 Sep 2011 02:29:40 +0200 Subject: [PATCH] annotation sort --- pandora/annotation/models.py | 15 +++++++++++++++ pandora/annotation/views.py | 24 ++++++++++++++++++++++-- pandora/archive/extract.py | 23 +++++++++++++++++++++-- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/pandora/annotation/models.py b/pandora/annotation/models.py index d2d127d3..eb00e745 100644 --- a/pandora/annotation/models.py +++ b/pandora/annotation/models.py @@ -8,6 +8,7 @@ import ox import utils import managers +from archive import extract def load_layers(layers): @@ -87,6 +88,12 @@ class Annotation(models.Model): layer = models.ForeignKey(Layer) value = models.TextField() + duration = models.FloatField(default=0, db_index=True) + hue = models.FloatField(default=0, db_index=True) + saturation = models.FloatField(default=0, db_index=True) + lightness = models.FloatField(default=0, db_index=True) + volume = models.FloatField(default=0, db_index=True) + def editable(self, user): if user.is_authenticated(): if user.is_staff or \ @@ -105,6 +112,14 @@ class Annotation(models.Model): if not self.id: super(Annotation, self).save(*args, **kwargs) self.public_id = '%s/%s' % (self.item.itemId, ox.to32(self.id)) + if self.duration != self.end - self.start: + self.duration = self.end - self.start + if self.duration > 0: + self.hue, self.saturation, self.lightness = extract.average_color( + self.item.timeline_prefix, self.start, self.end) + else: + self.hue = self.saturation = self.lightness = 0 + #FIXME: set volume here super(Annotation, self).save(*args, **kwargs) def json(self, layer=False, keys=None): diff --git a/pandora/annotation/views.py b/pandora/annotation/views.py index ee87cf51..f8cc9f20 100644 --- a/pandora/annotation/views.py +++ b/pandora/annotation/views.py @@ -32,8 +32,28 @@ def parse_query(data, user): query['qs'] = query['qs'].filter(item__in=item_query) return query +def annotation_sort_key(key): + return { + 'text': 'value', + 'position': 'start', + }.get(key, key) + def order_query(qs, sort): - qs = qs.order_by('start') + order_by = [] + print sort + for e in sort: + operator = e['operator'] + if operator != '-': + operator = '' + if e['key'].startswith('clip:'): + key = annotation_sort_key(e['key'][len('clip:'):]) + else: + #key mgith need to be changed, see order_sort in item/views.py + key = "item__sort__%s" % e['key'] + order = '%s%s' % (operator, key) + order_by.append(order) + if order_by: + qs = qs.order_by(*order_by, nulls_last=True) return qs def findAnnotations(request): @@ -70,7 +90,7 @@ def findAnnotations(request): if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: - ids = [i.get_id() for i in qs] + ids = [i.public_id for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: response['data']['items'] = qs.count() diff --git a/pandora/archive/extract.py b/pandora/archive/extract.py index 1fbef95b..61088edb 100644 --- a/pandora/archive/extract.py +++ b/pandora/archive/extract.py @@ -279,20 +279,39 @@ def timeline(video, prefix): p.wait() -def average_color(prefix): +def average_color(prefix, start=0, end=0): height = 64 - width = 1500 frames = 0 pixels = [] color = np.asarray([0, 0, 0], dtype=np.float32) + if end: + start = int(start * 25) + end = int(end * 25) for image in sorted(glob("%s.%d.*.png" % (prefix, height))): + start_offset = 0 timeline = Image.open(image) frames += timeline.size[0] + if start and frames < start: + continue + elif start and frames > start > frames-timeline.size[0]: + start_offset = start - (frames-timeline.size[0]) + box = (start_offset, 0, timeline.size[0], height) + timeline = timeline.crop(box) + if end and frames > end: + end_offset = timeline.size[0] - (frames - end) + box = (0, 0, end_offset, height) + timeline = timeline.crop(box) + p = np.asarray(timeline, dtype=np.float32) p = np.sum(p, axis=0) / height #average color per frame pixels.append(p) + if end and frames >= end: + break + + if end: + frames = end - start for i in range(0, len(pixels)): p = np.sum(pixels[i], axis=0) / frames color += p