5 from urllib
import urlopen, quote_plus
7 from urllib.request
import urlopen
8 from urllib.parse
import quote_plus
11 from optparse
import OptionParser
12 from common
import utilities
14 __author__ =
"Paul Harrison and ronie'"
15 __title__ =
"LyricsMode"
16 __description__ =
"Search http://www.lyricsmode.com for lyrics"
19 __syncronized__ =
False
28 self.
search_results_regex = re.compile(
"<a href=\"[^\"]+\">([^<]+)</a></td>[^<]+<td><a href=\"([^\"]+)\" class=\"b\">[^<]+</a></td>", re.IGNORECASE)
29 self.
next_results_regex = re.compile(
"<A href=\"([^\"]+)\" class=\"pages\">next .</A>", re.IGNORECASE)
32 utilities.log(debug,
"%s: searching lyrics for %s - %s - %s" % (__title__, lyrics.artist, lyrics.album, lyrics.title))
34 artist = utilities.deAccent(lyrics.artist)
35 title = utilities.deAccent(lyrics.title)
37 url =
"http://www.lyricsmode.com/lyrics/%s/%s/%s.html" % (artist.lower()[:1], artist.lower().replace(
"&",
"and").replace(
" ",
"_"), title.lower().replace(
"&",
"and").replace(
" ",
"_"))
40 utilities.log(debug,
"%s: search url: %s" % (__title__, url))
41 song_search = urlopen(url).
read()
42 if song_search.find(
"<p id=\"lyrics_text\" class=\"ui-annotatable\">") >= 0:
51 if not 'search' in url:
52 url =
"http://www.lyricsmode.com/search.php?what=songs&s=" + quote_plus(title.lower())
56 start = song_search.find(
'<!--output-->')
57 end = song_search.find(
'<!--/output-->', start)
60 for result
in results:
61 if result[0].lower()
in artist.lower():
62 url =
"http://www.lyricsmode.com" + result[1]
70 url =
"http://www.lyricsmode.com/search.php" + match.group(1)
74 lyr = song_search.split(
"<p id=\"lyrics_text\" class=\"ui-annotatable\">")[1].split(
'</p><p id=\"lyrics_text_selected\">')[0]
79 for line
in lyr.splitlines():
81 if line.find(
"Lyrics from:") < 0:
83 lyr =
u"\n".join( lir )
84 if lyr.startswith(
'These lyrics are missing'):
89 utilities.log(
True,
"%s: %s::%s (%d) [%s]" % (
90 __title__, self.__class__.__name__,
91 sys.exc_info()[ 2 ].tb_frame.f_code.co_name,
92 sys.exc_info()[ 2 ].tb_lineno,
99 lyrics = utilities.Lyrics()
100 lyrics.source = __title__
101 lyrics.syncronized = __syncronized__
102 lyrics.artist =
'Dire Straits'
103 lyrics.album =
'Brothers In Arms'
104 lyrics.title =
'Money For Nothing'
107 found = fetcher.get_lyrics(lyrics)
110 utilities.log(
True,
"Everything appears in order.")
114 utilities.log(
True,
"The lyrics for the test search failed!")
118 from lxml
import etree
119 xml = etree.XML(
u'<lyrics></lyrics>')
120 etree.SubElement(xml,
"artist").text = lyrics.artist
121 etree.SubElement(xml,
"album").text = lyrics.album
122 etree.SubElement(xml,
"title").text = lyrics.title
123 etree.SubElement(xml,
"syncronized").text =
'True' if __syncronized__
else 'False'
124 etree.SubElement(xml,
"grabber").text = lyrics.source
126 lines = lyrics.lyrics.splitlines()
128 etree.SubElement(xml,
"lyric").text = line
130 utilities.log(
True, utilities.convert_etree(etree.tostring(xml, encoding=
'UTF-8',
131 pretty_print=
True, xml_declaration=
True)))
135 from lxml
import etree
136 version = etree.XML(
u'<grabber></grabber>')
137 etree.SubElement(version,
"name").text = __title__
138 etree.SubElement(version,
"author").text = __author__
139 etree.SubElement(version,
"command").text =
'lyricsmode.py'
140 etree.SubElement(version,
"type").text =
'lyrics'
141 etree.SubElement(version,
"description").text = __description__
142 etree.SubElement(version,
"version").text = __version__
143 etree.SubElement(version,
"priority").text = __priority__
144 etree.SubElement(version,
"syncronized").text =
'True' if __syncronized__
else 'False'
146 utilities.log(
True, utilities.convert_etree(etree.tostring(version, encoding=
'UTF-8',
147 pretty_print=
True, xml_declaration=
True)))
153 parser = OptionParser()
155 parser.add_option(
'-v',
"--version", action=
"store_true", default=
False,
156 dest=
"version", help=
"Display version and author")
157 parser.add_option(
'-t',
"--test", action=
"store_true", default=
False,
158 dest=
"test", help=
"Test grabber with a know good search")
159 parser.add_option(
'-s',
"--search", action=
"store_true", default=
False,
160 dest=
"search", help=
"Search for lyrics.")
161 parser.add_option(
'-a',
"--artist", metavar=
"ARTIST", default=
None,
162 dest=
"artist", help=
"Artist of track.")
163 parser.add_option(
'-b',
"--album", metavar=
"ALBUM", default=
None,
164 dest=
"album", help=
"Album of track.")
165 parser.add_option(
'-n',
"--title", metavar=
"TITLE", default=
None,
166 dest=
"title", help=
"Title of track.")
167 parser.add_option(
'-f',
"--filename", metavar=
"FILENAME", default=
None,
168 dest=
"filename", help=
"Filename of track.")
169 parser.add_option(
'-d',
'--debug', action=
"store_true", default=
False,
170 dest=
"debug", help=(
"Show debug messages"))
172 opts, args = parser.parse_args()
174 lyrics = utilities.Lyrics()
175 lyrics.source = __title__
176 lyrics.syncronized = __syncronized__
188 lyrics.artist = opts.artist
190 lyrics.album = opts.album
192 lyrics.title = opts.title
194 lyrics.filename = opts.filename
197 if fetcher.get_lyrics(lyrics):
201 utilities.log(
True,
"No lyrics found for this track")
205 if __name__ ==
'__main__':