Source

lyrcl-rhythmbox / LyricsParse.py

# -*- Mode: python; coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*-
#
# Copyright (C) 2011 Rhys Adams
# Based on code Copyright (C) 2006 Jonathan Matthew
#               Copyright (C) 2007 James Livingston
#
# 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 3, 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 urllib
import rb

class Parser(object):
    def __init__(self, artist, title, entry):
        self.title = title
        self.artist = artist
        self.entry = entry

    def make_request(self, callback, *data):
        artist = urllib.quote(self.artist, safe='')
        title = urllib.quote(self.title, safe='')

        htstring = 'http://www.lyrcl.org/api?song=%s&artist=%s' % (title, artist)
            
        loader = rb.Loader()
        loader.get_url(htstring, self.got_lyrics, callback, *data)

    def got_lyrics(self, result, callback, *data):
        if not result:
            print 'no result from from lyrcl.org'
            callback((None, self.entry), *data)
            return

        try:
            lyrics = result.split('<![CDATA[', 1)[1].split(']]>', 1)[0]
        except IndexError:
            print 'unable to extract lyrics from xml from lyrcl.org'
            callback((None, self.entry), *data)
        else:
            print 'got lyrics for song from lyrcl.org'
            callback((lyrics, self.entry), *data)

    def searcher(self, plexer, callback, *data):
        plexer.clear()
        print 'searching lyrcl.org for lyrics'

        self.make_request(plexer.send())
        yield None

        _, (lyrics,) = plexer.receive()
        callback (lyrics, *data)

    def get_lyrics(self, callback, *data):
        rb.Coroutine(self.searcher, callback, *data).begin()