4 import gconf
, gnomevfs
, gnome
13 from MagnatuneSource
import MagnatuneSource
15 has_gnomekeyring
= False
18 has_gnome_keyring
= True
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"/>
31 <menuitem name="BrowseGenreLibraryPopup" action="BrowserSrcChooseGenre"/>
32 <menuitem name="BrowseArtistLibraryPopup" action="BrowserSrcChooseArtist"/>
33 <menuitem name="BrowseAlbumLibraryPopup" action="BrowserSrcChooseAlbum"/>
35 <menuitem name="PropertiesLibraryPopup" action="MusicProperties"/>
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']
49 'format': "/apps/rhythmbox/plugins/magnatune/format",
50 'pay': "/apps/rhythmbox/plugins/magnatune/pay",
51 'ccauthtoken': "/apps/rhythmbox/plugins/magnatune/ccauthtoken"
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")
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"),
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"),
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"),
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
)
109 self
.entry_type
= None
110 self
.source
.delete_thyself()
116 def get_keyring(self
):
117 if self
.keyring
is None:
118 self
.keyring
= gnomekeyring
.get_default_keyring_sync()
121 def store_cc_details(self
, *details
):
122 if has_gnome_keyring
:
123 print "storing CC details"
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)
132 def clear_cc_details(self
):
133 if has_gnome_keyring
:
134 print "clearing CC details"
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])
142 def get_cc_details(self
):
143 if has_gnome_keyring
:
144 print "getting CC details"
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")
152 return ("", "", 0, "", "")
154 def create_configure_dialog(self
, dialog
=None):
155 keyring
= gnomekeyring
.get_default_keyring_sync()
157 def fill_cc_details():
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)
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
180 yy
= int(gladexml
.get_widget("yy_entry").get_text())
183 gladexml
.get_widget("cc_expired_label").hide()
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()
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():
203 self
.clear_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
)
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'])))