1
# Copyright 2005 Eduardo Gonzalez, Joe Wreschnig
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License version 2 as
5
# published by the Free Software Foundation
7
# $Id: lyrics.py 4330 2008-09-14 03:19:26Z piman $
10
# - Too many buttons -- saving should be automatic?
11
# - Make purpose of 'Add' button clearer.
12
# - Indicate when the match was fuzzy in the buffer text.
21
from quodlibet import const
22
from quodlibet import qltk
23
from quodlibet import util
25
class LyricsPane(gtk.VBox):
26
def __init__(self, song):
27
super(LyricsPane, self).__init__(spacing=12)
28
self.set_border_width(12)
30
sw = gtk.ScrolledWindow()
32
refresh = qltk.Button(_("_Download"), gtk.STOCK_CONNECT)
33
save = gtk.Button(stock=gtk.STOCK_SAVE)
34
delete = gtk.Button(stock=gtk.STOCK_DELETE)
35
add = gtk.Button(stock=gtk.STOCK_EDIT)
36
view.set_wrap_mode(gtk.WRAP_WORD)
37
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
39
lyricname = song.lyric_filename
40
buffer = view.get_buffer()
42
refresh.connect('clicked', self.__refresh, add, buffer, song)
43
save.connect('clicked', self.__save, lyricname, buffer, delete)
44
delete.connect('clicked', self.__delete, lyricname, save)
45
add.connect('clicked', self.__add, song)
47
sw.set_shadow_type(gtk.SHADOW_IN)
48
self.pack_start(sw, expand=True)
50
self.pack_start(gtk.Label(_("Lyrics provided by %s.") %(
51
"http://lyricwiki.org")), expand=False)
53
bbox = gtk.HButtonBox()
55
bbox.pack_start(delete)
56
bbox.pack_start(refresh)
58
self.pack_start(bbox, expand=False)
60
save.set_sensitive(False)
61
add.set_sensitive(True)
63
if os.path.exists(lyricname): buffer.set_text(file(lyricname).read())
64
else: buffer.set_text(_("No lyrics found.\n\nYou can click the "
65
"Download button to have Quod Libet search "
66
"for lyrics online. You can also enter them "
67
"yourself and click save."))
68
buffer.connect_object('changed', save.set_sensitive, True)
70
def __add(self, add, song):
71
artist = song.comma('artist').encode('utf-8')
72
title = song.comma('title').encode('utf-8')
73
album = song.comma('album').encode('utf-8')
75
util.website("http://lyricwiki.org/%s" % (urllib.quote(artist)))
77
def __refresh(self, refresh, add, buffer, song):
78
buffer.set_text(_("Searching for lyrics..."))
79
refresh.set_sensitive(False)
80
thread = threading.Thread(
81
target=self.__search, args=(song, buffer, refresh, add))
82
thread.setDaemon(True)
85
def __search(self, song, buffer, refresh, add):
86
artist = song.comma("artist")
87
title = song.comma("title")
90
sock = urllib.urlopen(
91
"http://lyricwiki.org/api.php?"
92
"client=QuodLibet&func=getSong&artist=%s&song=%s&fmt=text"%(
93
urllib.quote(artist.encode('utf-8')),
94
urllib.quote(title.encode('utf-8'))))
96
except Exception, err:
97
try: err = err.strerror.decode(const.ENCODING, 'replace')
98
except: err = _("Unable to download lyrics.")
99
gobject.idle_add(buffer.set_text, err)
104
if text == 'Not found':
106
buffer.set_text, _("No lyrics found for this song."))
109
gobject.idle_add(buffer.set_text, text)
110
gobject.idle_add(refresh.set_sensitive, True)
112
def __save(self, save, lyricname, buffer, delete):
113
try: os.makedirs(os.path.dirname(lyricname))
114
except EnvironmentError, err: pass
116
try: f = file(lyricname, "w")
117
except EnvironmentError, err:
118
print_w(err.strerror.decode(const.ENCODING, "replace"))
120
start, end = buffer.get_bounds()
121
f.write(buffer.get_text(start, end))
123
delete.set_sensitive(True)
124
save.set_sensitive(False)
126
def __delete(self, delete, lyricname, save):
127
try: os.unlink(lyricname)
128
except EnvironmentError: pass
129
lyricname = os.path.dirname(lyricname)
130
try: os.rmdir(lyricname)
131
except EnvironmentError: pass
132
delete.set_sensitive(False)
133
save.set_sensitive(True)