reworked AlbumDialog and SearchWindow

This commit is contained in:
Martin Wagner 2020-08-16 17:07:41 +02:00
parent 6bf3c86068
commit 49ae372b43
3 changed files with 357 additions and 263 deletions

View File

@ -837,19 +837,21 @@ class Client(MPDClient):
def on_settings_changed(self, *args):
self.disconnect()
def files_to_playlist(self, files, append, force=False):
if append:
def files_to_playlist(self, files, mode="default"): # modes: default, play, append, enqueue
def append(files):
for f in files:
self.add(f)
else:
if self.settings.get_boolean("force-mode") or force or self.status()["state"] == "stop":
if not files == []:
self.clear()
for f in files:
self.add(f)
self.play()
def play(files):
if not files == []:
self.clear()
for f in files:
self.add(f)
self.play()
def enqueue(files):
status=self.status()
if status["state"] == "stop":
play(files)
else:
status=self.status()
self.moveid(status["songid"], 0)
current_song_file=self.playlistinfo()[0]["file"]
try:
@ -861,10 +863,21 @@ class Client(MPDClient):
self.add(f)
else:
self.move(0, (len(self.playlistinfo())-1))
if mode == "append":
append(files)
elif mode == "enqueue":
enqueue(files)
elif mode == "play":
play(files)
elif mode == "default":
if self.settings.get_boolean("force-mode"):
play(files)
else:
enqueue(files)
def album_to_playlist(self, album, artist, year, append, force=False):
def album_to_playlist(self, album, artist, year, mode="default"):
songs=self.find("album", album, "date", year, self.settings.get_artist_type(), artist)
self.files_to_playlist([song['file'] for song in songs], append, force)
self.files_to_playlist([song['file'] for song in songs], mode)
def comp_list(self, *args): # simulates listing behavior of python-mpd2 1.0
native_list=self.list(*args)
@ -1009,14 +1022,20 @@ class SearchWindow(Gtk.Box):
# label
self.label=Gtk.Label()
self.label.set_xalign(1)
self.label.set_margin_end(6)
# store
# (track, title, artist, album, duration, file)
self.store=Gtk.ListStore(int, str, str, str, str, str)
# songs window
self.songs_window=SongsWindow(self.client, self.store, 5)
# action bar
self.action_bar=self.songs_window.get_actionbar()
self.action_bar.set_sensitive(False)
# songs view
self.songs_view=SongsView(self.client, self.store, 5)
self.songs_view=self.songs_window.get_treeview()
# columns
renderer_text=Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END, ellipsize_set=True)
@ -1056,52 +1075,21 @@ class SearchWindow(Gtk.Box):
self.column_album.set_sort_column_id(3)
self.column_time.set_sort_column_id(4)
# scroll
scroll=Gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scroll.add(self.songs_view)
# buttons
self.add_button=Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_ADD), label=_("Add"))
self.add_button.set_sensitive(False)
self.add_button.set_relief(Gtk.ReliefStyle.NONE)
self.play_button=Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_MEDIA_PLAY), label=_("Play"))
self.play_button.set_sensitive(False)
self.play_button.set_relief(Gtk.ReliefStyle.NONE)
self.open_button=Gtk.Button(image=Gtk.Image(stock=Gtk.STOCK_OPEN), label=_("Open"))
self.open_button.set_sensitive(False)
self.open_button.set_relief(Gtk.ReliefStyle.NONE)
# connect
self.search_entry.connect("search-changed", self.on_search_changed)
self.tags.connect("changed", self.on_search_changed)
self.add_button.connect("clicked", self.on_add_clicked)
self.play_button.connect("clicked", self.on_play_clicked)
self.open_button.connect("clicked", self.on_open_clicked)
self.client.emitter.connect("reconnected", self.on_reconnected)
self.client.emitter.connect("disconnected", self.on_disconnected)
# packing
vbox=Gtk.Box(spacing=6)
vbox.set_property("border-width", 6)
vbox.pack_start(self.search_entry, True, True, 0)
vbox.pack_end(self.tags, False, False, 0)
frame=FocusFrame()
frame.set_widget(self.songs_view)
frame.add(scroll)
ButtonBox=Gtk.ButtonBox(spacing=1)
ButtonBox.set_property("border-width", 1)
ButtonBox.pack_start(self.add_button, True, True, 0)
ButtonBox.pack_start(self.play_button, True, True, 0)
ButtonBox.pack_start(self.open_button, True, True, 0)
hbox=Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
hbox.pack_start(ButtonBox, 0, False, False)
hbox.pack_end(self.label, 0, False, False)
self.pack_start(vbox, False, False, 0)
self.pack_start(Gtk.Separator.new(orientation=Gtk.Orientation.HORIZONTAL), False, False, 0)
self.pack_start(frame, True, True, 0)
self.pack_start(Gtk.Separator.new(orientation=Gtk.Orientation.HORIZONTAL), False, False, 0)
hbox=Gtk.Box(spacing=6)
hbox.set_property("border-width", 6)
hbox.pack_start(self.search_entry, True, True, 0)
hbox.pack_end(self.tags, False, False, 0)
self.action_bar.pack_end(self.label)
self.pack_start(hbox, False, False, 0)
self.pack_start(Gtk.Separator.new(orientation=Gtk.Orientation.HORIZONTAL), False, False, 0)
self.pack_start(self.songs_window, True, True, 0)
def start(self):
self.search_entry.grab_focus()
@ -1138,22 +1126,9 @@ class SearchWindow(Gtk.Box):
self.store.append([int(song["track"]), song["title"], song["artist"], song["album"], song["human_duration"], song["file"]])
self.label.set_text(_("hits: %i") % (self.songs_view.count()))
if self.songs_view.count() == 0:
self.add_button.set_sensitive(False)
self.play_button.set_sensitive(False)
self.open_button.set_sensitive(False)
self.action_bar.set_sensitive(False)
else:
self.add_button.set_sensitive(True)
self.play_button.set_sensitive(True)
self.open_button.set_sensitive(True)
def on_add_clicked(self, *args):
self.client.wrapped_call("files_to_playlist", self.songs_view.get_files(), True)
def on_play_clicked(self, *args):
self.client.wrapped_call("files_to_playlist", self.songs_view.get_files(), False, True)
def on_open_clicked(self, *args):
self.client.wrapped_call("files_to_playlist", self.songs_view.get_files(), False)
self.action_bar.set_sensitive(True)
class SongsView(Gtk.TreeView):
def __init__(self, client, store, file_column_id):
@ -1177,19 +1152,19 @@ class SongsView(Gtk.TreeView):
self.key_press_event=self.connect("key-press-event", self.on_key_press_event)
def on_row_activated(self, widget, path, view_column):
self.client.wrapped_call("files_to_playlist", [self.store[path][self.file_column_id]], False, True)
self.client.wrapped_call("files_to_playlist", [self.store[path][self.file_column_id]], "play")
def on_button_press_event(self, widget, event):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
try:
path=widget.get_path_at_pos(int(event.x), int(event.y))[0]
self.client.wrapped_call("files_to_playlist", [self.store[path][self.file_column_id]], False)
self.client.wrapped_call("files_to_playlist", [self.store[path][self.file_column_id]])
except:
pass
elif event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
try:
path=widget.get_path_at_pos(int(event.x), int(event.y))[0]
self.client.wrapped_call("files_to_playlist", [self.store[path][self.file_column_id]], True)
self.client.wrapped_call("files_to_playlist", [self.store[path][self.file_column_id]], "append")
except:
pass
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
@ -1207,11 +1182,11 @@ class SongsView(Gtk.TreeView):
if event.keyval == 112: # p
treeview, treeiter=self.selection.get_selected()
if not treeiter == None:
self.client.wrapped_call("files_to_playlist", [self.store.get_value(treeiter, self.file_column_id)], False)
self.client.wrapped_call("files_to_playlist", [self.store.get_value(treeiter, self.file_column_id)])
elif event.keyval == 97: # a
treeview, treeiter=self.selection.get_selected()
if not treeiter == None:
self.client.wrapped_call("files_to_playlist", [self.store.get_value(treeiter, self.file_column_id)], True)
self.client.wrapped_call("files_to_playlist", [self.store.get_value(treeiter, self.file_column_id)], "append")
elif event.keyval == 65383: # menu key
treeview, treeiter=self.selection.get_selected()
if not treeiter == None:
@ -1235,10 +1210,81 @@ class SongsView(Gtk.TreeView):
return_list.append(row[self.file_column_id])
return return_list
class SongsWindow(Gtk.Box):
def __init__(self, client, store, file_column_id):
Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL)
# adding vars
self.client=client
self.store=store
# treeview
self.songs_view=SongsView(client, store, file_column_id)
# scroll
scroll=Gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scroll.add(self.songs_view)
# buttons
self.append_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("list-add", Gtk.IconSize.BUTTON), label=_("Append"))
self.append_button.set_tooltip_text(_("Add all titles to playlist"))
self.play_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-start", Gtk.IconSize.BUTTON), label=_("Play"))
self.play_button.set_tooltip_text(_("Directly play all titles"))
self.enqueue_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("insert-object", Gtk.IconSize.BUTTON), label=_("Enqueue"))
self.enqueue_button.set_tooltip_text(_("Append all titles after the currently playing track and clear the playlist from all other songs"))
# button box
button_box=Gtk.ButtonBox()
button_box.set_property("layout-style", Gtk.ButtonBoxStyle.EXPAND)
# action bar
self.action_bar=Gtk.ActionBar()
# connect
self.append_button.connect("clicked", self.on_append_button_clicked)
self.play_button.connect("clicked", self.on_play_button_clicked)
self.enqueue_button.connect("clicked", self.on_enqueue_button_clicked)
# packing
frame=FocusFrame()
frame.set_widget(self.songs_view)
frame.add(scroll)
self.pack_start(frame, True, True, 0)
button_box.pack_start(self.append_button, True, True, 0)
button_box.pack_start(self.play_button, True, True, 0)
button_box.pack_start(self.enqueue_button, True, True, 0)
self.action_bar.pack_start(button_box)
self.pack_start(self.action_bar, False, False, 0)
def get_treeview(self):
return self.songs_view
def get_actionbar(self):
return self.action_bar
def on_append_button_clicked(self, *args):
self.client.wrapped_call("files_to_playlist", self.songs_view.get_files(), "append")
def on_play_button_clicked(self, *args):
self.client.wrapped_call("files_to_playlist", self.songs_view.get_files(), "play")
def on_enqueue_button_clicked(self, *args):
self.client.wrapped_call("files_to_playlist", self.songs_view.get_files(), "enqueue")
class AlbumDialog(Gtk.Dialog):
def __init__(self, parent, client, settings, album, artist, year):
Gtk.Dialog.__init__(self, transient_for=parent)
self.add_buttons(Gtk.STOCK_ADD, Gtk.ResponseType.ACCEPT, Gtk.STOCK_MEDIA_PLAY, Gtk.ResponseType.YES, Gtk.STOCK_OPEN, Gtk.ResponseType.OK, Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
use_csd=settings.get_boolean("use-csd")
if use_csd:
Gtk.Dialog.__init__(self, transient_for=parent, use_header_bar=True)
# css
style_context=self.get_style_context()
provider=Gtk.CssProvider()
css=b"""* {-GtkDialog-content-area-border: 0px;}"""
provider.load_from_data(css)
style_context.add_provider(provider, 800)
else:
Gtk.Dialog.__init__(self, transient_for=parent)
# metadata
self.album=album
@ -1267,9 +1313,6 @@ class AlbumDialog(Gtk.Dialog):
# store
# (track, title (artist), duration, file)
self.store=Gtk.ListStore(int, str, str, str)
# songs view
self.songs_view=SongsView(self.client, self.store, 3)
for s in songs:
song=ClientHelper.extend_song_for_display(s)
if type(song["title"]) == list: # could be impossible
@ -1291,6 +1334,12 @@ class AlbumDialog(Gtk.Dialog):
title_artist=title_artist.replace("&", "&")
self.store.append([int(song["track"]), title_artist, song["human_duration"], song["file"]])
# songs window
self.songs_window=SongsWindow(self.client, self.store, 3)
# songs view
self.songs_view=self.songs_window.get_treeview()
# columns
renderer_text=Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END, ellipsize_set=True)
renderer_text_ralign=Gtk.CellRendererText(xalign=1.0)
@ -1311,24 +1360,25 @@ class AlbumDialog(Gtk.Dialog):
self.column_time.set_property("resizable", False)
self.songs_view.append_column(self.column_time)
# scroll
scroll=Gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scroll.add(self.songs_view)
# close button
close_button=Gtk.ToggleButton(image=Gtk.Image.new_from_icon_name("window-close", Gtk.IconSize.BUTTON), label=_("Close"))
# action bar
action_bar=self.songs_window.get_actionbar()
action_bar.pack_end(close_button)
# connect
close_button.connect("clicked", self.on_close_button_clicked)
# packing
self.vbox.pack_start(scroll, True, True, 0) # vbox default widget of dialogs
self.vbox.set_spacing(3)
self.vbox.pack_start(self.songs_window, True, True, 0) # vbox default widget of dialogs
self.show_all()
def open(self):
response=self.run()
if response == Gtk.ResponseType.OK:
self.client.wrapped_call("album_to_playlist", self.album, self.artist, self.year, False)
elif response == Gtk.ResponseType.ACCEPT:
self.client.wrapped_call("album_to_playlist", self.album, self.artist, self.year, True)
elif response == Gtk.ResponseType.YES:
self.client.wrapped_call("album_to_playlist", self.album, self.artist, self.year, False, True)
def on_close_button_clicked(self, *args):
self.destroy()
class GenreSelect(Gtk.ComboBoxText):
def __init__(self, client, settings):
@ -1649,11 +1699,11 @@ class AlbumIconView(Gtk.IconView):
self.scroll_to_path(path, True, 0, 0)
break
def path_to_playlist(self, path, add, force=False):
def path_to_playlist(self, path, mode="default"):
album=self.store[path][4]
year=self.store[path][5]
artist=self.store[path][6]
self.client.wrapped_call("album_to_playlist", album, artist, year, add, force)
self.client.wrapped_call("album_to_playlist", album, artist, year, mode)
def open_album_dialog(self, path):
if self.client.connected():
@ -1674,9 +1724,9 @@ class AlbumIconView(Gtk.IconView):
if not path == None:
if self.button_event == (event.button, path):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_RELEASE:
self.path_to_playlist(path, False)
self.path_to_playlist(path)
elif event.button == 2 and event.type == Gdk.EventType.BUTTON_RELEASE:
self.path_to_playlist(path, True)
self.path_to_playlist(path, "append")
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE:
self.open_album_dialog(path)
@ -1685,11 +1735,11 @@ class AlbumIconView(Gtk.IconView):
if event.keyval == 112: # p
paths=self.get_selected_items()
if not len(paths) == 0:
self.path_to_playlist(paths[0], False)
self.path_to_playlist(paths[0])
elif event.keyval == 97: # a
paths=self.get_selected_items()
if not len(paths) == 0:
self.path_to_playlist(paths[0], True)
self.path_to_playlist(paths[0], "append")
elif event.keyval == 65383: # menu key
paths=self.get_selected_items()
if not len(paths) == 0:
@ -1701,7 +1751,7 @@ class AlbumIconView(Gtk.IconView):
selected_album=self.store.get_value(treeiter, 4)
selected_album_year=self.store.get_value(treeiter, 5)
selected_artist=self.store.get_value(treeiter, 6)
self.client.wrapped_call("album_to_playlist", selected_album, selected_artist, selected_album_year, False, True)
self.client.wrapped_call("album_to_playlist", selected_album, selected_artist, selected_album_year, "play")
class AlbumView(FocusFrame):
def __init__(self, client, settings, genre_select, window):
@ -2126,9 +2176,9 @@ class MainCover(Gtk.Frame):
except:
album_year=""
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
self.client.wrapped_call("album_to_playlist", album, artist, album_year, False)
self.client.wrapped_call("album_to_playlist", album, artist, album_year)
elif event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
self.client.wrapped_call("album_to_playlist", album, artist, album_year, True)
self.client.wrapped_call("album_to_playlist", album, artist, album_year, "append")
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
album_dialog=AlbumDialog(self.window, self.client, self.settings, album, artist, album_year)
album_dialog.open()

