コード例 #1
0
	def onSeek(self, elapsed):
		print "## seek to:", elapsed
		if self.lyrics:
			self.lyricsTimer.pause()
			self.lyricsTimer = LyricsTimer(self.lyrics, self.update)
			self.lyricsTimer.start(elapsed)
			self.label.set_text(self.lyrics[self.lyricsTimer.actualLine].text[0].strip())
コード例 #2
0
	def onLyricsFound(self, lyrics):
		if not self.lyrics and lyrics:
			print "onLyricsFound"
			try:
				parsed = lyricsparser.parseLyrics(lyrics)
				if isinstance(parsed[0], LyricEntity):
					self.lyrics = parsed
					self.lyricsTimer = LyricsTimer(self.lyrics ,self.update)
					elapsed = self.player.getElapsed()
					#print "elapsed:", elapsed
					self.lyricsTimer.start(elapsed)
					self.label.set_text(self.lyrics[self.lyricsTimer.actualLine].text[0].strip())
					self.lyricsEngine.stop()
			except:
				traceback.print_exc()
コード例 #3
0
class Lyrics(object):

	color = gtk.gdk.Color()
	font = "Sans 10"
	applet = None
	label = None
	lyrics_directory = "/home/dencer/Lyrics"

	def __init__(self):
		self.lyrics = None
		self.lyricsTimer = None
		self.player = Player()
		self.player.registerOnPlayerConnected(self.onPlayerConnected)
		self.player.registerOnSongChange(self.onSongChanged)
		self.player.registerOnPlay(self.onPlay)
		self.player.registerOnStop(self.onStop)
		self.player.registerOnElapsedChanged(self.onSeek)
		self.lyricsEngine = LyricsEngine(self.onLyricsFound, self.onEngineFinish)
		self.lyricsEngine.setLyricsSources(['alsong', 'minilyrics', 'lrcdb', 'lyricsscreenlet'])
		
		self.label = gtk.Label("Lyrics Applet")
		self.gconf_client = gconf.client_get_default()
		self.gconf_client.add_dir("/apps/lyrics_applet", gconf.CLIENT_PRELOAD_NONE)
		self.gconf_client.notify_add('/apps/lyrics_applet/color', self.color_changed)
		self.gconf_client.notify_add('/apps/lyrics_applet/font', self.font_changed)
		
		self.color_changed(None)
		self.font_changed(None)


	def color_changed(self, client, *args):
		color = self.gconf_client.get_string("/apps/lyrics_applet/color")
		if color:
			self.color = gtk.gdk.Color(color)
			self.label.modify_fg(gtk.STATE_NORMAL, self.color)

	def font_changed(self, client, *args):
		font = self.gconf_client.get_string("/apps/lyrics_applet/font")
		if font:
			self.font = font
			font_desc = pango.FontDescription(font)
			self.label.modify_font(font_desc)

	def onPlayerConnected(self):
		print "onPlayerConnected"

	def onStop(self):
		if self.lyricsTimer:
			self.lyricsTimer.pause()

	def onPlay(self):
		if self.lyricsTimer:
			self.lyricsTimer.resume()

	def onSeek(self, elapsed):
		print "## seek to:", elapsed
		if self.lyrics:
			self.lyricsTimer.pause()
			self.lyricsTimer = LyricsTimer(self.lyrics, self.update)
			self.lyricsTimer.start(elapsed)
			self.label.set_text(self.lyrics[self.lyricsTimer.actualLine].text[0].strip())

	def onSongChanged(self, songFile):
		try:
			self.lyrics = None
			if self.lyricsTimer:
				self.lyricsTimer.pause()
				self.lyricsTimer = None
		
			print "onSongChanged"
			metadata = getSongMetadata(self.player)
			metadata['file'] = songFile
		
			self.label.set_text("")
			print metadata
		
			lyrics = self.getLyricsFromDisk(metadata)
			if lyrics is None:
				self.lyricsEngine.search(metadata)
				print "searching started"
			else:
				self.onLyricsFound(lyrics)
		except:
			traceback.print_exc()


	def onLyricsFound(self, lyrics):
		if not self.lyrics and lyrics:
			print "onLyricsFound"
			try:
				parsed = lyricsparser.parseLyrics(lyrics)
				if isinstance(parsed[0], LyricEntity):
					self.lyrics = parsed
					self.lyricsTimer = LyricsTimer(self.lyrics ,self.update)
					elapsed = self.player.getElapsed()
					#print "elapsed:", elapsed
					self.lyricsTimer.start(elapsed)
					self.label.set_text(self.lyrics[self.lyricsTimer.actualLine].text[0].strip())
					self.lyricsEngine.stop()
			except:
				traceback.print_exc()

	def update(self, lyricsLine):
		lyricLine = self.lyrics[lyricsLine].text[0].strip()
		if lyricLine:
			self.label.set_text(self.lyrics[lyricsLine].text[0].strip())

	def onEngineFinish(self):
		print "onEngineFinish"

	def getLyricsFromDisk(self, songInfo):
		logger.debug("searching lyrics on disk")
		# check for .lrc file in song file directory
		lrc_file = None
		if songInfo.has_key('file'):
			lrc_file = songInfo['file'].rstrip("mp3")+"lrc" #TODO: not only mp3 expecting
		if lrc_file == None or not os.path.exists(lrc_file):
			lrc_path = lyricsFile(songInfo)
			lrc_file = os.path.join(self.lyrics_directory, lrc_path['folder'], lrc_path['file'])
			logger.debug("lyrics should be here: %s" % lrc_file)
			
		print lrc_file
		if lrc_file != None and os.path.exists(lrc_file):
			f = open(lrc_file, 'r')
			print "lyrics from file: %s" % lrc_file
			lrc = f.read()
			f.close()
			return lrc
		print "Nothing on disk"
		return None

	def show_about(self, *args):
		print args
		pass

	def show_preferences(self, *args):
		dialog = OptionsDialog(self)
		response = dialog.run()
		if response == gtk.RESPONSE_OK:
			dialog.save_preferences()
		dialog.destroy()