From 3ff1d186c072087afbc32ce890200abd85f3ae80 Mon Sep 17 00:00:00 2001 From: j <0x006A@0x2620.org> Date: Wed, 24 Aug 2011 13:31:23 +0200 Subject: [PATCH] limit memory usage for large timelines, sort parts, dont delete poster after creating it --- pandora/item/models.py | 5 +++-- pandora/item/timelines.py | 29 ++++++++++++++++------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/pandora/item/models.py b/pandora/item/models.py index 48635c8..a8d5b52 100644 --- a/pandora/item/models.py +++ b/pandora/item/models.py @@ -818,7 +818,7 @@ class Item(models.Model): def streams(self): return [video.streams.filter(source=None, available=True)[0] - for video in self.files.filter(is_video=True, active=True)] + for video in self.files.filter(is_video=True, active=True).order_by('part')] def update_timeline(self, force=False): config = site_config() @@ -938,7 +938,8 @@ class Item(models.Model): p = subprocess.Popen(cmd) p.wait() for f in glob(poster.replace('.jpg', '*.jpg')): - os.unlink(f) + if f != poster: + os.unlink(f) return poster def poster_frames(self): diff --git a/pandora/item/timelines.py b/pandora/item/timelines.py index 8e799be..32fd4ac 100644 --- a/pandora/item/timelines.py +++ b/pandora/item/timelines.py @@ -78,22 +78,25 @@ def join_timelines(timelines, prefix): for timeline in timelines: tiles += sorted(glob('%s.%s.*.png'%(timeline, height))) - tiles = map(Image.open, tiles) - duration = sum(map(lambda i: i.size[0], tiles)) - timeline = Image.new("RGB", (duration, height)) - pos = 0 - for tile in tiles: - timeline.paste(tile, (pos, 0, pos+tile.size[0], height)) - pos += tile.size[0] + timeline = Image.new("RGB", (2 * width, height)) pos = 0 i = 0 - while pos < timeline.size[0]: - end = min(pos+width, timeline.size[0]) - timeline_name = '%s.%s.%04d.png' % (prefix, timeline.size[1], i) - timeline.crop((pos, 0, end, timeline.size[1])).save(timeline_name) - pos += width - i += 1 + for tile in tiles: + tile = Image.open(tile) + timeline.paste(tile, (pos, 0, pos+tile.size[0], height)) + pos += tile.size[0] + if pos >= width: + timeline_name = '%s.%s.%04d.png' % (prefix, height, i) + timeline.crop((0, 0, width, height)).save(timeline_name) + i += 1 + if pos > width: + t = timeline.crop((width, 0, pos, height)) + timeline.paste(t, (0, 0, t.size[0], height)) + pos -= width + if pos: + timeline_name = '%s.%s.%04d.png' % (prefix, height, i) + timeline.crop((0, 0, pos, height)).save(timeline_name) makeTiles(prefix, 16, 3600) makeTimelineOverview(prefix, 1920, height=16)