Newer
Older
Import / projects / LGN-IP3870 / t / new / mmssmil.py
import os.path
from mmsmanager import mmsmgr

def get_filename(fname):
	fname = os.path.split(fname)[1]
	dot = fname.rfind('.')
	if dot >=0:
		fname = fname[:dot]
	return fname

def MMS_smilsave(fp, ntap, text):
	text = unicode(text)
	text = text.encode('utf-8')
	fp.write('\t'*ntap + text + '\n')

def MMS_smilmake(msg, filepath, slide_pos=[], region_fit=[]):
	def change_filename(fname):
		if not fname:
			return ''
		fname = fname.replace('&', '&')
		fname = fname.replace('<', '&lt;')
		fname = fname.replace('>', '&gt;')
		fname = fname.replace('"', '&quot;')
		fname = fname.replace("'", '&apos;')
		return fname

	if not msg:
		return False

	tag_version = '<?xml version="1.0" encoding="utf-8"?>'
	tag_start = ('<smil xmlns="http://www.w3.org/2001/SMIL20/Language">', '</smil>')
	tag_head = ('<head>', '</head>')
	tag_layout = ('<layout>', '</layout>')
	tag_rootlayout = '<root-layout width="100%" height="100%"/>'
	region_id = [ \
		'<region id="__YH__IMAGE_UP__" width="100%" height="70%" left="0%" top="0%" fit="meet" />', \
		'<region id="__YH__IMAGE_DOWN__" width="100%" height="70%" left="0%" top="30%" fit="meet" />', \
		'<region id="__YH__TEXT_UP__" width="100%" height="30%" left="0%" top="0%" />', \
		'<region id="__YH__TEXT_DOWN__" width="100%" height="30%" left="0%" top="70%" />', \
		'<region id="__YH__ALL__" width="100%" height="100%" left="0%" top="0%" />', \
		]
	tag_body = ('<body>', '</body>')
	tag_par = ('<par dur = "', 'ms" >', '</par>')
	tag_image = ('<img src = "cid:', '" region="', '" />')
	tag_video = ('<video src = "cid:', '" region="', '" />')
	tag_text = ('<text src = "cid:', '" region="', '" />')
	tag_sound = ('<audio src = "cid:', '" />')

	isregion_all = False
	isregion_up = False
	isregion_down = False
	body_value = []

	slide_count = len(msg.media)
	if slide_count <= 0:
		return False

	for index, s in enumerate(msg.media):
		fname_text = change_filename(s.fname_text)
		fname_image = change_filename(s.fname_image)
		fname_sound = change_filename(s.fname_sound)
		fname_video = change_filename(s.fname_video)
		try:
			slide_time = msg.slide_time[index]
		except:
			slide_time = 5000
		isimage = False
		isvideo = False
		istext = False
		issound = False
		isimage_one = False
		isvideo_one = False
		istext_one = False

		if s.fname_image:
			isimage = True
		if s.fname_video:
			isvideo =True
		if s.fname_text:
			istext = True
		if s.fname_sound:
			issound =True
		if isimage and not isvideo and not istext:
			isimage_one = True
			isimage = False
		if isvideo and not isimage and not istext:
			isvideo_one = True
			isvideo = False
		if istext and not isimage and not isvideo:
			istext_one = True
			istext = False

		if isvideo or isvideo_one:
			body_value.append(tag_par[0] + '%d'%(slide_time) + tag_par[1])
		else:
			body_value.append(tag_par[0] + '%d'%(slide_time) + tag_par[1])

		if isimage_one:
			body_value.append(tag_image[0]+get_filename(fname_image)+tag_image[1]+'__YH__ALL__'+tag_image[2])
		elif isvideo_one:
			body_value.append(tag_video[0]+get_filename(fname_video)+tag_video[1]+'__YH__ALL__'+tag_video[2])
		elif istext_one:
			body_value.append(tag_text[0]+get_filename(fname_text)+tag_text[1]+'__YH__ALL__'+tag_text[2])
		else:
			if slide_pos:
				if isimage and istext:
					if slide_pos[index] == 'idown':
						body_value.append(tag_text[0]+get_filename(fname_text)+tag_text[1]+'__YH__TEXT_UP__'+tag_text[2])
						body_value.append(tag_image[0]+get_filename(fname_image)+tag_image[1]+'__YH__IMAGE_DOWN__'+tag_image[2])
					else:
						body_value.append(tag_text[0]+get_filename(fname_text)+tag_text[1]+'__YH__TEXT_DOWN__'+tag_text[2])
						body_value.append(tag_image[0]+get_filename(fname_image)+tag_image[1]+'__YH__IMAGE_UP__'+tag_image[2])
				elif isvideo and istext:
					if slide_pos[index] == 'idown':
						body_value.append(tag_text[0]+get_filename(fname_text)+tag_text[1]+'__YH__TEXT_UP__'+tag_text[2])
						body_value.append(tag_video[0]+get_filename(fname_video)+tag_video[1]+'__YH__IMAGE_DOWN__'+tag_video[2])
					else:
						body_value.append(tag_text[0]+get_filename(fname_text)+tag_text[1]+'__YH__TEXT_DOWN__'+tag_text[2])
						body_value.append(tag_video[0]+get_filename(fname_video)+tag_video[1]+'__YH__IMAGE_UP__'+tag_video[2])
			else:
				if isimage:
					body_value.append(tag_image[0]+get_filename(fname_image)+tag_image[1]+'__YH__IMAGE_UP__'+tag_image[2])
				elif isvideo:
					body_value.append(tag_video[0]+get_filename(fname_video)+tag_video[1]+'__YH__IMAGE_UP__'+tag_video[2])
				if istext:
					body_value.append(tag_text[0]+get_filename(fname_text)+tag_text[1]+'__YH__TEXT_DOWN__'+tag_text[2])
		if issound:
			body_value.append(tag_sound[0]+get_filename(fname_sound)+tag_sound[1])
		body_value.append(tag_par[2])

	fp = open(filepath, 'w')
	MMS_smilsave(fp, 0, tag_version)
	MMS_smilsave(fp, 0, tag_start[0])
	MMS_smilsave(fp, 1, tag_head[0])
	MMS_smilsave(fp, 2, tag_layout[0])
	MMS_smilsave(fp, 3, tag_rootlayout)
	for w in region_id:
		MMS_smilsave(fp, 3, w)
	MMS_smilsave(fp, 2, tag_layout[1])
	MMS_smilsave(fp, 1, tag_head[1])
	MMS_smilsave(fp, 1, tag_body[0])
	for w in body_value:
		if w[:4] == '<par' or w == '</par>':
			MMS_smilsave(fp, 2, w)
		else:
			MMS_smilsave(fp, 3, w)
	MMS_smilsave(fp, 1, tag_body[1])
	MMS_smilsave(fp, 0, tag_start[1])
	fp.close()

	return True

