[rhythmbox] lyrics: add parsers for jetlyrics.com and j-lyric.net



commit 14b9e2312cb6f92bce7d01c0510717af785615b2
Author: hejian <hejian he gmail com>
Date:   Sun Oct 21 18:43:57 2012 +1000

    lyrics: add parsers for jetlyrics.com and j-lyric.net
    
    https://bugzilla.gnome.org/show_bug.cgi?id=674178

 plugins/lyrics/JetlyricsParser.py |   75 +++++++++++++++++++++++++++++++++++++
 plugins/lyrics/JlyricParser.py    |   69 ++++++++++++++++++++++++++++++++++
 plugins/lyrics/LyricsSites.py     |    4 ++
 plugins/lyrics/Makefile.am        |    4 +-
 4 files changed, 151 insertions(+), 1 deletions(-)
---
diff --git a/plugins/lyrics/JetlyricsParser.py b/plugins/lyrics/JetlyricsParser.py
new file mode 100644
index 0000000..95864c9
--- /dev/null
+++ b/plugins/lyrics/JetlyricsParser.py
@@ -0,0 +1,75 @@
+# -*- Mode: python; coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*-
+#
+# Copyright (C) 2012 He Jian <hejian he gmail com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# The Rhythmbox authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and Rhythmbox. This permission is above and beyond the permissions granted
+# by the GPL license by which Rhythmbox is covered. If you modify this code
+# you may extend this exception to your version of the code, but you are not
+# obligated to do so. If you do not wish to do so, delete this exception
+# statement from your version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
+
+import rb
+import urllib
+import re
+
+class JetlyricsParser (object):
+  def __init__ (self, artist, title):
+    self.artist = artist
+    self.title = title
+
+  def search (self, callback, *data):
+    artist = re.sub('%20', '+', urllib.quote(self.artist))
+    title = re.sub('%20', '+', urllib.quote(self.title))
+    q = title + ' - ' + artist
+    url = 'http://www.jetlyrics.com/search.php?q=%s' % (q)
+    loader = rb.Loader()
+    loader.get_url (url, self.got_results, callback, *data)
+
+  def got_results (self, result, callback, *data):
+    if result is None:
+      callback (None, *data)
+      return
+
+    m = re.search('<a href=\'(http://jetlyrics\.com/viewlyrics\.php\?id=[0-9]*)\'>', result)
+    if m is None:
+      callback (None, *data)
+      return
+
+    loader = rb.Loader()
+    loader.get_url (m.group(1), self.parse_lyrics, callback, *data)
+    
+  def parse_lyrics (self, result, callback, *data):
+    if result is None:
+      callback (None, *data)
+      return
+
+    lyrics = re.split ('<div id=lyricsText>', result)[1]
+    lyrics = re.split ('</div>', lyrics)[0]
+
+    lyrics = re.sub('<br/>', '\n', lyrics)
+    lyrics = re.sub('<br />', '\n', lyrics)
+    lyrics = re.sub('<br>', '\n', lyrics)
+    lyrics = re.sub('<noscript><a href=\'http://jetlyrics.com\'>Lyrics</a></noscript>', '', lyrics)
+    lyrics = re.sub('<a href=\'http://jetlyrics.com\'>Jet Lyrics</a>', '', lyrics)
+
+    lyrics = self.title + "\n\n" + lyrics
+    lyrics += "\n\nLyrics provided by jetlyrics.com"
+
+    callback (lyrics, *data)
+
diff --git a/plugins/lyrics/JlyricParser.py b/plugins/lyrics/JlyricParser.py
new file mode 100644
index 0000000..56f237f
--- /dev/null
+++ b/plugins/lyrics/JlyricParser.py
@@ -0,0 +1,69 @@
+# -*- Mode: python; coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*-
+#
+# Copyright (C) 2012 He Jian <hejian he gmail com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# The Rhythmbox authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and Rhythmbox. This permission is above and beyond the permissions granted
+# by the GPL license by which Rhythmbox is covered. If you modify this code
+# you may extend this exception to your version of the code, but you are not
+# obligated to do so. If you do not wish to do so, delete this exception
+# statement from your version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
+
+import rb
+import urllib
+import re
+
+class JlyricParser (object):
+  def __init__ (self, artist, title):
+    self.artist = artist
+    self.title = title
+
+  def search (self, callback, *data):
+    artist = re.sub('%20', '+', urllib.quote(self.artist))
+    title = re.sub('%20', '+', urllib.quote(self.title))
+    url = 'http://j-lyric.net/index.php?kt=%s&ka=%s' % (title, artist)
+    loader = rb.Loader()
+    loader.get_url (url, self.got_results, callback, *data)
+
+  def got_results (self, result, callback, *data):
+    if result is None:
+      callback (None, *data)
+      return
+
+    m = re.search('<div class=\'title\'><a href=\'(/artist/[^\.]*\.html)\'>', result)
+    if m is None:
+      callback (None, *data)
+      return
+
+    loader = rb.Loader()
+    loader.get_url ('http://j-lyric.net' + m.group(1), self.parse_lyrics, callback, *data)
+    
+  def parse_lyrics (self, result, callback, *data):
+    if result is None:
+      callback (None, *data)
+      return
+
+    lyrics = re.split ('<p id=\'lyricBody\'>', result)[1]
+    lyrics = re.split ('</p>', lyrics)[0]
+
+    lyrics = re.sub('<br />', '', lyrics)
+    lyrics = self.title + "\n\n" + lyrics
+    lyrics += "\n\nLyrics provided by j-lyric.net"
+
+    callback (lyrics, *data)
+
diff --git a/plugins/lyrics/LyricsSites.py b/plugins/lyrics/LyricsSites.py
index 2edafe6..cf03b5f 100644
--- a/plugins/lyrics/LyricsSites.py
+++ b/plugins/lyrics/LyricsSites.py
@@ -29,6 +29,8 @@
 from WinampcnParser import WinampcnParser
 from TerraParser import TerraParser
 from DarkLyricsParser import DarkLyricsParser
+from JlyricParser import JlyricParser
+from JetlyricsParser import JetlyricsParser
 
 from gi.repository import RB
 
@@ -40,5 +42,7 @@ lyrics_sites = [
 	{ 'id': 'winampcn.com', 	'class': WinampcnParser, 	'name': _("WinampCN (www.winampcn.com)") 	},
 	{ 'id': 'terra.com.br',		'class': TerraParser,		'name': _("TerraBrasil (terra.com.br)")		},
 	{ 'id': 'darklyrics.com',	'class': DarkLyricsParser,	'name': _("Dark Lyrics (darklyrics.com)")	}
+	{ 'id': 'j-lyric.net', 		'class': JlyricParser, 		'name': _("Jlyric (j-lyric.net)") 		},
+	{ 'id': 'jetlyrics.com', 	'class': JetlyricsParser, 	'name': _("Jetlyrics (jetlyrics.com)") 		}
 ]
 
diff --git a/plugins/lyrics/Makefile.am b/plugins/lyrics/Makefile.am
index defba41..5b81981 100644
--- a/plugins/lyrics/Makefile.am
+++ b/plugins/lyrics/Makefile.am
@@ -11,7 +11,9 @@ plugin_PYTHON =				\
        LyricWikiParser.py		\
        WinampcnParser.py		\
        TerraParser.py			\
-       DarkLyricsParser.py
+       DarkLyricsParser.py	\
+       JlyricParser.py	\
+       JetlyricsParser.py
 
 %.plugin: %.plugin.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache
 plugin_DATA = $(plugin_in_files:.plugin.in=.plugin)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]