Newer
Older
Import / projects / LGN-IP3870 / t / orig / mmsplayer.py
import runtime
import utils
import config
from basemodel import Stage
from baseui import BaseUI
import uiconfig
import mmscomposestage
from mmsmanager import mmsmgr
import os

def Get_SlideInfo(smil):
	import mmssmilparser
	rootlayout, region, par = mmssmilparser.setsmil(smil)
	return par

class PlayUI(BaseUI):
	def __init__(self, msg, fname, mode, title):

		self.msg = msg
		self.replay = False
		self.mode = mode
		self.rootlayout = []
		self.region = []
		self.par = []

		self.mms_image = None
		self.up_img = None
		self.down_img = None
		self.snd_id = None
		try:
			if self.mode == False:
				leftname = '' 
			else:
				leftname = _('OPTIONS')

			BaseUI.__init__(self, leftname, _('BACK'), title)
			import mmssmilparser
			self.rootlayout, self.region, self.par = mmssmilparser.setsmil(fname)

		except:
			pass
		self.ori_par = self.par

		if self.par != []:
			self.Player()

	def destroy(self):
		self.kill_all()
		BaseUI.destroy(self)

	def restart(self):
		if self.par != []:
			if self.cur_slide != 0:
				for z in range(self.npar - self.cur_slide, 0, -1):
					tmp_list = self.par.pop(0)
					self.par.append(tmp_list)

				self.cur_slide = 0

			self.Player()

	def Player(self):

		self.videoplay_pid = None
		self.npar = len(self.par)  # slide count
		self.imgfit_value = ''
		self.message_list = []
		self.img_rg = []
		self.vdo_rg = []
		self.txt_rg = []
		self.txt_list = []
		self.txt_point = 0
		self.nline = 0
		self.cur_slide = 0  # now slide
		self.m_list = []  #  each line's  text list

		self.vdoever = None

		self.bvideo_play = False

		try:
			self.rw = self.trans_unit(self.rootlayout['width'], 256)   #player region
			self.rh = self.trans_unit(self.rootlayout['height'], 192)
		except:
			self.rw = 256
			self.rh = 192

		if self.rw > 256:
			x_diff = self.rw - 256
			self.rh = self.rh - self.rh * x_diff / self.rw
			self.rw = 256
		if self.rh > 192:
			y_diff = self.rh - 192
			self.rw = self.rw - self.rw * y_diff / self.rh
			self.rh = 192
		self.rx = 32 + (256 - self.rw) / 2 
		self.ry = 24 + (192 - self.rh) / 2

		self.pMain()

	def par_queue(self):

		if self.npar - 1 > self.cur_slide:
			self.cur_slide = self.cur_slide + 1
		else:
			if self.mode == False:
				self.set_left(_('REPLAY'))

			if self.par[0][2] != {}:
				self.aud_stop()
			if self.par[0][4] != {}:
				self.video_stop(True)

			return

		if self.par[0][1] != {}:
			self.img_hide()
		elif self.par[0][4] != {}:
			self.video_stop()
		if self.par[0][3] != {}:
			self.txt_hide()
			self.txt_free()
		if self.par[0][2] != {}:
			self.aud_stop()
		self.txt_list = []

		tmp_list = self.par.pop(0)
		self.par.append(tmp_list)

		self.pMain()

	def txt_free(self):
		if self.m_list != []:
			for z in self.m_list:
				for zz in z:
					if type(zz) == list:
						zz[0].free()
					else:
						zz.free()
		if self.up_img != None:
			self.up_img.free()
		if self.down_img != None:
			self.down_img.free()

	def txt_hide(self):
		if self.m_list != []:

			for z in self.m_list[self.txt_point:self.txt_point+ self.nline]:
				for zz in z:
					if type(zz) == list:
						zz[0].hide()
					else:
						zz.hide()

		if self.up_img != None:
			self.up_img.hide()
		if self.down_img != None:
			self.down_img.hide()

		runtime.evas.render()

	def img_hide(self):
		if self.mms_image != None:
			self.mms_image.hide()
			self.mms_image.free()
			runtime.evas.render()

	def aud_stop(self):
		if self.snd_id != None:
			utils.player.stop(self.snd_id)

	def video_stop(self, last = False):
		if self.bvideo_play == False:
			return

		os.system('fb0top 1')
		if self.videoplay_pid:
			utils.player.stop(self.videoplay_pid)
			self.videoplay_pid = None
		self.bvideo_play = True
		if last:
			y, x, sy, sx = self.vdo_pos
			self.vdoever = utils.put_image(uiconfig.image_image_sound_video_icon[0], (x + (sx - x)/2 - 36 - 20, y + (sy - y)/2 - 36))

	def video_play(self):

		startx = self.rx + self.trans_unit(self.vdo_rg['left'], self.rw)
		starty = self.ry + self.trans_unit(self.vdo_rg['top'], self.rh)
		video_Width = self.trans_unit(self.vdo_rg['width'], self.rw)
		video_Height = self.trans_unit(self.vdo_rg['height'], self.rh)

		vdo_right = startx + video_Width
		vdo_bottom = starty + video_Height

		if vdo_bottom > 216:
			vdo_bottom = 216
		if vdo_right > 298:
			vdo_right = 298

		if starty%2 == 1:
			starty = starty + 1

		if vdo_bottom%2 == 1:
			vdo_bottom += 1

		self.vdo_pos = (starty, startx + 40, vdo_bottom, vdo_right)
		vdo_fname = self.msg[self.cur_slide].fname_video

		if vdo_fname:
			vdo_fname = vdo_fname.replace('cid:','')
		else:
			return

		if vdo_fname.endswith('3gp'):
			self.bvideo_play = True
		else:
			return

		os.system('fb0top 0')
		self.videoplay_pid = utils.player.play(vdo_fname, videopos = self.vdo_pos, loop=False)

		if self.vdo_tend != 0:
			self.vdot2 = utils.Timer(self.vdo_tend, self.video_stop)

	def img_play(self):
		try:
			imgrg_Width = self.trans_unit(self.img_rg['width'], self.rw)
			imgrg_Height = self.trans_unit(self.img_rg['height'], self.rh)

			img_fname = str(self.msg[self.cur_slide].fname_image)
			img_fname = img_fname.replace('cid:','')

			tmp_w, tmp_h = utils.get_img_size(img_fname)

			if tmp_w * tmp_h > 640 * 480:
				img_fname = '/usr/local/lgvp/images/image_big.png'

			if self.imgfit_value == 'fill':
				self.mms_image = utils.put_image_sized(img_fname, 
								(self.rx + self.trans_unit(self.img_rg['left'], self.rw), self.ry + self.trans_unit(self.img_rg['top'], self.rh)),
								(imgrg_Width, imgrg_Height))

			else:
				img_fname = utils.changefile_gif(img_fname)
				image = runtime.evas.image(file=img_fname)
				w, h = image.size_get()
				image.free()

				if imgrg_Width < w:
					imgratio = w / float(w -imgrg_Width)
					w = imgrg_Width
					h = int(h - h/imgratio)
				if imgrg_Height < h:
					imgratio = h / float(h - imgrg_Height)
					h = imgrg_Height
					w = int(w-w/imgratio)
				ictrx = (imgrg_Width - w) /2
				ictry = (imgrg_Height - h) /2
				self.mms_image = utils.put_image(img_fname,
								(self.rx + self.trans_unit(self.img_rg['left'], self.rw) + ictrx, self.ry + self.trans_unit(self.img_rg['top'], self.rh) + ictry),
								[w, h])

		except:
			self.mms_image = runtime.evas.text(text='Image error', font=('Vera',15), pos=(80, 60), color=(0,0,0,128))
			self.mms_image.show()
		self.mms_image.layer = -11
		runtime.evas.render()
		if self.img_tend != 0 and self.npar - 1 != self.cur_slide:
			self.imgt2 = utils.Timer(self.img_tend, self.img_hide)

	def aud_play(self):
		try:
			aud_fname = str(self.msg[self.cur_slide].fname_sound)
			aud_fname = aud_fname.replace('cid:','')
			self.snd_id = utils.player.play(aud_fname, False)
		except:
			pass

		if self.aud_tend != 0:
			self.audt2 = utils.Timer(self.aud_tend, self.aud_stop)

	def txt_play(self):
		yindex = 0
		for z in self.m_list[self.txt_point:self.txt_point+ self.nline]:

			for zz in z:
				if type(zz) == list:
					xp, yp = zz[0].pos
					zz[0].pos = xp, self.ry + 2 + 27*yindex + self.trans_unit(self.txt_rg['top'], self.rh)
					zz[0].show()
				else:
					xp, yp = zz.pos
					zz.pos = xp, self.ry + 8 + 27*yindex + self.trans_unit(self.txt_rg['top'], self.rh)
					zz.show()
			yindex = yindex + 1

		self.up_img = utils.put_image(uiconfig.up_arrow,
				(self.rx + self.trans_unit(self.txt_rg['width'], self.rw)+ self.trans_unit(self.txt_rg['left'], self.rw),self.ry +  self.trans_unit(self.txt_rg['top'], self.rh)))
		self.down_img = utils.put_image(uiconfig.down_arrow,
				(self.rx + self.trans_unit(self.txt_rg['width'], self.rw)+ self.trans_unit(self.txt_rg['left'], self.rw), self.ry + yindex*25 + self.trans_unit(self.txt_rg['top'], self.rh)))

		if self.txt_point != 0:
			self.up_img.show()
		else:
			self.up_img.hide()

		if self.txt_point + self.nline < len(self.m_list):
			self.down_img.show()
		else:
			self.down_img.hide()

		runtime.evas.render()

		if self.txt_tend != 0 and self.npar - 1 != self.cur_slide:
			self.txtt2 = utils.Timer(self.txt_tend, self.txt_hide)

	def trans_time(self, tvalue):
		if str(tvalue).endswith('ms'):
			if int(str(tvalue).replace('ms','')) < 3600000:
				return int(str(tvalue).replace('ms',''))
		elif str(self.par[0][0]['dur']).endswith('s'):
			if int(str(tvalue).replace('s',''))* 1000 < 3600000:
				return int(str(tvalue).replace('s',''))* 1000
		return 3600000

	def trans_unit(self, unit, woh):
		if str(unit).endswith('px'):
			if  int(str(unit).replace('px','')) > woh:
				return woh
			return  int(str(unit).replace('px',''))
		elif str(unit).endswith('%'):
			return woh*int(str(unit).replace('%',''))/100
		else:
			return int(unit)

	def pMain(self):

		img_tbegin = 0
		vdo_tbegin = 0
		txt_tbegin = 0
		aud_tbegin = 0
		self.txt_point = 0

		if self.par[0][0].has_key('dur') == True: 
			tdur = self.trans_time(self.par[0][0]['dur'])
		else:
			tdur = 5000

		if self.par[0][3] != {}:
			self.txt_list = []

			for i in self.region:
				if i['id'] == self.par[0][3]['region']:
					self.txt_rg = i
					break

			if self.txt_rg.has_key('top') == False:
				self.txt_rg['top'] = 0

			if self.txt_rg.has_key('left') == False:
				self.txt_rg['left'] = 0

			if self.par[0][3].has_key('begin') == True:
				txt_tbegin = self.trans_time(self.par[0][3]['begin'])

			if self.par[0][3].has_key('dur') == True:
				self.txt_tend = self.trans_time(self.par[0][3]['dur'])
			elif self.par[0][3].has_key('end') == True:
				self.txt_tend = self.trans_time(self.par[0][3]['end'])
			else:
				self.txt_tend = 0

			x_width = self.trans_unit(self.txt_rg['width'], self.rw)
			start_xpos = self.trans_unit(self.txt_rg['left'], self.rw)

			effect_text = []
			inserted_text = []
			txt_type = 'text/plain'

			txt_fname = str(self.msg[self.cur_slide].fname_text)
			txt_fname = txt_fname.replace('cid:',"")

			try:
				if txt_type == 'text/plain':
					f = open(txt_fname)
					ftmp = [('h3'), f.read()]
					inserted_text.append(ftmp)
				else:
					import mmsxhtmlparser
					effect_text, inserted_text = mmsxhtmlparser.setsmil(txt_fname)
			except:
				inserted_text.append( [('h3'),'Text error'])

			for index, (x, y) in enumerate(inserted_text):
				ni = 0
				new_y = []
				for yi in range(len(y)):
					if ni > yi:
						continue
					for uistr, img, e in uiconfig.emoticons:
						if y[yi:yi+2] == e:

							if yi != 0:
								new_y.append(y[ni:yi])
							ni = yi + 2
							new_y.append([img, e])
							break
						elif y[yi:yi+3] == e:

							if yi != 0:
								new_y.append(y[ni:yi])
							ni = yi + 3
							new_y.append([img, e])
							break

				else:
					new_y.append(y[ni:])

				inserted_text[index][1] = new_y

			self.m_list = []
			self.message_list = []
			self.nline = self.trans_unit(self.txt_rg['height'], self.rh)/25 

			str_width = 0 
			wpoint = 0

			for x in inserted_text:
				fontsize = 13
				hcolor = uiconfig.entry_color
				hf = uiconfig.def_font
				alignL = False
				alignC = False

				hfont = hf, fontsize

				yy = ''
				for y in x[1]:	
					if type(y) != list:
						for y2 in range(0,len(y),8):

							yy = yy + y[y2:y2+8]

							if yy.find('\n') != -1:

								ccf = yy.count('\n')

								for z in range(ccf):

									if yy.find('\n') == 0:
										self.message_list.append((' ', hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor))
										self.m_list.append(self.message_list)
										self.message_list = []
										wpoint = 0
										yy = yy[1:]
										continue

									self.message_list.append((yy[:yy.find('\n')], hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor))
									self.m_list.append(self.message_list)
									self.message_list = []
									wpoint = 0
									yy = yy[yy.find('\n')+1:]

								continue

							message = runtime.evas.text(text = yy,font = hfont )
							str_width = message.geometry[2]
							message.free()
							message = None

							if x_width - wpoint - str_width < 11:

								txt_index = 1
								while True:
									message = runtime.evas.text(text = yy[:-txt_index],font = hfont)
									str_width = message.geometry[2]
									message.free()
									message = None

									if x_width - wpoint - str_width < 11:
										if txt_index == 7:
											if self.message_list == []:
												self.m_list.append([(yy[:-txt_index], hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor)])
											else:
												self.message_list.append((yy[:-txt_index] , hfont,(self.rx + 3 + start_xpos + wpoint, 0), hcolor))
												self.m_list.append(self.message_list)
												self.message_list = []
											wpoint = 0
											yy = yy[-txt_index:]
											break

										else:
											txt_index += 1
											continue

									else:
										if txt_index == 1:
											tmpLine = yy
											yy = ''
										else:
											tmpLine = yy[:-(txt_index-1)]
											yy = yy[-(txt_index-1):]

										if self.message_list == []:
											self.m_list.append([(tmpLine, hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor)])
										else:
											self.message_list.append((tmpLine , hfont,(self.rx + 3 + start_xpos + wpoint, 0), hcolor))
											self.m_list.append(self.message_list)
											self.message_list = []
										wpoint = 0
										break

						else:
							if str_width != 0:
								message = runtime.evas.text(text = yy,font = hfont)
								self.message_list.append((yy, hfont,(self.rx + 3 + start_xpos + wpoint, 0), hcolor))
								wpoint = wpoint + message.geometry[2]
								message.free()
								message = None
								yy=''

					else:
						if x_width - wpoint - 35 < 11:
							wpoint = 0
							self.m_list.append(self.message_list)
							self.message_list = []

						self.message_list.append([(str(y[0]), (self.rx + 5 + start_xpos + wpoint, 0))])
						wpoint = wpoint + 35

				wpoint = wpoint + 10
			if self.message_list != []:
				if self.message_list[0][0] != '':
					self.m_list.append(self.message_list)

			evas_txt = []
			for z in self.m_list:
				evas_txt_line = []
				for zz in z:
					if type(zz) == tuple:
						evas_txt_line.append(runtime.evas.text(text = zz[0], font = zz[1], pos = zz[2], color = zz[3]))
					else:
						im = utils.put_image(*zz[0])
						evas_txt_line.append([im])
						im.hide()

				evas_txt.append(evas_txt_line)

			self.m_list = evas_txt
			if alignC == True:
				for z in self.m_list:
					total_width = 0
					cblank = 0

					if type(z[0]) != list:
						for x in z[0].text_get():
							if x != ' ':
								break
							cblank = cblank + 1

					for zz in z:
						if type(zz) == list:
							wrtn_width = zz[0].geometry[2]
						else:
							wrtn_width = zz.geometry[2]
						total_width = total_width + wrtn_width
					for zz in z:
						if type(zz) == list:
							xp, yp = zz[0].pos
							zz[0].pos = xp - 6 * cblank + (self.trans_unit(self.txt_rg['width'], self.rw) - total_width) / 2, yp
						else:
							xp, yp = zz.pos
							zz.pos = xp - 6 * cblank + (self.trans_unit(self.txt_rg['width'], self.rw) - total_width) / 2, yp

			elif alignL == True:
				for z in self.m_list:
					cblank = 0

					if type(z[0]) != list:
						for x in z[0].text_get():
							if x != ' ':
								break
							cblank = cblank + 1

					for zz in z:
						if type(zz) == list:
							xp, yp = zz[0].pos
							zz[0].pos = xp - 6*cblank, yp
						else:
							xp, yp = zz.pos
							zz.pos = xp - 6*cblank, yp

		if self.par[0][5] != {}:
			pass

		if self.par[0][1] != {}:
			for i in self.region:

				if i['id'] == self.par[0][1]['region']:
					self.img_rg = i
					if self.par[0][1].has_key('fit') == True:
						self.imgfit_value = str(self.par[0][1]['fit'])
					elif i.has_key('fit'):
						self.imgfit_value = i['fit']
					else:
						self.imgfit_value = ''

					if self.img_rg.has_key('top') == False:
						self.img_rg['top'] = 0

					if self.img_rg.has_key('left') == False:
						self.img_rg['left'] = 0
					break

			if self.par[0][1].has_key('begin') == True:
				img_tbegin = self.trans_time(self.par[0][1]['begin'])

			if self.par[0][1].has_key('dur') == True:
				self.img_tend = self.trans_time(self.par[0][1]['dur'])

			elif self.par[0][1].has_key('end') == True:
				self.img_tend = self.trans_time(self.par[0][1]['end'])  #end를 기준으로
			else:
				self.img_tend = 0

		elif self.par[0][4] != {}: #video
			for i in self.region:
				if i['id'] == self.par[0][4]['region']:
					self.vdo_rg = i
					break

			if self.vdo_rg.has_key('top') == False:
				self.vdo_rg['top'] = 0

			if self.vdo_rg.has_key('left') == False:
				self.vdo_rg['left'] = 0

			if self.par[0][4].has_key('begin') == True:
				vdo_tbegin = self.trans_time(self.par[0][4]['begin'])

			if self.par[0][4].has_key('dur') == True:
				self.vdo_tend = self.trans_time(self.par[0][4]['dur'])

			elif self.par[0][4].has_key('end') == True:
				self.vdo_tend = self.trans_time(self.par[0][4]['end'])  #end를 기준으로
			else:
				self.vdo_tend = 0

		if self.par[0][2] != {}: #sound
			if self.par[0][2].has_key('begin') == True:
				aud_tbegin = self.trans_time(self.par[0][2]['begin'])

			if self.par[0][2].has_key('dur') == True:
				self.aud_tend = self.trans_time(self.par[0][2]['dur'])
			elif self.par[0][2].has_key('end') == True:
				self.aud_tend = self.trans_time(self.par[0][2]['end'])  #end를 기준으로
			else:
				self.aud_tend = 0


		if self.par[0][1] != {}:
			if img_tbegin == 0:  #이미지 타임 적용 플레이
				self.img_play()
			else:
				self.imgt1 = utils.Timer(img_tbegin, self.img_play)
		elif self.par[0][4] != {}:
			if vdo_tbegin == 0:  #비디오 타임 적용 플레이
				self.video_play()
			else:
				self.vdot1 = utils.Timer(vdo_tbegin, self.video_play)

		if self.par[0][2] != {}:
			if aud_tbegin == 0:  #사운드 플레이
				self.aud_play()
			else:
				self.audt1 = utils.Timer(aud_tbegin, self.aud_play)

		if self.par[0][3] != {}:
			if txt_tbegin == 0:  #txt 타임 적용 플레이
					self.txt_play()
			else:
				self.txtt1 = utils.Timer(txt_tbegin, self.txt_play)

		self.t = utils.Timer(tdur, self.par_queue)

	def kill_all(self):

		if self.par != []:
			if self.par[0][3] != {}:
				self.txt_hide()
				self.txt_free()

			if self.par[0][2] != {}:
				self.aud_stop()

			if self.par[0][1] != {}:
				self.img_hide()
			elif self.par[0][4] != {}:
				self.video_stop()

			if self.vdoever:
				self.vdoever.hide()
				self.vdoever.free()

		self.imgt1 = None
		self.txtt1 = None
		self.imgt2 = None
		self.txtt2 = None
		self.vdot1 = None
		self.vdot2 = None
		self.t = None

	def handle_key(self, key):

		if key == 'Up' and self.par[0][3] != {}:
			if self.txt_point > 0:
				self.txt_hide()
				self.txt_point = self.txt_point - 1
				self.txt_play()

		elif key == 'Down' and self.par[0][3] != {}:
			if len(self.m_list) - self.nline > self.txt_point:
				self.txt_hide()
				self.txt_point = self.txt_point + 1
				self.txt_play()

		elif key == config.Menu2 or key == config.Menu1: # or key == config.Red:

			if key == config.Menu1:
				runtime.manager.back_activate()
			else:
				runtime.manager.back_stage()


	def change_title(self, title):
		self.set_title(title)

	def set_left(self, left, breplay = True):
		self.replay = breplay
		BaseUI.set_left(self, left)

class PlayStage(Stage):
	name = 'play'
	def __init__(self, msg, fname, mode = False, title=_('PREVIEW')):
		self.title = None
		if title:
			self.title = title
		else:
			self.title = _('PREVIEW')
		self.fname = fname
		self.mode = mode
		self.msg = msg

		self.is_hide = False

		self.ui = PlayUI(self.msg, self.fname, self.mode, self.title)

	def handle_key(self, key):
		if key in ('Up', 'Down', config.Menu2, config.Red):
			return self.ui.handle_key(key)
		elif key == config.Menu1 and self.mode == False and self.ui.replay == True:
			self.ui.kill_all()
			self.ui.set_left('', False)
			self.ui.restart()

			return
		elif key == config.Menu1 and self.mode == True:
			return self.ui.handle_key(key)

	def show(self):
		if self.is_hide == True:
			self.ui.restart()
		self.is_hide = False
		Stage.show(self)

	def hide(self):
		self.is_hide = True
		self.ui.kill_all()
		Stage.hide(self)

	def change_title(self, title):
		self.ui.change_title(title)
		self.title = title