made cover regex configurable

This commit is contained in:
Martin Wagner
2020-08-04 19:37:54 +02:00
parent 98c6f35e66
commit 2a260af2f3
4 changed files with 255 additions and 179 deletions

View File

@@ -45,6 +45,7 @@ DATADIR='@datadir@'
NAME='mpdevil' NAME='mpdevil'
VERSION='@version@' VERSION='@version@'
PACKAGE=NAME.lower() PACKAGE=NAME.lower()
COVER_REGEX="^\.?(album|cover|folder|front).*\.(gif|jpeg|jpg|png)$"
################# #################
# lang settings # # lang settings #
@@ -314,7 +315,7 @@ class MPRISInterface(dbus.service.Object): # TODO emit Seeked if needed
if 'file' in mpd_meta: if 'file' in mpd_meta:
song_file=mpd_meta['file'] song_file=mpd_meta['file']
self.metadata['xesam:url']="file://"+os.path.join(self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file) self.metadata['xesam:url']="file://"+os.path.join(self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file)
cover=Cover(lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=song_file) cover=Cover(self.settings, mpd_meta)
if not cover.path == None: if not cover.path == None:
self.metadata['mpris:artUrl']="file://"+cover.path self.metadata['mpris:artUrl']="file://"+cover.path
else: else:
@@ -671,18 +672,42 @@ class SongPopover(Gtk.Popover):
frame.show_all() frame.show_all()
class Cover(object): class Cover(object):
regex=re.compile(r'^\.?(album|cover|folder|front).*\.(gif|jpeg|jpg|png)$', flags=re.IGNORECASE) def __init__(self, settings, song):
def __init__(self, lib_path, song_file):
self.lib_path=lib_path or ""
self.path=None self.path=None
if not song_file == None: if song != {}:
head, tail=os.path.split(song_file) song_file=song["file"]
song_dir=os.path.join(self.lib_path, head)
if os.path.exists(song_dir): active_profile=settings.get_int("active-profile")
for f in os.listdir(song_dir):
if self.regex.match(f): self.lib_path=settings.get_value("paths")[active_profile]
self.path=os.path.join(song_dir, f) regex_str=settings.get_value("regex")[active_profile]
break
if regex_str == "":
self.regex=re.compile(r''+COVER_REGEX+'', flags=re.IGNORECASE)
else:
try:
artist=song["albumartist"]
except:
artist=""
try:
album=song["album"]
except:
album=""
regex_str=regex_str.replace("%AlbumArtist%", artist)
regex_str=regex_str.replace("%Album%", album)
try:
self.regex=re.compile(r''+regex_str+'', flags=re.IGNORECASE)
except:
print("illegal regex:", regex_str)
if not song_file == None:
head, tail=os.path.split(song_file)
song_dir=os.path.join(self.lib_path, head)
if os.path.exists(song_dir):
for f in os.listdir(song_dir):
if self.regex.match(f):
self.path=os.path.join(song_dir, f)
break
def get_pixbuf(self, size): def get_pixbuf(self, size):
if self.path == None: if self.path == None:
@@ -923,8 +948,18 @@ class Settings(Gio.Settings):
BASE_KEY="org.mpdevil" BASE_KEY="org.mpdevil"
def __init__(self): def __init__(self):
super().__init__(schema=self.BASE_KEY) super().__init__(schema=self.BASE_KEY)
# fix profile settings
if len(self.get_value("profiles")) < (self.get_int("active-profile")+1): if len(self.get_value("profiles")) < (self.get_int("active-profile")+1):
self.set_int("active-profile", 0) self.set_int("active-profile", 0)
profile_keys=[('as', "profiles", "new profile"), ('as', "hosts", "localhost"), ('ai', "ports", 6600), ('as', "passwords", ""), ('as', "paths", ""), ('as', "regex", "")]
profile_arrays=[]
for vtype, key, default in profile_keys:
profile_arrays.append(self.get_value(key).unpack())
max_len=max(len(x) for x in profile_arrays)
for index, (vtype, key, default) in enumerate(profile_keys):
profile_arrays[index]=(profile_arrays[index]+max_len*[default])[:max_len]
self.set_value(key, GLib.Variant(vtype, profile_arrays[index]))
def array_append(self, vtype, key, value): # append to Gio.Settings (self.settings) array def array_append(self, vtype, key, value): # append to Gio.Settings (self.settings) array
array=self.get_value(key).unpack() array=self.get_value(key).unpack()
@@ -1637,11 +1672,10 @@ class AlbumIconView(Gtk.IconView):
albums=sorted(albums, key=lambda k: k['year']) albums=sorted(albums, key=lambda k: k['year'])
else: else:
albums=sorted(albums, key=lambda k: k['album']) albums=sorted(albums, key=lambda k: k['album'])
music_lib=self.settings.get_value("paths")[self.settings.get_int("active-profile")]
size=self.settings.get_int("album-cover") size=self.settings.get_int("album-cover")
for i, album in enumerate(albums): for i, album in enumerate(albums):
if not self.stop_flag: if not self.stop_flag:
cover=Cover(lib_path=music_lib, song_file=album["songs"][0]["file"]).get_pixbuf(size) cover=Cover(self.settings, album["songs"][0]).get_pixbuf(size)
# tooltip # tooltip
length_human_readable=ClientHelper.calc_display_length(album["songs"]) length_human_readable=ClientHelper.calc_display_length(album["songs"])
try: try:
@@ -2022,7 +2056,7 @@ class MainCover(Gtk.Frame):
# cover # cover
self.cover=Gtk.Image.new() self.cover=Gtk.Image.new()
size=self.settings.get_int("track-cover") size=self.settings.get_int("track-cover")
self.cover.set_from_pixbuf(Cover(lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=None).get_pixbuf(size)) # set to fallback cover self.cover.set_from_pixbuf(Cover(self.settings, {}).get_pixbuf(size)) # set to fallback cover
# set default size # set default size
self.cover.set_size_request(size, size) self.cover.set_size_request(size, size)
@@ -2035,15 +2069,11 @@ class MainCover(Gtk.Frame):
self.add(event_box) self.add(event_box)
def refresh(self, *args): def refresh(self, *args):
try: current_song=self.client.wrapped_call("currentsong")
current_song=self.client.wrapped_call("currentsong") self.cover.set_from_pixbuf(Cover(self.settings, current_song).get_pixbuf(self.settings.get_int("track-cover")))
song_file=current_song['file']
except:
song_file=None
self.cover.set_from_pixbuf(Cover(lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=song_file).get_pixbuf(self.settings.get_int("track-cover")))
def clear(self, *args): def clear(self, *args):
self.cover.set_from_pixbuf(Cover(lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=None).get_pixbuf(self.settings.get_int("track-cover"))) self.cover.set_from_pixbuf(Cover(self.settings, {}).get_pixbuf(self.settings.get_int("track-cover")))
self.song_file=None self.song_file=None
def on_button_press_event(self, widget, event): def on_button_press_event(self, widget, event):
@@ -2556,7 +2586,7 @@ class ProfileSettings(Gtk.Grid):
self.gui_modification=False # indicates whether the settings were changed from the settings dialog self.gui_modification=False # indicates whether the settings were changed from the settings dialog
# widgets # widgets
self.profiles_combo=Gtk.ComboBoxText() self.profiles_combo=Gtk.ComboBoxText(hexpand=True)
self.profiles_combo.set_entry_text_column(0) self.profiles_combo.set_entry_text_column(0)
add_button=Gtk.Button(label=None, image=Gtk.Image(stock=Gtk.STOCK_ADD)) add_button=Gtk.Button(label=None, image=Gtk.Image(stock=Gtk.STOCK_ADD))
@@ -2566,19 +2596,22 @@ class ProfileSettings(Gtk.Grid):
add_delete_buttons.pack_start(add_button, True, True, 0) add_delete_buttons.pack_start(add_button, True, True, 0)
add_delete_buttons.pack_start(delete_button, True, True, 0) add_delete_buttons.pack_start(delete_button, True, True, 0)
self.profile_entry=Gtk.Entry() self.profile_entry=Gtk.Entry(hexpand=True)
self.host_entry=Gtk.Entry() self.host_entry=Gtk.Entry(hexpand=True)
self.port_entry=IntEntry(0, 0, 65535, 1) self.port_entry=IntEntry(0, 0, 65535, 1)
address_entry=Gtk.Box(spacing=6) address_entry=Gtk.Box(spacing=6)
address_entry.pack_start(self.host_entry, True, True, 0) address_entry.pack_start(self.host_entry, True, True, 0)
address_entry.pack_start(self.port_entry, False, False, 0) address_entry.pack_start(self.port_entry, False, False, 0)
self.password_entry=Gtk.Entry() self.password_entry=Gtk.Entry(hexpand=True)
self.password_entry.set_visibility(False) self.password_entry.set_visibility(False)
self.path_entry=Gtk.Entry() self.path_entry=Gtk.Entry(hexpand=True)
self.path_select_button=Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_OPEN)) self.path_select_button=Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_OPEN))
path_box=Gtk.Box(spacing=6) path_box=Gtk.Box(spacing=6)
path_box.pack_start(self.path_entry, True, True, 0) path_box.pack_start(self.path_entry, True, True, 0)
path_box.pack_start(self.path_select_button, False, False, 0) path_box.pack_start(self.path_select_button, False, False, 0)
self.regex_entry=Gtk.Entry(hexpand=True)
self.regex_entry.set_property("placeholder-text", COVER_REGEX)
self.regex_entry.set_tooltip_text(_("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."))
profiles_label=Gtk.Label(label=_("Profile:")) profiles_label=Gtk.Label(label=_("Profile:"))
profiles_label.set_xalign(1) profiles_label.set_xalign(1)
@@ -2590,6 +2623,8 @@ class ProfileSettings(Gtk.Grid):
password_label.set_xalign(1) password_label.set_xalign(1)
path_label=Gtk.Label(label=_("Music lib:")) path_label=Gtk.Label(label=_("Music lib:"))
path_label.set_xalign(1) path_label.set_xalign(1)
regex_label=Gtk.Label(label=_("Cover regex:"))
regex_label.set_xalign(1)
# connect # connect
add_button.connect("clicked", self.on_add_button_clicked) add_button.connect("clicked", self.on_add_button_clicked)
@@ -2602,12 +2637,14 @@ class ProfileSettings(Gtk.Grid):
self.entry_changed_handlers.append((self.port_entry, self.port_entry.connect("value-changed", self.on_port_entry_changed))) self.entry_changed_handlers.append((self.port_entry, self.port_entry.connect("value-changed", self.on_port_entry_changed)))
self.entry_changed_handlers.append((self.password_entry, self.password_entry.connect("changed", self.on_password_entry_changed))) self.entry_changed_handlers.append((self.password_entry, self.password_entry.connect("changed", self.on_password_entry_changed)))
self.entry_changed_handlers.append((self.path_entry, self.path_entry.connect("changed", self.on_path_entry_changed))) self.entry_changed_handlers.append((self.path_entry, self.path_entry.connect("changed", self.on_path_entry_changed)))
self.entry_changed_handlers.append((self.regex_entry, self.regex_entry.connect("changed", self.on_regex_entry_changed)))
self.settings_handlers=[] self.settings_handlers=[]
self.settings_handlers.append(self.settings.connect("changed::profiles", self.on_settings_changed)) self.settings_handlers.append(self.settings.connect("changed::profiles", self.on_settings_changed))
self.settings_handlers.append(self.settings.connect("changed::hosts", self.on_settings_changed)) self.settings_handlers.append(self.settings.connect("changed::hosts", self.on_settings_changed))
self.settings_handlers.append(self.settings.connect("changed::ports", self.on_settings_changed)) self.settings_handlers.append(self.settings.connect("changed::ports", self.on_settings_changed))
self.settings_handlers.append(self.settings.connect("changed::passwords", self.on_settings_changed)) self.settings_handlers.append(self.settings.connect("changed::passwords", self.on_settings_changed))
self.settings_handlers.append(self.settings.connect("changed::paths", self.on_settings_changed)) self.settings_handlers.append(self.settings.connect("changed::paths", self.on_settings_changed))
self.settings_handlers.append(self.settings.connect("changed::regex", self.on_settings_changed))
self.connect("destroy", self.remove_handlers) self.connect("destroy", self.remove_handlers)
self.profiles_combo_reload() self.profiles_combo_reload()
@@ -2619,12 +2656,14 @@ class ProfileSettings(Gtk.Grid):
self.attach_next_to(host_label, profile_label, Gtk.PositionType.BOTTOM, 1, 1) self.attach_next_to(host_label, profile_label, Gtk.PositionType.BOTTOM, 1, 1)
self.attach_next_to(password_label, host_label, Gtk.PositionType.BOTTOM, 1, 1) self.attach_next_to(password_label, host_label, Gtk.PositionType.BOTTOM, 1, 1)
self.attach_next_to(path_label, password_label, Gtk.PositionType.BOTTOM, 1, 1) self.attach_next_to(path_label, password_label, Gtk.PositionType.BOTTOM, 1, 1)
self.attach_next_to(regex_label, path_label, Gtk.PositionType.BOTTOM, 1, 1)
self.attach_next_to(self.profiles_combo, profiles_label, Gtk.PositionType.RIGHT, 2, 1) self.attach_next_to(self.profiles_combo, profiles_label, Gtk.PositionType.RIGHT, 2, 1)
self.attach_next_to(add_delete_buttons, self.profiles_combo, Gtk.PositionType.RIGHT, 1, 1) self.attach_next_to(add_delete_buttons, self.profiles_combo, Gtk.PositionType.RIGHT, 1, 1)
self.attach_next_to(self.profile_entry, profile_label, Gtk.PositionType.RIGHT, 2, 1) self.attach_next_to(self.profile_entry, profile_label, Gtk.PositionType.RIGHT, 2, 1)
self.attach_next_to(address_entry, host_label, Gtk.PositionType.RIGHT, 2, 1) self.attach_next_to(address_entry, host_label, Gtk.PositionType.RIGHT, 2, 1)
self.attach_next_to(self.password_entry, password_label, Gtk.PositionType.RIGHT, 2, 1) 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(path_box, path_label, Gtk.PositionType.RIGHT, 2, 1)
self.attach_next_to(self.regex_entry, regex_label, Gtk.PositionType.RIGHT, 2, 1)
def remove_handlers(self, *args): def remove_handlers(self, *args):
for handler in self.settings_handlers: for handler in self.settings_handlers:
@@ -2661,6 +2700,7 @@ class ProfileSettings(Gtk.Grid):
self.settings.array_append('ai', "ports", 6600) self.settings.array_append('ai', "ports", 6600)
self.settings.array_append('as', "passwords", "") self.settings.array_append('as', "passwords", "")
self.settings.array_append('as', "paths", "") self.settings.array_append('as', "paths", "")
self.settings.array_append('as', "regex", "")
self.profiles_combo_reload() self.profiles_combo_reload()
self.profiles_combo.set_active(pos) self.profiles_combo.set_active(pos)
@@ -2671,6 +2711,7 @@ class ProfileSettings(Gtk.Grid):
self.settings.array_delete('ai', "ports", pos) self.settings.array_delete('ai', "ports", pos)
self.settings.array_delete('as', "passwords", pos) self.settings.array_delete('as', "passwords", pos)
self.settings.array_delete('as', "paths", pos) self.settings.array_delete('as', "paths", pos)
self.settings.array_delete('as', "regex", pos)
if len(self.settings.get_value("profiles")) == 0: if len(self.settings.get_value("profiles")) == 0:
self.on_add_button_clicked() self.on_add_button_clicked()
else: else:
@@ -2700,6 +2741,10 @@ class ProfileSettings(Gtk.Grid):
self.gui_modification=True self.gui_modification=True
self.settings.array_modify('as', "paths", self.profiles_combo.get_active(), self.path_entry.get_text()) self.settings.array_modify('as', "paths", self.profiles_combo.get_active(), self.path_entry.get_text())
def on_regex_entry_changed(self, *args):
self.gui_modification=True
self.settings.array_modify('as', "regex", self.profiles_combo.get_active(), self.regex_entry.get_text())
def on_path_select_button_clicked(self, widget, parent): def on_path_select_button_clicked(self, widget, parent):
dialog=Gtk.FileChooserDialog(title=_("Choose directory"), transient_for=parent, action=Gtk.FileChooserAction.SELECT_FOLDER) dialog=Gtk.FileChooserDialog(title=_("Choose directory"), transient_for=parent, action=Gtk.FileChooserAction.SELECT_FOLDER)
dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
@@ -2722,6 +2767,7 @@ class ProfileSettings(Gtk.Grid):
self.port_entry.set_int(self.settings.get_value("ports")[active]) self.port_entry.set_int(self.settings.get_value("ports")[active])
self.password_entry.set_text(self.settings.get_value("passwords")[active]) self.password_entry.set_text(self.settings.get_value("passwords")[active])
self.path_entry.set_text(self.settings.get_value("paths")[active]) self.path_entry.set_text(self.settings.get_value("paths")[active])
self.regex_entry.set_text(self.settings.get_value("regex")[active])
self.unblock_entry_changed_handlers() self.unblock_entry_changed_handlers()
@@ -3476,7 +3522,7 @@ class MainWindow(Gtk.ApplicationWindow):
if self.settings.get_boolean("send-notify"): if self.settings.get_boolean("send-notify"):
if not self.is_active() and self.client.wrapped_call("status")["state"] == "play": if not self.is_active() and self.client.wrapped_call("status")["state"] == "play":
notify=Notify.Notification.new(song["title"], song["artist"]+"\n"+song["album"]+date) notify=Notify.Notification.new(song["title"], song["artist"]+"\n"+song["album"]+date)
pixbuf=Cover(lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=song["file"]).get_pixbuf(400) pixbuf=Cover(self.settings, song).get_pixbuf(400)
notify.set_image_from_pixbuf(pixbuf) notify.set_image_from_pixbuf(pixbuf)
notify.show() notify.show()

