96
96
else: # don't quit, just hide
97
97
if self.first_time_closing:
98
98
self.main_gui_toggle_hidden()
99
self.create_dialog_alert("info", """Viridian is still running in the status bar. If you do not want Viridian to continue running when the window is closed you can disable it in Preferences.""", True)
99
self.create_dialog_alert("info", _("Viridian is still running in the status bar. If you do not want Viridian to continue running when the window is closed you can disable it in Preferences."), True)
100
100
self.first_time_closing = False
101
101
self.db_session.variable_set('first_time_closing', False)
106
106
def destroy(self, widget=None, data=None):
107
107
"""The function when the program exits."""
108
108
if THREAD_LOCK.locked():
109
result = self.create_dialog_ok_or_close("Downloads in progress..", "There are unfinished downloads, are you sure you want to quit?")
109
result = self.create_dialog_ok_or_close(_("Downloads in progress.."), _("There are unfinished downloads, are you sure you want to quit?"))
110
110
if result != "ok":
112
112
self.stop_all_threads()
183
183
filem = gtk.MenuItem("_File")
184
184
filem.set_submenu(file_menu)
186
newi = gtk.MenuItem("Reauthenticate")
186
newi = gtk.MenuItem(_("Reauthenticate"))
187
187
newi.connect("activate", self.button_reauthenticate_clicked)
188
188
file_menu.append(newi)
190
self.go_to_ampache_menu_item = gtk.MenuItem("Open Ampache")
190
self.go_to_ampache_menu_item = gtk.MenuItem(_("Open Ampache"))
191
191
self.go_to_ampache_menu_item.connect("activate", lambda x: self.gnome_open(self.ampache_conn.url))
192
192
self.go_to_ampache_menu_item.set_sensitive(False)
193
193
file_menu.append(self.go_to_ampache_menu_item)
203
203
newi.connect("activate", self.button_save_playlist_clicked)
204
204
file_menu.append(newi)
206
newi = gtk.ImageMenuItem("Load Playlist", agr)
206
newi = gtk.ImageMenuItem(_("Load Playlist"), agr)
207
207
img = gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_MENU)
208
208
newi.set_image(img)
209
209
key, mod = gtk.accelerator_parse("<Control>O")
211
211
newi.connect("activate", self.button_load_playlist_clicked)
212
212
file_menu.append(newi)
214
newi = gtk.ImageMenuItem("Export Playlist...")#, agr)
214
newi = gtk.ImageMenuItem(_("Export Playlist..."))#, agr)
215
215
img = gtk.image_new_from_stock(gtk.STOCK_SAVE_AS, gtk.ICON_SIZE_MENU)
216
216
newi.set_image(img)
217
217
#key, mod = gtk.accelerator_parse("<Control>E")
222
222
sep = gtk.SeparatorMenuItem()
223
223
file_menu.append(sep)
225
newi = gtk.MenuItem("Clear Album Art")
225
newi = gtk.MenuItem(_("Clear Album Art"))
226
226
newi.connect("activate", self.button_clear_album_art_clicked)
227
227
file_menu.append(newi)
229
newi = gtk.MenuItem("Clear Local Cache")
229
newi = gtk.MenuItem(_("Clear Local Cache"))
230
230
newi.connect("activate", self.button_clear_cached_artist_info_clicked)
231
231
file_menu.append(newi)
233
newi = gtk.MenuItem("Pre-Cache")
233
newi = gtk.MenuItem(_("Pre-Cache"))
234
234
newi.connect("activate", self.button_pre_cache_info_clicked)
235
235
file_menu.append(newi)
267
267
"""Start View Menu"""
268
268
view_menu = gtk.Menu()
269
viewm = gtk.MenuItem("_View")
269
viewm = gtk.MenuItem(_("_View"))
270
270
viewm.set_submenu(view_menu)
272
newi = gtk.CheckMenuItem("Show Playlist")
272
newi = gtk.CheckMenuItem(_("Show Playlist"))
273
273
show_playlist = self.db_session.variable_get('show_playlist', True)
275
275
newi.set_active(show_playlist)
276
276
newi.connect("activate", self.toggle_playlist_view)
277
277
view_menu.append(newi)
279
self.show_downloads_checkbox = gtk.CheckMenuItem("Show Downloads")
279
self.show_downloads_checkbox = gtk.CheckMenuItem(_("Show Downloads"))
280
280
show_downloads = self.db_session.variable_get('show_downloads', False)
281
281
self.show_downloads_checkbox.set_active(show_downloads)
282
282
self.show_downloads_checkbox.connect("activate", self.toggle_downloads_view)
365
365
self.volume_slider.set_size_request(80, 20)
366
366
self.volume_slider.set_value(volume)
368
repeat_songs_checkbutton = gtk.CheckButton("Repeat")
368
repeat_songs_checkbutton = gtk.CheckButton(_("Repeat"))
369
369
repeat_songs_checkbutton.set_active(False)
370
370
repeat_songs_checkbutton.connect("toggled", self.toggle_repeat_songs)
372
shuffle_songs_checkbutton = gtk.CheckButton("Shuffle")
372
shuffle_songs_checkbutton = gtk.CheckButton(_("Shuffle"))
373
373
shuffle_songs_checkbutton.set_active(False)
374
374
shuffle_songs_checkbutton.connect("toggled", self.toggle_shuffle_songs)
376
376
hbox = gtk.HBox()
377
377
vbox = gtk.VBox()
378
378
label = gtk.Label()
379
label.set_markup('<span size="6000"><b>Volume</b></span>')
379
label.set_markup(_('<span size="6000"><b>Volume</b></span>'))
380
380
vbox.pack_start(label, False, False, 0)
381
381
vbox.pack_start(self.volume_slider, False, False, 0)
525
525
tree_view.append_column(new_column)
527
527
renderer_text = gtk.CellRendererText()
528
new_column = gtk.TreeViewColumn("Current Playlist", renderer_text, markup=1)
528
new_column = gtk.TreeViewColumn(_("Current Playlist"), renderer_text, markup=1)
529
529
#new_column = guifunctions.create_column("Current Playlist", 1)
530
530
new_column.set_reorderable(False)
531
531
new_column.set_resizable(False)
540
540
hbox = gtk.HBox()
542
button = gtk.Button("Clear Playlist")
542
button = gtk.Button(_("Clear Playlist"))
543
543
button.connect('clicked', self.audio_engine.clear_playlist)
545
545
hbox.pack_start(button, False, False, 2)
547
547
combobox = gtk.combo_box_new_text()
548
combobox.append_text('Replace Mode')
549
combobox.append_text('Add Mode')
548
combobox.append_text(_('Replace Mode'))
549
combobox.append_text(_('Add Mode'))
550
550
combobox.connect('changed', self.playlist_mode_changed)
572
572
tree_view.connect("row-activated", self.downloads_on_activated)
573
573
tree_view.connect("button_press_event", self.downloads_on_right_click)
574
574
tree_view.set_rules_hint(True)
575
column = gtk.TreeViewColumn("File", gtk.CellRendererText(), text=0)
575
column = gtk.TreeViewColumn(_("File"), gtk.CellRendererText(), text=0)
576
576
column.set_reorderable(False)
577
577
column.set_resizable(True)
578
578
column.set_clickable(False)
582
582
tree_view.append_column(column)
584
584
rendererprogress = gtk.CellRendererProgress()
585
column = gtk.TreeViewColumn("Progress")
585
column = gtk.TreeViewColumn(_("Progress"))
586
586
column.pack_start(rendererprogress, True)
587
587
column.add_attribute(rendererprogress, "value", 1)
588
588
column.set_reorderable(False)
648
648
#albums_column = guifunctions.create_column("Albums", 0)
649
649
renderer_text = gtk.CellRendererText()
650
albums_column = gtk.TreeViewColumn("Albums", renderer_text, markup=0)
650
albums_column = gtk.TreeViewColumn(_("Albums"), renderer_text, markup=0)
651
651
albums_column.set_resizable(False)
652
652
albums_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
700
700
tree_view.set_search_column(1)
703
for column in ("Track", "Title", "Artist", "Album", "Time", "Size"):
703
for column in (_("Track"), _("Title"), _("Artist"), _("Album"), _("Time"), _("Size")):
704
704
new_column = guifunctions.create_column(column, i)
705
705
new_column.set_reorderable(True)
706
706
new_column.set_resizable(True)
707
707
new_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
708
if column == "Track":
708
if column == _("Track"):
709
709
new_column.set_fixed_width(60)
710
elif column == "Title":
710
elif column == _("Title"):
711
711
new_column.set_fixed_width(230)
712
elif column == "Artist":
712
elif column == _("Artist"):
713
713
new_column.set_fixed_width(170)
714
elif column == "Album":
714
elif column == _("Album"):
715
715
new_column.set_fixed_width(190)
716
elif column == "Time":
716
elif column == _("Time"):
717
717
new_column.set_fixed_width(90)
718
elif column == "Size":
718
elif column == _("Size"):
719
719
new_column.set_fixed_width(70)
720
720
tree_view.append_column(new_column)
738
738
#################################
739
739
self.statusbar = gtk.Statusbar()
740
740
self.statusbar.set_has_resize_grip(True)
741
self.update_statusbar("Ready")
741
self.update_statusbar(_("Ready"))
744
744
main_box.pack_start(self.statusbar, False, False, 0)
828
828
self.ampache_conn.set_credentials(username, password, url)
829
829
if self.ampache_conn.has_credentials():
830
830
self.go_to_ampache_menu_item.set_sensitive(True)
831
self.update_statusbar("Attempting to authenticate...")
831
self.update_statusbar(_("Attempting to authenticate..."))
832
832
if self.login_and_get_artists("First"):
833
833
list = self.db_session.variable_get('current_playlist', None)
835
835
self.load_playlist(list)
836
836
#self.update_playlist_window()
838
self.update_statusbar("Set Ampache information by going to Edit -> Preferences")
838
self.update_statusbar(_("Set Ampache information by going to Edit -> Preferences"))
839
839
if self.is_first_time:
840
840
self.create_dialog_alert("info", """This looks like the first time you are running Viridian. To get started, go to Edit -> Preferences and set your account information.""", True)
878
878
self.preferences_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
879
879
self.preferences_window.set_icon(self.images_pixbuf_viridian_simple)
880
880
self.preferences_window.set_transient_for(self.window)
881
self.preferences_window.set_title("Viridian Settings")
881
self.preferences_window.set_title(_("Viridian Settings"))
882
882
self.preferences_window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
883
883
self.preferences_window.resize(450, 300)
884
884
self.preferences_window.set_resizable(False)
910
910
### Ampache URL ###
911
911
hbox = gtk.HBox()
912
912
hbox.pack_start(gtk.Label(" "), False, False, 0)
913
ampache_label = gtk.Label("Ampache URL:")
913
ampache_label = gtk.Label(_("Ampache URL:"))
914
914
hbox.pack_start(ampache_label, False, False, 2)
916
916
self.ampache_text_entry = gtk.Entry()
926
926
hbox = gtk.HBox()
927
927
label = gtk.Label("")
928
label.set_markup('<span size="8000"><b>Example: </b>http://example.com/ampache</span>')
928
label.set_markup(_('<span size="8000"><b>Example: </b>http://example.com/ampache</span>'))
929
929
hbox.pack_end(label, False, False, 2)
931
931
account_box.pack_start(hbox, False, False, 2)
932
932
### Ampache Username ###
933
933
hbox = gtk.HBox()
934
934
hbox.pack_start(gtk.Label(" "), False, False, 0)
935
username_label = gtk.Label("Username:")
935
username_label = gtk.Label(_("Username:"))
936
936
hbox.pack_start(username_label, False, False, 2)
938
938
self.username_text_entry = gtk.Entry()
948
948
### Ampache Password ###
949
949
hbox = gtk.HBox()
950
950
hbox.pack_start(gtk.Label(" "), False, False, 0)
951
password_label = gtk.Label("Password:")
951
password_label = gtk.Label(_("Password:"))
952
952
hbox.pack_start(password_label, False, False, 2)
954
954
self.password_text_entry = gtk.Entry()
1004
1004
hbox = gtk.HBox()
1006
1006
label = gtk.Label()
1007
label.set_markup('<b>Alternate Row Colors</b>')
1007
label.set_markup(_('<b>Alternate Row Colors</b>'))
1008
1008
hbox.pack_start(label, False, False)
1010
1010
display_box.pack_start(hbox, False, False, 3)
1012
1012
hbox = gtk.HBox()
1013
1013
hbox.pack_start(gtk.Label(" "), False, False, 0)
1014
cb = gtk.CheckButton("Artists Column")
1014
cb = gtk.CheckButton(_("Artists Column"))
1015
1015
cb.connect("toggled", self.toggle_alternate_row_colors, 'artists')
1016
1016
cb.set_active(self.tree_view_dict['artists'].get_rules_hint())
1017
1017
hbox.pack_start(cb)
1020
1020
hbox = gtk.HBox()
1021
1021
hbox.pack_start(gtk.Label(" "), False, False, 0)
1022
cb = gtk.CheckButton("Albums Column")
1022
cb = gtk.CheckButton(_("Albums Column"))
1023
1023
cb.connect("toggled", self.toggle_alternate_row_colors, 'albums')
1024
1024
cb.set_active(self.tree_view_dict['albums'].get_rules_hint())
1025
1025
hbox.pack_start(cb)
1028
1028
hbox = gtk.HBox()
1029
1029
hbox.pack_start(gtk.Label(" "), False, False, 0)
1030
cb = gtk.CheckButton("Songs Column")
1030
cb = gtk.CheckButton(_("Songs Column"))
1031
1031
cb.connect("toggled", self.toggle_alternate_row_colors, 'songs')
1032
1032
cb.set_active(self.tree_view_dict['songs'].get_rules_hint())
1033
1033
hbox.pack_start(cb)
1036
1036
hbox = gtk.HBox()
1037
1037
hbox.pack_start(gtk.Label(" "), False, False, 0)
1038
cb = gtk.CheckButton("Playlist Column")
1038
cb = gtk.CheckButton(_("Playlist Column"))
1039
1039
cb.connect("toggled", self.toggle_alternate_row_colors, 'playlist')
1040
1040
cb.set_active(self.tree_view_dict['playlist'].get_rules_hint())
1041
1041
hbox.pack_start(cb)
1044
1044
hbox = gtk.HBox()
1045
1045
hbox.pack_start(gtk.Label(" "), False, False, 0)
1046
cb = gtk.CheckButton("Downloads Column")
1046
cb = gtk.CheckButton(_("Downloads Column"))
1047
1047
cb.connect("toggled", self.toggle_alternate_row_colors, 'downloads')
1048
1048
cb.set_active(self.tree_view_dict['downloads'].get_rules_hint())
1049
1049
hbox.pack_start(cb)
1071
1071
hbox.pack_start(gtk.Label(" "), False, False, 0)
1074
cb = gtk.CheckButton("Automatically clear local catalog when Ampache is updated")
1074
cb = gtk.CheckButton(_("Automatically clear local catalog when Ampache is updated"))
1075
1075
cb.set_active(self.automatically_update)
1076
1076
cb.connect("toggled", self.toggle_automatically_update)
1089
1089
if self.ampache_conn.has_credentials() and self.ampache_conn.is_authenticated():
1090
1090
if self.catalog_up_to_date:
1091
1091
image.set_from_stock(gtk.STOCK_YES,gtk.ICON_SIZE_SMALL_TOOLBAR)
1092
label.set_text("Local catalog is up-to-date.")
1092
label.set_text(_("Local catalog is up-to-date."))
1094
1094
image.set_from_stock(gtk.STOCK_NO,gtk.ICON_SIZE_SMALL_TOOLBAR)
1095
label.set_text("Local catalog is older than Ampache catalog! To update the local catalog go to File -> Clear Local Cache.")
1095
label.set_text(_("Local catalog is older than Ampache catalog! To update the local catalog go to File -> Clear Local Cache."))
1097
1097
hbox.pack_start(image, False, False, 5)
1098
1098
hbox.pack_start(label, False, False, 0)
1151
1151
hbox = gtk.HBox()
1153
1153
label = gtk.Label()
1154
label.set_markup('<b>Status Tray Icon</b>')
1154
label.set_markup(_('<b>Status Tray Icon</b>'))
1156
1156
hbox.pack_start(label, False, False)
1158
1158
trayicon_box.pack_start(hbox, False, False, 3)
1160
cb = gtk.CheckButton("Quit Viridian when window is closed")
1160
cb = gtk.CheckButton(_("Quit Viridian when window is closed"))
1161
1161
cb.connect("toggled", self.toggle_quit_when_window_closed)
1162
1162
cb.set_active(self.quit_when_window_closed)
1164
1164
hbox = gtk.HBox()
1165
1165
hbox.pack_start(gtk.Label(" "), False, False, 0)
1167
button = gtk.RadioButton(None, "Standard Tray Icon")
1167
button = gtk.RadioButton(None, _("Standard Tray Icon"))
1168
1168
button.connect("toggled", self.trayicon_settings_toggled, "standard", cb)
1169
1169
if self.tray_icon_to_display == 'standard':
1170
1170
button.set_active(True)
1187
1187
hbox = gtk.HBox()
1188
1188
hbox.pack_start(gtk.Label(" "), False, False, 0)
1190
button = gtk.RadioButton(button, "Disabled")
1190
button = gtk.RadioButton(button, _("Disabled"))
1191
1191
button.connect("toggled", self.trayicon_settings_toggled, "disabled", cb)
1192
1192
if self.tray_icon_to_display == 'disabled':
1193
1193
button.set_active(True)
1205
1205
hbox = gtk.HBox()
1206
1206
hbox.pack_start(gtk.Label(" "), False, False, 0)
1208
label = gtk.Label("Note: changes to the type of icon will take effect the next time this program is opened.")
1208
label = gtk.Label(_("Note: changes to the type of icon will take effect the next time this program is opened."))
1209
1209
label.set_line_wrap(True)
1211
1211
hbox.pack_start(label, False, False, 4)
1231
1231
hbox = gtk.HBox()
1232
1232
hbox.pack_start(gtk.Label(" "), False, False, 0)
1234
hbox.pack_start(gtk.Label("XML RPC Server: "), False, False, 0)
1234
hbox.pack_start(gtk.Label(_("XML RPC Server: ")), False, False, 0)
1236
1236
label = gtk.Label()
1237
1237
image = gtk.Image()
1239
1239
if self.xml_server.is_running:
1240
1240
image.set_from_stock(gtk.STOCK_YES,gtk.ICON_SIZE_SMALL_TOOLBAR)
1241
label.set_text("Running. (port %d)" % self.xml_server.port)
1241
label.set_text(_("Running. (port %d)") % self.xml_server.port)
1243
1243
image.set_from_stock(gtk.STOCK_NO,gtk.ICON_SIZE_SMALL_TOOLBAR)
1244
label.set_text("Not Running.")
1244
label.set_text(_("Not Running."))
1246
1246
hbox.pack_start(image, False, False, 5)
1247
1247
hbox.pack_start(label, False, False, 0)
1254
1254
port = gtk.Entry()
1256
button = gtk.Button("Start")
1256
button = gtk.Button(_("Start"))
1257
1257
button.connect("clicked", self.button_xml_server_clicked, 'start', label, image, port)
1258
1258
#button.set_sensitive(False)
1259
1259
hbox.pack_start(button, True, True, 0)
1261
button = gtk.Button("Stop")
1261
button = gtk.Button(_("Stop"))
1262
1262
button.connect("clicked", self.button_xml_server_clicked, 'stop', label, image, port)
1263
1263
#button.set_sensitive(False)
1264
1264
hbox.pack_start(button, True, True, 0)
1266
button = gtk.Button("Restart")
1266
button = gtk.Button(_("Restart"))
1267
1267
button.connect("clicked", self.button_xml_server_clicked, 'restart', label, image, port)
1268
1268
#button.set_sensitive(False)
1269
1269
hbox.pack_start(button, True, True, 0)
1271
hbox.pack_start(gtk.Label('Port: '), False, False, 1)
1271
hbox.pack_start(gtk.Label(_('Port: ')), False, False, 1)
1274
1274
port.set_text(str(self.db_session.variable_get('xmlrpc_port', XML_RPC_PORT)))
1280
1280
hbox = gtk.HBox()
1281
1281
hbox.pack_start(gtk.Label(" "), False, False, 0)
1283
cb = gtk.CheckButton("Start XML RPC server when Viridan starts")
1283
cb = gtk.CheckButton(_("Start XML RPC server when Viridan starts"))
1284
1284
cb.connect("toggled", self.toggle_start_xml_rpc_server)
1285
1285
start_xml_rpc_server = self.db_session.variable_get('enable_xmlrpc_server', False)
1286
1286
cb.set_active(start_xml_rpc_server)
1310
1310
hbox.pack_start(gtk.Label(" "), False, False, 0)
1312
label = gtk.Label("To delete all personal information (including your username, password, album-art, cached information, etc.) press this button. NOTE: This will delete all personal settings stored on this computer and Viridian will close itself. When you reopen, it will be as though it is the first time you are running Viridian.")
1312
label = gtk.Label(_("To delete all personal information (including your username, password, album-art, cached information, etc.) press this button. NOTE: This will delete all personal settings stored on this computer and Viridian will close itself. When you reopen, it will be as though it is the first time you are running Viridian."))
1313
1313
label.set_line_wrap(True)
1315
1315
hbox.pack_start(label, False, False)
1321
1321
hbox.pack_start(gtk.Label(" "), False, False, 0)
1323
cb = gtk.Button("Reset Everything")
1323
cb = gtk.Button(_("Reset Everything"))
1324
1324
cb.connect("clicked", self.button_reset_everything_clicked)
1326
1326
hbox.pack_start(cb, False, False, 2)
1329
1329
"""End System Settings"""
1331
1331
"""End Notebook"""
1332
notebook.append_page(account_box, gtk.Label("Account"))
1333
notebook.append_page(display_box, gtk.Label("Display"))
1334
notebook.append_page(catalog_box, gtk.Label("Catalog"))
1335
notebook.append_page(download_box, gtk.Label("Downloads"))
1336
notebook.append_page(trayicon_box, gtk.Label("Tray Icon"))
1337
notebook.append_page(server_box, gtk.Label("Server"))
1338
notebook.append_page(system_box, gtk.Label("System"))
1332
notebook.append_page(account_box, gtk.Label(_("Account")))
1333
notebook.append_page(display_box, gtk.Label(_("Display")))
1334
notebook.append_page(catalog_box, gtk.Label(_("Catalog")))
1335
notebook.append_page(download_box, gtk.Label(_("Downloads")))
1336
notebook.append_page(trayicon_box, gtk.Label(_("Tray Icon")))
1337
notebook.append_page(server_box, gtk.Label(_("Server")))
1338
notebook.append_page(system_box, gtk.Label(_("System")))
1340
1340
"""Start Bottom Bar"""
1341
1341
bottom_bar = gtk.HBox()
1371
1371
self.help_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
1372
1372
self.help_window.set_transient_for(self.window)
1373
self.help_window.set_title("Viridian Help")
1373
self.help_window.set_title(_("Viridian Help"))
1374
1374
self.help_window.set_icon(self.images_pixbuf_viridian_simple)
1375
1375
self.help_window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
1376
1376
self.help_window.resize(350, 300)
1382
1382
vbox.set_border_width(10)
1384
1384
label = gtk.Label()
1385
label.set_markup('<span size="14000"><b>Viridian Help</b></span>')
1385
label.set_markup(_('<span size="14000"><b>Viridian Help</b></span>'))
1386
1386
vbox.pack_start(label, False, False, 1)
1388
1388
hbox = gtk.HBox()
1389
label = gtk.Label("Home Page:")
1389
label = gtk.Label(_("Home Page:"))
1390
1390
link = guifunctions.hyperlink('http://viridian.daveeddy.com')
1391
1391
hbox.pack_start(label, False, False, 1)
1392
1392
hbox.pack_start(link, False, False, 2)
1393
1393
vbox.pack_start(hbox, False, False, 0)
1395
1395
hbox = gtk.HBox()
1396
label = gtk.Label("Launchpad:")
1396
label = gtk.Label(_("Launchpad:"))
1397
1397
link = guifunctions.hyperlink('https://launchpad.net/viridianplayer')
1398
1398
hbox.pack_start(label, False, False, 1)
1399
1399
hbox.pack_start(link, False, False, 2)
1400
1400
vbox.pack_start(hbox, False, False, 0)
1402
1402
hbox = gtk.HBox()
1403
label = gtk.Label("FAQ:")
1403
label = gtk.Label(_("FAQ:"))
1404
1404
link = guifunctions.hyperlink('https://answers.launchpad.net/viridianplayer/+faqs')
1405
1405
hbox.pack_start(label, False, False, 1)
1406
1406
hbox.pack_start(link, False, False, 2)
1407
1407
vbox.pack_start(hbox, False, False, 0)
1409
1409
hbox = gtk.HBox()
1410
label = gtk.Label("Bugs:")
1410
label = gtk.Label(_("Bugs:"))
1411
1411
link = guifunctions.hyperlink('https://bugs.launchpad.net/viridianplayer')
1412
1412
hbox.pack_start(label, False, False, 1)
1413
1413
hbox.pack_start(link, False, False, 2)
1414
1414
vbox.pack_start(hbox, False, False, 0)
1416
1416
hbox = gtk.HBox()
1417
label = gtk.Label("Questions:")
1417
label = gtk.Label(_("Questions:"))
1418
1418
link = guifunctions.hyperlink('https://answers.launchpad.net/viridianplayer')
1419
1419
hbox.pack_start(label, False, False, 1)
1420
1420
hbox.pack_start(link, False, False, 2)
1467
1467
tree_view.set_rules_hint(True)
1470
for column in ("Name", "Songs", "Owner", "Type"):
1471
if column == "Name":
1470
for column in (_("Name"), _("Songs"), _("Owner"), _("Type")):
1471
if column == _("Name"):
1472
1472
renderer_text = gtk.CellRendererText()
1473
1473
new_column = gtk.TreeViewColumn(column, renderer_text, markup=0)
1476
1476
new_column.set_reorderable(True)
1477
1477
new_column.set_resizable(True)
1478
1478
new_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
1479
if column == "Name":
1479
if column == _("Name"):
1480
1480
new_column.set_fixed_width(200)
1481
elif column == "Songs":
1481
elif column == _("Songs"):
1482
1482
new_column.set_fixed_width(70)
1483
elif column == "Owner":
1483
elif column == _("Owner"):
1484
1484
new_column.set_fixed_width(90)
1485
elif column == "Type":
1485
elif column == _("Type"):
1486
1486
new_column.set_fixed_width(60)
1487
1487
tree_view.append_column(new_column)
1496
1496
text_entry.set_text('')
1497
1497
if type == 'Save':
1498
1498
hbox = gtk.HBox()
1499
hbox.pack_start(gtk.Label("Playlist Name: "), False, False, 1)
1499
hbox.pack_start(gtk.Label(_("Playlist Name: ")), False, False, 1)
1500
1500
hbox.pack_start(text_entry, False, False, 2)
1501
1501
vbox.pack_start(hbox, False, False, 2)
1513
1513
if type == 'Load':
1514
1514
button = gtk.Button(stock=gtk.STOCK_OPEN)
1515
1515
elif type == 'Export':
1516
button = gtk.Button("Export as M3U...")
1516
button = gtk.Button(_("Export as M3U..."))
1517
1517
button.connect("clicked", self.button_load_or_save_playlist_clicked, tree_view.get_selection(), text_entry, type)
1519
1519
bottom_bar.pack_start(remove, False, False, 2)
1570
1570
"""Create a menu when the user right clicks the sys tray icon."""
1571
1571
menu = gtk.Menu()
1573
show_window = gtk.MenuItem("Show Window")
1573
show_window = gtk.MenuItem(_("Show Window"))
1574
1574
show_window.connect('activate', self.status_icon_activate)
1575
1575
menu.append(show_window)
1577
1577
### Display Song Info is song is playing ###
1578
1578
if self.audio_engine.get_state() != "stopped" and self.audio_engine.get_state() != None:
1579
1579
menu.append(gtk.SeparatorMenuItem())
1580
np = gtk.MenuItem("- Now Playing -")
1580
np = gtk.MenuItem(_("- Now Playing -"))
1581
1581
if self.audio_engine.get_state() == "paused":
1582
np = gtk.MenuItem("- Now Playing (paused) -")
1582
np = gtk.MenuItem(_("- Now Playing (paused) -"))
1583
1583
np.set_sensitive(False)
1584
1584
menu.append(np)
1792
1792
#else: #do nothing, pull from cache
1794
1794
# load the artists window with, you guessed it, artists
1795
self.update_statusbar("Pulling Artists...")
1795
self.update_statusbar(_("Pulling Artists..."))
1796
1796
self.check_and_populate_artists()
1797
1797
artists = dbfunctions.get_artist_dict(self.db_session)
1798
1798
model = self.artist_list_store
1800
1800
artist_name = artists[artist_id]['name']
1801
1801
custom_name = artists[artist_id]['custom_name']
1802
1802
model.append([artist_name, artist_id, custom_name])
1803
self.update_statusbar("Ready.")
1803
self.update_statusbar(_("Ready."))
1805
1805
else: # auth failed
1806
self.update_statusbar("Authentication Failed.")
1806
self.update_statusbar(_("Authentication Failed."))
1836
1836
self.check_and_populate_albums(self.artist_id)
1837
1837
albums = dbfunctions.get_album_dict(self.db_session, self.artist_id)
1839
model.append(["<b>All Albums (%d)</b>" % (len(albums)), -1, -1, 0])
1839
model.append([_("<b>All Albums (%d)</b>") % (len(albums)), -1, -1, 0])
1840
1840
for album in albums:
1841
1841
album_name = albums[album]['name']
1842
1842
album_year = albums[album]['year']
1843
1843
precise_rating = albums[album]['precise_rating']
1844
1844
album_id = album
1845
self.update_statusbar("Fetching Album: " + album_name)
1845
self.update_statusbar(_("Fetching Album: ") + album_name)
1846
1846
album_string = album_name + ' (' + str(album_year) + ')'
1847
1847
if album_year == 0:
1848
1848
album_string = album_name
1963
1963
song_id = treeview.get_model()[path][2]
1965
i = gtk.MenuItem("Remove From Playlist")
1965
i = gtk.MenuItem(_("Remove From Playlist"))
1966
1966
i.connect('activate', self.remove_from_playlist, song_id, treeview, list)
1968
i = gtk.MenuItem("Download Songs")
1968
i = gtk.MenuItem(_("Download Songs"))
1969
1969
i.connect('activate', self.download_songs_clicked, list)
1978
1978
song_id = treeview.get_model()[path][2]
1980
i = gtk.MenuItem("Remove From Playlist")
1980
i = gtk.MenuItem(_("Remove From Playlist"))
1981
1981
i.connect('activate', self.remove_from_playlist, song_id, treeview)
1983
i = gtk.MenuItem("Download Song")
1983
i = gtk.MenuItem(_("Download Song"))
1984
1984
i.connect('activate', self.download_song_clicked, song_id)
1997
1997
full_path = treeview.get_model()[path][2]
1999
i = gtk.MenuItem("Open Song")
1999
i = gtk.MenuItem(_("Open Song"))
2000
2000
i.connect('activate', lambda _: self.gnome_open(full_path))
2002
i = gtk.MenuItem("Open Containing Folder")
2002
i = gtk.MenuItem(_("Open Containing Folder"))
2003
2003
i.connect('activate', lambda _: self.gnome_open(os.path.dirname(full_path)))
2016
2016
album_id = treeview.get_model()[path][1]
2018
i = gtk.MenuItem("Add Album to Playlist")
2018
i = gtk.MenuItem(_("Add Album to Playlist"))
2019
2019
i.connect('activate', self.add_album_to_playlist)
2021
i = gtk.MenuItem("Download Album")
2021
i = gtk.MenuItem(_("Download Album"))
2022
2022
i.connect('activate', self.download_album_clicked)
2037
2037
path, col, cellx, celly = pthinfo
2040
i = gtk.MenuItem("Add Songs to Playlist")
2040
i = gtk.MenuItem(_("Add Songs to Playlist"))
2041
2041
i.connect('activate', self.add_songs_to_playlist, list)
2043
i = gtk.MenuItem("Download Songs")
2043
i = gtk.MenuItem(_("Download Songs"))
2044
2044
i.connect('activate', self.download_songs_clicked, list)
2053
2053
song_id = treeview.get_model()[path][6]
2055
i = gtk.MenuItem("Add Song to Playlist")
2055
i = gtk.MenuItem(_("Add Song to Playlist"))
2056
2056
i.connect('activate', self.add_song_to_playlist, song_id)
2058
i = gtk.MenuItem("Download Song")
2058
i = gtk.MenuItem(_("Download Song"))
2059
2059
i.connect('activate', self.download_song_clicked, song_id)
2130
2130
self.db_session.variable_set('credentials_username', username)
2131
2131
self.db_session.variable_set('credentials_password', password)
2132
2132
self.db_session.variable_set('credentials_url', url)
2133
self.update_statusbar("Saved Credentials")
2134
print "Credentials Saved"
2133
self.update_statusbar(_("Saved Credentials"))
2134
print _("Credentials Saved")
2135
2135
self.destroy_settings(window)
2136
2136
self.login_and_get_artists("changed")
2138
self.update_statusbar("Couldn't save credentials!")
2139
print "[Error] Couldn't save credentials!"
2138
self.update_statusbar(_("Couldn't save credentials!"))
2139
print _("[Error] Couldn't save credentials!")
2148
2148
def button_open_downloads_file_chooser_clicked(self, widget, data=None):
2149
2149
"""Open file chooser for the downloads directory."""
2150
dialog = gtk.FileChooserDialog("Choose Folder...",
2150
dialog = gtk.FileChooserDialog(_("Choose Folder..."),
2152
2152
gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
2153
2153
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
2205
2205
def button_save_playlist_clicked(self, widget, data=None):
2206
2206
"""The save playlist button was clicked."""
2207
2207
if not self.audio_engine.get_playlist():
2208
self.create_dialog_alert("error", "Cannot save empty playlist.", True)
2209
print "Cannot save empty playlist"
2208
self.create_dialog_alert("error", _("Cannot save empty playlist."), True)
2209
print _("Cannot save empty playlist")
2211
2211
self.show_playlist_select('Save')
2350
2350
def button_pre_cache_info_clicked(self, widget=None, data=None):
2351
2351
"""Pre-cache all album and song info."""
2352
2352
if self.ampache_conn.is_authenticated() == False:
2353
self.create_dialog_alert("warn", "Not Authenticated", True)
2353
self.create_dialog_alert("warn", _("Not Authenticated"), True)
2355
2355
try: # check to see if this function is running
2356
2356
if self.button_pre_cache_locked == True:
2426
2426
"""Right click on album art."""
2429
i = gtk.MenuItem("Open Image")
2429
i = gtk.MenuItem(_("Open Image"))
2430
2430
i.connect('activate', lambda x: self.gnome_open(self.current_album_art_file))
2432
i = gtk.MenuItem("Refresh Album Art")
2432
i = gtk.MenuItem(_("Refresh Album Art"))
2433
2433
i.connect('activate', self.__re_fetch_album_art)
2515
2515
about.set_icon(self.images_pixbuf_viridian_simple)
2516
2516
about.set_version("1.1")
2517
2517
about.set_copyright("(c) Dave Eddy <dave@daveeddy.com>")
2518
about.set_comments("Viridian is a front-end for an Ampache Server (see http://ampache.org)")
2518
about.set_comments(_("Viridian is a front-end for an Ampache Server (see http://ampache.org)"))
2519
2519
about.set_website("http://viridian.daveeddy.com")
2520
2520
about.set_authors(["Author:", "Dave Eddy <dave@daveeddy.com>", "http://www.daveeddy.com", "", "AudioEngine by:", "Michael Zeller <link@conquerthesound.com>", "http://conquerthesound.com"])
2521
2521
about.set_artists(["Skye Sawyer <skyelauren.s@gmail.com>", "http://www.skyeillustration.com", "", "Media Icons by:", "http://mysitemyway.com", "http://ampache.org"])
2637
2637
def audioengine_error_callback(self, error_message):
2638
2638
"""Display the gstreamer error in the notification label."""
2639
self.update_statusbar("An error has occured.")
2639
self.update_statusbar(_("An error has occured."))
2640
2640
self.create_dialog_alert('warn', """GStreamer has encountered an error, this is most likely caused by:
2641
2641
- gstreamer-plugins not being installed.
2642
2642
- Ampache not transcoding the file correctly.
2780
2780
"""Takes a list of song_ids and loads it into the audio engine."""
2781
2781
self.audio_engine.clear_playlist()
2782
2782
self.audio_engine.set_playlist(list)
2783
self.update_statusbar('Loading Playlist...')
2783
self.update_statusbar(_('Loading Playlist...'))
2786
2786
for song in list:
2787
self.update_statusbar('Querying for song %d/%d in playlist' % (i, len(list)))
2787
self.update_statusbar(_('Querying for song %d/%d in playlist') % (i, len(list)))
2788
2788
if not dbfunctions.song_has_info(self.db_session, song):
2789
2789
song = self.ampache_conn.get_song_info(song)
2790
2790
self.check_and_populate_albums(song['artist_id'])
2791
2791
self.check_and_populate_songs( song['album_id'])
2793
2793
self.update_playlist_window()
2794
self.update_statusbar('Playlist loaded')
2794
self.update_statusbar(_('Playlist loaded'))
2796
2796
def add_album_to_playlist(self, widget):
2797
2797
"""Adds every song in the visible list store and adds it to the playlist."""
2896
2896
def download_songs_clicked(self, widget, list):
2897
2897
"""The user is downloading multiple songs from the playlist."""
2898
2898
if not os.path.exists(self.downloads_directory):
2899
self.create_dialog_alert("warn", "The folder %s does not exist. You can change the folder in Preferences." % (self.downloads_directory), True)
2899
self.create_dialog_alert("warn", _("The folder %s does not exist. You can change the folder in Preferences.") % (self.downloads_directory), True)
2901
2901
if self.show_downloads_checkbox.active == False:
2902
2902
self.side_panel.show()
2909
2909
"""The user cliked download album."""
2910
2910
# check to see if the downloads directory exists
2911
2911
if not os.path.exists(self.downloads_directory):
2912
self.create_dialog_alert("warn", "The folder %s does not exist. You can change the folder in Preferences." % (self.downloads_directory), True)
2912
self.create_dialog_alert("warn", _("The folder %s does not exist. You can change the folder in Preferences.") % (self.downloads_directory), True)
2914
2914
if self.show_downloads_checkbox.active == False:
2915
2915
self.side_panel.show()
2922
2922
"""The user clicked download song."""
2923
2923
# check to see if the downloads directory exists
2924
2924
if not os.path.exists(self.downloads_directory):
2925
self.create_dialog_alert("warn", "The folder %s does not exist. You can change the folder in Preferences." % (self.downloads_directory), True)
2925
self.create_dialog_alert("warn", _("The folder %s does not exist. You can change the folder in Preferences.") % (self.downloads_directory), True)
2927
2927
if show_panel and self.show_downloads_checkbox.active == False:
2928
2928
self.side_panel.show()
2941
2941
print "get url '%s' to '%s'" % (url, dst)
2942
2942
urllib.urlretrieve(url, dst,
2943
2943
lambda nb, bs, fs, url=url: self._reporthook(nb,bs,fs,url,iter1))
2944
self.notification("Download Complete", os.path.basename(url).replace('%20',' ').replace('%27', "'"))
2944
self.notification(_("Download Complete"), os.path.basename(url).replace('%20',' ').replace('%27', "'"))
2945
2945
THREAD_LOCK.release()
2946
2946
#urllib.urlretrieve(url, dst, self._reporthook, iter1)