def change_smil(msg, filepath):
	from mmssmilparser import setsmil
	slide_pos = []
	region_pos = {}
	region_fit = []
	try:
		rootlayout, region, par = setsmil(filepath)
	except:
		return MMS_smilmake(msg, filepath)

	if len(region) == 0:
		return MMS_smilmake(msg, filepath)

	for i, r in enumerate(region):
		region_pos[r[u'id']] = i

	for n, m in enumerate(msg.media):
		slide_pos.append('')
		region_fit.append('')
		if n <= len(par):
			if par[n][1] and par[n][3]:
				i = region[region_pos[par[n][1][u'region']]][u'top']
				i = i.replace('%', '')
				i = i.replace('px', '')
				t = region[region_pos[par[n][3][u'region']]][u'top']
				t = t.replace('%', '')
				t = t.replace('px', '')
				if i > t:
					slide_pos[n] = 'idown'
				else:
					slide_pos[n] = 'iup'
			elif par[n][3] and par[n][4]:
				i = region[region_pos[par[n][4][u'region']]][u'top']
				i = i.replace('%', '')
				i = i.replace('px', '')
				t = region[region_pos[par[n][3][u'region']]][u'top']
				t = t.replace('%', '')
				t = t.replace('px', '')
				if i > t:
					slide_pos[n] = 'idown'
				else:
					slide_pos[n] = 'iup'

	MMS_smilmake(msg, filepath, slide_pos, region_fit)