View File

@@ -146,5 +146,10 @@
<summary>List of library paths</summary> <summary>List of library paths</summary>
<description></description> <description></description>
</key> </key>
<key type="as" name="regex">
<default>[""]</default>
<summary>List of cover regex</summary>
<description></description>
</key>
</schema> </schema>
</schemalist> </schemalist>

166
po/de.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-13 19:18+0200\n" "POT-Creation-Date: 2020-08-04 19:29+0200\n"
"PO-Revision-Date: 2020-07-13 19:19+0200\n" "PO-Revision-Date: 2020-08-04 19:33+0200\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: de\n" "Language: de\n"
@@ -18,102 +18,102 @@ msgstr ""
"X-Generator: Poedit 2.3.1\n" "X-Generator: Poedit 2.3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mpdevil.py:650 #: mpdevil.py:651
msgid "MPD-Tag" msgid "MPD-Tag"
msgstr "MPD-Tag" msgstr "MPD-Tag"
#: mpdevil.py:654 #: mpdevil.py:655
msgid "Value" msgid "Value"
msgstr "Wert" msgstr "Wert"
#: mpdevil.py:712 #: mpdevil.py:737
msgid "Unknown Title" msgid "Unknown Title"
msgstr "Unbekannter Titel" msgstr "Unbekannter Titel"
#: mpdevil.py:712 #: mpdevil.py:737
msgid "Unknown Artist" msgid "Unknown Artist"
msgstr "Unbekannter Interpret" msgstr "Unbekannter Interpret"
#: mpdevil.py:712 #: mpdevil.py:737
msgid "Unknown Album" msgid "Unknown Album"
msgstr "Unbekanntes Album" msgstr "Unbekanntes Album"
#: mpdevil.py:989 mpdevil.py:1358 mpdevil.py:2108 mpdevil.py:2763 #: mpdevil.py:1026 mpdevil.py:1395 mpdevil.py:2140 mpdevil.py:2811
msgid "No" msgid "No"
msgstr "Nr." msgstr "Nr."
#: mpdevil.py:994 mpdevil.py:1363 mpdevil.py:2114 mpdevil.py:2763 #: mpdevil.py:1031 mpdevil.py:1400 mpdevil.py:2146 mpdevil.py:2811
msgid "Title" msgid "Title"
msgstr "Titel" msgstr "Titel"
#: mpdevil.py:1000 mpdevil.py:1502 mpdevil.py:2117 mpdevil.py:2763 #: mpdevil.py:1037 mpdevil.py:1539 mpdevil.py:2149 mpdevil.py:2811
msgid "Artist" msgid "Artist"
msgstr "Interpret" msgstr "Interpret"
#: mpdevil.py:1006 mpdevil.py:2120 mpdevil.py:2763 #: mpdevil.py:1043 mpdevil.py:2152 mpdevil.py:2811
msgid "Album" msgid "Album"
msgstr "Album" msgstr "Album"
#: mpdevil.py:1012 mpdevil.py:1369 mpdevil.py:2123 mpdevil.py:2763 #: mpdevil.py:1049 mpdevil.py:1406 mpdevil.py:2155 mpdevil.py:2811
msgid "Length" msgid "Length"
msgstr "Länge" msgstr "Länge"
#: mpdevil.py:1029 #: mpdevil.py:1066
msgid "Add" msgid "Add"
msgstr "Hinzufügen" msgstr "Hinzufügen"
#: mpdevil.py:1032 #: mpdevil.py:1069
msgid "Play" msgid "Play"
msgstr "Wiedergabe" msgstr "Wiedergabe"
#: mpdevil.py:1035 #: mpdevil.py:1072
msgid "Open" msgid "Open"
msgstr "Öffnen" msgstr "Öffnen"
#: mpdevil.py:1095 #: mpdevil.py:1132
#, python-format #, python-format
msgid "hits: %i" msgid "hits: %i"
msgstr "Treffer: %i" msgstr "Treffer: %i"
#: mpdevil.py:1174 #: mpdevil.py:1211
msgid "searching..." msgid "searching..."
msgstr "suche..." msgstr "suche..."
#: mpdevil.py:1178 #: mpdevil.py:1215
msgid "lyrics not found" msgid "lyrics not found"
msgstr "Liedtext nicht gefunden" msgstr "Liedtext nicht gefunden"
#: mpdevil.py:1412 #: mpdevil.py:1449
msgid "all genres" msgid "all genres"
msgstr "Alle Genres" msgstr "Alle Genres"
#: mpdevil.py:1500 #: mpdevil.py:1537
msgid "Album Artist" msgid "Album Artist"
msgstr "Albuminterpret" msgstr "Albuminterpret"
#: mpdevil.py:1503 #: mpdevil.py:1540
msgid "all artists" msgid "all artists"
msgstr "Alle Interpreten" msgstr "Alle Interpreten"
#: mpdevil.py:1650 #: mpdevil.py:1686
#, python-format #, python-format
msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)" msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)"
msgstr "%(total_tracks)i Titel auf %(discs)i CDs (%(total_length)s)" msgstr "%(total_tracks)i Titel auf %(discs)i CDs (%(total_length)s)"
#: mpdevil.py:1652 mpdevil.py:2209 #: mpdevil.py:1688 mpdevil.py:2241
#, python-format #, python-format
msgid "%(total_tracks)i titles (%(total_length)s)" msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr "%(total_tracks)i Titel (%(total_length)s)" msgstr "%(total_tracks)i Titel (%(total_length)s)"
#: mpdevil.py:1827 #: mpdevil.py:1863
msgid "Back to current album" msgid "Back to current album"
msgstr "Zurück zu aktuellem Album" msgstr "Zurück zu aktuellem Album"
#: mpdevil.py:1829 #: mpdevil.py:1865
msgid "Search" msgid "Search"
msgstr "Suche" msgstr "Suche"
#: mpdevil.py:1974 #: mpdevil.py:2010
#, python-format #, python-format
msgid "" msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i " "%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i "
@@ -122,205 +122,219 @@ msgstr ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i " "%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i "
"Kanäle, %(file_type)s" "Kanäle, %(file_type)s"
#: mpdevil.py:2111 mpdevil.py:2763 #: mpdevil.py:2143 mpdevil.py:2811
msgid "Disc" msgid "Disc"
msgstr "CD" msgstr "CD"
#: mpdevil.py:2126 mpdevil.py:2763 #: mpdevil.py:2158 mpdevil.py:2811
msgid "Year" msgid "Year"
msgstr "Jahr" msgstr "Jahr"
#: mpdevil.py:2129 mpdevil.py:2763 #: mpdevil.py:2161 mpdevil.py:2811
msgid "Genre" msgid "Genre"
msgstr "Genre" msgstr "Genre"
#: mpdevil.py:2319 #: mpdevil.py:2351
msgid "Show lyrics" msgid "Show lyrics"
msgstr "Zeige Liedtext" msgstr "Zeige Liedtext"
#: mpdevil.py:2418 #: mpdevil.py:2450
msgid "Main cover size:" msgid "Main cover size:"
msgstr "Größe des Haupt-Covers:" msgstr "Größe des Haupt-Covers:"
#: mpdevil.py:2419 #: mpdevil.py:2451
msgid "Album view cover size:" msgid "Album view cover size:"
msgstr "Covergröße in Albumliste:" msgstr "Covergröße in Albumliste:"
#: mpdevil.py:2420 #: mpdevil.py:2452
msgid "Button icon size:" msgid "Button icon size:"
msgstr "Symbolgröße der Knöpfe:" msgstr "Symbolgröße der Knöpfe:"
#: mpdevil.py:2430 #: mpdevil.py:2462
msgid "Sort albums by:" msgid "Sort albums by:"
msgstr "Sortiere Alben nach:" msgstr "Sortiere Alben nach:"
#: mpdevil.py:2430 #: mpdevil.py:2462
msgid "name" msgid "name"
msgstr "Name" msgstr "Name"
#: mpdevil.py:2430 #: mpdevil.py:2462
msgid "year" msgid "year"
msgstr "Jahr" msgstr "Jahr"
#: mpdevil.py:2431 #: mpdevil.py:2463
msgid "Position of playlist:" msgid "Position of playlist:"
msgstr "Wiedergabelistenposition:" msgstr "Wiedergabelistenposition:"
#: mpdevil.py:2431 #: mpdevil.py:2463
msgid "bottom" msgid "bottom"
msgstr "unten" msgstr "unten"
#: mpdevil.py:2431 #: mpdevil.py:2463
msgid "right" msgid "right"
msgstr "rechts" msgstr "rechts"
#: mpdevil.py:2448 #: mpdevil.py:2480
msgid "Use Client-side decoration" msgid "Use Client-side decoration"
msgstr "Benutze \"Client-side decoration\"" msgstr "Benutze \"Client-side decoration\""
#: mpdevil.py:2449 #: mpdevil.py:2481
msgid "Show stop button" msgid "Show stop button"
msgstr "Zeige Stopp-Knopf" msgstr "Zeige Stopp-Knopf"
#: mpdevil.py:2450 #: mpdevil.py:2482
msgid "Show lyrics button" msgid "Show lyrics button"
msgstr "Zeige Liedtext-Knopf" msgstr "Zeige Liedtext-Knopf"
#: mpdevil.py:2451 #: mpdevil.py:2483
msgid "Show initials in artist view" msgid "Show initials in artist view"
msgstr "Zeige Anfangsbuchstaben in Interpretenliste" msgstr "Zeige Anfangsbuchstaben in Interpretenliste"
#: mpdevil.py:2452 #: mpdevil.py:2484
msgid "Show tooltips in album view" msgid "Show tooltips in album view"
msgstr "Zeige Tooltips in Albumliste" msgstr "Zeige Tooltips in Albumliste"
#: mpdevil.py:2453 #: mpdevil.py:2485
msgid "Use 'Album Artist' tag" msgid "Use 'Album Artist' tag"
msgstr "Benutze \"Album Artist\" Tag" msgstr "Benutze \"Album Artist\" Tag"
#: mpdevil.py:2454 #: mpdevil.py:2486
msgid "Send notification on title change" msgid "Send notification on title change"
msgstr "Sende Benachrichtigung bei Titelwechsel" msgstr "Sende Benachrichtigung bei Titelwechsel"
#: mpdevil.py:2455 #: mpdevil.py:2487
msgid "Stop playback on quit" msgid "Stop playback on quit"
msgstr "Wiedergabe beim Beenden stoppen" msgstr "Wiedergabe beim Beenden stoppen"
#: mpdevil.py:2456 #: mpdevil.py:2488
msgid "Play selected albums and titles immediately" msgid "Play selected albums and titles immediately"
msgstr "Ausgewählte Alben und Titel sofort abspielen" msgstr "Ausgewählte Alben und Titel sofort abspielen"
#: mpdevil.py:2467 #: mpdevil.py:2499
msgid "<b>View</b>" msgid "<b>View</b>"
msgstr "<b>Ansicht</b>" msgstr "<b>Ansicht</b>"
#: mpdevil.py:2470 #: mpdevil.py:2502
msgid "<b>Behavior</b>" msgid "<b>Behavior</b>"
msgstr "<b>Verhalten</b>" msgstr "<b>Verhalten</b>"
#: mpdevil.py:2501 #: mpdevil.py:2533
msgid "(restart required)" msgid "(restart required)"
msgstr "(Neustart erforderlich)" msgstr "(Neustart erforderlich)"
#: mpdevil.py:2581 #: mpdevil.py:2614
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 ""
"Das erste Bild im gleichen Verzeichnis wie die Musikdatei, welches dem "
"regulären Ausdruck entspricht, wird angezeigt. %AlbumArtist% und %Album% "
"werden durch die entsprechenden Tags des Liedes ersetzt."
#: mpdevil.py:2616
msgid "Profile:" msgid "Profile:"
msgstr "Profil:" msgstr "Profil:"
#: mpdevil.py:2583 #: mpdevil.py:2618
msgid "Name:" msgid "Name:"
msgstr "Name:" msgstr "Name:"
#: mpdevil.py:2585 #: mpdevil.py:2620
msgid "Host:" msgid "Host:"
msgstr "Host:" msgstr "Host:"
#: mpdevil.py:2587 #: mpdevil.py:2622
msgid "Password:" msgid "Password:"
msgstr "Passwort:" msgstr "Passwort:"
#: mpdevil.py:2589 #: mpdevil.py:2624
msgid "Music lib:" msgid "Music lib:"
msgstr "Musikverzeichnis:" msgstr "Musikverzeichnis:"
#: mpdevil.py:2702 #: mpdevil.py:2626
msgid "Cover regex:"
msgstr "Cover-Regex:"
#: mpdevil.py:2749
msgid "Choose directory" msgid "Choose directory"
msgstr "Verzeichnis Wählen" msgstr "Verzeichnis Wählen"
#: mpdevil.py:2735 #: mpdevil.py:2783
msgid "Choose the order of information to appear in the playlist:" msgid "Choose the order of information to appear in the playlist:"
msgstr "" msgstr ""
"Lege die Reihenfolge fest, in der Informationen in der Wiedergabeliste " "Lege die Reihenfolge fest, in der Informationen in der Wiedergabeliste "
"angezeigt werden sollen:" "angezeigt werden sollen:"
#: mpdevil.py:2877 mpdevil.py:3390 #: mpdevil.py:2925 mpdevil.py:3435
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
#: mpdevil.py:2891 #: mpdevil.py:2939
msgid "General" msgid "General"
msgstr "Allgemein" msgstr "Allgemein"
#: mpdevil.py:2892 #: mpdevil.py:2940
msgid "Profiles" msgid "Profiles"
msgstr "Profile" msgstr "Profile"
#: mpdevil.py:2893 #: mpdevil.py:2941
msgid "Playlist" msgid "Playlist"
msgstr "Wiedergabeliste" msgstr "Wiedergabeliste"
#: mpdevil.py:3155 #: mpdevil.py:3200
msgid "Random mode" msgid "Random mode"
msgstr "Zufallsmodus" msgstr "Zufallsmodus"
#: mpdevil.py:3157 #: mpdevil.py:3202
msgid "Repeat mode" msgid "Repeat mode"
msgstr "Dauerschleife" msgstr "Dauerschleife"
#: mpdevil.py:3159 #: mpdevil.py:3204
msgid "Single mode" msgid "Single mode"
msgstr "Einzelstückmodus" msgstr "Einzelstückmodus"
#: mpdevil.py:3161 #: mpdevil.py:3206
msgid "Consume mode" msgid "Consume mode"
msgstr "Wiedergabeliste verbrauchen" msgstr "Wiedergabeliste verbrauchen"
#: mpdevil.py:3238 #: mpdevil.py:3283
msgid "Stats" msgid "Stats"
msgstr "Statistik" msgstr "Statistik"
#: mpdevil.py:3291 #: mpdevil.py:3336
msgid "A small MPD client written in python" msgid "A small MPD client written in python"
msgstr "" msgstr ""
#: mpdevil.py:3383 #: mpdevil.py:3428
msgid "Select profile" msgid "Select profile"
msgstr "Profil auswählen" msgstr "Profil auswählen"
#: mpdevil.py:3391 #: mpdevil.py:3436
msgid "Help" msgid "Help"
msgstr "Hilfe" msgstr "Hilfe"
#: mpdevil.py:3392 #: mpdevil.py:3437
msgid "About" msgid "About"
msgstr "Über" msgstr "Über"
#: mpdevil.py:3393 #: mpdevil.py:3438
msgid "Quit" msgid "Quit"
msgstr "Beenden" msgstr "Beenden"
#: mpdevil.py:3396 #: mpdevil.py:3441
msgid "Save window layout" msgid "Save window layout"
msgstr "Fensterlayout speichern" msgstr "Fensterlayout speichern"
#: mpdevil.py:3397 #: mpdevil.py:3442
msgid "Update database" msgid "Update database"
msgstr "Datenbank aktualisieren" msgstr "Datenbank aktualisieren"
#: mpdevil.py:3398 #: mpdevil.py:3443
msgid "Server stats" msgid "Server stats"
msgstr "Serverstatistik" msgstr "Serverstatistik"
#: mpdevil.py:3404 #: mpdevil.py:3449
msgid "Menu" msgid "Menu"
msgstr "Menü" msgstr "Menü"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-13 19:18+0200\n" "POT-Creation-Date: 2020-08-04 19:29+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,304 +17,315 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: mpdevil.py:650 #: mpdevil.py:651
msgid "MPD-Tag" msgid "MPD-Tag"
msgstr "" msgstr ""
#: mpdevil.py:654 #: mpdevil.py:655
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: mpdevil.py:712 #: mpdevil.py:737
msgid "Unknown Title" msgid "Unknown Title"
msgstr "" msgstr ""
#: mpdevil.py:712 #: mpdevil.py:737
msgid "Unknown Artist" msgid "Unknown Artist"
msgstr "" msgstr ""
#: mpdevil.py:712 #: mpdevil.py:737
msgid "Unknown Album" msgid "Unknown Album"
msgstr "" msgstr ""
#: mpdevil.py:989 mpdevil.py:1358 mpdevil.py:2108 mpdevil.py:2763 #: mpdevil.py:1026 mpdevil.py:1395 mpdevil.py:2140 mpdevil.py:2811
msgid "No" msgid "No"
msgstr "" msgstr ""
#: mpdevil.py:994 mpdevil.py:1363 mpdevil.py:2114 mpdevil.py:2763 #: mpdevil.py:1031 mpdevil.py:1400 mpdevil.py:2146 mpdevil.py:2811
msgid "Title" msgid "Title"
msgstr "" msgstr ""
#: mpdevil.py:1000 mpdevil.py:1502 mpdevil.py:2117 mpdevil.py:2763 #: mpdevil.py:1037 mpdevil.py:1539 mpdevil.py:2149 mpdevil.py:2811
msgid "Artist" msgid "Artist"
msgstr "" msgstr ""
#: mpdevil.py:1006 mpdevil.py:2120 mpdevil.py:2763 #: mpdevil.py:1043 mpdevil.py:2152 mpdevil.py:2811
msgid "Album" msgid "Album"
msgstr "" msgstr ""
#: mpdevil.py:1012 mpdevil.py:1369 mpdevil.py:2123 mpdevil.py:2763 #: mpdevil.py:1049 mpdevil.py:1406 mpdevil.py:2155 mpdevil.py:2811
msgid "Length" msgid "Length"
msgstr "" msgstr ""
#: mpdevil.py:1029 #: mpdevil.py:1066
msgid "Add" msgid "Add"
msgstr "" msgstr ""
#: mpdevil.py:1032 #: mpdevil.py:1069
msgid "Play" msgid "Play"
msgstr "" msgstr ""
#: mpdevil.py:1035 #: mpdevil.py:1072
msgid "Open" msgid "Open"
msgstr "" msgstr ""
#: mpdevil.py:1095 #: mpdevil.py:1132
#, python-format #, python-format
msgid "hits: %i" msgid "hits: %i"
msgstr "" msgstr ""
#: mpdevil.py:1174 #: mpdevil.py:1211
msgid "searching..." msgid "searching..."
msgstr "" msgstr ""
#: mpdevil.py:1178 #: mpdevil.py:1215
msgid "lyrics not found" msgid "lyrics not found"
msgstr "" msgstr ""
#: mpdevil.py:1412 #: mpdevil.py:1449
msgid "all genres" msgid "all genres"
msgstr "" msgstr ""
#: mpdevil.py:1500 #: mpdevil.py:1537
msgid "Album Artist" msgid "Album Artist"
msgstr "" msgstr ""
#: mpdevil.py:1503 #: mpdevil.py:1540
msgid "all artists" msgid "all artists"
msgstr "" msgstr ""
#: mpdevil.py:1650 #: mpdevil.py:1686
#, python-format #, python-format
msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)" msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)"
msgstr "" msgstr ""
#: mpdevil.py:1652 mpdevil.py:2209 #: mpdevil.py:1688 mpdevil.py:2241
#, python-format #, python-format
msgid "%(total_tracks)i titles (%(total_length)s)" msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr "" msgstr ""
#: mpdevil.py:1827 #: mpdevil.py:1863
msgid "Back to current album" msgid "Back to current album"
msgstr "" msgstr ""
#: mpdevil.py:1829 #: mpdevil.py:1865
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: mpdevil.py:1974 #: mpdevil.py:2010
#, python-format #, python-format
msgid "" msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i " "%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i "
"channels, %(file_type)s" "channels, %(file_type)s"
msgstr "" msgstr ""
#: mpdevil.py:2111 mpdevil.py:2763 #: mpdevil.py:2143 mpdevil.py:2811
msgid "Disc" msgid "Disc"
msgstr "" msgstr ""
#: mpdevil.py:2126 mpdevil.py:2763 #: mpdevil.py:2158 mpdevil.py:2811
msgid "Year" msgid "Year"
msgstr "" msgstr ""
#: mpdevil.py:2129 mpdevil.py:2763 #: mpdevil.py:2161 mpdevil.py:2811
msgid "Genre" msgid "Genre"
msgstr "" msgstr ""
#: mpdevil.py:2319 #: mpdevil.py:2351
msgid "Show lyrics" msgid "Show lyrics"
msgstr "" msgstr ""
#: mpdevil.py:2418 #: mpdevil.py:2450
msgid "Main cover size:" msgid "Main cover size:"
msgstr "" msgstr ""
#: mpdevil.py:2419 #: mpdevil.py:2451
msgid "Album view cover size:" msgid "Album view cover size:"
msgstr "" msgstr ""
#: mpdevil.py:2420 #: mpdevil.py:2452
msgid "Button icon size:" msgid "Button icon size:"
msgstr "" msgstr ""
#: mpdevil.py:2430 #: mpdevil.py:2462
msgid "Sort albums by:" msgid "Sort albums by:"
msgstr "" msgstr ""
#: mpdevil.py:2430 #: mpdevil.py:2462
msgid "name" msgid "name"
msgstr "" msgstr ""
#: mpdevil.py:2430 #: mpdevil.py:2462
msgid "year" msgid "year"
msgstr "" msgstr ""
#: mpdevil.py:2431 #: mpdevil.py:2463
msgid "Position of playlist:" msgid "Position of playlist:"
msgstr "" msgstr ""
#: mpdevil.py:2431 #: mpdevil.py:2463
msgid "bottom" msgid "bottom"
msgstr "" msgstr ""
#: mpdevil.py:2431 #: mpdevil.py:2463
msgid "right" msgid "right"
msgstr "" msgstr ""
#: mpdevil.py:2448 #: mpdevil.py:2480
msgid "Use Client-side decoration" msgid "Use Client-side decoration"
msgstr "" msgstr ""
#: mpdevil.py:2449 #: mpdevil.py:2481
msgid "Show stop button" msgid "Show stop button"
msgstr "" msgstr ""
#: mpdevil.py:2450 #: mpdevil.py:2482
msgid "Show lyrics button" msgid "Show lyrics button"
msgstr "" msgstr ""
#: mpdevil.py:2451 #: mpdevil.py:2483
msgid "Show initials in artist view" msgid "Show initials in artist view"
msgstr "" msgstr ""
#: mpdevil.py:2452 #: mpdevil.py:2484
msgid "Show tooltips in album view" msgid "Show tooltips in album view"
msgstr "" msgstr ""
#: mpdevil.py:2453 #: mpdevil.py:2485
msgid "Use 'Album Artist' tag" msgid "Use 'Album Artist' tag"
msgstr "" msgstr ""
#: mpdevil.py:2454 #: mpdevil.py:2486
msgid "Send notification on title change" msgid "Send notification on title change"
msgstr "" msgstr ""
#: mpdevil.py:2455 #: mpdevil.py:2487
msgid "Stop playback on quit" msgid "Stop playback on quit"
msgstr "" msgstr ""
#: mpdevil.py:2456 #: mpdevil.py:2488
msgid "Play selected albums and titles immediately" msgid "Play selected albums and titles immediately"
msgstr "" msgstr ""
#: mpdevil.py:2467 #: mpdevil.py:2499
msgid "<b>View</b>" msgid "<b>View</b>"
msgstr "" msgstr ""
#: mpdevil.py:2470 #: mpdevil.py:2502
msgid "<b>Behavior</b>" msgid "<b>Behavior</b>"
msgstr "" msgstr ""
#: mpdevil.py:2501 #: mpdevil.py:2533
msgid "(restart required)" msgid "(restart required)"
msgstr "" msgstr ""
#: mpdevil.py:2581 #: mpdevil.py:2614
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.py:2616
msgid "Profile:" msgid "Profile:"
msgstr "" msgstr ""
#: mpdevil.py:2583 #: mpdevil.py:2618
msgid "Name:" msgid "Name:"
msgstr "" msgstr ""
#: mpdevil.py:2585 #: mpdevil.py:2620
msgid "Host:" msgid "Host:"
msgstr "" msgstr ""
#: mpdevil.py:2587 #: mpdevil.py:2622
msgid "Password:" msgid "Password:"
msgstr "" msgstr ""
#: mpdevil.py:2589 #: mpdevil.py:2624
msgid "Music lib:" msgid "Music lib:"
msgstr "" msgstr ""
#: mpdevil.py:2702 #: mpdevil.py:2626
msgid "Cover regex:"
msgstr ""
#: mpdevil.py:2749
msgid "Choose directory" msgid "Choose directory"
msgstr "" msgstr ""
#: mpdevil.py:2735 #: mpdevil.py:2783
msgid "Choose the order of information to appear in the playlist:" msgid "Choose the order of information to appear in the playlist:"
msgstr "" msgstr ""
#: mpdevil.py:2877 mpdevil.py:3390 #: mpdevil.py:2925 mpdevil.py:3435
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: mpdevil.py:2891 #: mpdevil.py:2939
msgid "General" msgid "General"
msgstr "" msgstr ""
#: mpdevil.py:2892 #: mpdevil.py:2940
msgid "Profiles" msgid "Profiles"
msgstr "" msgstr ""
#: mpdevil.py:2893 #: mpdevil.py:2941
msgid "Playlist" msgid "Playlist"
msgstr "" msgstr ""
#: mpdevil.py:3155 #: mpdevil.py:3200
msgid "Random mode" msgid "Random mode"
msgstr "" msgstr ""
#: mpdevil.py:3157 #: mpdevil.py:3202
msgid "Repeat mode" msgid "Repeat mode"
msgstr "" msgstr ""
#: mpdevil.py:3159 #: mpdevil.py:3204
msgid "Single mode" msgid "Single mode"
msgstr "" msgstr ""
#: mpdevil.py:3161 #: mpdevil.py:3206
msgid "Consume mode" msgid "Consume mode"
msgstr "" msgstr ""
#: mpdevil.py:3238 #: mpdevil.py:3283
msgid "Stats" msgid "Stats"
msgstr "" msgstr ""
#: mpdevil.py:3291 #: mpdevil.py:3336
msgid "A small MPD client written in python" msgid "A small MPD client written in python"
msgstr "" msgstr ""
#: mpdevil.py:3383 #: mpdevil.py:3428
msgid "Select profile" msgid "Select profile"
msgstr "" msgstr ""
#: mpdevil.py:3391 #: mpdevil.py:3436
msgid "Help" msgid "Help"
msgstr "" msgstr ""
#: mpdevil.py:3392 #: mpdevil.py:3437
msgid "About" msgid "About"
msgstr "" msgstr ""
#: mpdevil.py:3393 #: mpdevil.py:3438
msgid "Quit" msgid "Quit"
msgstr "" msgstr ""
#: mpdevil.py:3396 #: mpdevil.py:3441
msgid "Save window layout" msgid "Save window layout"
msgstr "" msgstr ""
#: mpdevil.py:3397 #: mpdevil.py:3442
msgid "Update database" msgid "Update database"
msgstr "" msgstr ""
#: mpdevil.py:3398 #: mpdevil.py:3443
msgid "Server stats" msgid "Server stats"
msgstr "" msgstr ""
#: mpdevil.py:3404 #: mpdevil.py:3449
msgid "Menu" msgid "Menu"
msgstr "" msgstr ""