12 Commits

Author SHA1 Message Date
Martin Wagner
e62f4824c2 gui improvements 2020-01-19 00:00:40 +01:00
Martin Wagner
b9b1ba989a reworked album query dialog 2020-01-18 16:23:52 +01:00
Martin Wagner
f1831a5569 new screenshot 2020-01-18 10:28:53 +01:00
Martin Wagner
b904907f6f Delete mainwindow.png 2020-01-18 10:26:35 +01:00
Martin Wagner
54673a9840 new screenshot 2020-01-18 10:23:57 +01:00
Martin Wagner
89ffc03cb2 Update configure.ac 2020-01-17 22:43:33 +01:00
Martin Wagner
d04c84e5d0 readme update 2020-01-17 22:39:56 +01:00
Martin Wagner
6990d59f72 translation update 2020-01-17 22:35:30 +01:00
Martin Wagner
421f685b58 search dialog fix 2020-01-17 22:18:50 +01:00
Martin Wagner
6238df4d21 added new album dialog / tooltip fixes 2020-01-17 22:13:58 +01:00
Martin Wagner
b8d1f9aafc fixed unintended behavior on stopped state 2020-01-14 20:24:28 +01:00
Martin Wagner
3414212173 converted to symbolic icons 2020-01-14 17:18:49 +01:00
6 changed files with 286 additions and 187 deletions

View File

@@ -12,9 +12,10 @@ Features
3. fetching lyrics form the web (based on PyLyrics 1.1.0)
4. searching songs in your music library
5. removing single tracks form playlist by hovering and pressing del
6. appending albums by rightclick
7. sending notifications on title change
8. managing multiple mpd servers
6. appending albums by middleclick
7. query albums by rightclick
8. sending notifications on title change
9. managing multiple mpd servers
TODO
----

View File

