fix a memory leak
[rhythmbox.git] / plugins / magnatune / magnatune / __init__.py
blob601d582244b59507d96c52dd8ff26d2df65a1f59
1 import rhythmdb, rb
2 import gobject
3 import gtk, gtk.glade
4 import gconf, gnomevfs, gnome
6 import urllib
7 import zipfile
8 import sys, os.path
9 import xml
10 import datetime
11 import string
13 from MagnatuneSource import MagnatuneSource
15 has_gnomekeyring = False
16 try:
17 import gnomekeyring
18 has_gnome_keyring = True
19 except:
20 pass
23 popup_ui = """
24 <ui>
25 <popup name="MagnatuneSourceViewPopup">
26 <menuitem name="AddToQueueLibraryPopup" action="AddToQueue"/>
27 <menuitem name="MagnatunePurchaseAlbum" action="MagnatunePurchaseAlbum"/>
28 <menuitem name="MagnatuneArtistInfo" action="MagnatuneArtistInfo"/>
29 <menuitem name="MagnatuneCancelDownload" action="MagnatuneCancelDownload"/>
30 <separator/>
31 <menuitem name="BrowseGenreLibraryPopup" action="BrowserSrcChooseGenre"/>
32 <menuitem name="BrowseArtistLibraryPopup" action="BrowserSrcChooseArtist"/>
33 <menuitem name="BrowseAlbumLibraryPopup" action="BrowserSrcChooseAlbum"/>
34 <separator/>
35 <menuitem name="PropertiesLibraryPopup" action="MusicProperties"/>
36 </popup>
37 </ui>
38 """
40 keyring_attributes = {"name": "rb-magnatune-cc-data"}
43 class Magnatune(rb.Plugin):
44 client = gconf.client_get_default()
46 format_list = ['ogg', 'flac', 'wav', 'mp3-vbr', 'mp3-cbr']
48 gconf_keys = {
49 'format': "/apps/rhythmbox/plugins/magnatune/format",
50 'pay': "/apps/rhythmbox/plugins/magnatune/pay",
51 'ccauthtoken': "/apps/rhythmbox/plugins/magnatune/ccauthtoken"
56 # Core methods
59 def __init__(self):
60 rb.Plugin.__init__(self)
62 def activate(self, shell):
63 self.shell = shell # so buy_track can update the progress bar
64 self.db = shell.get_property("db")
65 self.keyring = None
67 self.entry_type = self.db.entry_register_type("MagnatuneEntryType")
68 # allow changes which don't do anything
69 self.entry_type.can_sync_metadata = True
70 self.entry_type.sync_metadata = None
72 self.source = gobject.new (MagnatuneSource, shell=shell, entry_type=self.entry_type, plugin=self)
73 shell.register_entry_type_for_source(self.source, self.entry_type)
74 shell.append_source(self.source, None) # Add the source to the list
76 manager = shell.get_player().get_property('ui-manager')
77 # Add the popup menu actions
78 action = gtk.Action('MagnatunePurchaseAlbum', _('Purchase Album'),
79 _("Purchase this album from Magnatune"),
80 'gtk-save')
81 action.connect('activate', lambda a: self.shell.get_property("selected-source").purchase_tracks())
82 self.action_group = gtk.ActionGroup('MagnatunePluginActions')
83 self.action_group.add_action(action)
84 action = gtk.Action('MagnatuneArtistInfo', _('Artist Information'),
85 _("Get information about this artist"),
86 'gtk-info')
87 action.connect('activate', lambda a: self.shell.get_property("selected-source").display_artist_info())
88 self.action_group.add_action(action)
89 action = gtk.Action('MagnatuneCancelDownload', _('Cancel Downloads'),
90 _("Stop downloading purchased albums"),
91 'gtk-stop')
92 action.connect('activate', lambda a: self.shell.get_property("selected-source").cancel_downloads())
93 action.set_sensitive(False)
94 self.action_group.add_action(action)
96 manager.insert_action_group(self.action_group, 0)
97 self.ui_id = manager.add_ui_from_string(popup_ui)
98 manager.ensure_update()
100 def deactivate(self, shell):
101 manager = shell.get_player().get_property('ui-manager')
102 manager.remove_ui (self.ui_id)
103 manager.remove_action_group(self.action_group)
104 self.action_group = None
106 self.db.entry_delete_by_type(self.entry_type)
107 self.db.commit()
108 self.db = None
109 self.entry_type = None
110 self.source.delete_thyself()
111 self.source = None
112 self.shell = None
113 self.keyring = None
116 def get_keyring(self):
117 if self.keyring is None:
118 self.keyring = gnomekeyring.get_default_keyring_sync()
119 return self.keyring
121 def store_cc_details(self, *details):
122 if has_gnome_keyring:
123 print "storing CC details"
124 try:
125 id = gnomekeyring.item_create_sync(self.get_keyring(),
126 gnomekeyring.ITEM_GENERIC_SECRET,
127 "Magnatune credit card info", {"name": "rb-magnatune-cc-data"},
128 string.join (details, '\n'), True)
129 except Exception, e:
130 print e
132 def clear_cc_details(self):
133 if has_gnome_keyring:
134 print "clearing CC details"
135 try:
136 ids = gnomekeyring.find_items_sync (gnomekeyring.ITEM_GENERIC_SECRET, {"name": "rb-magnatune-cc-data"})
137 print "keyring ids " + str(ids)
138 gnomekeyring.item_delete_sync (self.get_keyring(), ids[0])
139 except Exception, e:
140 print e
142 def get_cc_details(self):
143 if has_gnome_keyring:
144 print "getting CC details"
145 try:
146 ids = gnomekeyring.find_items_sync (gnomekeyring.ITEM_GENERIC_SECRET, {"name": "rb-magnatune-cc-data"})
147 print "keyring ids " + str(ids)
148 data = gnomekeyring.item_get_info_sync(self.get_keyring(), ids[0]).get_secret()
149 return string.split(data, "\n")
150 except Exception, e:
151 print e
152 return ("", "", 0, "", "")
154 def create_configure_dialog(self, dialog=None):
155 keyring = gnomekeyring.get_default_keyring_sync()
156 if dialog == None:
157 def fill_cc_details():
158 try:
159 (ccnumber, ccyear, ccmonth, name, email) = self.get_cc_details()
160 gladexml.get_widget("cc_entry").set_text(ccnumber)
161 gladexml.get_widget("yy_entry").set_text(ccyear)
162 gladexml.get_widget("mm_entry").set_active(int(ccmonth)-1)
163 gladexml.get_widget("name_entry").set_text(name)
164 gladexml.get_widget("email_entry").set_text(email)
165 gladexml.get_widget("remember_cc_details").set_active(True)
166 except Exception, e:
167 print e
169 gladexml.get_widget("cc_entry").set_text("")
170 gladexml.get_widget("yy_entry").set_text("")
171 gladexml.get_widget("mm_entry").set_active(0)
172 gladexml.get_widget("name_entry").set_text("")
173 gladexml.get_widget("email_entry").set_text("")
174 gladexml.get_widget("remember_cc_details").set_active(False)
176 def update_expired():
177 mm = gladexml.get_widget("mm_entry").get_active() + 1
178 yy = 0
179 try:
180 yy = int(gladexml.get_widget("yy_entry").get_text())
181 except Exception, e:
182 print e
183 gladexml.get_widget("cc_expired_label").hide()
184 return
186 if yy < (datetime.date.today().year % 100):
187 gladexml.get_widget("cc_expired_label").show()
188 elif (yy == (datetime.date.today().year % 100) and mm < datetime.date.today().month):
189 gladexml.get_widget("cc_expired_label").show()
190 else:
191 gladexml.get_widget("cc_expired_label").hide()
193 def remember_checkbox_toggled (button):
194 print "remember CC details toggled " + str(button.get_active())
195 gladexml.get_widget("cc_entry").set_sensitive(button.get_active())
196 gladexml.get_widget("mm_entry").set_sensitive(button.get_active())
197 gladexml.get_widget("yy_entry").set_sensitive(button.get_active())
198 gladexml.get_widget("name_entry").set_sensitive(button.get_active())
199 gladexml.get_widget("email_entry").set_sensitive(button.get_active())
201 if not button.get_active():
202 try:
203 self.clear_cc_details ()
204 except Exception, e:
205 print e
206 # fill_cc_details()
209 self.configure_callback_dic = {
210 # "rb_magnatune_yy_entry_changed_cb" : lambda w: update_expired(),
211 # "rb_magnatune_mm_entry_changed_cb" : lambda w: update_expired(),
212 # "rb_magnatune_name_entry_changed_cb" : lambda w: None,
213 # "rb_magnatune_cc_entry_changed_cb" : lambda w: None,
214 # "rb_magnatune_email_entry_changed_cb" : lambda w: None,
215 "rb_magnatune_pay_combobox_changed_cb" : lambda w: self.client.set_int(self.gconf_keys['pay'], w.get_active() + 5),
216 "rb_magnatune_audio_combobox_changed_cb" : lambda w: self.client.set_string(self.gconf_keys['format'], self.format_list[w.get_active()]),
217 "rb_magnatune_remember_cc_details_toggled_cb" : remember_checkbox_toggled
220 gladexml = gtk.glade.XML(self.find_file("magnatune-prefs.glade"))
221 gladexml.signal_autoconnect(self.configure_callback_dic)
223 # FIXME this bit should be in glade too
224 dialog = gladexml.get_widget('preferences_dialog')
225 def dialog_response (dialog, response):
226 if gladexml.get_widget("remember_cc_details").get_active():
227 ccnumber = gladexml.get_widget("cc_entry").get_text()
228 ccyear = gladexml.get_widget("yy_entry").get_text()
229 ccmonth = str(gladexml.get_widget("mm_entry").get_active() + 1)
230 name = gladexml.get_widget("name_entry").get_text()
231 email = gladexml.get_widget("email_entry").get_text()
232 self.store_cc_details(ccnumber, ccyear, ccmonth, name, email)
233 dialog.hide()
234 dialog.connect("response", dialog_response)
236 gladexml.get_widget("remember_cc_details").set_sensitive(has_gnome_keyring)
237 gladexml.get_widget("pay_combobox").set_active(self.client.get_int(self.gconf_keys['pay']) - 5)
238 gladexml.get_widget("audio_combobox").set_active(self.format_list.index(self.client.get_string(self.gconf_keys['format'])))
239 fill_cc_details()
241 dialog.present()
242 return dialog