192
po/de.po
View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-09 22:22+0200\n"
"PO-Revision-Date: 2020-08-09 22:23+0200\n"
"POT-Creation-Date: 2020-08-16 17:01+0200\n"
"PO-Revision-Date: 2020-08-16 17:07+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@ -38,82 +38,102 @@ msgstr "Unbekannter Interpret"
msgid "Unknown Album"
msgstr "Unbekanntes Album"
#: mpdevil.py:1026 mpdevil.py:1291 mpdevil.py:2145 mpdevil.py:2823
#: mpdevil.py:1044 mpdevil.py:1347 mpdevil.py:2225 mpdevil.py:2910
msgid "No"
msgstr "Nr."
#: mpdevil.py:1031 mpdevil.py:1296 mpdevil.py:2151 mpdevil.py:2823
#: mpdevil.py:1049 mpdevil.py:1352 mpdevil.py:2231 mpdevil.py:2910
msgid "Title"
msgstr "Titel"
#: mpdevil.py:1037 mpdevil.py:1435 mpdevil.py:2154 mpdevil.py:2823
#: mpdevil.py:1055 mpdevil.py:1502 mpdevil.py:2234 mpdevil.py:2910
msgid "Artist"
msgstr "Interpret"
#: mpdevil.py:1043 mpdevil.py:2157 mpdevil.py:2823
#: mpdevil.py:1061 mpdevil.py:2237 mpdevil.py:2910
msgid "Album"
msgstr "Album"
#: mpdevil.py:1049 mpdevil.py:1302 mpdevil.py:2160 mpdevil.py:2823
#: mpdevil.py:1067 mpdevil.py:1358 mpdevil.py:2240 mpdevil.py:2910
msgid "Length"
msgstr "Länge"
#: mpdevil.py:1066
msgid "Add"
msgstr "Hinzufügen"
#: mpdevil.py:1069
msgid "Play"
msgstr "Wiedergabe"
#: mpdevil.py:1072
msgid "Open"
msgstr "Öffnen"
#: mpdevil.py:1132
#: mpdevil.py:1127
#, python-format
msgid "hits: %i"
msgstr "Treffer: %i"
#: mpdevil.py:1345
#: mpdevil.py:1230
msgid "Append"
msgstr "Anhängen"
#: mpdevil.py:1231
msgid "Add all titles to playlist"
msgstr "Alle Titel der Wiedergabeliste anhängen"
#: mpdevil.py:1232
msgid "Play"
msgstr "Abspielen"
#: mpdevil.py:1233
msgid "Directly play all titles"
msgstr "Alle Titel sofort abspielen"
#: mpdevil.py:1234
msgid "Enqueue"
msgstr "Einreihen"
#: mpdevil.py:1235
msgid ""
"Append all titles after the currently playing track and clear the playlist "
"from all other songs"
msgstr ""
"Alle Titel hinter dem aktuellen Stück einreihen und die Wiedergabeliste "
"sonst leeren"
#: mpdevil.py:1364
msgid "Close"
msgstr "Schließen"
#: mpdevil.py:1403
msgid "all genres"
msgstr "Alle Genres"
#: mpdevil.py:1433
#: mpdevil.py:1500
msgid "Album Artist"
msgstr "Albuminterpret"
#: mpdevil.py:1436
#: mpdevil.py:1503
msgid "all artists"
msgstr "Alle Interpreten"
#: mpdevil.py:1582
#: mpdevil.py:1665
#, 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:1584 mpdevil.py:2249
#: mpdevil.py:1667 mpdevil.py:2330
#, python-format
msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr "%(total_tracks)i Titel (%(total_length)s)"
#: mpdevil.py:1759
#: mpdevil.py:1848
msgid "Back to current album"
msgstr "Zurück zu aktuellem Album"
#: mpdevil.py:1761
#: mpdevil.py:1850
msgid "Search"
msgstr "Suche"
#: mpdevil.py:1938
#: mpdevil.py:2018
msgid "searching..."
msgstr "suche..."
#: mpdevil.py:1942
#: mpdevil.py:2022
msgid "lyrics not found"
msgstr "Liedtext nicht gefunden"
#: mpdevil.py:2010
#: mpdevil.py:2090
#, python-format
msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i "
@ -122,111 +142,111 @@ msgstr ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i "
"Kanäle, %(file_type)s"
#: mpdevil.py:2124
#: mpdevil.py:2204
msgid "Scroll to current song"
msgstr "Gehe zu aktuellem Lied"
#: mpdevil.py:2148 mpdevil.py:2823
#: mpdevil.py:2228 mpdevil.py:2910
msgid "Disc"
msgstr "CD"
#: mpdevil.py:2163 mpdevil.py:2823
#: mpdevil.py:2243 mpdevil.py:2910
msgid "Year"
msgstr "Jahr"
#: mpdevil.py:2166 mpdevil.py:2823
#: mpdevil.py:2246 mpdevil.py:2910
msgid "Genre"
msgstr "Genre"
#: mpdevil.py:2363
#: mpdevil.py:2448
msgid "Show lyrics"
msgstr "Zeige Liedtext"
#: mpdevil.py:2462
#: mpdevil.py:2547
msgid "Main cover size:"
msgstr "Größe des Haupt-Covers:"
#: mpdevil.py:2463
#: mpdevil.py:2548
msgid "Album view cover size:"
msgstr "Covergröße in Albumliste:"
#: mpdevil.py:2464
#: mpdevil.py:2549
msgid "Button icon size:"
msgstr "Symbolgröße der Knöpfe:"
#: mpdevil.py:2474
#: mpdevil.py:2559
msgid "Sort albums by:"
msgstr "Sortiere Alben nach:"
#: mpdevil.py:2474
#: mpdevil.py:2559
msgid "name"
msgstr "Name"
#: mpdevil.py:2474
#: mpdevil.py:2559
msgid "year"
msgstr "Jahr"
#: mpdevil.py:2475
#: mpdevil.py:2560
msgid "Position of playlist:"
msgstr "Wiedergabelistenposition:"
#: mpdevil.py:2475
#: mpdevil.py:2560
msgid "bottom"
msgstr "unten"
#: mpdevil.py:2475
#: mpdevil.py:2560
msgid "right"
msgstr "rechts"
#: mpdevil.py:2492
#: mpdevil.py:2577
msgid "Use Client-side decoration"
msgstr "Benutze \"Client-side decoration\""
#: mpdevil.py:2493
#: mpdevil.py:2578
msgid "Show stop button"
msgstr "Zeige Stopp-Knopf"
#: mpdevil.py:2494
#: mpdevil.py:2579
msgid "Show lyrics button"
msgstr "Zeige Liedtext-Knopf"
#: mpdevil.py:2495
#: mpdevil.py:2580
msgid "Show initials in artist view"
msgstr "Zeige Anfangsbuchstaben in Interpretenliste"
#: mpdevil.py:2496
#: mpdevil.py:2581
msgid "Show tooltips in album view"
msgstr "Zeige Tooltips in Albumliste"
#: mpdevil.py:2497
#: mpdevil.py:2582
msgid "Use 'Album Artist' tag"
msgstr "Benutze \"Album Artist\" Tag"
#: mpdevil.py:2498
#: mpdevil.py:2583
msgid "Send notification on title change"
msgstr "Sende Benachrichtigung bei Titelwechsel"
#: mpdevil.py:2499
#: mpdevil.py:2584
msgid "Stop playback on quit"
msgstr "Wiedergabe beim Beenden stoppen"
#: mpdevil.py:2500
#: mpdevil.py:2585
msgid "Play selected albums and titles immediately"
msgstr "Ausgewählte Alben und Titel sofort abspielen"
#: mpdevil.py:2511
#: mpdevil.py:2596
msgid "<b>View</b>"
msgstr "<b>Ansicht</b>"
#: mpdevil.py:2514
#: mpdevil.py:2599
msgid "<b>Behavior</b>"
msgstr "<b>Verhalten</b>"
#: mpdevil.py:2545
#: mpdevil.py:2630
msgid "(restart required)"
msgstr "(Neustart erforderlich)"
#: mpdevil.py:2626
#: mpdevil.py:2711
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 "
@ -236,112 +256,118 @@ msgstr ""
"regulären Ausdruck entspricht, wird angezeigt. %AlbumArtist% und %Album% "
"werden durch die entsprechenden Tags des Liedes ersetzt."
#: mpdevil.py:2628
#: mpdevil.py:2713
msgid "Profile:"
msgstr "Profil:"
#: mpdevil.py:2630
#: mpdevil.py:2715
msgid "Name:"
msgstr "Name:"
#: mpdevil.py:2632
#: mpdevil.py:2717
msgid "Host:"
msgstr "Host:"
#: mpdevil.py:2634
#: mpdevil.py:2719
msgid "Password:"
msgstr "Passwort:"
#: mpdevil.py:2636
#: mpdevil.py:2721
msgid "Music lib:"
msgstr "Musikverzeichnis:"
#: mpdevil.py:2638
#: mpdevil.py:2723
msgid "Cover regex:"
msgstr "Cover-Regex:"
#: mpdevil.py:2761
#: mpdevil.py:2848
msgid "Choose directory"
msgstr "Verzeichnis Wählen"
#: mpdevil.py:2795
#: mpdevil.py:2882
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:2937 mpdevil.py:3447
#: mpdevil.py:3026 mpdevil.py:3034 mpdevil.py:3569
msgid "Settings"
msgstr "Einstellungen"
#: mpdevil.py:2951
#: mpdevil.py:3045
msgid "General"
msgstr "Allgemein"
#: mpdevil.py:2952
#: mpdevil.py:3046
msgid "Profiles"
msgstr "Profile"
#: mpdevil.py:2953
#: mpdevil.py:3047
msgid "Playlist"
msgstr "Wiedergabeliste"
#: mpdevil.py:3212
#: mpdevil.py:3310
msgid "Random mode"
msgstr "Zufallsmodus"
#: mpdevil.py:3214
#: mpdevil.py:3312
msgid "Repeat mode"
msgstr "Dauerschleife"
#: mpdevil.py:3216
#: mpdevil.py:3314
msgid "Single mode"
msgstr "Einzelstückmodus"
#: mpdevil.py:3218
#: mpdevil.py:3316
msgid "Consume mode"
msgstr "Wiedergabeliste verbrauchen"
#: mpdevil.py:3295
#: mpdevil.py:3408 mpdevil.py:3416
msgid "Stats"
msgstr "Statistik"
#: mpdevil.py:3348
#: mpdevil.py:3470
msgid "A small MPD client written in python"
msgstr ""
#: mpdevil.py:3440
#: mpdevil.py:3562
msgid "Select profile"
msgstr "Profil auswählen"
#: mpdevil.py:3448
#: mpdevil.py:3570
msgid "Help"
msgstr "Hilfe"
#: mpdevil.py:3449
#: mpdevil.py:3571
msgid "About"
msgstr "Über"
#: mpdevil.py:3450
#: mpdevil.py:3572
msgid "Quit"
msgstr "Beenden"
#: mpdevil.py:3453
#: mpdevil.py:3575
msgid "Save window layout"
msgstr "Fensterlayout speichern"
#: mpdevil.py:3454
#: mpdevil.py:3576
msgid "Update database"
msgstr "Datenbank aktualisieren"
#: mpdevil.py:3455
#: mpdevil.py:3577
msgid "Server stats"
msgstr "Serverstatistik"
#: mpdevil.py:3461
#: mpdevil.py:3583
msgid "Menu"
msgstr "Menü"
#~ msgid "Add"
#~ msgstr "Hinzufügen"
#~ msgid "Open"
#~ msgstr "Öffnen"
#~ msgid "Show additional information"
#~ msgstr "Zeige weitere Informationen"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-09 22:22+0200\n"
"POT-Creation-Date: 2020-08-16 17:01+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -37,299 +37,317 @@ msgstr ""
msgid "Unknown Album"
msgstr ""
#: mpdevil.py:1026 mpdevil.py:1291 mpdevil.py:2145 mpdevil.py:2823
#: mpdevil.py:1044 mpdevil.py:1347 mpdevil.py:2225 mpdevil.py:2910
msgid "No"
msgstr ""
#: mpdevil.py:1031 mpdevil.py:1296 mpdevil.py:2151 mpdevil.py:2823
#: mpdevil.py:1049 mpdevil.py:1352 mpdevil.py:2231 mpdevil.py:2910
msgid "Title"
msgstr ""
#: mpdevil.py:1037 mpdevil.py:1435 mpdevil.py:2154 mpdevil.py:2823
#: mpdevil.py:1055 mpdevil.py:1502 mpdevil.py:2234 mpdevil.py:2910
msgid "Artist"
msgstr ""
#: mpdevil.py:1043 mpdevil.py:2157 mpdevil.py:2823
#: mpdevil.py:1061 mpdevil.py:2237 mpdevil.py:2910
msgid "Album"
msgstr ""
#: mpdevil.py:1049 mpdevil.py:1302 mpdevil.py:2160 mpdevil.py:2823
#: mpdevil.py:1067 mpdevil.py:1358 mpdevil.py:2240 mpdevil.py:2910
msgid "Length"
msgstr ""
#: mpdevil.py:1066
msgid "Add"
msgstr ""
#: mpdevil.py:1069
msgid "Play"
msgstr ""
#: mpdevil.py:1072
msgid "Open"
msgstr ""
#: mpdevil.py:1132
#: mpdevil.py:1127
#, python-format
msgid "hits: %i"
msgstr ""
#: mpdevil.py:1345
#: mpdevil.py:1230
msgid "Append"
msgstr ""
#: mpdevil.py:1231
msgid "Add all titles to playlist"
msgstr ""
#: mpdevil.py:1232
msgid "Play"
msgstr ""
#: mpdevil.py:1233
msgid "Directly play all titles"
msgstr ""
#: mpdevil.py:1234
msgid "Enqueue"
msgstr ""
#: mpdevil.py:1235
msgid ""
"Append all titles after the currently playing track and clear the playlist "
"from all other songs"
msgstr ""
#: mpdevil.py:1364
msgid "Close"
msgstr ""
#: mpdevil.py:1403
msgid "all genres"
msgstr ""
#: mpdevil.py:1433
#: mpdevil.py:1500
msgid "Album Artist"
msgstr ""
#: mpdevil.py:1436
#: mpdevil.py:1503
msgid "all artists"
msgstr ""
#: mpdevil.py:1582
#: mpdevil.py:1665
#, python-format
msgid "%(total_tracks)i titles on %(discs)i discs (%(total_length)s)"
msgstr ""
#: mpdevil.py:1584 mpdevil.py:2249
#: mpdevil.py:1667 mpdevil.py:2330
#, python-format
msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr ""
#: mpdevil.py:1759
#: mpdevil.py:1848
msgid "Back to current album"
msgstr ""
#: mpdevil.py:1761
#: mpdevil.py:1850
msgid "Search"
msgstr ""
#: mpdevil.py:1938
#: mpdevil.py:2018
msgid "searching..."
msgstr ""
#: mpdevil.py:1942
#: mpdevil.py:2022
msgid "lyrics not found"
msgstr ""
#: mpdevil.py:2010
#: mpdevil.py:2090
#, python-format
msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)i bit, %(channels)i "
"channels, %(file_type)s"
msgstr ""
#: mpdevil.py:2124
#: mpdevil.py:2204
msgid "Scroll to current song"
msgstr ""
#: mpdevil.py:2148 mpdevil.py:2823
#: mpdevil.py:2228 mpdevil.py:2910
msgid "Disc"
msgstr ""
#: mpdevil.py:2163 mpdevil.py:2823
#: mpdevil.py:2243 mpdevil.py:2910
msgid "Year"
msgstr ""
#: mpdevil.py:2166 mpdevil.py:2823
#: mpdevil.py:2246 mpdevil.py:2910
msgid "Genre"
msgstr ""
#: mpdevil.py:2363
#: mpdevil.py:2448
msgid "Show lyrics"
msgstr ""
#: mpdevil.py:2462
#: mpdevil.py:2547
msgid "Main cover size:"
msgstr ""
#: mpdevil.py:2463
#: mpdevil.py:2548
msgid "Album view cover size:"
msgstr ""
#: mpdevil.py:2464
#: mpdevil.py:2549
msgid "Button icon size:"
msgstr ""
#: mpdevil.py:2474
#: mpdevil.py:2559
msgid "Sort albums by:"
msgstr ""
#: mpdevil.py:2474
#: mpdevil.py:2559
msgid "name"
msgstr ""
#: mpdevil.py:2474
#: mpdevil.py:2559
msgid "year"
msgstr ""
#: mpdevil.py:2475
#: mpdevil.py:2560
msgid "Position of playlist:"
msgstr ""
#: mpdevil.py:2475
#: mpdevil.py:2560
msgid "bottom"
msgstr ""
#: mpdevil.py:2475
#: mpdevil.py:2560
msgid "right"
msgstr ""
#: mpdevil.py:2492
#: mpdevil.py:2577
msgid "Use Client-side decoration"
msgstr ""
#: mpdevil.py:2493
#: mpdevil.py:2578
msgid "Show stop button"
msgstr ""
#: mpdevil.py:2494
#: mpdevil.py:2579
msgid "Show lyrics button"
msgstr ""
#: mpdevil.py:2495
#: mpdevil.py:2580
msgid "Show initials in artist view"
msgstr ""
#: mpdevil.py:2496
#: mpdevil.py:2581
msgid "Show tooltips in album view"
msgstr ""
#: mpdevil.py:2497
#: mpdevil.py:2582
msgid "Use 'Album Artist' tag"
msgstr ""
#: mpdevil.py:2498
#: mpdevil.py:2583
msgid "Send notification on title change"
msgstr ""
#: mpdevil.py:2499
#: mpdevil.py:2584
msgid "Stop playback on quit"
msgstr ""
#: mpdevil.py:2500
#: mpdevil.py:2585
msgid "Play selected albums and titles immediately"
msgstr ""
#: mpdevil.py:2511
#: mpdevil.py:2596
msgid "<b>View</b>"
msgstr ""
#: mpdevil.py:2514
#: mpdevil.py:2599
msgid "<b>Behavior</b>"
msgstr ""
#: mpdevil.py:2545
#: mpdevil.py:2630
msgid "(restart required)"
msgstr ""
#: mpdevil.py:2626
#: mpdevil.py:2711
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:2628
#: mpdevil.py:2713
msgid "Profile:"
msgstr ""
#: mpdevil.py:2630
#: mpdevil.py:2715
msgid "Name:"
msgstr ""
#: mpdevil.py:2632
#: mpdevil.py:2717
msgid "Host:"
msgstr ""
#: mpdevil.py:2634
#: mpdevil.py:2719
msgid "Password:"
msgstr ""
#: mpdevil.py:2636
#: mpdevil.py:2721
msgid "Music lib:"
msgstr ""
#: mpdevil.py:2638
#: mpdevil.py:2723
msgid "Cover regex:"
msgstr ""
#: mpdevil.py:2761
#: mpdevil.py:2848
msgid "Choose directory"
msgstr ""
#: mpdevil.py:2795
#: mpdevil.py:2882
msgid "Choose the order of information to appear in the playlist:"
msgstr ""
#: mpdevil.py:2937 mpdevil.py:3447
#: mpdevil.py:3026 mpdevil.py:3034 mpdevil.py:3569
msgid "Settings"
msgstr ""
#: mpdevil.py:2951
#: mpdevil.py:3045
msgid "General"
msgstr ""
#: mpdevil.py:2952
#: mpdevil.py:3046
msgid "Profiles"
msgstr ""
#: mpdevil.py:2953
#: mpdevil.py:3047
msgid "Playlist"
msgstr ""
#: mpdevil.py:3212
#: mpdevil.py:3310
msgid "Random mode"
msgstr ""
#: mpdevil.py:3214
#: mpdevil.py:3312
msgid "Repeat mode"
msgstr ""
#: mpdevil.py:3216
#: mpdevil.py:3314
msgid "Single mode"
msgstr ""
#: mpdevil.py:3218
#: mpdevil.py:3316
msgid "Consume mode"
msgstr ""
#: mpdevil.py:3295
#: mpdevil.py:3408 mpdevil.py:3416
msgid "Stats"
msgstr ""
#: mpdevil.py:3348
#: mpdevil.py:3470
msgid "A small MPD client written in python"
msgstr ""
#: mpdevil.py:3440
#: mpdevil.py:3562
msgid "Select profile"
msgstr ""
#: mpdevil.py:3448
#: mpdevil.py:3570
msgid "Help"
msgstr ""
#: mpdevil.py:3449
#: mpdevil.py:3571
msgid "About"
msgstr ""
#: mpdevil.py:3450
#: mpdevil.py:3572
msgid "Quit"
msgstr ""
#: mpdevil.py:3453
#: mpdevil.py:3575
msgid "Save window layout"
msgstr ""
#: mpdevil.py:3454
#: mpdevil.py:3576
msgid "Update database"
msgstr ""
#: mpdevil.py:3455
#: mpdevil.py:3577
msgid "Server stats"
msgstr ""
#: mpdevil.py:3461
#: mpdevil.py:3583
msgid "Menu"
msgstr ""