@@ -89,6 +89,105 @@ class Client(MPDClient):
except:
return False
class AlbumDialog(Gtk.Dialog):
def __init__(self, parent, client, album, artist, year):
Gtk.Dialog.__init__(self, title=(artist+" - "+album+" ("+year+")"), 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)
self.set_default_size(800, 600)
#adding vars
self.client=client
#scroll
scroll=Gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
#Store
#(track, title, artist, duration, file)
self.store = Gtk.ListStore(str, str, str, str, str)
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview.set_search_column(-1)
self.treeview.columns_autosize()
self.selection = self.treeview.get_selection()
self.selection.set_mode(Gtk.SelectionMode.SINGLE)
#Column
renderer_text = Gtk.CellRendererText()
self.column_track = Gtk.TreeViewColumn(_("No"), renderer_text, text=0)
self.column_track.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_track.set_property("resizable", False)
self.treeview.append_column(self.column_track)
self.column_title = Gtk.TreeViewColumn(_("Title"), renderer_text, text=1)
self.column_title.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_title.set_property("resizable", False)
self.treeview.append_column(self.column_title)
self.column_artist = Gtk.TreeViewColumn(_("Artist"), renderer_text, text=2)
self.column_artist.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_artist.set_property("resizable", False)
self.treeview.append_column(self.column_artist)
self.column_time = Gtk.TreeViewColumn(_("Length"), renderer_text, text=3)
self.column_time.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_time.set_property("resizable", False)
self.treeview.append_column(self.column_time)
self.populate_treeview(album, artist, year)
#connect
self.title_activated=self.treeview.connect("row-activated", self.on_row_activated)
#packing
scroll.add(self.treeview)
self.vbox.pack_start(scroll, True, True, 0) #vbox default widget of dialogs
self.vbox.set_spacing(6)
self.show_all()
#selection workaround
self.selection.unselect_all()
self.title_change=self.selection.connect("changed", self.on_selection_change)
def on_row_activated(self, widget, path, view_column):
treeiter=self.store.get_iter(path)
selected_title=self.store.get_value(treeiter, 4)
self.client.clear()
self.client.add(selected_title)
self.client.play(0)
def on_selection_change(self, widget):
treeiter=widget.get_selected()[1]
if not treeiter == None:
selected_title=self.store.get_value(treeiter, 4)
self.client.add(selected_title)
def populate_treeview(self, album, artist, year):
songs=self.client.find("album", album, "date", year, "albumartist", artist)
if not songs == []:
for song in songs:
try:
title=song["title"]
except:
title=_("Unknown Title")
try:
artist=song["artist"]
except:
artist=_("Unknown Artist")
try:
track=song["track"].zfill(2)
except:
track="00"
try:
dura=float(song["duration"])
except:
dura=0.0
duration=str(datetime.timedelta(seconds=int(dura)))
self.store.append([track, title, artist, duration, song["file"]] )
class ArtistView(Gtk.ScrolledWindow):
def __init__(self, client):
Gtk.ScrolledWindow.__init__(self)
@@ -161,32 +260,19 @@ class AlbumView(Gtk.ScrolledWindow):
self.add(self.iconview)
def gen_title_list(self, album, artist, year): #needed for tooltips
def gen_tooltip(self, album, artist, year):
if self.settings.get_boolean("show-album-view-tooltips"):
songs=self.client.find("album", album, "date", year, "albumartist", artist)
length=float(0)
title_list=""
for song in songs:
try:
title=song["title"]
except:
title=_("Unknown Title")
try:
track=song["track"].zfill(2)
except:
track="00"
try:
dura=float(song["duration"])
except:
dura=0.0
length=length+dura
duration=str(datetime.timedelta(seconds=int(dura)))
title_list=title_list+"\n"+(track+" - "+title+" ("+duration+")")
if not year == "":
year=" ("+year+")"
length_human_readable=str(datetime.timedelta(seconds=int(length)))
title_list=(_("%(album)s%(year)s (tracks: %(total_tracks)i) (%(total_length)s):") % {"album": album, "year": year, "total_tracks": len(songs), "total_length": length_human_readable})+title_list
return title_list.replace("&", "") #& must not be in tooltips
tooltip=(_("%(total_tracks)i titles (%(total_length)s)") % {"total_tracks": len(songs), "total_length": length_human_readable})
return tooltip
else:
return None
@@ -206,9 +292,9 @@ class AlbumView(Gtk.ScrolledWindow):
cover=Cover(client=self.client, lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=song_file)
img=cover.get_pixbuf(size)
if album["year"] == "":
self.store.append([img, album["album"], self.gen_title_list(album["album"], artist, album["year"]), album["album"], album["year"]])
self.store.append([img, album["album"], self.gen_tooltip(album["album"], artist, album["year"]), album["album"], album["year"]])
else:
self.store.append([img, album["album"]+" ("+album["year"]+")", self.gen_title_list(album["album"], artist, album["year"]), album["album"], album["year"]])
self.store.append([img, album["album"]+" ("+album["year"]+")", self.gen_tooltip(album["album"], artist, album["year"]), album["album"], album["year"]])
while Gtk.events_pending():
Gtk.main_iteration_do(True)
@@ -231,7 +317,6 @@ class TrackView(Gtk.Box):
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview.set_search_column(-1)
self.treeview.set_tooltip_column(5)
self.treeview.columns_autosize()
#selection
@@ -306,14 +391,11 @@ class TrackView(Gtk.Box):
for song in songs:
self.client.add(song["file"])
else:
if self.settings.get_boolean("add-album") and not force:
if self.settings.get_boolean("add-album") and not force and not self.client.status()["state"] == "stop":
self.selection.handler_block(self.title_change)
status=self.client.status()
try:
self.client.moveid(status["songid"], 0) #bad song index possible
self.song_to_delete=self.client.playlistinfo()[0]["file"]
except:
pass
self.client.moveid(status["songid"], 0)
self.song_to_delete=self.client.playlistinfo()[0]["file"]
self.selection.handler_unblock(self.title_change)
try:
self.client.delete((1,)) # delete all songs, but the first. #bad song index possible
@@ -425,12 +507,13 @@ class TrackView(Gtk.Box):
self.client.play(selected_title)
class Browser(Gtk.Box):
def __init__(self, client, settings):
def __init__(self, client, settings, window):
Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=3)
#adding vars
self.client=client
self.settings=settings
self.window=window
#widgets
self.artist_list=ArtistView(self.client)
@@ -510,14 +593,26 @@ class Browser(Gtk.Box):
def on_album_view_button_press_event(self, widget, event):
path = widget.get_path_at_pos(int(event.x), int(event.y))
if event.button == 3:
if not path == None:
if not path == None:
if not event.button == 1:
treeiter=self.album_list.store.get_iter(path)
selected_album=self.album_list.store.get_value(treeiter, 3)
selected_album_year=self.album_list.store.get_value(treeiter, 4)
treeiter=self.artist_list.selection.get_selected()[1]
selected_artist=self.artist_list.store.get_value(treeiter, 0)
if event.button == 2:
self.title_list.album_to_playlist(selected_album, selected_artist, selected_album_year, True)
elif event.button == 3:
if self.client.connected():
album = AlbumDialog(self.window, self.client, selected_album, selected_artist, selected_album_year)
response = album.run()
if response == Gtk.ResponseType.OK:
self.album_list.iconview.select_path(path)
elif response == Gtk.ResponseType.ACCEPT:
self.title_list.album_to_playlist(selected_album, selected_artist, selected_album_year, True)
elif response == Gtk.ResponseType.YES:
self.title_list.album_to_playlist(selected_album, selected_artist, selected_album_year, False, True)
album.destroy()
def on_album_selection_change(self, widget):
paths=widget.get_selected_items()
@@ -719,7 +814,7 @@ class GeneralSettings(Gtk.Grid):
show_stop=Gtk.CheckButton(label=_("Show stop button"))
show_stop.set_active(self.settings.get_boolean("show-stop"))
show_album_view_tooltips=Gtk.CheckButton(label=_("Show title list as tooltip in album view"))
show_album_view_tooltips=Gtk.CheckButton(label=_("Show tooltips in album view"))
show_album_view_tooltips.set_active(self.settings.get_boolean("show-album-view-tooltips"))
send_notify=Gtk.CheckButton(label=_("Send notification on title change"))
@@ -775,6 +870,7 @@ class SettingsDialog(Gtk.Dialog):
tabs.append_page(general, Gtk.Label(label=_("General")))
tabs.append_page(profiles, Gtk.Label(label=_("Profiles")))
self.vbox.pack_start(tabs, True, True, 0) #vbox default widget of dialogs
self.vbox.set_spacing(6)
self.show_all()
@@ -787,10 +883,10 @@ class ClientControl(Gtk.ButtonBox):
self.settings=settings
#widgets
self.play_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-start", Gtk.IconSize.DND))
self.stop_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-stop", Gtk.IconSize.DND))
self.prev_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-backward", Gtk.IconSize.DND))
self.next_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-forward", Gtk.IconSize.DND))
self.play_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-start-symbolic", Gtk.IconSize.DND))
self.stop_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-stop-symbolic", Gtk.IconSize.DND))
self.prev_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-backward-symbolic", Gtk.IconSize.DND))
self.next_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-forward-symbolic", Gtk.IconSize.DND))
#connect
self.play_button.connect("clicked", self.on_play_clicked)
@@ -813,15 +909,15 @@ class ClientControl(Gtk.ButtonBox):
if self.client.connected():
status=self.client.status()
if status["state"] == "play":
self.play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-pause", Gtk.IconSize.DND))
self.play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-pause-symbolic", Gtk.IconSize.DND))
self.prev_button.set_sensitive(True)
self.next_button.set_sensitive(True)
elif status["state"] == "pause":
self.play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-start", Gtk.IconSize.DND))
self.play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-start-symbolic", Gtk.IconSize.DND))
self.prev_button.set_sensitive(True)
self.next_button.set_sensitive(True)
else:
self.play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-start", Gtk.IconSize.DND))
self.play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-start-symbolic", Gtk.IconSize.DND))
self.prev_button.set_sensitive(False)
self.next_button.set_sensitive(False)
return True
@@ -873,7 +969,9 @@ class SeekBar(Gtk.Box):
#widgets
self.elapsed=Gtk.Label()
self.elapsed.set_width_chars(7)
self.rest=Gtk.Label()
self.rest.set_width_chars(8)
self.scale=Gtk.Scale.new_with_range(orientation=Gtk.Orientation.HORIZONTAL, min=0, max=100, step=0.001)
self.scale.set_draw_value(False)
@@ -1173,7 +1271,7 @@ class ServerStats(Gtk.Dialog):
class Search(Gtk.Dialog):
def __init__(self, parent, client):
Gtk.Dialog.__init__(self, title=_("Search"), transient_for=parent)
self.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK)
self.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
self.set_default_size(800, 600)
#adding vars
@@ -1185,7 +1283,6 @@ class Search(Gtk.Dialog):
#search entry
self.search_entry=Gtk.SearchEntry()
self.search_entry.connect("search-changed", self.on_search_changed)
#label
self.label=Gtk.Label()
@@ -1198,7 +1295,6 @@ class Search(Gtk.Dialog):
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview.set_search_column(-1)
self.treeview.set_tooltip_column(5)
self.treeview.columns_autosize()
self.selection = self.treeview.get_selection()
@@ -1235,6 +1331,7 @@ class Search(Gtk.Dialog):
#connect
self.title_activated=self.treeview.connect("row-activated", self.on_row_activated)
self.title_change=self.selection.connect("changed", self.on_selection_change)
self.search_entry.connect("search-changed", self.on_search_changed)
#packing
scroll.add(self.treeview)
@@ -1416,16 +1513,16 @@ class MainWindow(Gtk.ApplicationWindow):
self.add_action(update_action)
#widgets
self.browser=Browser(self.client, self.settings)
self.browser=Browser(self.client, self.settings, self)
self.profiles=ProfileSelect(self.client, self.settings)
self.profiles.set_tooltip_text(_("Select profile"))
self.control=ClientControl(self.client, self.settings)
self.progress=SeekBar(self.client)
self.go_home_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("go-home", Gtk.IconSize.DND))
self.go_home_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("go-home-symbolic", Gtk.IconSize.DND))
self.go_home_button.set_tooltip_text(_("Return to album of current title"))
self.search_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("system-search", Gtk.IconSize.DND))
self.search_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("system-search-symbolic", Gtk.IconSize.DND))
self.search_button.set_tooltip_text(_("Title search"))
self.lyrics_button=Gtk.ToggleButton(image=Gtk.Image.new_from_icon_name("media-view-subtitles", Gtk.IconSize.DND))
self.lyrics_button=Gtk.ToggleButton(image=Gtk.Image.new_from_icon_name("media-view-subtitles-symbolic", Gtk.IconSize.DND))
self.lyrics_button.set_tooltip_text(_("Show lyrics"))
self.play_opts=PlaybackOptions(self.client)
@@ -1479,6 +1576,7 @@ class MainWindow(Gtk.ApplicationWindow):
self.hbox.pack_end(menu_button, False, False, 0)
self.add(self.vbox)
self.show_all()
def update(self, app): #update title and send notify
if self.client.connected():
@@ -1570,15 +1668,15 @@ class mpdevil(Gtk.Application):
BASE_KEY = "org.mpdevil"
def __init__(self, *args, **kwargs):
super().__init__(*args, application_id="org.mpdevil", flags=Gio.ApplicationFlags.FLAGS_NONE, **kwargs)
#Gtk.window_set_default_icon_name("mpdevil")
self.client=Client()
self.settings = Gio.Settings.new(self.BASE_KEY)
self.window=None
def do_activate(self):
self.window = MainWindow(self, self.client, self.settings)
self.window.connect("delete-event", self.on_delete_event)
self.window.show_all()
if not self.window: #allow just one instance
self.window = MainWindow(self, self.client, self.settings)
self.window.connect("delete-event", self.on_delete_event)
self.window.present()
def do_startup(self):
Gtk.Application.do_startup(self)

