fixed gui stall caused by auto reconnect

This commit is contained in:
Martin Wagner 2020-09-10 21:45:57 +02:00
parent 291507ca1c
commit 053dbbe08f
3 changed files with 274 additions and 186 deletions

View File

@ -610,6 +610,7 @@ class MpdEventEmitter(GObject.Object):
'update': (GObject.SignalFlags.RUN_FIRST, None, ()),
'disconnected': (GObject.SignalFlags.RUN_FIRST, None, ()),
'reconnected': (GObject.SignalFlags.RUN_FIRST, None, ()),
'connection_error': (GObject.SignalFlags.RUN_FIRST, None, ()),
'current_song_changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
'state': (GObject.SignalFlags.RUN_FIRST, None, (str,)),
'elapsed_changed': (GObject.SignalFlags.RUN_FIRST, None, (float,float,)),
@ -636,6 +637,9 @@ class MpdEventEmitter(GObject.Object):
def do_reconnected(self):
pass
def do_connection_error(self):
print("Connection error!")
def do_current_file_changed(self):
pass
@ -666,6 +670,7 @@ class Client(MPDClient):
self.emitter=MpdEventEmitter()
self._last_status={}
self._refresh_interval=self._settings.get_int("refresh-interval")
self._main_timeout_id=None
#connect
self._settings.connect("changed::active-profile", self._on_active_profile_changed)
@ -678,9 +683,27 @@ class Client(MPDClient):
return func(*args)
def start(self):
if self._disconnected_loop():
self.emitter.emit("disconnected")
self._disconnected_timeout_id=GLib.timeout_add(1000, self._disconnected_loop)
self.emitter.emit("disconnected") # bring player in defined state
active=self._settings.get_int("active-profile")
try:
self.connect(self._settings.get_value("hosts")[active], self._settings.get_value("ports")[active])
if self._settings.get_value("passwords")[active] != "":
self.password(self._settings.get_value("passwords")[active])
except:
self.emitter.emit("connection_error")
return False
# connect successful
self._main_timeout_id=GLib.timeout_add(self._refresh_interval, self._main_loop)
self.emitter.emit("reconnected")
return True
def reconnect(self):
if self._main_timeout_id is not None:
GLib.source_remove(self._main_timeout_id)
self._main_timeout_id=None
self._last_status={}
self.disconnect()
self.start()
def connected(self):
try:
@ -785,27 +808,13 @@ class Client(MPDClient):
self.disconnect()
self._last_status={}
self.emitter.emit("disconnected")
if self._disconnected_loop():
self._disconnected_timeout_id=GLib.timeout_add(1000, self._disconnected_loop)
self.emitter.emit("connection_error")
self._main_timeout_id=None
return False
return True
def _disconnected_loop(self, *args):
active=self._settings.get_int("active-profile")
try:
self.connect(self._settings.get_value("hosts")[active], self._settings.get_value("ports")[active])
if self._settings.get_value("passwords")[active] != "":
self.password(self._settings.get_value("passwords")[active])
except:
print("connect failed")
return True
# connect successful
self._main_timeout_id=GLib.timeout_add(self._refresh_interval, self._main_loop)
self.emitter.emit("reconnected")
return False
def _on_active_profile_changed(self, *args):
self.disconnect()
self.reconnect()
########################
# gio settings wrapper #
@ -2488,10 +2497,11 @@ class GeneralSettings(Gtk.Box):
self._settings.set_boolean(key, widget.get_active())
class ProfileSettings(Gtk.Grid):
def __init__(self, parent, settings):
def __init__(self, parent, client, settings):
super().__init__(row_spacing=6, column_spacing=12, border_width=18)
# adding vars
self._client=client
self._settings=settings
self._gui_modification=False # indicates whether the settings were changed from the settings dialog
@ -2504,6 +2514,8 @@ class ProfileSettings(Gtk.Grid):
add_delete_buttons.pack_start(add_button, True, True, 0)
add_delete_buttons.pack_start(delete_button, True, True, 0)
connect_button=Gtk.Button(label=_("Connect"), image=Gtk.Image.new_from_icon_name("system-run", Gtk.IconSize.BUTTON))
self._profile_entry=Gtk.Entry(hexpand=True)
self._host_entry=Gtk.Entry(hexpand=True)
self._port_entry=Gtk.SpinButton.new_with_range(0, 65535, 1)
@ -2529,6 +2541,7 @@ class ProfileSettings(Gtk.Grid):
# connect
add_button.connect("clicked", self._on_add_button_clicked)
delete_button.connect("clicked", self._on_delete_button_clicked)
connect_button.connect("clicked", self._on_connect_button_clicked)
self._path_select_button.connect("clicked", self._on_path_select_button_clicked, parent)
self._profiles_combo.connect("changed", self._on_profiles_changed)
self.entry_changed_handlers=[]
@ -2564,6 +2577,8 @@ class ProfileSettings(Gtk.Grid):
self.attach_next_to(self._password_entry, password_label, Gtk.PositionType.RIGHT, 2, 1)
self.attach_next_to(path_box, path_label, Gtk.PositionType.RIGHT, 2, 1)
self.attach_next_to(self._regex_entry, regex_label, Gtk.PositionType.RIGHT, 2, 1)
connect_button.set_margin_top(12)
self.attach_next_to(connect_button, self._regex_entry, Gtk.PositionType.BOTTOM, 2, 1)
def _block_entry_changed_handlers(self, *args):
for obj, handler in self.entry_changed_handlers:
@ -2620,6 +2635,10 @@ class ProfileSettings(Gtk.Grid):
new_pos=max(pos-1,0)
self._profiles_combo.set_active(new_pos)
def _on_connect_button_clicked(self, *args):
self._settings.set_int("active-profile", self._profiles_combo.get_active())
self._client.reconnect()
def _on_profile_entry_changed(self, *args):
self._gui_modification=True
pos=self._profiles_combo.get_active()
@ -2818,7 +2837,7 @@ class PlaylistSettings(Gtk.Box):
self._store.handler_unblock(self._row_deleted)
class SettingsDialog(Gtk.Dialog):
def __init__(self, parent, settings):
def __init__(self, parent, client, settings):
use_csd=settings.get_boolean("use-csd")
if use_csd:
super().__init__(title=_("Settings"), transient_for=parent, use_header_bar=True)
@ -2835,7 +2854,7 @@ class SettingsDialog(Gtk.Dialog):
# widgets
general=GeneralSettings(settings)
profiles=ProfileSettings(parent, settings)
profiles=ProfileSettings(parent, client, settings)
playlist=PlaylistSettings(settings)
# packing
@ -3017,6 +3036,7 @@ class SeekBar(Gtk.Box):
def _disable(self, *args):
self.set_sensitive(False)
self.scale.set_fill_level(0)
self.scale.set_range(0, 0)
self._elapsed.set_text("00:00")
self._rest.set_text("-00:00")
@ -3298,6 +3318,52 @@ class ProfileSelect(Gtk.ComboBoxText):
active=self.get_active()
self._settings.set_int("active-profile", active)
class ConnectionNotify(Gtk.Revealer):
def __init__(self, client, settings):
super().__init__(valign=Gtk.Align.START, halign=Gtk.Align.CENTER)
# adding vars
self._client=client
self._settings=settings
# widgets
self._label=Gtk.Label(wrap=True)
close_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("window-close-symbolic", Gtk.IconSize.BUTTON))
close_button.set_relief(Gtk.ReliefStyle.NONE)
connect_button=Gtk.Button(label=_("Connect"))
# connect
close_button.connect("clicked", self._on_close_button_clicked)
connect_button.connect("clicked", self._on_connect_button_clicked)
self._client.emitter.connect("connection_error", self._on_connection_error)
self._client.emitter.connect("reconnected", self._on_reconnected)
# packing
box=Gtk.Box(spacing=12)
box.get_style_context().add_class("app-notification")
box.pack_start(self._label, False, True, 6)
box.pack_end(close_button, False, True, 0)
box.pack_end(connect_button, False, True, 0)
self.add(box)
def _on_connection_error(self, *args):
active=self._settings.get_int("active-profile")
profile=self._settings.get_value("profiles")[active]
host=self._settings.get_value("hosts")[active]
port=self._settings.get_value("ports")[active]
string=_('Connection to "%(profile)s" (%(host)s:%(port)s) failed') % {"profile": profile, "host": host, "port": port}
self._label.set_text(string)
self.set_reveal_child(True)
def _on_reconnected(self, *args):
self.set_reveal_child(False)
def _on_close_button_clicked(self, *args):
self.set_reveal_child(False)
def _on_connect_button_clicked(self, *args):
self._client.reconnect()
class MainWindow(Gtk.ApplicationWindow):
def __init__(self, app, client, settings):
super().__init__(title=("mpdevil"), icon_name="mpdevil", application=app)
@ -3350,6 +3416,7 @@ class MainWindow(Gtk.ApplicationWindow):
self._playback_control=PlaybackControl(self._client, self._settings)
self._seek_bar=SeekBar(self._client)
playback_options=PlaybackOptions(self._client, self._settings)
connection_notify=ConnectionNotify(self._client, self._settings)
# menu
subsection=Gio.Menu()
@ -3397,6 +3464,9 @@ class MainWindow(Gtk.ApplicationWindow):
vbox=Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
vbox.pack_start(self._paned2, True, True, 0)
vbox.pack_start(action_bar, False, False, 0)
overlay=Gtk.Overlay()
overlay.add(vbox)
overlay.add_overlay(connection_notify)
if self._use_csd:
self._header_bar=Gtk.HeaderBar()
@ -3412,7 +3482,7 @@ class MainWindow(Gtk.ApplicationWindow):
action_bar.pack_start(self._profile_select)
action_bar.pack_start(menu_button)
self.add(vbox)
self.add(overlay)
self.show_all()
if self._settings.get_boolean("maximize"):
@ -3511,7 +3581,7 @@ class MainWindow(Gtk.ApplicationWindow):
self._settings.set_int("paned2", self._paned2.get_position())
def _on_settings(self, action, param):
settings=SettingsDialog(self, self._settings)
settings=SettingsDialog(self, self._client, self._settings)
settings.run()
settings.destroy()

