~ubuntu-branches/ubuntu/karmic/quodlibet/karmic

« back to all changes in this revision

Viewing changes to quodlibet/qltk/lyrics.py

  • Committer: Bazaar Package Importer
  • Author(s): Luca Falavigna
  • Date: 2009-01-30 23:55:34 UTC
  • mfrom: (1.1.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20090130235534-l4e72ulw0vqfo17w
Tags: 2.0-1ubuntu1
* Merge from Debian experimental (LP: #276856), remaining Ubuntu changes:
  + debian/patches/40-use-music-profile.patch:
    - Use the "Music and Movies" pipeline per default.
* Refresh the above patch for new upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2005 Eduardo Gonzalez, Joe Wreschnig
 
2
#
 
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
 
6
#
 
7
# $Id: lyrics.py 4330 2008-09-14 03:19:26Z piman $
 
8
 
 
9
# FIXME:
 
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.
 
13
 
 
14
import os
 
15
import threading
 
16
import urllib
 
17
 
 
18
import gobject
 
19
import gtk
 
20
 
 
21
from quodlibet import const
 
22
from quodlibet import qltk
 
23
from quodlibet import util
 
24
 
 
25
class LyricsPane(gtk.VBox):
 
26
    def __init__(self, song):
 
27
        super(LyricsPane, self).__init__(spacing=12)
 
28
        self.set_border_width(12)
 
29
        view = gtk.TextView()
 
30
        sw = gtk.ScrolledWindow()
 
31
        sw.add(view)
 
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)
 
38
 
 
39
        lyricname = song.lyric_filename
 
40
        buffer = view.get_buffer()
 
41
 
 
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)
 
46
 
 
47
        sw.set_shadow_type(gtk.SHADOW_IN)
 
48
        self.pack_start(sw, expand=True)
 
49
 
 
50
        self.pack_start(gtk.Label(_("Lyrics provided by %s.") %(
 
51
            "http://lyricwiki.org")), expand=False)
 
52
 
 
53
        bbox = gtk.HButtonBox()
 
54
        bbox.pack_start(save)
 
55
        bbox.pack_start(delete)
 
56
        bbox.pack_start(refresh)
 
57
        bbox.pack_start(add)
 
58
        self.pack_start(bbox, expand=False)
 
59
 
 
60
        save.set_sensitive(False)
 
61
        add.set_sensitive(True)
 
62
        
 
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)
 
69
 
 
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')
 
74
 
 
75
        util.website("http://lyricwiki.org/%s" % (urllib.quote(artist)))
 
76
 
 
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)
 
83
        thread.start()
 
84
        
 
85
    def __search(self, song, buffer, refresh, add):
 
86
        artist = song.comma("artist")
 
87
        title = song.comma("title")
 
88
        
 
89
        try:
 
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'))))        
 
95
            text = sock.read()
 
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)
 
100
            return
 
101
 
 
102
        sock.close()
 
103
 
 
104
        if text == 'Not found':
 
105
            gobject.idle_add(
 
106
                buffer.set_text, _("No lyrics found for this song."))
 
107
            return
 
108
        else:
 
109
            gobject.idle_add(buffer.set_text, text)
 
110
            gobject.idle_add(refresh.set_sensitive, True)
 
111
 
 
112
    def __save(self, save, lyricname, buffer, delete):
 
113
        try: os.makedirs(os.path.dirname(lyricname))
 
114
        except EnvironmentError, err: pass
 
115
 
 
116
        try: f = file(lyricname, "w")
 
117
        except EnvironmentError, err:
 
118
            print_w(err.strerror.decode(const.ENCODING, "replace"))
 
119
        else:
 
120
            start, end = buffer.get_bounds()
 
121
            f.write(buffer.get_text(start, end))
 
122
            f.close()
 
123
        delete.set_sensitive(True)
 
124
        save.set_sensitive(False)
 
125
 
 
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)