From 053dbbe08f0edb79483bbe9e6b5736aca06e4fcb Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Thu, 10 Sep 2020 21:45:57 +0200 Subject: [PATCH] fixed gui stall caused by auto reconnect --- bin/mpdevil | 120 ++++++++++++++++++++++++++-------- po/de.po | 171 ++++++++++++++++++++++++++----------------------- po/mpdevil.pot | 169 +++++++++++++++++++++++++----------------------- 3 files changed, 274 insertions(+), 186 deletions(-) diff --git a/bin/mpdevil b/bin/mpdevil index e114534..f51795a 100755 --- a/bin/mpdevil +++ b/bin/mpdevil @@ -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() diff --git a/po/de.po b/po/de.po index 70c4fe8..75c6a11 100644 --- a/po/de.po +++ b/po/de.po @@ -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 "View" msgstr "Ansicht" -#: mpdevil:2418 +#: mpdevil:2427 msgid "Behavior" msgstr "Verhalten" -#: 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" diff --git a/po/mpdevil.pot b/po/mpdevil.pot index 5bbfa6b..8c608ce 100644 --- a/po/mpdevil.pot +++ b/po/mpdevil.pot @@ -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 \n" "Language-Team: LANGUAGE \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 "View" msgstr "" -#: mpdevil:2418 +#: mpdevil:2427 msgid "Behavior" 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 ""