View File

@@ -1,7 +1,7 @@
dnl -*- Mode: autoconf -*-
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.68])
AC_INIT([mpdevil], [0.3.1])
AC_INIT([mpdevil], [0.4.1])
AC_CONFIG_SRCDIR([bin/mpdevil.py])
AM_INIT_AUTOMAKE
AC_CONFIG_MACRO_DIR([m4])

138
po/de.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-01-12 16:18+0100\n"
"PO-Revision-Date: 2020-01-12 16:18+0100\n"
"POT-Creation-Date: 2020-01-17 22:33+0100\n"
"PO-Revision-Date: 2020-01-17 22:34+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@@ -18,140 +18,140 @@ msgstr ""
"X-Generator: Poedit 2.2.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mpdevil.py:116
msgid "Album Artist"
msgstr "Albuminterpret"
#: mpdevil.py:173 mpdevil.py:350 mpdevil.py:1265
msgid "Unknown Title"
msgstr "Unbekannter Titel"
#: mpdevil.py:188
#, python-format
msgid "%(album)s%(year)s (tracks: %(total_tracks)i) (%(total_length)s):"
msgstr "%(album)s%(year)s (Titel: %(total_tracks)i) (%(total_length)s):"
#: mpdevil.py:244 mpdevil.py:1210
#: mpdevil.py:120 mpdevil.py:328 mpdevil.py:1302
msgid "No"
msgstr "Nr."
#: mpdevil.py:249 mpdevil.py:1215
#: mpdevil.py:125 mpdevil.py:333 mpdevil.py:1307
msgid "Title"
msgstr "Titel"
#: mpdevil.py:254 mpdevil.py:1220
#: mpdevil.py:130 mpdevil.py:338 mpdevil.py:1312
msgid "Artist"
msgstr "Interpret"
#: mpdevil.py:259 mpdevil.py:1230
#: mpdevil.py:135 mpdevil.py:343 mpdevil.py:1322
msgid "Length"
msgstr "Länge"
#: mpdevil.py:358 mpdevil.py:1273
#: mpdevil.py:174 mpdevil.py:431 mpdevil.py:1358
msgid "Unknown Title"
msgstr "Unbekannter Titel"
#: mpdevil.py:178 mpdevil.py:439 mpdevil.py:1366
msgid "Unknown Artist"
msgstr "Unbekannter Künstler"
#: mpdevil.py:362 mpdevil.py:1277
#: mpdevil.py:214
msgid "Album Artist"
msgstr "Albuminterpret"
#: mpdevil.py:273
#, python-format
msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr "%(total_tracks)i Titel (%(total_length)s)"
#: mpdevil.py:443 mpdevil.py:1370
msgid "Unknown Album"
msgstr "Unbekanntes Album"
#: mpdevil.py:575
#: mpdevil.py:669
msgid "Select"
msgstr "Auswählen"
#: mpdevil.py:577
#: mpdevil.py:671
msgid "Profile:"
msgstr "Profil:"
#: mpdevil.py:579
#: mpdevil.py:673
msgid "Name:"
msgstr "Name:"
#: mpdevil.py:581
#: mpdevil.py:675
msgid "Host:"
msgstr "Host:"
#: mpdevil.py:583
#: mpdevil.py:677
msgid "Port:"
msgstr "Port:"
#: mpdevil.py:585
#: mpdevil.py:679
msgid "Music lib:"
msgstr "Musikverzeichnis:"
#: mpdevil.py:675
#: mpdevil.py:769
msgid "Choose directory"
msgstr "Verzeichnis Wählen"
#: mpdevil.py:711
#: mpdevil.py:805
msgid "Main cover size:"
msgstr "Größe des Haupt-Covers:"
#: mpdevil.py:713
#: mpdevil.py:807
msgid "Album-view cover size:"
msgstr "Covergröße in Albumansicht:"
#: mpdevil.py:719
#: mpdevil.py:813
msgid "Show stop button"
msgstr "Zeige Stopp-Knopf"
#: mpdevil.py:722
msgid "Show title list as tooltip in album view"
msgstr "Zeige Titellisten als Tooltips in Albumansicht"
#: mpdevil.py:816
msgid "Show tooltips in album view"
msgstr "Zeige Tooltips in Albumansicht"
#: mpdevil.py:725
#: mpdevil.py:819
msgid "Send notification on title change"
msgstr "Sende Benachrichtigung bei Titelwechsel"
#: mpdevil.py:728
#: mpdevil.py:822
msgid "Stop playback on quit"
msgstr "Wiedergabe beim Beenden stoppen"
#: mpdevil.py:731
#: mpdevil.py:825
msgid "Play selected album after current title"
msgstr "Ausgewähltes Album hinter aktuellem Titel einreihen"
#: mpdevil.py:762 mpdevil.py:1441
#: mpdevil.py:856 mpdevil.py:1534
msgid "Settings"
msgstr "Einstellungen"
#: mpdevil.py:775
#: mpdevil.py:869
msgid "General"
msgstr "Allgemein"
#: mpdevil.py:776
#: mpdevil.py:870
msgid "Profiles"
msgstr "Profile"
#: mpdevil.py:924
#: mpdevil.py:1018
msgid "Random mode"
msgstr "Zufallsmodus"
#: mpdevil.py:926
#: mpdevil.py:1020
msgid "Repeat mode"
msgstr "Dauerschleife"
#: mpdevil.py:928
#: mpdevil.py:1022
msgid "Single mode"
msgstr "Einzelstückmodus"
#: mpdevil.py:930
#: mpdevil.py:1024
msgid "Consume mode"
msgstr "Playliste verbrauchen"
#: mpdevil.py:1024
#: mpdevil.py:1118
msgid "Right click to show additional information"
msgstr "Rechtsclick für weitere Informationen"
#: mpdevil.py:1047
#: mpdevil.py:1141
msgid "MPD-Tag"
msgstr "MPD-Tag"
#: mpdevil.py:1050 mpdevil.py:1158
#: mpdevil.py:1144 mpdevil.py:1252
msgid "Value"
msgstr "Wert"
#: mpdevil.py:1071
#: mpdevil.py:1165
#, python-format
msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
@@ -160,88 +160,88 @@ msgstr ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
"Kanäle, %(file_type)s"
#: mpdevil.py:1137
#: mpdevil.py:1231
msgid "Stats"
msgstr "Statistik"
#: mpdevil.py:1155
#: mpdevil.py:1249
msgid "Tag"
msgstr "Tag"
#: mpdevil.py:1175
#: mpdevil.py:1269
msgid "Search"
msgstr "Suche"
#: mpdevil.py:1225
#: mpdevil.py:1317
msgid "Album"
msgstr "Album"
#: mpdevil.py:1284
#: mpdevil.py:1377
#, python-format
msgid "Hits: %i"
msgstr "Treffer: %i"
#: mpdevil.py:1288
#: mpdevil.py:1381
msgid "Lyrics"
msgstr "Liedtext"
#: mpdevil.py:1332
#: mpdevil.py:1425
msgid "searching..."
msgstr "suche..."
#: mpdevil.py:1336
#: mpdevil.py:1429
msgid "not found"
msgstr "nicht gefunden"
#: mpdevil.py:1341
#: mpdevil.py:1434
msgid "not connected"
msgstr "nicht verbunden"
#: mpdevil.py:1421
#: mpdevil.py:1514
msgid "Select profile"
msgstr "Profil auswählen"
#: mpdevil.py:1425
#: mpdevil.py:1518
msgid "Return to album of current title"
msgstr "Zu Album des aktuellen Titels zurückkehren"
#: mpdevil.py:1427
#: mpdevil.py:1520
msgid "Title search"
msgstr "Titelsuche"
#: mpdevil.py:1429
#: mpdevil.py:1522
msgid "Show lyrics"
msgstr "Zeige Liedtext"
#: mpdevil.py:1436
#: mpdevil.py:1529
msgid "Not connected to MPD-server. Reconnect?"
msgstr "Nicht mit MPD-Server verbunden. Verbindung wiederherstellen?"
#: mpdevil.py:1440
#: mpdevil.py:1533
msgid "Save window size"
msgstr "Fenstergröße speichern"
#: mpdevil.py:1442
#: mpdevil.py:1535
msgid "Update database"
msgstr "Datenbank aktualisieren"
#: mpdevil.py:1443
#: mpdevil.py:1536
msgid "Server stats"
msgstr "Serverstatistik"
#: mpdevil.py:1444
#: mpdevil.py:1537
msgid "About"
msgstr "Über"
#: mpdevil.py:1445
#: mpdevil.py:1538
msgid "Quit"
msgstr "Beenden"
#: mpdevil.py:1450
#: mpdevil.py:1543
msgid "Main menu"
msgstr "Hauptmenu"
#: mpdevil.py:1603
#: mpdevil.py:1696
msgid "A small MPD client written in python"
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-01-12 16:18+0100\n"
"POT-Creation-Date: 2020-01-17 22:33+0100\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,227 +17,227 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: mpdevil.py:116
msgid "Album Artist"
msgstr ""
#: mpdevil.py:173 mpdevil.py:350 mpdevil.py:1265
msgid "Unknown Title"
msgstr ""
#: mpdevil.py:188
#, python-format
msgid "%(album)s%(year)s (tracks: %(total_tracks)i) (%(total_length)s):"
msgstr ""
#: mpdevil.py:244 mpdevil.py:1210
#: mpdevil.py:120 mpdevil.py:328 mpdevil.py:1302
msgid "No"
msgstr ""
#: mpdevil.py:249 mpdevil.py:1215
#: mpdevil.py:125 mpdevil.py:333 mpdevil.py:1307
msgid "Title"
msgstr ""
#: mpdevil.py:254 mpdevil.py:1220
#: mpdevil.py:130 mpdevil.py:338 mpdevil.py:1312
msgid "Artist"
msgstr ""
#: mpdevil.py:259 mpdevil.py:1230
#: mpdevil.py:135 mpdevil.py:343 mpdevil.py:1322
msgid "Length"
msgstr ""
#: mpdevil.py:358 mpdevil.py:1273
#: mpdevil.py:174 mpdevil.py:431 mpdevil.py:1358
msgid "Unknown Title"
msgstr ""
#: mpdevil.py:178 mpdevil.py:439 mpdevil.py:1366
msgid "Unknown Artist"
msgstr ""
#: mpdevil.py:362 mpdevil.py:1277
#: mpdevil.py:214
msgid "Album Artist"
msgstr ""
#: mpdevil.py:273
#, python-format
msgid "%(total_tracks)i titles (%(total_length)s)"
msgstr ""
#: mpdevil.py:443 mpdevil.py:1370
msgid "Unknown Album"
msgstr ""
#: mpdevil.py:575
#: mpdevil.py:669
msgid "Select"
msgstr ""
#: mpdevil.py:577
#: mpdevil.py:671
msgid "Profile:"
msgstr ""
#: mpdevil.py:579
#: mpdevil.py:673
msgid "Name:"
msgstr ""
#: mpdevil.py:581
#: mpdevil.py:675
msgid "Host:"
msgstr ""
#: mpdevil.py:583
#: mpdevil.py:677
msgid "Port:"
msgstr ""
#: mpdevil.py:585
#: mpdevil.py:679
msgid "Music lib:"
msgstr ""
#: mpdevil.py:675
#: mpdevil.py:769
msgid "Choose directory"
msgstr ""
#: mpdevil.py:711
#: mpdevil.py:805
msgid "Main cover size:"
msgstr ""
#: mpdevil.py:713
#: mpdevil.py:807
msgid "Album-view cover size:"
msgstr ""
#: mpdevil.py:719
#: mpdevil.py:813
msgid "Show stop button"
msgstr ""
#: mpdevil.py:722
msgid "Show title list as tooltip in album view"
#: mpdevil.py:816
msgid "Show tooltips in album view"
msgstr ""
#: mpdevil.py:725
#: mpdevil.py:819
msgid "Send notification on title change"
msgstr ""
#: mpdevil.py:728
#: mpdevil.py:822
msgid "Stop playback on quit"
msgstr ""
#: mpdevil.py:731
#: mpdevil.py:825
msgid "Play selected album after current title"
msgstr ""
#: mpdevil.py:762 mpdevil.py:1441
#: mpdevil.py:856 mpdevil.py:1534
msgid "Settings"
msgstr ""
#: mpdevil.py:775
#: mpdevil.py:869
msgid "General"
msgstr ""
#: mpdevil.py:776
#: mpdevil.py:870
msgid "Profiles"
msgstr ""
#: mpdevil.py:924
#: mpdevil.py:1018
msgid "Random mode"
msgstr ""
#: mpdevil.py:926
#: mpdevil.py:1020
msgid "Repeat mode"
msgstr ""
#: mpdevil.py:928
#: mpdevil.py:1022
msgid "Single mode"
msgstr ""
#: mpdevil.py:930
#: mpdevil.py:1024
msgid "Consume mode"
msgstr ""
#: mpdevil.py:1024
#: mpdevil.py:1118
msgid "Right click to show additional information"
msgstr ""
#: mpdevil.py:1047
#: mpdevil.py:1141
msgid "MPD-Tag"
msgstr ""
#: mpdevil.py:1050 mpdevil.py:1158
#: mpdevil.py:1144 mpdevil.py:1252
msgid "Value"
msgstr ""
#: mpdevil.py:1071
#: mpdevil.py:1165
#, python-format
msgid ""
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
"channels, %(file_type)s"
msgstr ""
#: mpdevil.py:1137
#: mpdevil.py:1231
msgid "Stats"
msgstr ""
#: mpdevil.py:1155
#: mpdevil.py:1249
msgid "Tag"
msgstr ""
#: mpdevil.py:1175
#: mpdevil.py:1269
msgid "Search"
msgstr ""
#: mpdevil.py:1225
#: mpdevil.py:1317
msgid "Album"
msgstr ""
#: mpdevil.py:1284
#: mpdevil.py:1377
#, python-format
msgid "Hits: %i"
msgstr ""
#: mpdevil.py:1288
#: mpdevil.py:1381
msgid "Lyrics"
msgstr ""
#: mpdevil.py:1332
#: mpdevil.py:1425
msgid "searching..."
msgstr ""
#: mpdevil.py:1336
#: mpdevil.py:1429
msgid "not found"
msgstr ""
#: mpdevil.py:1341
#: mpdevil.py:1434
msgid "not connected"
msgstr ""
#: mpdevil.py:1421
#: mpdevil.py:1514
msgid "Select profile"
msgstr ""
#: mpdevil.py:1425
#: mpdevil.py:1518
msgid "Return to album of current title"
msgstr ""
#: mpdevil.py:1427
#: mpdevil.py:1520
msgid "Title search"
msgstr ""
#: mpdevil.py:1429
#: mpdevil.py:1522
msgid "Show lyrics"
msgstr ""
#: mpdevil.py:1436
#: mpdevil.py:1529
msgid "Not connected to MPD-server. Reconnect?"
msgstr ""
#: mpdevil.py:1440
#: mpdevil.py:1533
msgid "Save window size"
msgstr ""
#: mpdevil.py:1442
#: mpdevil.py:1535
msgid "Update database"
msgstr ""
#: mpdevil.py:1443
#: mpdevil.py:1536
msgid "Server stats"
msgstr ""
#: mpdevil.py:1444
#: mpdevil.py:1537
msgid "About"
msgstr ""
#: mpdevil.py:1445
#: mpdevil.py:1538
msgid "Quit"
msgstr ""
#: mpdevil.py:1450
#: mpdevil.py:1543
msgid "Main menu"
msgstr ""
#: mpdevil.py:1603
#: mpdevil.py:1696
msgid "A small MPD client written in python"
msgstr ""

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1021 KiB

After

Width:  |  Height:  |  Size: 1005 KiB