104 lines
2.1 KiB
Python
104 lines
2.1 KiB
Python
# Bryan Schumaker (11/27/2010)
|
|
|
|
import ocarina
|
|
from ocarina import footer
|
|
from ocarina.components import image
|
|
from ocarina.components import label
|
|
import re
|
|
|
|
libsaria = ocarina.libsaria
|
|
from libsaria import web
|
|
from libsaria import xm
|
|
from libsaria import cache
|
|
|
|
__NAME__ = "Lyrics"
|
|
gtk = ocarina.gtk
|
|
|
|
lyrics = gtk.ScrolledWindow()
|
|
page = gtk.HBox(False, 5)
|
|
text = gtk.TextView()
|
|
buffer = text.get_buffer()
|
|
|
|
lyrics.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
|
|
|
page.pack_start(image.AlbumArt(), False, False)
|
|
|
|
text.set_editable(False)
|
|
lyrics.add(text)
|
|
page.pack_start(lyrics)
|
|
|
|
page.show_all()
|
|
|
|
url = "http://lyrics.wikia.com/api.php?"
|
|
|
|
def decode_line(line):
|
|
string = ""
|
|
for c in line.split(";"):
|
|
if len(c) == 0:
|
|
continue
|
|
try:
|
|
val = int(c[2:])
|
|
string += chr(val)
|
|
except:
|
|
pass
|
|
return string
|
|
|
|
def decode(file, code):
|
|
lines = []
|
|
for line in code:
|
|
lines.append(decode_line(line))
|
|
string = "\n".join(lines)
|
|
file.write(string)
|
|
|
|
def parse_full(file, lyrics):
|
|
req = web.Url(lyrics)
|
|
res = None
|
|
for line in req.open():
|
|
if re.match("<div class=\'lyricbox\'>(.*?)", line):
|
|
res = line
|
|
split = res.split("</div>")
|
|
code = split[len(split) - 1]
|
|
decode(file, code.split("<br />"))
|
|
|
|
def parse(file, res):
|
|
doc = xm.parse(res)
|
|
result = xm.child(doc)
|
|
url_node = xm.get_elements(result, "url")[0]
|
|
lyrics = xm.child(url_node).data
|
|
parse_full(file, lyrics)
|
|
|
|
def fetch_lyrics(file, artist, title):
|
|
req = web.Url(url)
|
|
req["artist"] = artist
|
|
req["song"] = title
|
|
req["fmt"] = "xml"
|
|
try:
|
|
parse(file, req.open())
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def set_lyrics(filepath):
|
|
artist, title = libsaria.sources.get_attrs("artist", "title")
|
|
cached = cache[artist]
|
|
file = cached.get("%s.txt" % title, fetch_lyrics, artist, title)
|
|
if file != None:
|
|
fin = open(file)
|
|
buffer.set_text(fin.read())
|
|
else:
|
|
buffer.set_text("")
|
|
|
|
def start():
|
|
footer.add_page("Lyrics", page)
|
|
libsaria.event.invite("POSTLOAD", set_lyrics, True)
|
|
|
|
def stop():
|
|
footer.remove_page("Lyrics")
|
|
|
|
def check_version():
|
|
if libsaria.__major__ != 4:
|
|
return False
|
|
if libsaria.__minor__ == 4:
|
|
return True
|
|
return False
|