[rhythmbox] lyrics: use streaming title information if available (bug #586598)
- From: Jonathan Matthew <jmatthew src gnome org>
- To: svn-commits-list gnome org
- Subject: [rhythmbox] lyrics: use streaming title information if available (bug #586598)
- Date: Tue, 21 Jul 2009 13:42:06 +0000 (UTC)
commit c63b6663f56ff905238d1a4d73cb3cf76ea948e2
Author: Piotr Janas <piotr janas t99 pl>
Date: Tue Jul 21 23:34:32 2009 +1000
lyrics: use streaming title information if available (bug #586598)
With this, we make a fair attempt at getting lyrics for songs played in
radio streams.
plugins/lyrics/lyrics/__init__.py | 83 +++++++++++++++++++++----------------
1 files changed, 47 insertions(+), 36 deletions(-)
---
diff --git a/plugins/lyrics/lyrics/__init__.py b/plugins/lyrics/lyrics/__init__.py
index a1645b4..d4a31e6 100644
--- a/plugins/lyrics/lyrics/__init__.py
+++ b/plugins/lyrics/lyrics/__init__.py
@@ -50,6 +50,7 @@ ui_str = """
LYRIC_TITLE_STRIP=["\(live[^\)]*\)", "\(acoustic[^\)]*\)", "\([^\)]*mix\)", "\([^\)]*version\)", "\([^\)]*edit\)", "\(feat[^\)]*\)"]
LYRIC_TITLE_REPLACE=[("/", "-"), (" & ", " and ")]
LYRIC_ARTIST_REPLACE=[("/", "-"), (" & ", " and ")]
+STREAM_SONG_TITLE='rb:stream-song-title'
gconf_keys = { 'engines' : '/apps/rhythmbox/plugins/lyrics/engines',
'folder': '/apps/rhythmbox/plugins/lyrics/folder'
@@ -73,7 +74,8 @@ def create_lyrics_view():
return (vbox, tview.get_buffer(), tview)
-def parse_song_data(artist, title):
+def parse_song_data(db, entry):
+ (artist, title) = get_artist_and_title(db, entry)
# don't search for 'unknown' when we don't have the artist or title information
if artist == _("Unknown"):
@@ -100,6 +102,30 @@ def parse_song_data(artist, title):
artist = artist.strip()
return (artist, title)
+
+def get_artist_and_title(db, entry):
+ stream_song_title = db.entry_request_extra_metadata(entry, STREAM_SONG_TITLE)
+ if stream_song_title is not None:
+ (artist, title) = extract_artist_and_title(stream_song_title)
+ else:
+ artist = db.entry_get(entry, rhythmdb.PROP_ARTIST)
+ title = db.entry_get(entry, rhythmdb.PROP_TITLE)
+ return (artist, title)
+
+def extract_artist_and_title(stream_song_title):
+ details = stream_song_title.split('-')
+ if len(details) > 1:
+ artist = details[0].strip()
+ title = details[1].strip()
+ else:
+ details = stream_song_title.split('(')
+ if len(details) > 1:
+ title = details[0].strip()
+ artist = details[1].strip(') ')
+ else:
+ title = stream_song_title
+ artist = ""
+ return (artist, title)
def build_cache_path(artist, title):
folder = gconf.client_get_default().get_string(gconf_keys['folder'])
@@ -121,10 +147,7 @@ class LyricGrabber(object):
self.db = db
self.entry = entry
- self.artist = self.db.entry_get(self.entry, rhythmdb.PROP_ARTIST)
- self.title = self.db.entry_get(self.entry, rhythmdb.PROP_TITLE)
-
- (self.artist, self.title) = parse_song_data(self.artist, self.title)
+ (self.artist, self.title) = parse_song_data(self.db, self.entry)
self.cache_path = build_cache_path(self.artist, self.title)
@@ -234,10 +257,7 @@ class LyricPane(object):
#self.get_lyrics()
def build_path(self):
-
- artist = self.db.entry_get(self.entry, rhythmdb.PROP_ARTIST)
- title = self.db.entry_get(self.entry, rhythmdb.PROP_TITLE)
- (artist, title) = parse_song_data(artist, title)
+ (artist, title) = parse_song_data(self.db, self.entry)
cache_path = build_cache_path(artist, title)
self.cache_path = cache_path
@@ -269,7 +289,7 @@ class LyricPane(object):
self.buffer.set_text(_("Searching for lyrics..."));
lyrics_grabber = LyricGrabber(self.db, self.entry)
lyrics_grabber.search_lyrics(self.__got_lyrics)
-
+
class LyricWindow (gtk.Window):
@@ -316,8 +336,8 @@ class LyricsDisplayPlugin(rb.Plugin):
uim.ensure_update ()
sp = shell.get_player ()
+ self.ppc_id = sp.connect('playing-song-property-changed', self.playing_property_changed)
self.pec_id = sp.connect('playing-song-changed', self.playing_entry_changed)
- self.current_entry = None
self.playing_entry_changed (sp, sp.get_playing_entry ())
self.csi_id = shell.connect('create_song_info', self.create_song_info)
@@ -332,6 +352,7 @@ class LyricsDisplayPlugin(rb.Plugin):
self.action = None
sp = shell.get_player ()
+ sp.disconnect (self.ppc_id)
sp.disconnect (self.pec_id)
shell.disconnect (self.csi_id)
@@ -345,6 +366,11 @@ class LyricsDisplayPlugin(rb.Plugin):
dialog = LyricsConfigureDialog (builder_file, gconf_keys).get_dialog()
dialog.present()
return dialog
+
+ def playing_property_changed(self, player, uri, prop, old_val, new_val):
+ if (prop == STREAM_SONG_TITLE):
+ self.update_song_lyrics(player.get_playing_entry())
+
def playing_entry_changed (self, sp, entry):
if entry is not None:
@@ -359,20 +385,12 @@ class LyricsDisplayPlugin(rb.Plugin):
self.window.buffer.set_text (text)
def update_song_lyrics(self, entry):
- if entry == self.current_entry:
- return
-
- db = self.shell.get_property ("db")
-
- if self.window is None:
- return
-
- title = db.entry_get(entry, rhythmdb.PROP_TITLE)
- artist = db.entry_get(entry, rhythmdb.PROP_ARTIST)
-
- self.window.s_title(title, artist)
- lyrics_grabber = LyricGrabber(db, entry)
- lyrics_grabber.search_lyrics(self.__got_lyrics)
+ if self.window is not None:
+ db = self.shell.get_property ("db")
+ (artist, title) = get_artist_and_title(db, entry)
+ self.window.s_title(title, artist)
+ lyrics_grabber = LyricGrabber(db, entry)
+ lyrics_grabber.search_lyrics(self.__got_lyrics)
def show_song_lyrics (self, action, shell):
@@ -384,17 +402,10 @@ class LyricsDisplayPlugin(rb.Plugin):
sp = shell.get_player ()
entry = sp.get_playing_entry ()
- if entry is None:
- return
-
- title = db.entry_get(entry, rhythmdb.PROP_TITLE)
- artist = db.entry_get(entry, rhythmdb.PROP_ARTIST)
-
- self.window = LyricWindow()
- self.window.s_title(title, artist)
- self.window.connect("destroy", self.window_deleted)
- lyrics_grabber = LyricGrabber(db, entry)
- lyrics_grabber.search_lyrics(self.__got_lyrics)
+ if entry is not None:
+ self.window = LyricWindow()
+ self.window.connect("destroy", self.window_deleted)
+ self.update_song_lyrics( entry )
def window_deleted (self, window):
print "lyrics window destroyed"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]