oxdbarchive/oxdbarchive/timeline.py

111 lines
3.5 KiB
Python

# -*- Mode: Python; -*-
# -*- coding: utf-8 -*-
# vi:si:et:sw=2:sts=2:ts=2
import Image
import math
from StringIO import StringIO
import oxdb_cache
from subtitles import srt2dict, time_str2msec
lineWidth = 600
timlelineHeight = 16
rowHeight = timlelineHeight + 2 * 4
'''
returns timeline view as a png image for a given movie.
'''
def loadTimeline(movie, lines = -1):
length = int(movie.length / 1000)
l = int(math.ceil(length / lineWidth) + 1)
if lines == -1 or l < lines:
lines = l
size = (lineWidth, rowHeight * lines)
timelineColor = (64, 64, 64)
i = Image.new("RGBA", size)
for currentLine in range(0, lines):
offset = currentLine * rowHeight + 4
try:
data = oxdb_cache.loadTimeline(movie, "%02d" % (currentLine * 10))
f = StringIO(data)
t = Image.open(f)
t = t.convert('RGBA')
box = (0, offset , t.size[0], offset + t.size[1])
i.paste(t, box)
except:
width = lineWidth
if currentLine == lines -1:
width = length - (lines - 1) * lineWidth
box = ((0, offset , width, offset + timlelineHeight))
i.paste(timelineColor, box)
f = StringIO()
i.save(f, 'PNG')
return f.getvalue()
'''
returns timeline overlay as a png image for a given movie
query is used to only highlight scenes matching query
'''
def loadTimelineOverlay(movie, query, lines = -1):
background = (255,255,255,0)
marker = (255,255,0,128)
markerBorder = (255,255,0,255)
length = int(movie.length / 1000)
l = int(math.ceil(length / lineWidth) + 1)
if lines == -1 or l < lines:
lines = l
size = (lineWidth, rowHeight * lines)
mask = Image.new("RGBA", size, background)
for subtitle in movie.overlay(query):
start = int(round(time_str2msec(subtitle.start) / 1000))
stop = int(round(time_str2msec(subtitle.stop) / 1000))
if start < stop:
currentLine = math.ceil(start / lineWidth)
if currentLine <= l:
offset = currentLine * rowHeight + 4
start = start - ((currentLine) * lineWidth)
stop = stop - ((currentLine) * lineWidth)
box = ((start, offset -1, stop, offset + timlelineHeight + 1))
mask.paste(marker, box)
borderBox = ((start, offset -1, stop, offset))
mask.paste(markerBorder, borderBox)
borderBox = ((start, offset + timlelineHeight, stop, offset + timlelineHeight +1))
mask.paste(markerBorder, borderBox)
f = StringIO()
mask.save(f, 'PNG', quality=70)
return f.getvalue()
return Image.composite(image, overlay, mask)
'''
returns an image map marking all the scenes with mouse events
for a given movie.
'''
def loadTimelineImageMap(movie):
s = movie.subtitleDict
length = int(movie.length / 1000)
imageMap ='<map name="timelineImageMap">'
for key in sorted([int(k) for k in s.keys()]):
sub = s["%s" % key]
start = int(round(time_str2msec(sub['start']) / 1000))
stop = int(round(time_str2msec(sub['stop']) / 1000))
if start < stop:
currentLine = math.ceil(start / lineWidth)
offset = int(currentLine * rowHeight + 4)
start = int(start - ((currentLine) * lineWidth))
stop = int(stop - ((currentLine) * lineWidth))
box = (start, offset -1, stop, offset + timlelineHeight + 1)
area = '<area class="timelineMarker" shape="rect" coords="%s, %s, %s, %s"' % box
area += ' onMouseOver="iS(%s, %s, %s, %s)" ' % (start, stop, offset, key)
area += ' onClick="cS(%s, %s, %s, %s)" ' % (start, stop, offset, key)
area += ' onMouseOut="oS()" />'
imageMap += area
imageMap += "</map>"
return imageMap