6 from urllib2
import quote, urlopen, HTTPError
8 from urllib.request
import urlopen, HTTPError
9 from urllib.parse
import quote
12 import HTMLParser
as html_parser
14 from html
import parser
as html_parser
16 from optparse
import OptionParser
18 if sys.version_info < (2, 7):
21 import json
as simplejson
25 __author__ =
"Paul Harrison and ronie'"
26 __title__ =
"LyricsWiki"
27 __description__ =
"Search http://lyrics.wikia.com for lyrics"
30 __syncronized__ =
False
33 LIC_TXT =
'we are not licensed to display the full lyrics for this song at the moment'
37 socket.setdefaulttimeout(10)
41 self.
url =
'http://lyrics.wikia.com/api.php?func=getSong&artist=%s&song=%s&fmt=realjson'
44 utilities.log(debug,
"%s: searching lyrics for %s - %s - %s" % (__title__, lyrics.artist, lyrics.album, lyrics.title))
47 req = urlopen(self.
url % (quote(lyrics.artist), quote(lyrics.title)))
48 response = req.read().
decode(
'utf-8')
52 data = simplejson.loads(response)
57 if not self.
page.endswith(
'action=edit'):
58 utilities.log(debug,
"%s: search url: %s" % (__title__, self.
page))
60 req = urlopen(self.
page)
61 response = req.read().
decode(
'utf-8')
62 except HTTPError
as error:
64 response = error.read().
decode(
'utf-8')
68 matchcode = re.search(
"lyricbox'>.*?(&#.*?)<div", response)
70 lyricscode = (matchcode.group(1))
71 htmlparser = html_parser.HTMLParser()
72 lyricstext = htmlparser.unescape(lyricscode).replace(
'<br />',
'\n')
73 lyr = re.sub(
'<[^<]+?>',
'', lyricstext)
85 lyrics = utilities.Lyrics()
86 lyrics.source = __title__
87 lyrics.syncronized = __syncronized__
88 lyrics.artist =
'Dire Straits'
89 lyrics.album =
'Brothers In Arms'
90 lyrics.title =
'Money For Nothing'
93 found = fetcher.get_lyrics(lyrics)
96 utilities.log(
True,
"Everything appears in order.")
100 utilities.log(
True,
"The lyrics for the test search failed!")
104 from lxml
import etree
105 xml = etree.XML(
u'<lyrics></lyrics>')
106 etree.SubElement(xml,
"artist").text = lyrics.artist
107 etree.SubElement(xml,
"album").text = lyrics.album
108 etree.SubElement(xml,
"title").text = lyrics.title
109 etree.SubElement(xml,
"syncronized").text =
'True' if __syncronized__
else 'False'
110 etree.SubElement(xml,
"grabber").text = lyrics.source
112 lines = lyrics.lyrics.splitlines()
114 etree.SubElement(xml,
"lyric").text = line
116 utilities.log(
True, utilities.convert_etree(etree.tostring(xml, encoding=
'UTF-8',
117 pretty_print=
True, xml_declaration=
True)))
121 from lxml
import etree
122 version = etree.XML(
u'<grabber></grabber>')
123 etree.SubElement(version,
"name").text = __title__
124 etree.SubElement(version,
"author").text = __author__
125 etree.SubElement(version,
"command").text =
'lyricswiki.py'
126 etree.SubElement(version,
"type").text =
'lyrics'
127 etree.SubElement(version,
"description").text = __description__
128 etree.SubElement(version,
"version").text = __version__
129 etree.SubElement(version,
"priority").text = __priority__
130 etree.SubElement(version,
"syncronized").text =
'True' if __syncronized__
else 'False'
132 utilities.log(
True, utilities.convert_etree(etree.tostring(version, encoding=
'UTF-8',
133 pretty_print=
True, xml_declaration=
True)))
139 parser = OptionParser()
141 parser.add_option(
'-v',
"--version", action=
"store_true", default=
False,
142 dest=
"version", help=
"Display version and author")
143 parser.add_option(
'-t',
"--test", action=
"store_true", default=
False,
144 dest=
"test", help=
"Test grabber with a know good search")
145 parser.add_option(
'-s',
"--search", action=
"store_true", default=
False,
146 dest=
"search", help=
"Search for lyrics.")
147 parser.add_option(
'-a',
"--artist", metavar=
"ARTIST", default=
None,
148 dest=
"artist", help=
"Artist of track.")
149 parser.add_option(
'-b',
"--album", metavar=
"ALBUM", default=
None,
150 dest=
"album", help=
"Album of track.")
151 parser.add_option(
'-n',
"--title", metavar=
"TITLE", default=
None,
152 dest=
"title", help=
"Title of track.")
153 parser.add_option(
'-f',
"--filename", metavar=
"FILENAME", default=
None,
154 dest=
"filename", help=
"Filename of track.")
155 parser.add_option(
'-d',
'--debug', action=
"store_true", default=
False,
156 dest=
"debug", help=(
"Show debug messages"))
158 opts, args = parser.parse_args()
160 lyrics = utilities.Lyrics()
161 lyrics.source = __title__
162 lyrics.syncronized = __syncronized__
174 lyrics.artist = opts.artist
176 lyrics.album = opts.album
178 lyrics.title = opts.title
180 lyrics.filename = opts.filename
183 if fetcher.get_lyrics(lyrics):
187 utilities.log(
True,
"No lyrics found for this track")
191 if __name__ ==
'__main__':