From d3fdb4f578539f83dca8dc43564039239a1af9f2 Mon Sep 17 00:00:00 2001 From: j <0x006A@0x2620.org> Date: Sat, 29 Oct 2011 12:01:41 +0200 Subject: [PATCH] cache stream aspect ratio in clips table. speedup clips view --- pandora/clip/models.py | 20 ++++++++++++-------- pandora/clip/views.py | 5 +++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pandora/clip/models.py b/pandora/clip/models.py index 696b6d98..5b9eda3d 100644 --- a/pandora/clip/models.py +++ b/pandora/clip/models.py @@ -22,6 +22,7 @@ class Clip(models.Model): created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) public_id = models.CharField(max_length=128, unique=True) + aspect_ratio = models.FloatField(default=0) item = models.ForeignKey('item.Item', related_name='clips') @@ -37,8 +38,8 @@ class Clip(models.Model): lightness = models.FloatField(default=0, db_index=True) volume = models.FloatField(default=0, null=True, db_index=True) - director = models.CharField(max_length=1000) - title = models.CharField(max_length=1000) + director = models.CharField(max_length=1000, db_index=True) + title = models.CharField(max_length=1000, db_index=True) def update_calculated_values(self): self.duration = self.end - self.start @@ -51,41 +52,44 @@ class Clip(models.Model): self.volume = 0 self.director = self.item.sort.director self.title = self.item.sort.title - + def save(self, *args, **kwargs): self.public_id = u"%s/%s-%s" %(self.item.itemId, float(self.start), float(self.end)) if self.duration != self.end - self.start: self.update_calculated_values() + if not self.aspect_ratio and self.item: + streams = self.item.streams() + if streams: + self.aspect_ratio = streams[0].aspect_ratio super(Clip, self).save(*args, **kwargs) def json(self, keys=None): j = {} clip_keys = ('id', 'in', 'out', 'position', 'created', 'modified', - 'hue', 'saturation', 'lightness', 'volume') + 'hue', 'saturation', 'lightness', 'volume', 'videoRatio') for key in clip_keys: j[key] = getattr(self, { 'id': 'public_id', 'in': 'start', 'out': 'end', 'position': 'start', + 'videoRatio': 'aspect_ratio', }.get(key, key)) if keys: for key in j.keys(): if key not in keys: del j[key] - if 'videoRatio' in keys: - streams = self.item.streams() - if streams: - j['videoRatio'] = streams[0].aspect_ratio public_layers = [l['id'] for l in filter(lambda l: not l.get('private', False), settings.CONFIG['layers'])] if 'annotations' in keys: j['annotations'] = [a.json(keys=['value', 'id', 'layer']) for a in self.annotations.filter(layer__name__in=public_layers).select_related()] + for layer in filter(lambda l: l in keys, public_layers): j[layer] = [a.json(keys=['id', 'value']) for a in self.annotations.filter(layer__name=layer)] + for key in keys: if key not in clip_keys and key not in j: value = self.item.get(key) diff --git a/pandora/clip/views.py b/pandora/clip/views.py index d703014b..d53ed253 100644 --- a/pandora/clip/views.py +++ b/pandora/clip/views.py @@ -32,7 +32,7 @@ def order_query(qs, sort): if operator != '-': operator = '' clip_keys = ('public_id', 'start', 'end', 'hue', 'saturation', 'lightness', 'volume', - 'annotations__value', + 'annotations__value', 'videoRatio', 'director', 'title') key = { 'id': 'public_id', @@ -40,6 +40,7 @@ def order_query(qs, sort): 'out': 'end', 'position': 'start', 'text': 'annotations__value', + 'videoRatio': 'aspect_ratio', }.get(e['key'], e['key']) if key.startswith('clip:'): key = e['key'][len('clip:'):] @@ -76,8 +77,8 @@ def findClips(request): query = parse_query(data, request.user) qs = order_query(query['qs'], query['sort']) if 'keys' in data: - qs = qs.select_related() qs = qs[query['range'][0]:query['range'][1]] + qs = qs.select_related() response['data']['items'] = [p.json(keys=data['keys']) for p in qs] elif 'position' in query: ids = [i.public_id for i in qs]