171
po/de.po
View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-10 16:59+0200\n"
"PO-Revision-Date: 2020-09-10 17:00+0200\n"
"POT-Creation-Date: 2020-09-10 21:43+0200\n"
"PO-Revision-Date: 2020-09-10 21:45+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@ -38,52 +38,52 @@ msgstr "Unbekannter Interpret"
msgid "Unknown Album"
msgstr "Unbekanntes Album"
#: mpdevil:898 mpdevil:1198 mpdevil:2056 mpdevil:2708
#: mpdevil:907 mpdevil:1207 mpdevil:2065 mpdevil:2727
msgid "No"
msgstr "Nr."
#: mpdevil:903 mpdevil:1203 mpdevil:2058 mpdevil:2708
#: mpdevil:912 mpdevil:1212 mpdevil:2067 mpdevil:2727
msgid "Title"
msgstr "Titel"
#: mpdevil:909 mpdevil:1380 mpdevil:2059 mpdevil:2708
#: mpdevil:918 mpdevil:1389 mpdevil:2068 mpdevil:2727
msgid "Artist"
msgstr "Interpret"
#: mpdevil:915 mpdevil:2060 mpdevil:2708
#: mpdevil:924 mpdevil:2069 mpdevil:2727
msgid "Album"
msgstr "Album"
#: mpdevil:921 mpdevil:1209 mpdevil:2061 mpdevil:2708
#: mpdevil:930 mpdevil:1218 mpdevil:2070 mpdevil:2727
msgid "Length"
msgstr "Länge"
#: mpdevil:981
#: mpdevil:990
#, python-format
msgid "%i hits"
msgstr "%i Treffer"
#: mpdevil:1082
#: mpdevil:1091
msgid "Append"
msgstr "Anhängen"
#: mpdevil:1083
#: mpdevil:1092
msgid "Add all titles to playlist"
msgstr "Alle Titel der Wiedergabeliste anhängen"
#: mpdevil:1084
#: mpdevil:1093
msgid "Play"
msgstr "Abspielen"
#: mpdevil:1085
#: mpdevil:1094
msgid "Directly play all titles"
msgstr "Alle Titel sofort abspielen"
#: mpdevil:1086
#: mpdevil:1095
msgid "Enqueue"
msgstr "Einreihen"
#: mpdevil:1087
#: mpdevil:1096
msgid ""
"Append all titles after the currently playing track and clear the playlist "
"from all other songs"
@ -91,49 +91,49 @@ msgstr ""
"Alle Titel hinter dem aktuellen Stück einreihen und die weitere "
"Wiedergabeliste leeren"
#: mpdevil:1215
#: mpdevil:1224
msgid "Close"
msgstr "Schließen"
#: mpdevil:1268
#: mpdevil:1277
msgid "all genres"
msgstr "Alle Genres"
#: mpdevil:1378
#: mpdevil:1387
msgid "Album Artist"
msgstr "Albuminterpret"
#: mpdevil:1381
#: mpdevil:1390
msgid "all artists"
msgstr "Alle Interpreten"
#: mpdevil:1554
#: mpdevil:1563
#, python-format
msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)"
msgstr "%(total_tracks)i Titel auf %(discs)i CDs (%(total_length)s)"
#: mpdevil:1556 mpdevil:2150
#: mpdevil:1565 mpdevil:2159
#, python-format
msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr "%(total_tracks)i Titel (%(total_length)s)"
#: mpdevil:1672
#: mpdevil:1681
msgid "Back to current album"
msgstr "Zurück zu aktuellem Album"
#: mpdevil:1673
#: mpdevil:1682
msgid "Search"
msgstr "Suche"
#: mpdevil:1827
#: mpdevil:1836
msgid "searching..."
msgstr "suche..."
#: mpdevil:1831
#: mpdevil:1840
msgid "lyrics not found"
msgstr "Liedtext nicht gefunden"
#: mpdevil:1901
#: mpdevil:1910
#, python-format
msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
@ -142,119 +142,123 @@ msgstr ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
"Kanäle, %(file_type)s"
#: mpdevil:2031
#: mpdevil:2040
msgid "Scroll to current song"
msgstr "Gehe zu aktuellem Lied"
#: mpdevil:2034
#: mpdevil:2043
msgid "Clear playlist"
msgstr "Wiedergabeliste leeren"
#: mpdevil:2057 mpdevil:2708
#: mpdevil:2066 mpdevil:2727
msgid "Disc"
msgstr "CD"
#: mpdevil:2062 mpdevil:2708
#: mpdevil:2071 mpdevil:2727
msgid "Year"
msgstr "Jahr"
#: mpdevil:2063 mpdevil:2708
#: mpdevil:2072 mpdevil:2727
msgid "Genre"
msgstr "Genre"
#: mpdevil:2280
#: mpdevil:2289
msgid "Show lyrics"
msgstr "Zeige Liedtext"
#: mpdevil:2372
#: mpdevil:2381
msgid "Main cover size:"
msgstr "Größe des Haupt-Covers:"
#: mpdevil:2373
#: mpdevil:2382
msgid "Album view cover size:"
msgstr "Covergröße in Albumliste:"
#: mpdevil:2374
#: mpdevil:2383
msgid "Action bar icon size:"
msgstr "Symbolgröße Aktionsleiste:"
#: mpdevil:2375
#: mpdevil:2384
msgid "Secondary icon size:"
msgstr "Sekundäre Symbolgröße:"
#: mpdevil:2384
#: mpdevil:2393
msgid "Sort albums by:"
msgstr "Sortiere Alben nach:"
#: mpdevil:2384
#: mpdevil:2393
msgid "name"
msgstr "Name"
#: mpdevil:2384
#: mpdevil:2393
msgid "year"
msgstr "Jahr"
#: mpdevil:2385
#: mpdevil:2394
msgid "Position of playlist:"
msgstr "Wiedergabelistenposition:"
#: mpdevil:2385
#: mpdevil:2394
msgid "bottom"
msgstr "unten"
#: mpdevil:2385
#: mpdevil:2394
msgid "right"
msgstr "rechts"
#: mpdevil:2399
#: mpdevil:2408
msgid "Use Client-side decoration"
msgstr "Benutze \"Client-side decoration\""
#: mpdevil:2400
#: mpdevil:2409
msgid "Show stop button"
msgstr "Zeige Stopp-Knopf"
#: mpdevil:2401
#: mpdevil:2410
msgid "Show lyrics button"
msgstr "Zeige Liedtext-Knopf"
#: mpdevil:2402
#: mpdevil:2411
msgid "Show initials in artist view"
msgstr "Zeige Anfangsbuchstaben in Interpretenliste"
#: mpdevil:2403
#: mpdevil:2412
msgid "Show tooltips in album view"
msgstr "Zeige Tooltips in Albumliste"
#: mpdevil:2404
#: mpdevil:2413
msgid "Use 'Album Artist' tag"
msgstr "Benutze \"Album Artist\" Tag"
#: mpdevil:2405
#: mpdevil:2414
msgid "Send notification on title change"
msgstr "Sende Benachrichtigung bei Titelwechsel"
#: mpdevil:2406
#: mpdevil:2415
msgid "Stop playback on quit"
msgstr "Wiedergabe beim Beenden stoppen"
#: mpdevil:2407
#: mpdevil:2416
msgid "Play selected albums and titles immediately"
msgstr "Ausgewählte Alben und Titel sofort abspielen"
#: mpdevil:2417
#: mpdevil:2426
msgid "<b>View</b>"
msgstr "<b>Ansicht</b>"
#: mpdevil:2418
#: mpdevil:2427
msgid "<b>Behavior</b>"
msgstr "<b>Verhalten</b>"
#: mpdevil:2446
#: mpdevil:2455
msgid "(restart required)"
msgstr "(Neustart erforderlich)"
#: mpdevil:2520
#: mpdevil:2517 mpdevil:3333
msgid "Connect"
msgstr "Verbinden"
#: mpdevil:2532
msgid ""
"The first image in the same directory as the song file matching this regex "
"will be displayed. %AlbumArtist% and %Album% will be replaced by the "
@ -264,113 +268,118 @@ msgstr ""
"regulären Ausdruck entspricht, wird angezeigt. %AlbumArtist% und %Album% "
"werden durch die entsprechenden Tags des Liedes ersetzt."
#: mpdevil:2522
#: mpdevil:2534
msgid "Profile:"
msgstr "Profil:"
#: mpdevil:2523
#: mpdevil:2535
msgid "Name:"
msgstr "Name:"
#: mpdevil:2524
#: mpdevil:2536
msgid "Host:"
msgstr "Host:"
#: mpdevil:2525
#: mpdevil:2537
msgid "Password:"
msgstr "Passwort:"
#: mpdevil:2526
#: mpdevil:2538
msgid "Music lib:"
msgstr "Musikverzeichnis:"
#: mpdevil:2527
#: mpdevil:2539
msgid "Cover regex:"
msgstr "Cover-Regex:"
#: mpdevil:2651
#: mpdevil:2670
msgid "Choose directory"
msgstr "Verzeichnis Wählen"
#: mpdevil:2684
#: mpdevil:2703
msgid "Choose the order of information to appear in the playlist:"
msgstr ""
"Lege die Reihenfolge fest, in der Informationen in der Wiedergabeliste "
"angezeigt werden sollen:"
#: mpdevil:2824 mpdevil:2832 mpdevil:3356
#: mpdevil:2843 mpdevil:2851 mpdevil:3423
msgid "Settings"
msgstr "Einstellungen"
#: mpdevil:2843
#: mpdevil:2862
msgid "General"
msgstr "Allgemein"
#: mpdevil:2844
#: mpdevil:2863
msgid "Profiles"
msgstr "Profile"
#: mpdevil:2845
#: mpdevil:2864
msgid "Playlist"
msgstr "Wiedergabeliste"
#: mpdevil:3100
#: mpdevil:3120
msgid "Random mode"
msgstr "Zufallsmodus"
#: mpdevil:3101
#: mpdevil:3121
msgid "Repeat mode"
msgstr "Dauerschleife"
#: mpdevil:3102
#: mpdevil:3122
msgid "Single mode"
msgstr "Einzelstückmodus"
#: mpdevil:3103
#: mpdevil:3123
msgid "Consume mode"
msgstr "Wiedergabeliste verbrauchen"
#: mpdevil:3204 mpdevil:3212
#: mpdevil:3224 mpdevil:3232
msgid "Stats"
msgstr "Statistik"
#: mpdevil:3261
#: mpdevil:3281
msgid "A small MPD client written in python"
msgstr ""
#: mpdevil:3273
#: mpdevil:3293
msgid "Select profile"
msgstr "Profil auswählen"
#: mpdevil:3357
#: mpdevil:3354
#, python-format
msgid "Connection to \"%(profile)s\" (%(host)s:%(port)s) failed"
msgstr "Verbindung zu \"%(profile)s\" (%(host)s:%(port)s) fehlgeschlagen"
#: mpdevil:3424
msgid "Help"
msgstr "Hilfe"
#: mpdevil:3358
#: mpdevil:3425
msgid "About"
msgstr "Über"
#: mpdevil:3359
#: mpdevil:3426
msgid "Quit"
msgstr "Beenden"
#: mpdevil:3362
#: mpdevil:3429
msgid "Save window layout"
msgstr "Fensterlayout speichern"
#: mpdevil:3363
#: mpdevil:3430
msgid "Update database"
msgstr "Datenbank aktualisieren"
#: mpdevil:3364
#: mpdevil:3431
msgid "Server stats"
msgstr "Serverstatistik"
#: mpdevil:3367
#: mpdevil:3434
msgid "Menu"
msgstr "Menü"
#: mpdevil:3457 mpdevil:3459
#: mpdevil:3527 mpdevil:3529
msgid "not connected"
msgstr "nicht verbunden"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-10 16:59+0200\n"
"POT-Creation-Date: 2020-09-10 21:43+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -37,329 +37,338 @@ msgstr ""
msgid "Unknown Album"
msgstr ""
#: mpdevil:898 mpdevil:1198 mpdevil:2056 mpdevil:2708
#: mpdevil:907 mpdevil:1207 mpdevil:2065 mpdevil:2727
msgid "No"
msgstr ""
#: mpdevil:903 mpdevil:1203 mpdevil:2058 mpdevil:2708
#: mpdevil:912 mpdevil:1212 mpdevil:2067 mpdevil:2727
msgid "Title"
msgstr ""
#: mpdevil:909 mpdevil:1380 mpdevil:2059 mpdevil:2708
#: mpdevil:918 mpdevil:1389 mpdevil:2068 mpdevil:2727
msgid "Artist"
msgstr ""
#: mpdevil:915 mpdevil:2060 mpdevil:2708
#: mpdevil:924 mpdevil:2069 mpdevil:2727
msgid "Album"
msgstr ""
#: mpdevil:921 mpdevil:1209 mpdevil:2061 mpdevil:2708
#: mpdevil:930 mpdevil:1218 mpdevil:2070 mpdevil:2727
msgid "Length"
msgstr ""
#: mpdevil:981
#: mpdevil:990
#, python-format
msgid "%i hits"
msgstr ""
#: mpdevil:1082
#: mpdevil:1091
msgid "Append"
msgstr ""
#: mpdevil:1083
#: mpdevil:1092
msgid "Add all titles to playlist"
msgstr ""
#: mpdevil:1084
#: mpdevil:1093
msgid "Play"
msgstr ""
#: mpdevil:1085
#: mpdevil:1094
msgid "Directly play all titles"
msgstr ""
#: mpdevil:1086
#: mpdevil:1095
msgid "Enqueue"
msgstr ""
#: mpdevil:1087
#: mpdevil:1096
msgid ""
"Append all titles after the currently playing track and clear the playlist "
"from all other songs"
msgstr ""
#: mpdevil:1215
#: mpdevil:1224
msgid "Close"
msgstr ""
#: mpdevil:1268
#: mpdevil:1277
msgid "all genres"
msgstr ""
#: mpdevil:1378
#: mpdevil:1387
msgid "Album Artist"
msgstr ""
#: mpdevil:1381
#: mpdevil:1390
msgid "all artists"
msgstr ""
#: mpdevil:1554
#: mpdevil:1563
#, python-format
msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)"
msgstr ""
#: mpdevil:1556 mpdevil:2150
#: mpdevil:1565 mpdevil:2159
#, python-format
msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr ""
#: mpdevil:1672
#: mpdevil:1681
msgid "Back to current album"
msgstr ""
#: mpdevil:1673
#: mpdevil:1682
msgid "Search"
msgstr ""
#: mpdevil:1827
#: mpdevil:1836
msgid "searching..."
msgstr ""
#: mpdevil:1831
#: mpdevil:1840
msgid "lyrics not found"
msgstr ""
#: mpdevil:1901
#: mpdevil:1910
#, python-format
msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
"channels, %(file_type)s"
msgstr ""
#: mpdevil:2031
#: mpdevil:2040
msgid "Scroll to current song"
msgstr ""
#: mpdevil:2034
#: mpdevil:2043
msgid "Clear playlist"
msgstr ""
#: mpdevil:2057 mpdevil:2708
#: mpdevil:2066 mpdevil:2727
msgid "Disc"
msgstr ""
#: mpdevil:2062 mpdevil:2708
#: mpdevil:2071 mpdevil:2727
msgid "Year"
msgstr ""
#: mpdevil:2063 mpdevil:2708
#: mpdevil:2072 mpdevil:2727
msgid "Genre"
msgstr ""
#: mpdevil:2280
#: mpdevil:2289
msgid "Show lyrics"
msgstr ""
#: mpdevil:2372
#: mpdevil:2381
msgid "Main cover size:"
msgstr ""
#: mpdevil:2373
#: mpdevil:2382
msgid "Album view cover size:"
msgstr ""
#: mpdevil:2374
#: mpdevil:2383
msgid "Action bar icon size:"
msgstr ""
#: mpdevil:2375
#: mpdevil:2384
msgid "Secondary icon size:"
msgstr ""
#: mpdevil:2384
#: mpdevil:2393
msgid "Sort albums by:"
msgstr ""
#: mpdevil:2384
#: mpdevil:2393
msgid "name"
msgstr ""
#: mpdevil:2384
#: mpdevil:2393
msgid "year"
msgstr ""
#: mpdevil:2385
#: mpdevil:2394
msgid "Position of playlist:"
msgstr ""
#: mpdevil:2385
#: mpdevil:2394
msgid "bottom"
msgstr ""
#: mpdevil:2385
#: mpdevil:2394
msgid "right"
msgstr ""
#: mpdevil:2399
#: mpdevil:2408
msgid "Use Client-side decoration"
msgstr ""
#: mpdevil:2400
#: mpdevil:2409
msgid "Show stop button"
msgstr ""
#: mpdevil:2401
#: mpdevil:2410
msgid "Show lyrics button"
msgstr ""
#: mpdevil:2402
#: mpdevil:2411
msgid "Show initials in artist view"
msgstr ""
#: mpdevil:2403
#: mpdevil:2412
msgid "Show tooltips in album view"
msgstr ""
#: mpdevil:2404
#: mpdevil:2413
msgid "Use 'Album Artist' tag"
msgstr ""
#: mpdevil:2405
#: mpdevil:2414
msgid "Send notification on title change"
msgstr ""
#: mpdevil:2406
#: mpdevil:2415
msgid "Stop playback on quit"
msgstr ""
#: mpdevil:2407
#: mpdevil:2416
msgid "Play selected albums and titles immediately"
msgstr ""
#: mpdevil:2417
#: mpdevil:2426
msgid "<b>View</b>"
msgstr ""
#: mpdevil:2418
#: mpdevil:2427
msgid "<b>Behavior</b>"
msgstr ""
#: mpdevil:2446
#: mpdevil:2455
msgid "(restart required)"
msgstr ""
#: mpdevil:2520
#: mpdevil:2517 mpdevil:3333
msgid "Connect"
msgstr ""
#: mpdevil:2532
msgid ""
"The first image in the same directory as the song file matching this regex "
"will be displayed. %AlbumArtist% and %Album% will be replaced by the "
"corresponding tags of the song."
msgstr ""
#: mpdevil:2522
#: mpdevil:2534
msgid "Profile:"
msgstr ""
#: mpdevil:2523
#: mpdevil:2535
msgid "Name:"
msgstr ""
#: mpdevil:2524
#: mpdevil:2536
msgid "Host:"
msgstr ""
#: mpdevil:2525
#: mpdevil:2537
msgid "Password:"
msgstr ""
#: mpdevil:2526
#: mpdevil:2538
msgid "Music lib:"
msgstr ""
#: mpdevil:2527
#: mpdevil:2539
msgid "Cover regex:"
msgstr ""
#: mpdevil:2651
#: mpdevil:2670
msgid "Choose directory"
msgstr ""
#: mpdevil:2684
#: mpdevil:2703
msgid "Choose the order of information to appear in the playlist:"
msgstr ""
#: mpdevil:2824 mpdevil:2832 mpdevil:3356
#: mpdevil:2843 mpdevil:2851 mpdevil:3423
msgid "Settings"
msgstr ""
#: mpdevil:2843
#: mpdevil:2862
msgid "General"
msgstr ""
#: mpdevil:2844
#: mpdevil:2863
msgid "Profiles"
msgstr ""
#: mpdevil:2845
#: mpdevil:2864
msgid "Playlist"
msgstr ""
#: mpdevil:3100
#: mpdevil:3120
msgid "Random mode"
msgstr ""
#: mpdevil:3101
#: mpdevil:3121
msgid "Repeat mode"
msgstr ""
#: mpdevil:3102
#: mpdevil:3122
msgid "Single mode"
msgstr ""
#: mpdevil:3103
#: mpdevil:3123
msgid "Consume mode"
msgstr ""
#: mpdevil:3204 mpdevil:3212
#: mpdevil:3224 mpdevil:3232
msgid "Stats"
msgstr ""
#: mpdevil:3261
#: mpdevil:3281
msgid "A small MPD client written in python"
msgstr ""
#: mpdevil:3273
#: mpdevil:3293
msgid "Select profile"
msgstr ""
#: mpdevil:3357
#: mpdevil:3354
#, python-format
msgid "Connection to \"%(profile)s\" (%(host)s:%(port)s) failed"
msgstr ""
#: mpdevil:3424
msgid "Help"
msgstr ""
#: mpdevil:3358
#: mpdevil:3425
msgid "About"
msgstr ""
#: mpdevil:3359
#: mpdevil:3426
msgid "Quit"
msgstr ""
#: mpdevil:3362
#: mpdevil:3429
msgid "Save window layout"
msgstr ""
#: mpdevil:3363
#: mpdevil:3430
msgid "Update database"
msgstr ""
#: mpdevil:3364
#: mpdevil:3431
msgid "Server stats"
msgstr ""
#: mpdevil:3367
#: mpdevil:3434
msgid "Menu"
msgstr ""
#: mpdevil:3457 mpdevil:3459
#: mpdevil:3527 mpdevil:3529
msgid "not connected"
msgstr ""