mirror of
https://github.com/SoongNoonien/mpdevil.git
synced 2023-08-10 21:12:44 +03:00
made cover regex configurable
This commit is contained in:
parent
98c6f35e66
commit
2a260af2f3
102
bin/mpdevil.py
102
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()
|
||||
|
||||
|
@ -146,5 +146,10 @@
|
||||
<summary>List of library paths</summary>
|
||||
<description></description>
|
||||
</key>
|
||||
<key type="as" name="regex">
|
||||
<default>[""]</default>
|
||||
<summary>List of cover regex</summary>
|
||||
<description></description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
|
166
po/de.po
166
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 "<b>View</b>"
|
||||
msgstr "<b>Ansicht</b>"
|
||||
|
||||
#: mpdevil.py:2470
|
||||
#: mpdevil.py:2502
|
||||
msgid "<b>Behavior</b>"
|
||||
msgstr "<b>Verhalten</b>"
|
||||
|
||||
#: 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ü"
|
||||
|
||||
|
161
po/mpdevil.pot
161
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 <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\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 "<b>View</b>"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:2470
|
||||
#: mpdevil.py:2502
|
||||
msgid "<b>Behavior</b>"
|
||||
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 ""
|
||||
|
Loading…
Reference in New Issue
Block a user