diff --git a/bin/mpdevil.py b/bin/mpdevil.py index d087f9b..c5198d1 100644 --- a/bin/mpdevil.py +++ b/bin/mpdevil.py @@ -45,6 +45,7 @@ DATADIR='@datadir@' NAME='mpdevil' VERSION='@version@' PACKAGE=NAME.lower() +COVER_REGEX="^\.?(album|cover|folder|front).*\.(gif|jpeg|jpg|png)$" ################# # lang settings # @@ -314,7 +315,7 @@ class MPRISInterface(dbus.service.Object): # TODO emit Seeked if needed if 'file' in mpd_meta: 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) - 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: self.metadata['mpris:artUrl']="file://"+cover.path else: @@ -671,18 +672,42 @@ class SongPopover(Gtk.Popover): frame.show_all() class Cover(object): - regex=re.compile(r'^\.?(album|cover|folder|front).*\.(gif|jpeg|jpg|png)$', flags=re.IGNORECASE) - def __init__(self, lib_path, song_file): - self.lib_path=lib_path or "" + def __init__(self, settings, song): self.path=None - 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 + if song != {}: + song_file=song["file"] + + active_profile=settings.get_int("active-profile") + + self.lib_path=settings.get_value("paths")[active_profile] + regex_str=settings.get_value("regex")[active_profile] + + 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): if self.path == None: @@ -923,8 +948,18 @@ class Settings(Gio.Settings): BASE_KEY="org.mpdevil" def __init__(self): super().__init__(schema=self.BASE_KEY) + + # fix profile settings if len(self.get_value("profiles")) < (self.get_int("active-profile")+1): 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 array=self.get_value(key).unpack() @@ -1637,11 +1672,10 @@ class AlbumIconView(Gtk.IconView): albums=sorted(albums, key=lambda k: k['year']) else: 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") for i, album in enumerate(albums): 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 length_human_readable=ClientHelper.calc_display_length(album["songs"]) try: @@ -2022,7 +2056,7 @@ class MainCover(Gtk.Frame): # cover self.cover=Gtk.Image.new() 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 self.cover.set_size_request(size, size) @@ -2035,15 +2069,11 @@ class MainCover(Gtk.Frame): self.add(event_box) def refresh(self, *args): - try: - current_song=self.client.wrapped_call("currentsong") - 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"))) + 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"))) 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 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 # widgets - self.profiles_combo=Gtk.ComboBoxText() + self.profiles_combo=Gtk.ComboBoxText(hexpand=True) self.profiles_combo.set_entry_text_column(0) 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(delete_button, True, True, 0) - self.profile_entry=Gtk.Entry() - self.host_entry=Gtk.Entry() + self.profile_entry=Gtk.Entry(hexpand=True) + self.host_entry=Gtk.Entry(hexpand=True) self.port_entry=IntEntry(0, 0, 65535, 1) address_entry=Gtk.Box(spacing=6) address_entry.pack_start(self.host_entry, True, True, 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.path_entry=Gtk.Entry() + self.path_entry=Gtk.Entry(hexpand=True) self.path_select_button=Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_OPEN)) path_box=Gtk.Box(spacing=6) path_box.pack_start(self.path_entry, True, True, 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.set_xalign(1) @@ -2590,6 +2623,8 @@ class ProfileSettings(Gtk.Grid): password_label.set_xalign(1) path_label=Gtk.Label(label=_("Music lib:")) path_label.set_xalign(1) + regex_label=Gtk.Label(label=_("Cover regex:")) + regex_label.set_xalign(1) # connect 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.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.regex_entry, self.regex_entry.connect("changed", self.on_regex_entry_changed))) self.settings_handlers=[] 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::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::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.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(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(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(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(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(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): 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('as', "passwords", "") self.settings.array_append('as', "paths", "") + self.settings.array_append('as', "regex", "") self.profiles_combo_reload() 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('as', "passwords", pos) self.settings.array_delete('as', "paths", pos) + self.settings.array_delete('as', "regex", pos) if len(self.settings.get_value("profiles")) == 0: self.on_add_button_clicked() else: @@ -2700,6 +2741,10 @@ class ProfileSettings(Gtk.Grid): self.gui_modification=True 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): dialog=Gtk.FileChooserDialog(title=_("Choose directory"), transient_for=parent, action=Gtk.FileChooserAction.SELECT_FOLDER) 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.password_entry.set_text(self.settings.get_value("passwords")[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() @@ -3476,7 +3522,7 @@ class MainWindow(Gtk.ApplicationWindow): if self.settings.get_boolean("send-notify"): 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) - 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.show() diff --git a/data/org.mpdevil.gschema.xml b/data/org.mpdevil.gschema.xml index d9854d4..f46ac17 100644 --- a/data/org.mpdevil.gschema.xml +++ b/data/org.mpdevil.gschema.xml @@ -146,5 +146,10 @@ List of library paths + + [""] + List of cover regex + + diff --git a/po/de.po b/po/de.po index d4d78b2..00bf58b 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-07-13 19:18+0200\n" -"PO-Revision-Date: 2020-07-13 19:19+0200\n" +"POT-Creation-Date: 2020-08-04 19:29+0200\n" +"PO-Revision-Date: 2020-08-04 19:33+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" @@ -18,102 +18,102 @@ msgstr "" "X-Generator: Poedit 2.3.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: mpdevil.py:650 +#: mpdevil.py:651 msgid "MPD-Tag" msgstr "MPD-Tag" -#: mpdevil.py:654 +#: mpdevil.py:655 msgid "Value" msgstr "Wert" -#: mpdevil.py:712 +#: mpdevil.py:737 msgid "Unknown Title" msgstr "Unbekannter Titel" -#: mpdevil.py:712 +#: mpdevil.py:737 msgid "Unknown Artist" msgstr "Unbekannter Interpret" -#: mpdevil.py:712 +#: mpdevil.py:737 msgid "Unknown 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" 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" 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" msgstr "Interpret" -#: mpdevil.py:1006 mpdevil.py:2120 mpdevil.py:2763 +#: mpdevil.py:1043 mpdevil.py:2152 mpdevil.py:2811 msgid "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" msgstr "Länge" -#: mpdevil.py:1029 +#: mpdevil.py:1066 msgid "Add" msgstr "Hinzufügen" -#: mpdevil.py:1032 +#: mpdevil.py:1069 msgid "Play" msgstr "Wiedergabe" -#: mpdevil.py:1035 +#: mpdevil.py:1072 msgid "Open" msgstr "Öffnen" -#: mpdevil.py:1095 +#: mpdevil.py:1132 #, python-format msgid "hits: %i" msgstr "Treffer: %i" -#: mpdevil.py:1174 +#: mpdevil.py:1211 msgid "searching..." msgstr "suche..." -#: mpdevil.py:1178 +#: mpdevil.py:1215 msgid "lyrics not found" msgstr "Liedtext nicht gefunden" -#: mpdevil.py:1412 +#: mpdevil.py:1449 msgid "all genres" msgstr "Alle Genres" -#: mpdevil.py:1500 +#: mpdevil.py:1537 msgid "Album Artist" msgstr "Albuminterpret" -#: mpdevil.py:1503 +#: mpdevil.py:1540 msgid "all artists" msgstr "Alle Interpreten" -#: mpdevil.py:1650 +#: mpdevil.py:1686 #, 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.py:1652 mpdevil.py:2209 +#: mpdevil.py:1688 mpdevil.py:2241 #, python-format msgid "%(total_tracks)i titles (%(total_length)s)" msgstr "%(total_tracks)i Titel (%(total_length)s)" -#: mpdevil.py:1827 +#: mpdevil.py:1863 msgid "Back to current album" msgstr "Zurück zu aktuellem Album" -#: mpdevil.py:1829 +#: mpdevil.py:1865 msgid "Search" msgstr "Suche" -#: mpdevil.py:1974 +#: mpdevil.py:2010 #, python-format msgid "" "%(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 " "Kanäle, %(file_type)s" -#: mpdevil.py:2111 mpdevil.py:2763 +#: mpdevil.py:2143 mpdevil.py:2811 msgid "Disc" msgstr "CD" -#: mpdevil.py:2126 mpdevil.py:2763 +#: mpdevil.py:2158 mpdevil.py:2811 msgid "Year" msgstr "Jahr" -#: mpdevil.py:2129 mpdevil.py:2763 +#: mpdevil.py:2161 mpdevil.py:2811 msgid "Genre" msgstr "Genre" -#: mpdevil.py:2319 +#: mpdevil.py:2351 msgid "Show lyrics" msgstr "Zeige Liedtext" -#: mpdevil.py:2418 +#: mpdevil.py:2450 msgid "Main cover size:" msgstr "Größe des Haupt-Covers:" -#: mpdevil.py:2419 +#: mpdevil.py:2451 msgid "Album view cover size:" msgstr "Covergröße in Albumliste:" -#: mpdevil.py:2420 +#: mpdevil.py:2452 msgid "Button icon size:" msgstr "Symbolgröße der Knöpfe:" -#: mpdevil.py:2430 +#: mpdevil.py:2462 msgid "Sort albums by:" msgstr "Sortiere Alben nach:" -#: mpdevil.py:2430 +#: mpdevil.py:2462 msgid "name" msgstr "Name" -#: mpdevil.py:2430 +#: mpdevil.py:2462 msgid "year" msgstr "Jahr" -#: mpdevil.py:2431 +#: mpdevil.py:2463 msgid "Position of playlist:" msgstr "Wiedergabelistenposition:" -#: mpdevil.py:2431 +#: mpdevil.py:2463 msgid "bottom" msgstr "unten" -#: mpdevil.py:2431 +#: mpdevil.py:2463 msgid "right" msgstr "rechts" -#: mpdevil.py:2448 +#: mpdevil.py:2480 msgid "Use Client-side decoration" msgstr "Benutze \"Client-side decoration\"" -#: mpdevil.py:2449 +#: mpdevil.py:2481 msgid "Show stop button" msgstr "Zeige Stopp-Knopf" -#: mpdevil.py:2450 +#: mpdevil.py:2482 msgid "Show lyrics button" msgstr "Zeige Liedtext-Knopf" -#: mpdevil.py:2451 +#: mpdevil.py:2483 msgid "Show initials in artist view" msgstr "Zeige Anfangsbuchstaben in Interpretenliste" -#: mpdevil.py:2452 +#: mpdevil.py:2484 msgid "Show tooltips in album view" msgstr "Zeige Tooltips in Albumliste" -#: mpdevil.py:2453 +#: mpdevil.py:2485 msgid "Use 'Album Artist' tag" msgstr "Benutze \"Album Artist\" Tag" -#: mpdevil.py:2454 +#: mpdevil.py:2486 msgid "Send notification on title change" msgstr "Sende Benachrichtigung bei Titelwechsel" -#: mpdevil.py:2455 +#: mpdevil.py:2487 msgid "Stop playback on quit" msgstr "Wiedergabe beim Beenden stoppen" -#: mpdevil.py:2456 +#: mpdevil.py:2488 msgid "Play selected albums and titles immediately" msgstr "Ausgewählte Alben und Titel sofort abspielen" -#: mpdevil.py:2467 +#: mpdevil.py:2499 msgid "View" msgstr "Ansicht" -#: mpdevil.py:2470 +#: mpdevil.py:2502 msgid "Behavior" msgstr "Verhalten" -#: mpdevil.py:2501 +#: mpdevil.py:2533 msgid "(restart required)" 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:" msgstr "Profil:" -#: mpdevil.py:2583 +#: mpdevil.py:2618 msgid "Name:" msgstr "Name:" -#: mpdevil.py:2585 +#: mpdevil.py:2620 msgid "Host:" msgstr "Host:" -#: mpdevil.py:2587 +#: mpdevil.py:2622 msgid "Password:" msgstr "Passwort:" -#: mpdevil.py:2589 +#: mpdevil.py:2624 msgid "Music lib:" msgstr "Musikverzeichnis:" -#: mpdevil.py:2702 +#: mpdevil.py:2626 +msgid "Cover regex:" +msgstr "Cover-Regex:" + +#: mpdevil.py:2749 msgid "Choose directory" msgstr "Verzeichnis Wählen" -#: mpdevil.py:2735 +#: mpdevil.py:2783 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.py:2877 mpdevil.py:3390 +#: mpdevil.py:2925 mpdevil.py:3435 msgid "Settings" msgstr "Einstellungen" -#: mpdevil.py:2891 +#: mpdevil.py:2939 msgid "General" msgstr "Allgemein" -#: mpdevil.py:2892 +#: mpdevil.py:2940 msgid "Profiles" msgstr "Profile" -#: mpdevil.py:2893 +#: mpdevil.py:2941 msgid "Playlist" msgstr "Wiedergabeliste" -#: mpdevil.py:3155 +#: mpdevil.py:3200 msgid "Random mode" msgstr "Zufallsmodus" -#: mpdevil.py:3157 +#: mpdevil.py:3202 msgid "Repeat mode" msgstr "Dauerschleife" -#: mpdevil.py:3159 +#: mpdevil.py:3204 msgid "Single mode" msgstr "Einzelstückmodus" -#: mpdevil.py:3161 +#: mpdevil.py:3206 msgid "Consume mode" msgstr "Wiedergabeliste verbrauchen" -#: mpdevil.py:3238 +#: mpdevil.py:3283 msgid "Stats" msgstr "Statistik" -#: mpdevil.py:3291 +#: mpdevil.py:3336 msgid "A small MPD client written in python" msgstr "" -#: mpdevil.py:3383 +#: mpdevil.py:3428 msgid "Select profile" msgstr "Profil auswählen" -#: mpdevil.py:3391 +#: mpdevil.py:3436 msgid "Help" msgstr "Hilfe" -#: mpdevil.py:3392 +#: mpdevil.py:3437 msgid "About" msgstr "Über" -#: mpdevil.py:3393 +#: mpdevil.py:3438 msgid "Quit" msgstr "Beenden" -#: mpdevil.py:3396 +#: mpdevil.py:3441 msgid "Save window layout" msgstr "Fensterlayout speichern" -#: mpdevil.py:3397 +#: mpdevil.py:3442 msgid "Update database" msgstr "Datenbank aktualisieren" -#: mpdevil.py:3398 +#: mpdevil.py:3443 msgid "Server stats" msgstr "Serverstatistik" -#: mpdevil.py:3404 +#: mpdevil.py:3449 msgid "Menu" msgstr "Menü" diff --git a/po/mpdevil.pot b/po/mpdevil.pot index ba4e8b0..5eef7dd 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-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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,304 +17,315 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: mpdevil.py:650 +#: mpdevil.py:651 msgid "MPD-Tag" msgstr "" -#: mpdevil.py:654 +#: mpdevil.py:655 msgid "Value" msgstr "" -#: mpdevil.py:712 +#: mpdevil.py:737 msgid "Unknown Title" msgstr "" -#: mpdevil.py:712 +#: mpdevil.py:737 msgid "Unknown Artist" msgstr "" -#: mpdevil.py:712 +#: mpdevil.py:737 msgid "Unknown Album" 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" 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" 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" msgstr "" -#: mpdevil.py:1006 mpdevil.py:2120 mpdevil.py:2763 +#: mpdevil.py:1043 mpdevil.py:2152 mpdevil.py:2811 msgid "Album" 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" msgstr "" -#: mpdevil.py:1029 +#: mpdevil.py:1066 msgid "Add" msgstr "" -#: mpdevil.py:1032 +#: mpdevil.py:1069 msgid "Play" msgstr "" -#: mpdevil.py:1035 +#: mpdevil.py:1072 msgid "Open" msgstr "" -#: mpdevil.py:1095 +#: mpdevil.py:1132 #, python-format msgid "hits: %i" msgstr "" -#: mpdevil.py:1174 +#: mpdevil.py:1211 msgid "searching..." msgstr "" -#: mpdevil.py:1178 +#: mpdevil.py:1215 msgid "lyrics not found" msgstr "" -#: mpdevil.py:1412 +#: mpdevil.py:1449 msgid "all genres" msgstr "" -#: mpdevil.py:1500 +#: mpdevil.py:1537 msgid "Album Artist" msgstr "" -#: mpdevil.py:1503 +#: mpdevil.py:1540 msgid "all artists" msgstr "" -#: mpdevil.py:1650 +#: mpdevil.py:1686 #, python-format msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)" msgstr "" -#: mpdevil.py:1652 mpdevil.py:2209 +#: mpdevil.py:1688 mpdevil.py:2241 #, python-format msgid "%(total_tracks)i titles (%(total_length)s)" msgstr "" -#: mpdevil.py:1827 +#: mpdevil.py:1863 msgid "Back to current album" msgstr "" -#: mpdevil.py:1829 +#: mpdevil.py:1865 msgid "Search" msgstr "" -#: mpdevil.py:1974 +#: mpdevil.py:2010 #, python-format msgid "" "%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i " "channels, %(file_type)s" msgstr "" -#: mpdevil.py:2111 mpdevil.py:2763 +#: mpdevil.py:2143 mpdevil.py:2811 msgid "Disc" msgstr "" -#: mpdevil.py:2126 mpdevil.py:2763 +#: mpdevil.py:2158 mpdevil.py:2811 msgid "Year" msgstr "" -#: mpdevil.py:2129 mpdevil.py:2763 +#: mpdevil.py:2161 mpdevil.py:2811 msgid "Genre" msgstr "" -#: mpdevil.py:2319 +#: mpdevil.py:2351 msgid "Show lyrics" msgstr "" -#: mpdevil.py:2418 +#: mpdevil.py:2450 msgid "Main cover size:" msgstr "" -#: mpdevil.py:2419 +#: mpdevil.py:2451 msgid "Album view cover size:" msgstr "" -#: mpdevil.py:2420 +#: mpdevil.py:2452 msgid "Button icon size:" msgstr "" -#: mpdevil.py:2430 +#: mpdevil.py:2462 msgid "Sort albums by:" msgstr "" -#: mpdevil.py:2430 +#: mpdevil.py:2462 msgid "name" msgstr "" -#: mpdevil.py:2430 +#: mpdevil.py:2462 msgid "year" msgstr "" -#: mpdevil.py:2431 +#: mpdevil.py:2463 msgid "Position of playlist:" msgstr "" -#: mpdevil.py:2431 +#: mpdevil.py:2463 msgid "bottom" msgstr "" -#: mpdevil.py:2431 +#: mpdevil.py:2463 msgid "right" msgstr "" -#: mpdevil.py:2448 +#: mpdevil.py:2480 msgid "Use Client-side decoration" msgstr "" -#: mpdevil.py:2449 +#: mpdevil.py:2481 msgid "Show stop button" msgstr "" -#: mpdevil.py:2450 +#: mpdevil.py:2482 msgid "Show lyrics button" msgstr "" -#: mpdevil.py:2451 +#: mpdevil.py:2483 msgid "Show initials in artist view" msgstr "" -#: mpdevil.py:2452 +#: mpdevil.py:2484 msgid "Show tooltips in album view" msgstr "" -#: mpdevil.py:2453 +#: mpdevil.py:2485 msgid "Use 'Album Artist' tag" msgstr "" -#: mpdevil.py:2454 +#: mpdevil.py:2486 msgid "Send notification on title change" msgstr "" -#: mpdevil.py:2455 +#: mpdevil.py:2487 msgid "Stop playback on quit" msgstr "" -#: mpdevil.py:2456 +#: mpdevil.py:2488 msgid "Play selected albums and titles immediately" msgstr "" -#: mpdevil.py:2467 +#: mpdevil.py:2499 msgid "View" msgstr "" -#: mpdevil.py:2470 +#: mpdevil.py:2502 msgid "Behavior" msgstr "" -#: mpdevil.py:2501 +#: mpdevil.py:2533 msgid "(restart required)" 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:" msgstr "" -#: mpdevil.py:2583 +#: mpdevil.py:2618 msgid "Name:" msgstr "" -#: mpdevil.py:2585 +#: mpdevil.py:2620 msgid "Host:" msgstr "" -#: mpdevil.py:2587 +#: mpdevil.py:2622 msgid "Password:" msgstr "" -#: mpdevil.py:2589 +#: mpdevil.py:2624 msgid "Music lib:" msgstr "" -#: mpdevil.py:2702 +#: mpdevil.py:2626 +msgid "Cover regex:" +msgstr "" + +#: mpdevil.py:2749 msgid "Choose directory" msgstr "" -#: mpdevil.py:2735 +#: mpdevil.py:2783 msgid "Choose the order of information to appear in the playlist:" msgstr "" -#: mpdevil.py:2877 mpdevil.py:3390 +#: mpdevil.py:2925 mpdevil.py:3435 msgid "Settings" msgstr "" -#: mpdevil.py:2891 +#: mpdevil.py:2939 msgid "General" msgstr "" -#: mpdevil.py:2892 +#: mpdevil.py:2940 msgid "Profiles" msgstr "" -#: mpdevil.py:2893 +#: mpdevil.py:2941 msgid "Playlist" msgstr "" -#: mpdevil.py:3155 +#: mpdevil.py:3200 msgid "Random mode" msgstr "" -#: mpdevil.py:3157 +#: mpdevil.py:3202 msgid "Repeat mode" msgstr "" -#: mpdevil.py:3159 +#: mpdevil.py:3204 msgid "Single mode" msgstr "" -#: mpdevil.py:3161 +#: mpdevil.py:3206 msgid "Consume mode" msgstr "" -#: mpdevil.py:3238 +#: mpdevil.py:3283 msgid "Stats" msgstr "" -#: mpdevil.py:3291 +#: mpdevil.py:3336 msgid "A small MPD client written in python" msgstr "" -#: mpdevil.py:3383 +#: mpdevil.py:3428 msgid "Select profile" msgstr "" -#: mpdevil.py:3391 +#: mpdevil.py:3436 msgid "Help" msgstr "" -#: mpdevil.py:3392 +#: mpdevil.py:3437 msgid "About" msgstr "" -#: mpdevil.py:3393 +#: mpdevil.py:3438 msgid "Quit" msgstr "" -#: mpdevil.py:3396 +#: mpdevil.py:3441 msgid "Save window layout" msgstr "" -#: mpdevil.py:3397 +#: mpdevil.py:3442 msgid "Update database" msgstr "" -#: mpdevil.py:3398 +#: mpdevil.py:3443 msgid "Server stats" msgstr "" -#: mpdevil.py:3404 +#: mpdevil.py:3449 msgid "Menu" msgstr ""