40 Commits

Author SHA1 Message Date
Martin Wagner
2d6b83a94e preparations for 1.1.0 2021-02-13 12:03:08 +01:00
Martin Wagner
7610178497 removed empty tooltips 2021-02-13 11:56:16 +01:00
Martin Wagner
dedcca7bc4 changed default settings 2021-02-13 11:48:17 +01:00
Martin Wagner
95386b05bc removed separator 2021-02-12 21:48:54 +01:00
Martin Wagner
7c5f0b4fbf changed order of check buttons in settings window 2021-02-12 21:26:32 +01:00
Martin Wagner
8217a87f13 small formulation change 2021-02-12 17:00:06 +01:00
Martin Wagner
432a4d4425 dutch translation update 2021-02-12 09:34:02 +01:00
Martin Wagner
15ed338062 german translation update 2021-02-11 22:20:35 +01:00
Martin Wagner
6fc61f37e0 removed "combo_settings" from settings window 2021-02-11 19:09:12 +01:00
Martin Wagner
f07d7a3448 removed show-album-view-tooltips key 2021-02-11 18:10:39 +01:00
Martin Wagner
576bc088e9 remember mini player state 2021-02-08 17:49:45 +01:00
Martin Wagner
a5b2ad16dc fixed paned positions restoring 2021-02-08 09:32:55 +01:00
Martin Wagner
27b4efb49f improved column sizing in playlist window 2021-02-07 19:27:06 +01:00
Martin Wagner
b2cab7b188 removed unneeded vars 2021-02-07 19:14:38 +01:00
Martin Wagner
c4734d80b7 automatically save window layout 2021-02-07 19:05:30 +01:00
Martin Wagner
3ecb93b7b9 added mpd specific icons 2021-02-07 12:23:16 +01:00
Martin Wagner
4a0b6a0350 added symbolic app icon 2021-02-07 10:03:45 +01:00
Martin Wagner
7916112432 allow moving the miniplayer by dragging the cover 2021-02-04 21:33:51 +01:00
Martin Wagner
4e8ae30201 icon style fixes 2021-02-01 20:41:00 +01:00
Martin Wagner
a5a53032f2 small fix in german translation 2021-01-23 12:45:58 +01:00
Martin Wagner
24d5bd1ca3 fixed AudioType 2021-01-16 23:06:04 +01:00
Martin Wagner
959dc9b5ad improved sigular plural handling in translations 2021-01-16 14:55:06 +01:00
Martin Wagner
e8191eab7c preparations for 1.0.0 2021-01-02 11:49:04 +01:00
Martin Wagner
5db00fcd27 fixed release order in appdata file 2021-01-01 22:00:59 +01:00
Martin Wagner
7ab40d5049 preparations for 0.9.9 2021-01-01 21:20:33 +01:00
Martin Wagner
a695d829d8 fixed play/pause (space key) when album popover is shown 2021-01-01 21:05:40 +01:00
Martin Wagner
ac749a10dd fixed error when GLib.UserDirectory.DIRECTORY_MUSIC returns None 2021-01-01 17:54:20 +01:00
Martin Wagner
f7ada87104 ensure window is shown before connecting client 2021-01-01 15:50:08 +01:00
Martin Wagner
4925b0288c improved open with button appearance 2021-01-01 15:37:17 +01:00
Martin Wagner
d920da9e52 fixed typo in german translation 2021-01-01 14:34:31 +01:00
Martin Wagner
fb60e4701f fixed license text in source code 2021-01-01 14:11:59 +01:00
Martin Wagner
35ef3deaab updated copyright 2021-01-01 13:19:05 +01:00
Martin Wagner
62c30b1b01 small ui fixes 2021-01-01 12:44:04 +01:00
Martin Wagner
2f28b91865 simplified SongPopover 2020-12-31 17:28:33 +01:00
Martin Wagner
72588b5b66 fixed placing of app chooser dialog 2020-12-31 14:54:13 +01:00
Martin Wagner
838e421466 added ability to open song files with any application 2020-12-31 14:47:25 +01:00
Martin Wagner
2d6e2aa3f5 improved progress indication while albums are loading 2020-12-29 18:42:53 +01:00
Martin Wagner
6fe8fa9d37 allow password revealing 2020-12-29 17:44:20 +01:00
Martin Wagner
2493255643 Update README.md 2020-12-28 13:45:12 +01:00
Martin Wagner
d86a52d1d3 replaced Gtk.FileChosserDialog with Gtk.FileChooserNative 2020-12-28 13:02:38 +01:00
23 changed files with 921 additions and 786 deletions

View File

@@ -2,7 +2,7 @@ README for mpdevil
==================
Mpdevil is a simple music browser for the Music Player Daemon (MPD) which is focused on playing local music without the need of managing playlists. Instead of maintaining a client side database of your music library mpdevil loads all tags and covers on demand. So you'll never see any outdated information in the browser. Mpdevil strongly relies on tags.
![ScreenShot](screenshots/mainwindow_0.9.5.png)
![ScreenShot](screenshots/mainwindow_1.1.0.png)
Features
--------
@@ -46,6 +46,10 @@ Gentoo (see: https://wiki.gentoo.org/wiki/Custom_repository):
- Generate manifest file
- Run: `emerge mpdevil`
Flatpak:
<a href='https://flathub.org/apps/details/org.mpdevil.mpdevil'><img width='240' alt='Download on Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.png'/></a>
Building
--------

View File

@@ -2,21 +2,20 @@
# -*- coding: utf-8 -*-
#
# mpdevil - MPD Client.
# Copyright 2020 Martin Wagner <martin.wagner.dev@gmail.com>
# Copyright (C) 2020-2021 Martin Wagner <martin.wagner.dev@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 3 of the License.
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import gi
gi.require_version("Gtk", "3.0")
@@ -30,13 +29,12 @@ import datetime
import os
import sys
import re
import gettext
gettext.textdomain("mpdevil")
from gettext import gettext as _, ngettext, textdomain, bindtextdomain
textdomain("mpdevil")
if os.path.isfile("/.flatpak-info"): # test for flatpak environment
gettext.bindtextdomain("mpdevil", "/app/share/locale")
_=gettext.gettext
bindtextdomain("mpdevil", "/app/share/locale")
VERSION="0.9.8" # sync with setup.py
VERSION="1.1.0" # sync with setup.py
COVER_REGEX=r"^\.?(album|cover|folder|front).*\.(gif|jpeg|jpg|png)$"
@@ -435,9 +433,13 @@ class MPRISInterface: # TODO emit Seeked if needed
class ClientHelper():
def seconds_to_display_time(seconds):
raw_time_string=str(datetime.timedelta(seconds=seconds))
stript_time_string=raw_time_string.lstrip("0").lstrip(":")
return stript_time_string.replace(":", "") # use 'ratio' as delimiter
delta=datetime.timedelta(seconds=seconds)
if delta.days > 0:
days=ngettext("{days} day", "{days} days", delta.days).format(days=delta.days)
time_string=days+", "+str(datetime.timedelta(seconds=delta.seconds))
else:
time_string=str(delta).lstrip("0").lstrip(":")
return time_string.replace(":", "") # use 'ratio' as delimiter
def song_to_str_dict(song): # converts tags with multiple values to comma separated strings
return_song={}
@@ -635,6 +637,17 @@ class Client(MPDClient):
pass
return meta_base
def get_absolute_path(self, uri):
lib_path=self._settings.get_lib_path()
if lib_path is not None:
path=os.path.join(lib_path, uri)
if os.path.isfile(path):
return path
else:
return None
else:
return None
def toggle_play(self):
status=self.status()
if status["state"] == "play":
@@ -763,6 +776,14 @@ class Settings(Gio.Settings):
else:
return ("artist")
def get_lib_path(self, profile=None):
if profile is None: # use current profile if none is given
profile=self.get_int("active-profile")
lib_path=self.get_value("paths")[profile]
if lib_path == "":
lib_path=GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC)
return lib_path
###################
# settings dialog #
###################
@@ -791,25 +812,6 @@ class GeneralSettings(Gtk.Box):
self._settings.connect("changed::{}".format(key), self._on_int_settings_changed, int_settings[key][1])
)
# combo_settings
combo_settings={}
combo_settings_data=[
(_("Sort albums by:"), _("name"), _("year"), "sort-albums-by-year"),
(_("Position of playlist:"), _("bottom"), _("right"), "playlist-right")
]
for label, vfalse, vtrue, key in combo_settings_data:
combo_settings[key]=(Gtk.Label(label=label, xalign=0), Gtk.ComboBoxText(entry_text_column=0))
combo_settings[key][1].append_text(vfalse)
combo_settings[key][1].append_text(vtrue)
if self._settings.get_boolean(key):
combo_settings[key][1].set_active(1)
else:
combo_settings[key][1].set_active(0)
combo_settings[key][1].connect("changed", self._on_combo_changed, key)
self._settings_handlers.append(
self._settings.connect("changed::{}".format(key), self._on_combo_settings_changed, combo_settings[key][1])
)
# check buttons
check_buttons={}
check_buttons_data=[
@@ -817,13 +819,13 @@ class GeneralSettings(Gtk.Box):
(_("Show stop button"), "show-stop"),
(_("Show lyrics button"), "show-lyrics-button"),
(_("Show initials in artist view"), "show-initials"),
(_("Show tooltips in album view"), "show-album-view-tooltips"),
(_("Place playlist at the side"), "playlist-right"),
(_("Use “Album Artist” tag"), "use-album-artist"),
(_("Send notification on title change"), "send-notify"),
(_("Stop playback on quit"), "stop-on-quit"),
(_("Play selected albums and titles immediately"), "force-mode")
(_("Play selected albums and titles immediately"), "force-mode"),
(_("Sort albums by year"), "sort-albums-by-year"),
]
for label, key in check_buttons_data:
check_buttons[key]=Gtk.CheckButton(label=label)
check_buttons[key].set_active(self._settings.get_boolean(key))
@@ -844,22 +846,10 @@ class GeneralSettings(Gtk.Box):
view_grid.attach_next_to(int_settings["album-cover"][0], int_settings["track-cover"][0], Gtk.PositionType.BOTTOM, 1, 1)
view_grid.attach_next_to(int_settings["icon-size"][0], int_settings["album-cover"][0], Gtk.PositionType.BOTTOM, 1, 1)
view_grid.attach_next_to(int_settings["icon-size-sec"][0], int_settings["icon-size"][0], Gtk.PositionType.BOTTOM, 1, 1)
view_grid.attach_next_to(combo_settings["playlist-right"][0], int_settings["icon-size-sec"][0], Gtk.PositionType.BOTTOM, 1, 1)
view_grid.attach_next_to(int_settings["track-cover"][1], int_settings["track-cover"][0], Gtk.PositionType.RIGHT, 1, 1)
view_grid.attach_next_to(int_settings["album-cover"][1], int_settings["album-cover"][0], Gtk.PositionType.RIGHT, 1, 1)
view_grid.attach_next_to(int_settings["icon-size"][1], int_settings["icon-size"][0], Gtk.PositionType.RIGHT, 1, 1)
view_grid.attach_next_to(int_settings["icon-size-sec"][1], int_settings["icon-size-sec"][0], Gtk.PositionType.RIGHT, 1, 1)
view_grid.attach_next_to(combo_settings["playlist-right"][1], combo_settings["playlist-right"][0], Gtk.PositionType.RIGHT, 1, 1)
# behavior grid
behavior_grid=Gtk.Grid(row_spacing=6, column_spacing=12)
behavior_grid.set_margin_start(12)
behavior_grid.add(combo_settings["sort-albums-by-year"][0])
behavior_grid.attach_next_to(
combo_settings["sort-albums-by-year"][1],
combo_settings["sort-albums-by-year"][0],
Gtk.PositionType.RIGHT, 1, 1
)
# connect
self.connect("destroy", self._remove_handlers)
@@ -873,14 +863,14 @@ class GeneralSettings(Gtk.Box):
self.pack_start(check_buttons["show-stop"], False, False, 0)
self.pack_start(check_buttons["show-lyrics-button"], False, False, 0)
self.pack_start(check_buttons["show-initials"], False, False, 0)
self.pack_start(check_buttons["show-album-view-tooltips"], False, False, 0)
self.pack_start(check_buttons["playlist-right"], False, False, 0)
self.pack_start(view_grid, False, False, 0)
self.pack_start(behavior_heading, False, False, 0)
self.pack_start(check_buttons["use-album-artist"], False, False, 0)
self.pack_start(check_buttons["sort-albums-by-year"], False, False, 0)
self.pack_start(check_buttons["send-notify"], False, False, 0)
self.pack_start(check_buttons["stop-on-quit"], False, False, 0)
self.pack_start(check_buttons["force-mode"], False, False, 0)
self.pack_start(behavior_grid, False, False, 0)
self.pack_start(check_buttons["stop-on-quit"], False, False, 0)
def _remove_handlers(self, *args):
for handler in self._settings_handlers:
@@ -889,25 +879,12 @@ class GeneralSettings(Gtk.Box):
def _on_int_settings_changed(self, settings, key, entry):
entry.set_value(settings.get_int(key))
def _on_combo_settings_changed(self, settings, key, combo):
if settings.get_boolean(key):
combo.set_active(1)
else:
combo.set_active(0)
def _on_check_settings_changed(self, settings, key, button):
button.set_active(settings.get_boolean(key))
def _on_int_changed(self, widget, key):
self._settings.set_int(key, int(widget.get_value()))
def _on_combo_changed(self, box, key):
active=box.get_active()
if active == 0:
self._settings.set_boolean(key, False)
else:
self._settings.set_boolean(key, True)
def _on_toggled(self, widget, key):
self._settings.set_boolean(key, widget.get_active())
@@ -923,13 +900,13 @@ class ProfileSettings(Gtk.Grid):
# widgets
self._profiles_combo=Gtk.ComboBoxText(entry_text_column=0, hexpand=True)
add_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("list-add", Gtk.IconSize.BUTTON))
delete_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("list-remove", Gtk.IconSize.BUTTON))
add_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.BUTTON))
delete_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("list-remove-symbolic", Gtk.IconSize.BUTTON))
add_delete_buttons=Gtk.ButtonBox(layout_style=Gtk.ButtonBoxStyle.EXPAND)
add_delete_buttons.pack_start(add_button, True, True, 0)
add_delete_buttons.pack_start(delete_button, True, True, 0)
connect_button=Gtk.Button(label=_("Connect"), image=Gtk.Image.new_from_icon_name("system-run", Gtk.IconSize.BUTTON))
connect_button=Gtk.Button.new_with_mnemonic(_("_Connect"))
self._profile_entry=Gtk.Entry(hexpand=True)
self._host_entry=Gtk.Entry(hexpand=True)
@@ -937,9 +914,9 @@ class ProfileSettings(Gtk.Grid):
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(hexpand=True, visibility=False)
self._password_entry=PasswordEntry(hexpand=True)
self._path_entry=Gtk.Entry(hexpand=True, placeholder_text=GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC))
self._path_select_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("folder-open", Gtk.IconSize.BUTTON))
self._path_select_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("folder-open-symbolic", Gtk.IconSize.BUTTON))
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)
@@ -961,6 +938,8 @@ class ProfileSettings(Gtk.Grid):
add_button.connect("clicked", self._on_add_button_clicked)
delete_button.connect("clicked", self._on_delete_button_clicked)
connect_button.connect("clicked", self._on_connect_button_clicked)
style_context=connect_button.get_style_context()
style_context.add_class("suggested-action")
self._path_select_button.connect("clicked", self._on_path_select_button_clicked, parent)
self._profiles_changed=self._profiles_combo.connect("changed", self._on_profiles_changed)
self.entry_changed_handlers=[]
@@ -1088,17 +1067,12 @@ class ProfileSettings(Gtk.Grid):
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)
dialog.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK)
dialog.set_default_size(800, 400)
folder=self._settings.get_value("paths")[self._profiles_combo.get_active()]
if folder == "":
dialog.set_current_folder(GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC))
else:
dialog=Gtk.FileChooserNative(title=_("Choose directory"), transient_for=parent, action=Gtk.FileChooserAction.SELECT_FOLDER)
folder=self._settings.get_lib_path(self._profiles_combo.get_active())
if folder is not None:
dialog.set_current_folder(folder)
response=dialog.run()
if response == Gtk.ResponseType.OK:
if response == Gtk.ResponseType.ACCEPT:
self._gui_modification=True
self._settings.array_modify("as", "paths", self._profiles_combo.get_active(), dialog.get_filename())
self._path_entry.set_text(dialog.get_filename())
@@ -1287,7 +1261,6 @@ class SettingsDialog(Gtk.Dialog):
vbox.set_property("spacing", 6)
vbox.set_property("border-width", 6)
vbox.pack_start(tabs, True, True, 0)
self.show_all()
#################
@@ -1330,7 +1303,6 @@ class ServerStats(Gtk.Dialog):
vbox=self.get_content_area()
vbox.set_property("border-width", 6)
vbox.pack_start(grid, True, True, 0)
self.show_all()
self.run()
@@ -1343,7 +1315,8 @@ class AboutDialog(Gtk.AboutDialog):
self.set_authors(["Martin Wagner"])
self.set_translator_credits("Martin de Reuver\nMartin Wagner")
self.set_website("https://github.com/SoongNoonien/mpdevil")
self.set_copyright("\xa9 2020 Martin Wagner")
self.set_copyright("Copyright \xa9 2020-2021 Martin Wagner")
self.set_license_type(Gtk.License.GPL_3_0)
self.set_logo_icon_name("org.mpdevil.mpdevil")
###########################
@@ -1368,6 +1341,22 @@ class AutoSizedIcon(Gtk.Image):
def _on_icon_size_changed(self, *args):
self.set_pixel_size(self._settings.get_int(self._settings_key))
class PasswordEntry(Gtk.Entry):
def __init__(self, **kwargs):
super().__init__(visibility=False, caps_lock_warning=False, input_purpose=Gtk.InputPurpose.PASSWORD, **kwargs)
self.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "view-conceal-symbolic")
# connect
self.connect("icon-release", self._on_icon_release)
def _on_icon_release(self, *args):
if self.get_icon_name(Gtk.EntryIconPosition.SECONDARY) == "view-conceal-symbolic":
self.set_visibility(True)
self.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "view-reveal-symbolic")
else:
self.set_visibility(False)
self.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "view-conceal-symbolic")
class FocusFrame(Gtk.Overlay):
def __init__(self):
super().__init__()
@@ -1396,7 +1385,7 @@ class FocusFrame(Gtk.Overlay):
self._widget.connect("focus-out-event", lambda *args: self._frame.hide())
class SongPopover(Gtk.Popover):
def __init__(self, song, relative, x, y, offset=26):
def __init__(self, uri, client, relative, x, y, offset=26):
super().__init__()
rect=Gdk.Rectangle()
rect.x=x
@@ -1408,13 +1397,26 @@ class SongPopover(Gtk.Popover):
self.set_pointing_to(rect)
self.set_relative_to(relative)
# css
# client calls
song=client.wrapped_call("get_metadata", uri)
abs_path=client.wrapped_call("get_absolute_path", uri)
# popover css
style_context=self.get_style_context()
provider=Gtk.CssProvider()
css=b"""* {background-color: @theme_base_color}"""
provider.load_from_data(css)
style_context.add_provider(provider, 600)
# open with button
open_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("document-open-symbolic",Gtk.IconSize.BUTTON),tooltip_text=_("Open with…"))
style_context=open_button.get_style_context()
style_context.add_class("circular")
open_button_revealer=Gtk.Revealer() # needed for open_button tooltip
open_button_revealer.set_halign(Gtk.Align.END)
open_button_revealer.set_valign(Gtk.Align.END)
open_button_revealer.add(open_button)
# treeview
# (tag, display-value, tooltip)
store=Gtk.ListStore(str, str, str)
@@ -1445,15 +1447,31 @@ class SongPopover(Gtk.Popover):
store.append([tag+":", value, tooltip])
# packing
overlay=Gtk.Overlay()
scroll=Gtk.ScrolledWindow(border_width=3)
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
window=self.get_toplevel()
scroll.set_max_content_height(window.get_size()[1]//2)
scroll.set_propagate_natural_height(True)
scroll.add(treeview)
self.add(scroll)
overlay.add(scroll)
overlay.add_overlay(open_button_revealer)
if abs_path is not None: # show open with button when song is on the same computer
self._gfile=Gio.File.new_for_path(abs_path)
open_button.connect("clicked", self._on_open_button_clicked)
open_button_revealer.set_reveal_child(True)
self.add(overlay)
overlay.show_all()
scroll.show_all()
def _on_open_button_clicked(self, *args):
self.popdown()
dialog=Gtk.AppChooserDialog(gfile=self._gfile, transient_for=self.get_toplevel())
app_chooser=dialog.get_widget()
response=dialog.run()
if response == Gtk.ResponseType.OK:
app=app_chooser.get_app_info()
app.launch([self._gfile], None)
dialog.destroy()
class SongsView(Gtk.TreeView):
def __init__(self, client, store, file_column_id):
@@ -1506,11 +1524,11 @@ class SongsView(Gtk.TreeView):
elif event.button == 2 and event.type == Gdk.EventType.BUTTON_RELEASE:
self._client.wrapped_call("files_to_playlist", [self._store[path][self._file_column_id]], "append")
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE:
song=self._client.wrapped_call("get_metadata", self._store[path][self._file_column_id])
uri=self._store[path][self._file_column_id]
if self.get_property("headers-visible"):
pop=SongPopover(song, widget, int(event.x), int(event.y))
pop=SongPopover(uri, self._client, widget, int(event.x), int(event.y))
else:
pop=SongPopover(song, widget, int(event.x), int(event.y), offset=0)
pop=SongPopover(uri, self._client, widget, int(event.x), int(event.y), offset=0)
pop.popup()
self._button_event=(None, None)
@@ -1524,8 +1542,7 @@ class SongsView(Gtk.TreeView):
elif event.keyval == Gdk.keyval_from_name("Menu"):
path=self._store.get_path(treeiter)
cell=self.get_cell_area(path, None)
file_name=self._store[path][self._file_column_id]
pop=SongPopover(self._client.wrapped_call("get_metadata", file_name), widget, cell.x, cell.y)
pop=SongPopover(self._store[path][self._file_column_id], self._client, widget, cell.x, cell.y)
pop.popup()
class SongsWindow(Gtk.Box):
@@ -1545,13 +1562,13 @@ class SongsWindow(Gtk.Box):
# buttons
append_button=Gtk.Button.new_with_mnemonic(_("_Append"))
append_button.set_image(Gtk.Image.new_from_icon_name("list-add", Gtk.IconSize.BUTTON))
append_button.set_image(Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.BUTTON))
append_button.set_tooltip_text(_("Add all titles to playlist"))
play_button=Gtk.Button.new_with_mnemonic(_("_Play"))
play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-start", Gtk.IconSize.BUTTON))
play_button.set_image(Gtk.Image.new_from_icon_name("media-playback-start-symbolic", Gtk.IconSize.BUTTON))
play_button.set_tooltip_text(_("Directly play all titles"))
enqueue_button=Gtk.Button.new_with_mnemonic(_("_Enqueue"))
enqueue_button.set_image(Gtk.Image.new_from_icon_name("insert-object", Gtk.IconSize.BUTTON))
enqueue_button.set_image(Gtk.Image.new_from_icon_name("insert-object-symbolic", Gtk.IconSize.BUTTON))
enqueue_button.set_tooltip_text(_("Append all titles after the currently playing track and clear the playlist from all other songs"))
# button box
@@ -1664,7 +1681,6 @@ class AlbumPopover(Gtk.Popover):
# packing
self.add(songs_window)
songs_window.show_all()
class Cover(object):
@@ -1674,9 +1690,7 @@ class Cover(object):
if song != {}:
song_file=song["file"]
active_profile=settings.get_int("active-profile")
lib_path=settings.get_value("paths")[active_profile]
if lib_path == "":
lib_path=GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC)
lib_path=settings.get_lib_path()
if lib_path is not None:
regex_str=settings.get_value("regex")[active_profile]
if regex_str == "":
@@ -1838,7 +1852,8 @@ class SearchWindow(Gtk.Box):
song["human_duration"], song["file"],
int_track
])
self._hits_label.set_text(_("{num} hits").format(num=self._songs_view.count()))
hits=self._songs_view.count()
self._hits_label.set_text(ngettext("{hits} hit", "{hits} hits", hits).format(hits=hits))
if self._songs_view.count() == 0:
self._action_bar.set_sensitive(False)
else:
@@ -2031,8 +2046,7 @@ class AlbumWindow(FocusFrame):
self._sort_settings()
# iconview
self._iconview=Gtk.IconView(model=self._store, item_width=0, pixbuf_column=0, markup_column=1)
self._tooltip_settings()
self._iconview=Gtk.IconView(model=self._store, item_width=0, pixbuf_column=0, markup_column=1, tooltip_column=3)
# scroll
scroll=Gtk.ScrolledWindow()
@@ -2041,6 +2055,9 @@ class AlbumWindow(FocusFrame):
self._scroll_vadj=scroll.get_vadjustment()
self._scroll_hadj=scroll.get_hadjustment()
# progress bar
self._progress_bar=Gtk.ProgressBar(no_show_all=True)
# connect
self._iconview.connect("item-activated", self._on_item_activated)
self._iconview.connect("button-press-event", self._on_button_press_event)
@@ -2049,14 +2066,17 @@ class AlbumWindow(FocusFrame):
self._client.emitter.connect("update", self._clear)
self._client.emitter.connect("disconnected", self._on_disconnected)
self._client.emitter.connect("reconnected", self._on_reconnected)
self._settings.connect("changed::show-album-view-tooltips", self._tooltip_settings)
self._settings.connect("changed::sort-albums-by-year", self._sort_settings)
self._settings.connect("changed::album-cover", self._on_cover_size_changed)
self._settings.connect("changed::use-album-artist", self._clear)
self._artist_window.connect("artists_changed", self._refresh)
# packing
self.set_widget(self._iconview)
self.add(scroll)
box=Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
box.pack_start(scroll, True, True, 0)
box.pack_start(self._progress_bar, False, False, 0)
self.add(box)
def _workaround_clear(self):
self._store.clear()
@@ -2090,12 +2110,6 @@ class AlbumWindow(FocusFrame):
elif not self.scroll_to_current_album in self._pending:
self._pending.append(self.scroll_to_current_album)
def _tooltip_settings(self, *args):
if self._settings.get_boolean("show-album-view-tooltips"):
self._iconview.set_tooltip_column(3)
else:
self._iconview.set_tooltip_column(-1)
def _sort_settings(self, *args):
if self._settings.get_boolean("sort-albums-by-year"):
self._store.set_sort_column_id(5, Gtk.SortType.ASCENDING)
@@ -2110,6 +2124,7 @@ class AlbumWindow(FocusFrame):
if self._done:
self._done=False
self._settings.set_property("cursor-watch", True)
self._progress_bar.show()
GLib.idle_add(self._store.clear)
self._iconview.set_model(None)
try: # self._artist_window can still be empty (e.g. when client is not connected and cover size gets changed)
@@ -2125,12 +2140,14 @@ class AlbumWindow(FocusFrame):
# prepare albmus list (run all mpd related commands)
albums=[]
artist_type=self._settings.get_artist_type()
for artist in artists:
for i, artist in enumerate(artists):
try: # client cloud meanwhile disconnect
if self.stop_flag:
GLib.idle_add(self._done_callback)
return
else:
if i > 0: # more than one artist to show (all artists)
GLib.idle_add(self._progress_bar.pulse)
if genre is None:
album_candidates=self._client.wrapped_call("comp_list", "album", artist_type, artist)
else:
@@ -2154,17 +2171,16 @@ class AlbumWindow(FocusFrame):
for i, album in enumerate(albums):
# tooltip
length_human_readable=ClientHelper.calc_display_length(album["songs"])
titles=len(album["songs"])
discs=album["songs"][-1].get("disc", 1)
if type(discs) == list:
discs=int(discs[0])
else:
discs=int(discs)
tooltip=ngettext("{titles} title", "{titles} titles", titles).format(titles=titles)
if discs > 1:
tooltip=_("{titles} titles on {discs} discs ({length})").format(
titles=len(album["songs"]), discs=discs, length=length_human_readable)
else:
tooltip=_("{titles} titles ({length})").format(
titles=len(album["songs"]), length=length_human_readable)
tooltip=" ".join((tooltip, _("on {discs} discs").format(discs=discs)))
tooltip=" ".join((tooltip, "({length})".format(length=length_human_readable)))
# album label
if album["year"] == "":
display_label="<b>{}</b>".format(album["album"])
@@ -2184,10 +2200,12 @@ class AlbumWindow(FocusFrame):
def load_covers():
size=self._settings.get_int("album-cover")
for album in albums:
total_albums=len(albums)
for i, album in enumerate(albums):
if self.stop_flag:
break
album["cover"]=Cover(self._settings, album["songs"][0]).get_pixbuf(size)
GLib.idle_add(self._progress_bar.set_fraction, (i+1)/total_albums)
if self.stop_flag:
GLib.idle_add(self._done_callback)
else:
@@ -2207,6 +2225,8 @@ class AlbumWindow(FocusFrame):
def _done_callback(self, *args):
self._settings.set_property("cursor-watch", False)
self._progress_bar.hide()
self._progress_bar.set_fraction(0)
self.stop_flag=False
self._done=True
pending=self._pending
@@ -2237,7 +2257,7 @@ class AlbumWindow(FocusFrame):
artist=self._store[path][6]
v=self._scroll_vadj.get_value()
h=self._scroll_hadj.get_value()
pop=AlbumPopover(self._client, self._settings, album, artist, year, widget, int(event.x-h), int(event.y-v))
pop=AlbumPopover(self._client, self._settings, album, artist, year, widget, event.x-h, event.y-v)
pop.popup()
self._button_event=(None, None)
@@ -2282,7 +2302,7 @@ class Browser(Gtk.Paned):
__gsignals__={"search_focus_changed": (GObject.SignalFlags.RUN_FIRST, None, (bool,))}
def __init__(self, client, settings):
super().__init__(orientation=Gtk.Orientation.HORIZONTAL) # paned1
super().__init__(orientation=Gtk.Orientation.HORIZONTAL)
# adding vars
self._client=client
@@ -2322,7 +2342,6 @@ class Browser(Gtk.Paned):
self._stack=Gtk.Stack(transition_type=Gtk.StackTransitionType.CROSSFADE)
self._stack.add_named(self._album_window, "albums")
self._stack.add_named(self._search_window, "search")
hbox=Gtk.Box(spacing=6, border_width=6)
if self._use_csd:
hbox.pack_start(self._genre_select, True, True, 0)
@@ -2337,11 +2356,6 @@ class Browser(Gtk.Paned):
self.pack1(box1, False, False)
self.pack2(self._stack, True, False)
self.set_position(self._settings.get_int("paned1"))
def save_settings(self):
self._settings.set_int("paned1", self.get_position())
def _back_to_current_album(self, *args):
def callback():
try:
@@ -2393,10 +2407,15 @@ class Browser(Gtk.Paned):
self.search_button.set_active(False)
def _on_mini_player(self, obj, typestring):
visibility=not(obj.get_property("mini-player"))
self.set_property("visible", visibility)
self.back_to_current_album_button.set_property("visible", visibility)
self.search_button.set_property("visible", visibility)
state=obj.get_property("mini-player")
self.set_property("no-show-all", state)
self.back_to_current_album_button.set_property("no-show-all", state)
self.search_button.set_property("no-show-all", state)
self.set_property("visible", not(state))
self.back_to_current_album_button.set_property("visible", not(state))
self.search_button.set_property("visible", not(state))
if not state:
self.show_all()
######################
# playlist and cover #
@@ -2512,7 +2531,7 @@ class AudioType(Gtk.Label):
# adding vars
self._client=client
self._init_vars()
self.freq, self.res, self.chan, self.brate, self.file_type=(0, 0, 0, 0, "")
# connect
self._client.emitter.connect("audio", self._on_audio)
@@ -2523,18 +2542,15 @@ class AudioType(Gtk.Label):
def clear(self, *args):
self.set_text("")
self._init_vars()
def _init_vars(self):
self.freq=0
self.res=0
self.chan=0
self.brate=0
self.file_type=""
self.freq, self.res, self.chan, self.brate, self.file_type=(0, 0, 0, 0, "")
def _refresh(self, *args):
string=_("{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, {file_type}").format(
bitrate=self.brate, frequency=self.freq, resolution=self.res, channels=self.chan, file_type=self.file_type)
try:
int_chan=int(self.chan)
except:
int_chan=0
channels=ngettext("{channels} channel", "{channels} channels", int_chan).format(channels=self.chan)
string="{} kb/s, {} kHz, {} bit, {}, {}".format(self.brate, self.freq, self.res, channels, self.file_type)
self.set_text(string)
def _on_audio(self, emitter, freq, res, chan):
@@ -2571,31 +2587,29 @@ class CoverEventBox(Gtk.EventBox):
# connect
self._button_press_event=self.connect("button-press-event", self._on_button_press_event)
self._settings.connect("notify::mini-player", self._on_mini_player)
def _on_button_press_event(self, widget, event):
if self._client.connected():
song=ClientHelper.song_to_first_str_dict(self._client.wrapped_call("currentsong"))
if song != {}:
try:
artist=song[self._settings.get_artist_type()]
except:
artist=song.get("artist", "")
album=song.get("album", "")
album_year=song.get("date", "")
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
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, "append")
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
pop=AlbumPopover(self._client, self._settings, album, artist, album_year, widget, int(event.x), int(event.y))
pop.popup()
def _on_mini_player(self, obj, typestring):
if obj.get_property("mini-player"):
self.handler_block(self._button_press_event)
if self._settings.get_property("mini-player"):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
window=self.get_toplevel()
window.begin_move_drag(1, event.x_root, event.y_root, Gdk.CURRENT_TIME)
else:
self.handler_unblock(self._button_press_event)
if self._client.connected():
song=ClientHelper.song_to_first_str_dict(self._client.wrapped_call("currentsong"))
if song != {}:
try:
artist=song[self._settings.get_artist_type()]
except:
artist=song.get("artist", "")
album=song.get("album", "")
album_year=song.get("date", "")
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
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, "append")
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
pop=AlbumPopover(self._client, self._settings, album, artist, album_year, widget, event.x, event.y)
pop.popup()
class MainCover(Gtk.Frame):
def __init__(self, client, settings):
@@ -2698,11 +2712,11 @@ class PlaylistWindow(Gtk.Box):
Gtk.TreeViewColumn(_("Year"), renderer_text, text=6, weight=9),
Gtk.TreeViewColumn(_("Genre"), renderer_text, text=7, weight=9)
)
for column in self._columns:
for i, column in enumerate(self._columns):
column.set_property("resizable", True)
column.set_property("sizing", Gtk.TreeViewColumnSizing.FIXED)
column.set_min_width(30)
column.connect("notify::fixed-width", self._on_column_width, i)
self._load_settings()
# scroll
@@ -2758,13 +2772,8 @@ class PlaylistWindow(Gtk.Box):
self.pack_start(self._frame, True, True, 0)
self.pack_end(action_bar, False, False, 0)
def save_settings(self): # only saves the column sizes
columns=self._treeview.get_columns()
permutation=self._settings.get_value("column-permutation").unpack()
sizes=[0] * len(permutation)
for i in range(len(permutation)):
sizes[permutation[i]]=columns[i].get_width()
self._settings.set_value("column-sizes", GLib.Variant("ai", sizes))
def _on_column_width(self, obj, typestring, pos):
self._settings.array_modify("ai", "column-sizes", pos, obj.get_property("fixed-width"))
def _load_settings(self, *args):
columns=self._treeview.get_columns()
@@ -2793,7 +2802,8 @@ class PlaylistWindow(Gtk.Box):
self._playlist_info.set_text("")
else:
length_human_readable=ClientHelper.calc_display_length(songs)
self._playlist_info.set_text(_("{titles} titles ({length})").format(titles=len(songs), length=length_human_readable))
titles=ngettext("{titles} title", "{titles} titles", len(songs)).format(titles=len(songs))
self._playlist_info.set_text(" ".join((titles, "({length})".format(length=length_human_readable))))
def _scroll_to_selected_title(self, *args):
treeview, treeiter=self._selection.get_selected()
@@ -2827,8 +2837,7 @@ class PlaylistWindow(Gtk.Box):
if event.button == 2 and event.type == Gdk.EventType.BUTTON_RELEASE:
self._store.remove(self._store.get_iter(path))
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE:
song=self._client.wrapped_call("get_metadata", self._store[path][8])
pop=SongPopover(song, widget, int(event.x), int(event.y))
pop=SongPopover(self._store[path][8], self._client, widget, int(event.x), int(event.y))
pop.popup()
self._button_event=(None, None)
@@ -2845,8 +2854,7 @@ class PlaylistWindow(Gtk.Box):
if treeiter is not None:
path=self._store.get_path(treeiter)
cell=self._treeview.get_cell_area(path, None)
file_name=self._store[path][8]
pop=SongPopover(self._client.wrapped_call("get_metadata", file_name), widget, int(cell.x), int(cell.y))
pop=SongPopover(self._store[path][8], self._client, widget, int(cell.x), int(cell.y))
pop.popup()
def _on_row_deleted(self, model, path): # sync treeview to mpd
@@ -2946,8 +2954,12 @@ class PlaylistWindow(Gtk.Box):
self._treeview.set_sensitive(True)
def _on_mini_player(self, obj, typestring):
visibility=not(obj.get_property("mini-player"))
self.set_property("visible", visibility)
if obj.get_property("mini-player"):
self.set_property("no-show-all", True)
self.set_property("visible", False)
else:
self.set_property("no-show-all", False)
self.show_all()
class CoverPlaylistWindow(Gtk.Paned):
def __init__(self, client, settings):
@@ -3003,14 +3015,8 @@ class CoverPlaylistWindow(Gtk.Paned):
overlay.add_overlay(self._lyrics_button_revealer)
self.pack1(overlay, False, False)
self.pack2(self._playlist_window, True, False)
self.set_position(self._settings.get_int("paned0"))
self._on_settings_changed() # hide lyrics button
def save_settings(self):
self._settings.set_int("paned0", self.get_position())
self._playlist_window.save_settings()
def _on_reconnected(self, *args):
self.lyrics_button.set_sensitive(True)
@@ -3082,8 +3088,10 @@ class PlaybackControl(Gtk.ButtonBox):
song=int(self._client.wrapped_call("status")["song"])
elapsed=ClientHelper.calc_display_length(songs[:song])
rest=ClientHelper.calc_display_length(songs[song+1:])
self._prev_button.set_tooltip_text(_("{titles} titles ({length})").format(titles=song, length=elapsed))
self._next_button.set_tooltip_text(_("{titles} titles ({length})").format(titles=(len(songs)-(song+1)), length=rest))
elapsed_titles=ngettext("{titles} title", "{titles} titles", song).format(titles=song)
rest_titles=ngettext("{titles} title", "{titles} titles", (len(songs)-(song+1))).format(titles=(len(songs)-(song+1)))
self._prev_button.set_tooltip_text(" ".join((elapsed_titles, "({length})".format(length=elapsed))))
self._next_button.set_tooltip_text(" ".join((rest_titles, "({length})".format(length=rest))))
except:
self._prev_button.set_tooltip_text("")
self._next_button.set_tooltip_text("")
@@ -3268,7 +3276,6 @@ class OutputPopover(Gtk.Popover):
# packing
self.add(box)
box.show_all()
def _on_button_toggled(self, button, out_id):
@@ -3287,15 +3294,16 @@ class PlaybackOptions(Gtk.Box):
# widgets
icons={}
for icon_name in ("media-playlist-shuffle-symbolic","media-playlist-repeat-symbolic","zoom-original-symbolic","edit-cut-symbolic"):
for icon_name in ("media-playlist-shuffle-symbolic","media-playlist-repeat-symbolic",
"org.mpdevil.mpdevil-single-symbolic","org.mpdevil.mpdevil-consume-symbolic"):
icons[icon_name]=AutoSizedIcon(icon_name, "icon-size", self._settings)
self._random_button=Gtk.ToggleButton(image=icons["media-playlist-shuffle-symbolic"], tooltip_text=_("Random mode"))
self._random_button.set_can_focus(False)
self._repeat_button=Gtk.ToggleButton(image=icons["media-playlist-repeat-symbolic"], tooltip_text=_("Repeat mode"))
self._repeat_button.set_can_focus(False)
self._single_button=Gtk.ToggleButton(image=icons["zoom-original-symbolic"], tooltip_text=_("Single mode"))
self._single_button=Gtk.ToggleButton(image=icons["org.mpdevil.mpdevil-single-symbolic"], tooltip_text=_("Single mode"))
self._single_button.set_can_focus(False)
self._consume_button=Gtk.ToggleButton(image=icons["edit-cut-symbolic"], tooltip_text=_("Consume mode"))
self._consume_button=Gtk.ToggleButton(image=icons["org.mpdevil.mpdevil-consume-symbolic"], tooltip_text=_("Consume mode"))
self._consume_button.set_can_focus(False)
self._volume_button=Gtk.VolumeButton(use_symbolic=True, size=self._settings.get_gtk_icon_size("icon-size"))
self._volume_button.set_can_focus(False)
@@ -3411,8 +3419,12 @@ class PlaybackOptions(Gtk.Box):
self._volume_refresh(None, -1)
def _on_mini_player(self, obj, typestring):
visibility=not(obj.get_property("mini-player"))
self._button_box.set_property("visible", visibility)
if obj.get_property("mini-player"):
self._button_box.set_property("no-show-all", True)
self._button_box.set_property("visible", False)
else:
self._button_box.set_property("no-show-all", False)
self._button_box.show_all()
def _on_icon_size_changed(self, *args):
self._volume_button.set_property("size", self._settings.get_gtk_icon_size("icon-size"))
@@ -3613,15 +3625,13 @@ class MainWindow(Gtk.ApplicationWindow):
self._client=client
self._settings=settings
self._use_csd=self._settings.get_boolean("use-csd")
self._tmp_saved_size=None # needed to restore size after leaving mini player mode
self._tmp_saved_maximized=None # needed to restore maximize state after leaving mini player mode
# MPRIS
dbus_service=MPRISInterface(self, self._client, self._settings)
# actions
simple_actions_data=(
"save","settings","stats","help","menu",
"settings","stats","help","menu",
"toggle-lyrics","back-to-current-album","toggle-search",
"profile-next","profile-prev"
)
@@ -3643,6 +3653,7 @@ class MainWindow(Gtk.ApplicationWindow):
else:
icons={"open-menu-symbolic": AutoSizedIcon("open-menu-symbolic", "icon-size", self._settings)}
self._paned=Gtk.Paned()
self._browser=Browser(self._client, self._settings)
self._cover_playlist_window=CoverPlaylistWindow(self._client, self._settings)
playback_control=PlaybackControl(self._client, self._settings)
@@ -3665,7 +3676,6 @@ class MainWindow(Gtk.ApplicationWindow):
menu=Gio.Menu()
menu.append_submenu(_("Profiles"), self._profiles_submenu)
menu.append(_("Mini player"), "win.mini-player")
menu.append(_("Save window layout"), "win.save")
menu.append_section(None, mpd_subsection)
menu.append_section(None, subsection)
@@ -3691,20 +3701,22 @@ class MainWindow(Gtk.ApplicationWindow):
self._client.emitter.connect("disconnected", self._on_disconnected)
self._client.emitter.connect("reconnected", self._on_reconnected)
self._browser.connect("search_focus_changed", self._on_search_focus_changed)
# auto save window state and size
self.connect("size-allocate", self._on_size_allocate)
self._settings.bind("maximize", self, "is-maximized", Gio.SettingsBindFlags.SET)
# save and restore mini player
self._settings.bind("mini-player", self._settings, "mini-player", Gio.SettingsBindFlags.DEFAULT)
# packing
self._paned2=Gtk.Paned()
self._paned2.set_position(self._settings.get_int("paned2"))
self._on_playlist_pos_changed() # set orientation
self._paned2.pack1(self._browser, True, False)
self._paned2.pack2(self._cover_playlist_window, False, False)
self._paned.pack1(self._browser, True, False)
self._paned.pack2(self._cover_playlist_window, False, False)
vbox=Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
vbox.pack_start(self._paned2, True, True, 0)
vbox.pack_start(self._paned, True, True, 0)
vbox.pack_start(action_bar, False, False, 0)
overlay=Gtk.Overlay()
overlay.add(vbox)
overlay.add_overlay(connection_notify)
if self._use_csd:
self._header_bar=Gtk.HeaderBar()
self._header_bar.set_show_close_button(True)
@@ -3713,11 +3725,8 @@ class MainWindow(Gtk.ApplicationWindow):
self._header_bar.pack_end(self._menu_button)
self._header_bar.pack_end(self._browser.search_button)
else:
action_bar.pack_start(Gtk.Separator.new(orientation=Gtk.Orientation.VERTICAL))
action_bar.pack_start(self._menu_button)
self.add(overlay)
self._client.emitter.emit("disconnected") # bring player in defined state
# indicate connection process in window title
if self._use_csd:
@@ -3725,6 +3734,19 @@ class MainWindow(Gtk.ApplicationWindow):
else:
self.set_title("mpdevil "+_("connecting…"))
self.show_all()
while Gtk.events_pending(): # ensure window is visible
Gtk.main_iteration_do(True)
# restore paned settings when window is visible (fixes a bug when window is maximized)
self._cover_playlist_window.set_position(self._settings.get_int("paned0"))
self._browser.set_position(self._settings.get_int("paned1"))
self._paned.set_position(self._settings.get_int("paned2"))
# auto save paned positions
self._cover_playlist_window.connect("notify::position", self._on_paned_position, "paned0")
self._browser.connect("notify::position", self._on_paned_position, "paned1")
self._paned.connect("notify::position", self._on_paned_position, "paned2")
# start client
def callback(*args):
self._client.start() # connect client
return False
@@ -3739,15 +3761,6 @@ class MainWindow(Gtk.ApplicationWindow):
def _on_toggle_search(self, action, param):
self._browser.search_button.set_active(not(self._browser.search_button.get_active()))
def _on_save(self, action, param):
size=self.get_size()
self._settings.set_int("width", size[0])
self._settings.set_int("height", size[1])
self._settings.set_boolean("maximize", self.is_maximized())
self._browser.save_settings()
self._cover_playlist_window.save_settings()
self._settings.set_int("paned2", self._paned2.get_position())
def _on_settings(self, action, param):
settings=SettingsDialog(self, self._client, self._settings)
settings.run()
@@ -3804,34 +3817,35 @@ class MainWindow(Gtk.ApplicationWindow):
notify.show()
def _on_reconnected(self, *args):
for action in ("save","stats","toggle-lyrics","back-to-current-album","toggle-search"):
for action in ("stats","toggle-lyrics","back-to-current-album","toggle-search"):
self.lookup_action(action).set_enabled(True)
def _on_disconnected(self, *args):
self.set_title("mpdevil")
if self._use_csd:
self._header_bar.set_subtitle("")
for action in ("save","stats","toggle-lyrics","back-to-current-album","toggle-search"):
for action in ("stats","toggle-lyrics","back-to-current-album","toggle-search"):
self.lookup_action(action).set_enabled(False)
def _on_search_focus_changed(self, obj, focus):
self._mpd_action_group.lookup_action("toggle-play").set_enabled(not(focus))
def _on_size_allocate(self, widget, rect):
if not self.is_maximized() and not self._settings.get_property("mini-player"):
size=self.get_size()
self._settings.set_int("width", size[0])
self._settings.set_int("height", size[1])
def _on_paned_position(self, obj, typestring, key):
self._settings.set_int(key, obj.get_position())
def _on_mini_player(self, obj, typestring):
if obj.get_property("mini-player"):
self.lookup_action("save").set_enabled(False)
self._tmp_saved_size=self.get_size()
self._tmp_saved_miximized=self.is_maximized()
if self._tmp_saved_miximized:
if self.is_maximized():
self.unmaximize()
self.resize(1,1)
else:
self.lookup_action("save").set_enabled(True)
self.resize(self._tmp_saved_size[0], self._tmp_saved_size[1])
if self._tmp_saved_miximized:
self.maximize()
self._tmp_saved_size=None
self._tmp_saved_maximized=None
self.resize(self._settings.get_int("width"), self._settings.get_int("height"))
def _on_cursor_watch(self, obj, typestring):
if obj.get_property("cursor-watch"):
@@ -3843,10 +3857,10 @@ class MainWindow(Gtk.ApplicationWindow):
def _on_playlist_pos_changed(self, *args):
if self._settings.get_boolean("playlist-right"):
self._cover_playlist_window.set_orientation(Gtk.Orientation.VERTICAL)
self._paned2.set_orientation(Gtk.Orientation.HORIZONTAL)
self._paned.set_orientation(Gtk.Orientation.HORIZONTAL)
else:
self._cover_playlist_window.set_orientation(Gtk.Orientation.HORIZONTAL)
self._paned2.set_orientation(Gtk.Orientation.VERTICAL)
self._paned.set_orientation(Gtk.Orientation.VERTICAL)
def _refresh_profiles_menu(self, *args):
self._profiles_submenu.remove_all()
@@ -3887,6 +3901,8 @@ class mpdevil(Gtk.Application):
)
for action, accels in action_accels:
self.set_accels_for_action(action, accels)
# disable item activation on space key pressed in treeviews
Gtk.binding_entry_remove(Gtk.binding_set_find('GtkTreeView'), Gdk.keyval_from_name("space"), Gdk.ModifierType.MOD2_MASK)
self._window.present()
def do_startup(self):
@@ -3918,4 +3934,3 @@ class mpdevil(Gtk.Application):
if __name__ == "__main__":
app=mpdevil()
app.run(sys.argv)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<path d="m2.0102 0.52917a1.5875 1.5875 0 0 1 1.5875 1.5875 1.5875 1.5875 0 0 1-1.5875 1.5875 1.5875 1.5875 0 0 1-1.3746-0.79375l1.3746-0.79375-1.3746-0.79375a1.5875 1.5875 0 0 1 1.3746-0.79375zm-0.14779 0.52917a0.26458 0.26458 0 0 0-0.14263 0.035657 0.26458 0.26458 0 0 0-0.096635 0.36122 0.26458 0.26458 0 0 0 0.36122 0.096635 0.26458 0.26458 0 0 0 0.096635-0.36122 0.26458 0.26458 0 0 0-0.21859-0.13229z" fill="#2e3436" stroke-linecap="round" stroke-width=".25194"/>
</svg>

After

Width:  |  Height:  |  Size: 980 B

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<path transform="scale(.26458)" d="m8.4023 2a6 6 0 0 0-6 6 6 6 0 0 0 6 6 6 6 0 0 0 5.1953-3l-5.1953-3 5.1953-3a6 6 0 0 0-5.1953-3zm0.55859 2a1 1 0 0 1 0.53906 0.13477 1 1 0 0 1 0.36523 1.3652 1 1 0 0 1-1.3652 0.36523 1 1 0 0 1-0.36523-1.3652 1 1 0 0 1 0.82617-0.5z" fill="#2e3436" stroke-linecap="round" stroke-width=".9522"/>
</svg>

After

Width:  |  Height:  |  Size: 838 B

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="15.982" height="16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<path d="m7.9902 2a6 6 0 0 0-5.9902 5.6914v0.62891a6 6 0 0 0 5.9902 5.6797 6 6 0 0 0 6-6 6 6 0 0 0-6-6zm-0.99023 3h2v6h-2v-4h-1v-1c0.694 0 1-0.348 1-1z" fill="#2e3436"/>
</svg>

After

Width:  |  Height:  |  Size: 657 B

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-156.79 -48.192)">
<path transform="matrix(.26458 0 0 .26458 156.79 48.192)" d="m4.1621 0s-1.8317 4.1425-0.50781 9.791a22.525 23.103 0 0 0-3.6543 5.5703v0.63867h2.5234a19.982 20.495 0 0 1 2.0664-3.3125h0.0039062c0.44122 1.0742 1.008 2.1855 1.7266 3.3125h9.6797v-6.1543a17.886 17.886 0 0 0-4.5488 1.8223c-1.1979-0.89234-2.2001-1.8385-3.0391-2.791a19.982 20.495 0 0 1 7.5879-3.5469v-2.6621a22.525 23.103 0 0 0-9.1621 4.1504c-2.3946-3.6216-2.6738-6.8184-2.6738-6.8184h-0.0019531z" fill="#2e3436" stroke-linecap="round" stroke-width=".053119"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,5 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="128" height="128" version="1.1" viewBox="0 0 33.867 33.867" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<svg width="128" height="128" version="1.1" viewBox="0 0 33.867 33.867" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient871">
<stop stop-opacity=".5" offset="0"/>
<stop stop-opacity=".1" offset=".5"/>
<stop stop-opacity=".5" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient904" x1="142" x2="238" y1="74.998" y2="74.998" gradientTransform="matrix(.26458 0 0 .26458 123.45 54.013)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient871"/>
<linearGradient id="linearGradient912" x1="157.72" x2="189.71" y1="58.908" y2="58.908" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient871"/>
<linearGradient id="linearGradient1026" x1="195.81" x2="197.92" y1="69.668" y2="69.668" gradientTransform="translate(-11.506 4.4716)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient871"/>
<linearGradient id="linearGradient1030" x1="195.81" x2="197.92" y1="69.668" y2="69.668" gradientTransform="matrix(-1 0 0 1 358.94 4.4716)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient871"/>
<linearGradient id="linearGradient1043" x1="146.99" x2="161.99" y1="83.478" y2="83.478" gradientTransform="matrix(.26458 0 0 .26458 147.53 49.338)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient871"/>
<linearGradient id="linearGradient1047" x1="146.99" x2="161.99" y1="83.478" y2="83.478" gradientTransform="matrix(-.26458 0 0 .26458 199.91 49.338)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient871"/>
<linearGradient id="linearGradient885" x1="144.82" x2="154.08" y1="51.721" y2="51.721" gradientTransform="translate(16.728 4.9575)" gradientUnits="userSpaceOnUse">
<stop stop-opacity=".4" offset="0"/>
<stop stop-opacity=".1" offset=".5"/>
<stop stop-opacity=".5" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient889" x1="144.82" x2="154.08" y1="51.721" y2="51.721" gradientTransform="matrix(-1 0 0 1 330.71 4.9575)" gradientUnits="userSpaceOnUse">
<stop stop-opacity=".4" offset="0"/>
<stop stop-opacity=".1" offset=".5"/>
<stop stop-opacity=".5" offset="1"/>
</linearGradient>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
@@ -10,47 +33,34 @@
</rdf:RDF>
</metadata>
<g transform="translate(-156.79 -48.192)">
<path d="m173.69 50.573a15.994 16.404 0 0 0-15.965 16.404h1.8056a14.188 14.552 0 0 1 14.08-14.552 14.188 14.552 0 0 1 0.10852 0 14.188 14.552 0 0 1 14.188 14.552h1.8061a15.994 16.404 0 0 0-15.994-16.404 15.994 16.404 0 0 0-0.0289 0z" opacity=".3" stroke-linecap="round" stroke-width=".037717"/>
<path d="m173.69 50.044a15.994 16.404 0 0 0-15.965 16.404h1.8056a14.188 14.552 0 0 1 14.08-14.552 14.188 14.552 0 0 1 0.10852 0 14.188 14.552 0 0 1 14.188 14.552h1.8061a15.994 16.404 0 0 0-15.994-16.404 15.994 16.404 0 0 0-0.0289 0z" fill="#3d3846" stroke-linecap="round" stroke-width=".037717"/>
<path d="m173.61 51.367a14.188 14.552 0 0 0-14.079 14.552h-1.7973a15.994 16.404 0 0 0-8e-3 0.52917h1.8056a14.188 14.552 0 0 1 14.08-14.552 14.188 14.552 0 0 1 0.10852 0 14.188 14.552 0 0 1 14.188 14.552h1.8061a15.994 16.404 0 0 0-8e-3 -0.52917h-1.7978a14.188 14.552 0 0 0-14.188-14.552 14.188 14.552 0 0 0-0.10852 0 14.188 14.552 0 0 1-5.2e-4 0z" fill="url(#linearGradient912)" stroke-linecap="round" stroke-width=".037717"/>
<g>
<path d="m173.69 50.044a15.994 16.404 0 0 0-15.965 16.404h8e-3a15.994 16.404 0 0 1 15.957-15.875 15.994 16.404 0 0 1 0.0289 0 15.994 16.404 0 0 1 15.986 15.875h8e-3a15.994 16.404 0 0 0-15.994-16.404 15.994 16.404 0 0 0-0.0289 0z" fill="#fff" opacity=".1" stroke-linecap="round" stroke-width=".037717"/>
<path d="m162.25 48.986s-2.7703 6.254 2.6891 12.965l5.8685-2.7602c-7.9486-3.3925-8.5576-10.204-8.5576-10.204z" opacity=".2"/>
<path d="m162.25 48.457s-2.7703 6.254 2.6891 12.965l5.8685-2.7602c-7.9486-3.3925-8.5576-10.204-8.5576-10.204z" fill="#c01c28"/>
<path d="m185.19 48.986s2.7703 6.254-2.6891 12.965l-5.8685-2.7602c7.9486-3.3925 8.5576-10.204 8.5576-10.204z" opacity=".2"/>
<path d="m161.56 51.936c-0.10501 2.4408 0.46065 5.8972 3.3796 9.4852l5.8684-2.76c-0.39365-0.16801-0.76447-0.34666-1.1229-0.5302l-4.7454 2.2319c-2.5193-3.0967-3.2844-6.0943-3.3796-8.4269z" fill="url(#linearGradient885)"/>
<path d="m185.19 48.457s2.7703 6.254-2.6891 12.965l-5.8685-2.7602c7.9486-3.3925 8.5576-10.204 8.5576-10.204z" fill="#c01c28"/>
<path transform="matrix(.26458 0 0 .26458 156.79 48.192)" d="m107.34 1s-2.3018 25.746-32.344 38.568l2.166 1.0176c27.975-13.105 30.178-37.586 30.178-37.586s2.4572 5.5725 2.6387 14.197c0.20388-9.7558-2.6387-16.197-2.6387-16.197z" fill="#fffefe" opacity=".1"/>
<circle transform="rotate(12.584)" cx="184.43" cy="28.813" r="12.7" opacity=".2"/>
<path d="m162.25 48.457s0.609 6.812 8.5576 10.205l-0.57309 0.26924c-7.4018-3.4675-7.9845-9.9446-7.9845-9.9446s-0.65013 1.4744-0.69815 3.7564c-0.0539-2.5812 0.69815-4.2855 0.69815-4.2855z" fill="#fffefe" opacity=".1"/>
<path d="m185.88 51.936c0.10501 2.4408-0.46065 5.8972-3.3796 9.4852l-5.8684-2.76c0.39365-0.16801 0.76447-0.34666 1.1229-0.5302l4.7454 2.2319c2.5193-3.0967 3.2844-6.0943 3.3796-8.4269z" fill="url(#linearGradient889)"/>
<circle transform="rotate(12.584)" cx="184.31" cy="28.296" r="12.7" fill="#e01b24"/>
<path d="m173.67 55.071a12.7 12.7 0 0 0-12.345 9.9332 12.7 12.7 0 0 0-0.30179 3.0272 12.7 12.7 0 0 1 0.30179-2.498 12.7 12.7 0 0 1 15.162-9.6284 12.7 12.7 0 0 1 9.9301 12.135 12.7 12.7 0 0 0-9.9301-12.664 12.7 12.7 0 0 0-2.8169-0.30489z" fill="#fff" opacity=".1"/>
<path d="m161.03 67.241a12.7 12.7 0 0 0 9.9224 12.925 12.7 12.7 0 0 0 15.162-9.6284 12.7 12.7 0 0 0 0.29403-3.2949 12.7 12.7 0 0 1-0.29403 2.2366 12.7 12.7 0 0 1-15.162 9.6284 12.7 12.7 0 0 1-9.9224-11.867z" fill="url(#linearGradient904)"/>
<circle cx="172.13" cy="69.888" r=".79375" opacity=".4"/>
<circle cx="175.31" cy="69.888" r=".79375" opacity=".4"/>
</g>
<path d="m181.92 64.332c0 1.8995-1.5395 3.4396-3.4396 3.4396-1.8995 0-3.4396-1.5401-3.4396-3.4396 0-1.8995 1.5401-3.4396 3.4396-3.4396 1.9001 0 3.4396 1.5401 3.4396 3.4396z" fill="#f6f5f4"/>
<g>
<g>
<circle cx="172.13" cy="70.417" r=".79375" opacity=".3"/>
<circle cx="175.31" cy="70.417" r=".79375" opacity=".3"/>
<circle cx="178.48" cy="65.39" r="3.4396" opacity=".2"/>
<circle cx="178.48" cy="64.861" r="3.4396" fill="#f6f5f4"/>
<circle cx="168.96" cy="65.39" r="3.4396" opacity=".2"/>
<circle cx="168.96" cy="64.861" r="3.4396" fill="#f6f5f4"/>
<circle cx="178.22" cy="63.802" r="1.5875" fill="#241f31"/>
<circle cx="168.69" cy="63.802" r="1.5875" fill="#241f31"/>
<path transform="matrix(.26458 0 0 .26458 156.79 48.192)" d="m69.949 81a3 3 0 0 0-2.9492 3 3 3 0 0 0 0.042969 0.50195 3 3 0 0 1 2.957-2.502 3 3 0 0 1 2.957 2.498 3 3 0 0 0 0.042969-0.49805 3 3 0 0 0-3-3 3 3 0 0 0-0.050781 0z" opacity=".3"/>
<path d="m172.12 69.623a0.79375 0.79375 0 0 0-0.78031 0.79375 0.79375 0.79375 0 0 0 0.0114 0.13281 0.79375 0.79375 0 0 1 0.78238-0.66198 0.79375 0.79375 0 0 1 0.78238 0.66094 0.79375 0.79375 0 0 0 0.0114-0.13178 0.79375 0.79375 0 0 0-0.79375-0.79375 0.79375 0.79375 0 0 0-0.0134 0z" opacity=".3"/>
<circle cx="178.22" cy="63.273" r="1.5875" fill="#241f31"/>
<path d="m172.4 64.332c0 1.8995-1.5395 3.4396-3.4396 3.4396-1.8995 0-3.4396-1.5401-3.4396-3.4396 0-1.8995 1.5401-3.4396 3.4396-3.4396 1.9001 0 3.4396 1.5401 3.4396 3.4396z" fill="#f6f5f4"/>
<circle cx="168.69" cy="63.273" r="1.5875" fill="#241f31"/>
</g>
<path d="m169.95 71.211c-3.1753 0.04728-2.4014 1.419-2.9983 2.5048-0.29211 0.53135 0.422-0.06077 1.2252-0.80047 1.263 1.9524 3.5805 3.7996 7.6435 2.3347-3.622-0.25777-5.8309-1.5312-7.1556-2.7967 0.66518-0.6314 1.2852-1.2423 1.2852-1.2423z" opacity=".4"/>
<path d="m161.02 60.204v15.135s-0.25743-0.09764-0.39066-0.13303c-0.65036-0.17255-1.39-0.07614-1.9848-0.38276-0.32991-0.17009-0.60935-0.45083-0.79371-0.76449-0.26875-0.45726-0.3681-0.83192-0.44542-1.3501-0.20943-1.4036-0.34842-2.7238-0.35396-4.6762v-0.5219c6e-3 -1.9524 0.14453-3.273 0.35396-4.6767 0.0773-0.51818 0.17667-0.89233 0.44542-1.3496 0.18436-0.31367 0.4638-0.5944 0.79371-0.7645 0.59475-0.30662 1.3344-0.21021 1.9848-0.38276 0.13323-0.03538 0.39066-0.13302 0.39066-0.13302z" fill="#3d3846"/>
<path d="m162.07 59.834c-0.34403 5.04e-4 -1.0521 0.37002-1.0521 0.37002v15.135s0.7081 0.36951 1.0521 0.37002c0.34403 5.11e-4 0.54179-0.12749 0.71262-0.43627 0.17083-0.30878 0.35792-0.67862 0.35192-1.8119l-5.2e-4 -0.36135h5.2e-4v-10.656h-5.2e-4l5.2e-4 -0.36135c6e-3 -1.1332-0.18109-1.5031-0.35192-1.8119-0.17083-0.30878-0.36859-0.43678-0.71262-0.43627z" fill="#9a9996"/>
<path d="m186.42 60.204v15.135s0.25743-0.09764 0.39066-0.13303c0.65036-0.17255 1.39-0.07614 1.9848-0.38276 0.32991-0.17009 0.60935-0.45083 0.79371-0.76449 0.26875-0.45726 0.3681-0.83192 0.44542-1.3501 0.20943-1.4036 0.34842-2.7238 0.35396-4.6762v-0.5219c-6e-3 -1.9524-0.14453-3.273-0.35396-4.6767-0.0773-0.51818-0.17667-0.89233-0.44542-1.3496-0.18436-0.31367-0.4638-0.5944-0.79371-0.7645-0.59475-0.30662-1.3344-0.21021-1.9848-0.38276-0.13323-0.03538-0.39066-0.13302-0.39066-0.13302z" fill="#3d3846"/>
<path d="m185.37 59.834c0.34403 5.04e-4 1.0521 0.37002 1.0521 0.37002v15.135s-0.7081 0.36951-1.0521 0.37002c-0.34403 5.11e-4 -0.54179-0.12749-0.71262-0.43627-0.17083-0.30878-0.35792-0.67862-0.35192-1.8119l5.2e-4 -0.36135h-5.2e-4v-10.656h5.2e-4l-5.2e-4 -0.36135c-6e-3 -1.1332 0.18109-1.5031 0.35192-1.8119 0.17083-0.30878 0.36859-0.43678 0.71262-0.43627z" fill="#9a9996"/>
<path d="m184.3 72.57v0.36122l5.1e-4 -0.36122zm0 0.36122v0.16795h5.1e-4l-5.1e-4 0.36122c-6e-3 1.1332 0.18108 1.5035 0.35191 1.8123 0.17083 0.30878 0.36859 0.43666 0.71262 0.43615 0.34403-5.04e-4 1.0521-0.37 1.0521-0.37v-0.52917s-0.7081 0.3695-1.0521 0.37c-0.34403 5.11e-4 -0.54179-0.12737-0.71262-0.43615-0.17083-0.30878-0.35791-0.67905-0.35191-1.8123z" fill="url(#linearGradient1026)"/>
<path d="m163.13 72.57v0.36122l-5.1e-4 -0.36122zm0 0.36122v0.16795h-5.1e-4l5.1e-4 0.36122c6e-3 1.1332-0.18108 1.5035-0.35191 1.8123-0.17083 0.30878-0.36859 0.43666-0.71262 0.43615-0.34403-5.04e-4 -1.0521-0.37-1.0521-0.37v-0.52917s0.7081 0.3695 1.0521 0.37c0.34403 5.11e-4 0.54179-0.12737 0.71262-0.43615 0.17083-0.30878 0.35791-0.67905 0.35191-1.8123z" fill="url(#linearGradient1030)"/>
<path d="m190.39 67.51c-6e-3 1.9481-0.14483 3.2672-0.35398 4.669-0.0773 0.51818-0.1767 0.89253-0.44545 1.3498-0.18436 0.31366-0.46384 0.59472-0.79375 0.76481-0.59475 0.30662-1.334 0.21038-1.9844 0.38292-0.13323 0.03539-0.39067 0.13281-0.39067 0.13281v0.52917s0.25744-0.09742 0.39067-0.13281c0.65036-0.17255 1.3896-0.07631 1.9844-0.38292 0.32991-0.17009 0.60939-0.45115 0.79375-0.76481 0.26875-0.45726 0.36813-0.83161 0.44545-1.3498 0.20943-1.4036 0.34844-2.7238 0.35398-4.6762z" fill="url(#linearGradient1043)"/>
<path d="m157.05 67.51c6e-3 1.9481 0.14483 3.2672 0.35398 4.669 0.0773 0.51818 0.1767 0.89253 0.44545 1.3498 0.18436 0.31366 0.46384 0.59472 0.79375 0.76481 0.59475 0.30662 1.334 0.21038 1.9844 0.38292 0.13323 0.03539 0.39067 0.13281 0.39067 0.13281v0.52917s-0.25744-0.09742-0.39067-0.13281c-0.65036-0.17255-1.3896-0.07631-1.9844-0.38292-0.32991-0.17009-0.60939-0.45115-0.79375-0.76481-0.26875-0.45726-0.36813-0.83161-0.44545-1.3498-0.20943-1.4036-0.34844-2.7238-0.35398-4.6762z" fill="url(#linearGradient1047)"/>
</g>
<g transform="translate(-3.3391 -25.538)">
<path d="m188.71 85.901c-0.34403-5.19e-4 -0.54174 0.12927-0.71257 0.44235-0.17083 0.31308-0.3579 0.68807-0.3519 1.8371l5.2e-4 0.36639h-5.2e-4v10.583h5.2e-4l-5.2e-4 0.3669c-6e-3 1.149 0.18107 1.524 0.3519 1.8371s0.36854 0.44236 0.71257 0.44184c0.34403-5.1e-4 1.0521-0.37466 1.0521-0.37466v0.11059s0.25742-0.099 0.39065-0.13488c0.65036-0.17495 1.39-0.0772 1.9848-0.38809 0.32991-0.17245 0.60935-0.45711 0.79371-0.77514 0.26875-0.46363 0.3681-0.84351 0.44542-1.3689 0.20943-1.4232 0.34843-2.7617 0.35397-4.7413v-0.52917c-6e-3 -1.9796-0.14454-3.3186-0.35397-4.7418-0.0773-0.5254-0.17667-0.90476-0.44542-1.3684-0.18436-0.31804-0.4638-0.60268-0.79371-0.77515-0.59475-0.31089-1.3344-0.21314-1.9848-0.38809-0.13323-0.03587-0.39065-0.13488-0.39065-0.13488v0.11007s-0.70804-0.37466-1.0521-0.37517z" opacity=".2"/>
<path d="m189.76 85.637v15.346s0.25743-0.099 0.39066-0.13488c0.65036-0.17495 1.39-0.0772 1.9848-0.38809 0.32991-0.17246 0.60935-0.45711 0.79371-0.77514 0.26875-0.46363 0.3681-0.84351 0.44542-1.3689 0.20943-1.4232 0.34842-2.7617 0.35396-4.7413v-0.52917c-6e-3 -1.9796-0.14453-3.3186-0.35396-4.7418-0.0773-0.5254-0.17667-0.90476-0.44542-1.3684-0.18436-0.31804-0.4638-0.60269-0.79371-0.77515-0.59475-0.31089-1.3344-0.21314-1.9848-0.38809-0.13323-0.03587-0.39066-0.13488-0.39066-0.13488z" fill="#3d3846"/>
<path d="m188.71 85.372c-0.34403-5.19e-4 -0.54174 0.12927-0.71257 0.44235-0.17083 0.31308-0.35789 0.68807-0.35189 1.8371l5.1e-4 0.36638h-5.1e-4v10.583h5.1e-4l-5.1e-4 0.3669c-6e-3 1.149 0.18106 1.524 0.35189 1.8371s0.36854 0.44235 0.71257 0.44183c0.34403-5.1e-4 1.0521-0.37465 1.0521-0.37465v-15.125s-0.70804-0.37466-1.0521-0.37517z" fill="#9a9996"/>
<path d="m188.71 85.372c-0.34404-5.19e-4 -0.54175 0.12927-0.71257 0.44235-0.17083 0.31308-0.3579 0.68807-0.3519 1.8371l5.2e-4 0.36639h-5.2e-4v0.16278c-6e-3 -1.149 0.18107-1.524 0.3519-1.8371 0.17082-0.31308 0.36853-0.44287 0.71257-0.44235 0.34403 5.11e-4 1.0521 0.37517 1.0521 0.37517v-0.52917s-0.70804-0.37466-1.0521-0.37517zm-1.0645 2.8086v0.36639h5.2e-4z" fill="#fff" opacity=".2"/>
<path d="m189.76 85.637v0.52917s0.25743 0.09901 0.39065 0.13488c0.65036 0.17495 1.39 0.0772 1.9848 0.38809 0.32991 0.17246 0.60934 0.45711 0.7937 0.77515 0.26875 0.46363 0.36813 0.84299 0.44542 1.3684 0.20944 1.4232 0.34796 2.7622 0.35396 4.7418v-0.52917c-6e-3 -1.9796-0.14452-3.3186-0.35396-4.7418-0.0773-0.5254-0.17667-0.90476-0.44542-1.3684-0.18436-0.31804-0.46379-0.60269-0.7937-0.77515-0.59476-0.31089-1.3344-0.21314-1.9848-0.38809-0.13322-0.03587-0.39065-0.13488-0.39065-0.13488z" fill="#fff" opacity=".1"/>
</g>
<g transform="matrix(-1 0 0 1 350.78 -25.538)">
<path d="m188.71 85.901c-0.34403-5.19e-4 -0.54174 0.12927-0.71257 0.44235-0.17083 0.31308-0.3579 0.68807-0.3519 1.8371l5.2e-4 0.36639h-5.2e-4v10.583h5.2e-4l-5.2e-4 0.3669c-6e-3 1.149 0.18107 1.524 0.3519 1.8371s0.36854 0.44236 0.71257 0.44184c0.34403-5.1e-4 1.0521-0.37466 1.0521-0.37466v0.11059s0.25742-0.099 0.39065-0.13488c0.65036-0.17495 1.39-0.0772 1.9848-0.38809 0.32991-0.17245 0.60935-0.45711 0.79371-0.77514 0.26875-0.46363 0.3681-0.84351 0.44542-1.3689 0.20943-1.4232 0.34843-2.7617 0.35397-4.7413v-0.52917c-6e-3 -1.9796-0.14454-3.3186-0.35397-4.7418-0.0773-0.5254-0.17667-0.90476-0.44542-1.3684-0.18436-0.31804-0.4638-0.60268-0.79371-0.77515-0.59475-0.31089-1.3344-0.21314-1.9848-0.38809-0.13323-0.03587-0.39065-0.13488-0.39065-0.13488v0.11007s-0.70804-0.37466-1.0521-0.37517z" opacity=".2"/>
<path d="m189.76 85.637v15.346s0.25743-0.099 0.39066-0.13488c0.65036-0.17495 1.39-0.0772 1.9848-0.38809 0.32991-0.17246 0.60935-0.45711 0.79371-0.77514 0.26875-0.46363 0.3681-0.84351 0.44542-1.3689 0.20943-1.4232 0.34842-2.7617 0.35396-4.7413v-0.52917c-6e-3 -1.9796-0.14453-3.3186-0.35396-4.7418-0.0773-0.5254-0.17667-0.90476-0.44542-1.3684-0.18436-0.31804-0.4638-0.60269-0.79371-0.77515-0.59475-0.31089-1.3344-0.21314-1.9848-0.38809-0.13323-0.03587-0.39066-0.13488-0.39066-0.13488z" fill="#3d3846"/>
<path d="m188.71 85.372c-0.34403-5.19e-4 -0.54174 0.12927-0.71257 0.44235-0.17083 0.31308-0.35789 0.68807-0.35189 1.8371l5.1e-4 0.36638h-5.1e-4v10.583h5.1e-4l-5.1e-4 0.3669c-6e-3 1.149 0.18106 1.524 0.35189 1.8371s0.36854 0.44235 0.71257 0.44183c0.34403-5.1e-4 1.0521-0.37465 1.0521-0.37465v-15.125s-0.70804-0.37466-1.0521-0.37517z" fill="#9a9996"/>
<path d="m188.71 85.372c-0.34404-5.19e-4 -0.54175 0.12927-0.71257 0.44235-0.17083 0.31308-0.3579 0.68807-0.3519 1.8371l5.2e-4 0.36639h-5.2e-4v0.16278c-6e-3 -1.149 0.18107-1.524 0.3519-1.8371 0.17082-0.31308 0.36853-0.44287 0.71257-0.44235 0.34403 5.11e-4 1.0521 0.37517 1.0521 0.37517v-0.52917s-0.70804-0.37466-1.0521-0.37517zm-1.0645 2.8086v0.36639h5.2e-4z" fill="#fff" opacity=".2"/>
<path d="m189.76 85.637v0.52917s0.25743 0.09901 0.39065 0.13488c0.65036 0.17495 1.39 0.0772 1.9848 0.38809 0.32991 0.17246 0.60934 0.45711 0.7937 0.77515 0.26875 0.46363 0.36813 0.84299 0.44542 1.3684 0.20944 1.4232 0.34796 2.7622 0.35396 4.7418v-0.52917c-6e-3 -1.9796-0.14452-3.3186-0.35396-4.7418-0.0773-0.5254-0.17667-0.90476-0.44542-1.3684-0.18436-0.31804-0.46379-0.60269-0.7937-0.77515-0.59476-0.31089-1.3344-0.21314-1.9848-0.38809-0.13322-0.03587-0.39065-0.13488-0.39065-0.13488z" fill="#fff" opacity=".1"/>
</g>
<path d="m169.95 71.565c-3.1753 0.04728-2.4014 1.419-2.9983 2.5048-0.29211 0.53135 0.422-0.06077 1.2252-0.80047 1.263 1.9524 3.5805 3.7996 7.6435 2.3347-3.622-0.25777-5.8309-1.5312-7.1556-2.7967 0.66518-0.6314 1.2852-1.2423 1.2852-1.2423z" opacity=".29966"/>
<path d="m169.95 71.565c-3.1753 0.04728-2.4014 1.419-2.9983 2.5048-0.10728 0.19514-0.0779 0.23786 0.0408 0.17828 0.49788-1.0351-0.0815-2.2821 2.6712-2.4061 0.0552-0.05415 0.28628-0.27699 0.28628-0.27699zm-1.1446 1.371c-0.0709 0.0678-0.0678 0.06684-0.14056 0.13591 1.2446 1.1891 3.2705 2.3848 6.5148 2.7389 0.20894-0.06021 0.42181-0.12776 0.64079-0.20671-3.4991-0.24902-5.6768-1.446-7.0151-2.6681z" opacity=".29966"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -23,15 +23,12 @@
</ul>
</description>
<releases>
<release version="0.9.8" date="2020-12-27">
<description>
</description>
</release>
<release version="1.1.0" date="2021-02-13"/>
</releases>
<launchable type="desktop-id">org.mpdevil.mpdevil.desktop</launchable>
<screenshots>
<screenshot type="default">
<image type="source" width="1016" height="1024">https://raw.githubusercontent.com/SoongNoonien/mpdevil/v0.9.7/screenshots/mainwindow_0.9.5.png</image>
<image type="source" width="1008" height="1039">https://raw.githubusercontent.com/SoongNoonien/mpdevil/v1.1.0/screenshots/mainwindow_1.1.0.png</image>
</screenshot>
</screenshots>
<url type="homepage">https://github.com/SoongNoonien/mpdevil</url>

View File

@@ -31,6 +31,11 @@
<summary>Default position of paned1/paned0 separator</summary>
<description></description>
</key>
<key type="b" name="mini-player">
<default>false</default>
<summary>Start player in mini player mode</summary>
<description></description>
</key>
<key type="i" name="album-cover">
<default>170</default>
<summary>Size of covers in album view</summary>
@@ -52,7 +57,7 @@
<description></description>
</key>
<key type="b" name="use-csd">
<default>false</default>
<default>true</default>
<summary>Use Client-side decoration</summary>
<description></description>
</key>
@@ -71,11 +76,6 @@
<summary>Show initial letters in artist-view</summary>
<description></description>
</key>
<key type="b" name="show-album-view-tooltips">
<default>true</default>
<summary>Show tooltips in album-view</summary>
<description></description>
</key>
<key type="b" name="sort-albums-by-year">
<default>true</default>
<summary>Sort albums by year</summary>

388
po/de.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-20 18:10+0200\n"
"PO-Revision-Date: 2020-10-20 18:14+0200\n"
"POT-Creation-Date: 2021-02-12 16:57+0100\n"
"PO-Revision-Date: 2021-02-12 16:58+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@@ -18,103 +18,90 @@ msgstr ""
"X-Generator: Poedit 2.3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mpdevil:419
#: mpdevil:438
#, python-brace-format
msgid "{days} day"
msgid_plural "{days} days"
msgstr[0] "{days} Tag"
msgstr[1] "{days} Tage"
#: mpdevil:473
msgid "Unknown Title"
msgstr "Unbekannter Titel"
#: mpdevil:719
#: mpdevil:802
msgid "Main cover size:"
msgstr "Größe des Haupt-Covers:"
#: mpdevil:720
#: mpdevil:803
msgid "Album view cover size:"
msgstr "Covergröße in Albumliste:"
#: mpdevil:721
#: mpdevil:804
msgid "Action bar icon size:"
msgstr "Symbolgröße Aktionsleiste:"
#: mpdevil:722
#: mpdevil:805
msgid "Secondary icon size:"
msgstr "Sekundäre Symbolgröße:"
#: mpdevil:735
msgid "Sort albums by:"
msgstr "Sortiere Alben nach:"
#: mpdevil:735
msgid "name"
msgstr "Name"
#: mpdevil:735
msgid "year"
msgstr "Jahr"
#: mpdevil:736
msgid "Position of playlist:"
msgstr "Wiedergabelistenposition:"
#: mpdevil:736
msgid "bottom"
msgstr "unten"
#: mpdevil:736
msgid "right"
msgstr "rechts"
#: mpdevil:754
#: mpdevil:818
msgid "Use Client-side decoration"
msgstr "Benutze „Client-side decoration“"
msgstr "„Client-side decoration“ benutzen"
#: mpdevil:755
#: mpdevil:819
msgid "Show stop button"
msgstr "Zeige Stopp-Knopf"
msgstr "Stopp-Knopf anzeigen"
#: mpdevil:756
#: mpdevil:820
msgid "Show lyrics button"
msgstr "Zeige Liedtext-Knopf"
msgstr "Liedtext-Knopf anzeigen"
#: mpdevil:757
#: mpdevil:821
msgid "Show initials in artist view"
msgstr "Zeige Anfangsbuchstaben in Interpretenliste"
msgstr "Anfangsbuchstaben in Interpretenliste anzeigen"
#: mpdevil:758
msgid "Show tooltips in album view"
msgstr "Zeige Tooltips in Albumliste"
#: mpdevil:822
msgid "Place playlist at the side"
msgstr "Wiedergabeliste seitlich anzeigen"
#: mpdevil:759
#: mpdevil:823
msgid "Use “Album Artist” tag"
msgstr "Benutze „Album Artist“ Tag"
msgstr "„Album Artist“ Tag benutzen"
#: mpdevil:760
#: mpdevil:824
msgid "Send notification on title change"
msgstr "Sende Benachrichtigung bei Titelwechsel"
msgstr "Über Titelwechsel benachrichtigen"
#: mpdevil:761
#: mpdevil:825
msgid "Stop playback on quit"
msgstr "Wiedergabe beim Beenden stoppen"
#: mpdevil:762
#: mpdevil:826
msgid "Play selected albums and titles immediately"
msgstr "Ausgewählte Alben und Titel sofort abspielen"
#: mpdevil:775
#: mpdevil:827
msgid "Sort albums by year"
msgstr "Alben nach Jahr sortieren"
#: mpdevil:839
msgid "<b>View</b>"
msgstr "<b>Ansicht</b>"
#: mpdevil:776
#: mpdevil:840
msgid "<b>Behavior</b>"
msgstr "<b>Verhalten</b>"
#: mpdevil:808
#: mpdevil:860
msgid "(restart required)"
msgstr "(Neustart erforderlich)"
#: mpdevil:870 mpdevil:3409
msgid "Connect"
msgstr "Verbinden"
#: mpdevil:909
msgid "_Connect"
msgstr "_Verbinden"
#: mpdevil:886
#: mpdevil:925
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 "
@@ -124,157 +111,161 @@ msgstr ""
"regulären Ausdruck entspricht, wird angezeigt. %AlbumArtist% und %Album% "
"werden durch die entsprechenden Tags des Liedes ersetzt."
#: mpdevil:891
#: mpdevil:930
msgid "Profile:"
msgstr "Profil:"
#: mpdevil:892
#: mpdevil:931
msgid "Name:"
msgstr "Name:"
#: mpdevil:893
#: mpdevil:932
msgid "Host:"
msgstr "Host:"
#: mpdevil:894
#: mpdevil:933
msgid "Password:"
msgstr "Passwort:"
#: mpdevil:895
#: mpdevil:934
msgid "Music lib:"
msgstr "Musikverzeichnis:"
#: mpdevil:896
#: mpdevil:935
msgid "Cover regex:"
msgstr "Cover-Regex:"
#: mpdevil:1029
#: mpdevil:1070
msgid "Choose directory"
msgstr "Verzeichnis Wählen"
msgstr "Verzeichnis wählen"
#: mpdevil:1065
#: mpdevil:1101
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:1082 mpdevil:1604 mpdevil:1930 mpdevil:2633
#: mpdevil:1118 mpdevil:1671 mpdevil:1766 mpdevil:2706
msgid "No"
msgstr "Nr."
#: mpdevil:1082 mpdevil:2634
#: mpdevil:1118 mpdevil:2707
msgid "Disc"
msgstr "CD"
#: mpdevil:1082 mpdevil:1609 mpdevil:1933 mpdevil:2635
#: mpdevil:1118 mpdevil:1674 mpdevil:1771 mpdevil:2708
msgid "Title"
msgstr "Titel"
#: mpdevil:1082 mpdevil:1615 mpdevil:2636
#: mpdevil:1118 mpdevil:1777 mpdevil:2709
msgid "Artist"
msgstr "Interpret"
#: mpdevil:1082 mpdevil:1621 mpdevil:2637
#: mpdevil:1118 mpdevil:1783 mpdevil:2710
msgid "Album"
msgstr "Album"
#: mpdevil:1082 mpdevil:1627 mpdevil:1937 mpdevil:2638
#: mpdevil:1118 mpdevil:1678 mpdevil:1789 mpdevil:2711
msgid "Length"
msgstr "Länge"
#: mpdevil:1082 mpdevil:2639
#: mpdevil:1118 mpdevil:2712
msgid "Year"
msgstr "Jahr"
#: mpdevil:1082 mpdevil:2640
#: mpdevil:1118 mpdevil:2713
msgid "Genre"
msgstr "Genre"
#: mpdevil:1198 mpdevil:1200 mpdevil:3498
#: mpdevil:1234 mpdevil:1236 mpdevil:3666
msgid "Settings"
msgstr "Einstellungen"
#: mpdevil:1213 mpdevil:1222 mpdevil:3345
#: mpdevil:1249 mpdevil:1258 mpdevil:3513
msgid "General"
msgstr "Allgemein"
#: mpdevil:1214 mpdevil:1223 mpdevil:3509
#: mpdevil:1250 mpdevil:1259 mpdevil:3677
msgid "Profiles"
msgstr "Profile"
#: mpdevil:1215 mpdevil:1224 mpdevil:3349
#: mpdevil:1251 mpdevil:1260 mpdevil:3517
msgid "Playlist"
msgstr "Wiedergabeliste"
#: mpdevil:1238
#: mpdevil:1273
msgid "Stats"
msgstr "Statistik"
#: mpdevil:1248
#: mpdevil:1283
msgid "<b>Protocol:</b>"
msgstr "<b>Protokoll:</b>"
#: mpdevil:1249
#: mpdevil:1284
msgid "<b>Uptime:</b>"
msgstr "<b>Uptime:</b>"
#: mpdevil:1250
#: mpdevil:1285
msgid "<b>Playtime:</b>"
msgstr "<b>Wiedergabezeit:</b>"
#: mpdevil:1251
#: mpdevil:1286
msgid "<b>Artists:</b>"
msgstr "<b>Künstler:</b>"
#: mpdevil:1252
#: mpdevil:1287
msgid "<b>Albums:</b>"
msgstr "<b>Alben:</b>"
#: mpdevil:1253
#: mpdevil:1288
msgid "<b>Songs:</b>"
msgstr "<b>Titel:</b>"
#: mpdevil:1254
#: mpdevil:1289
msgid "<b>Total Playtime:</b>"
msgstr "<b>Gesamt Wiedergabezeit:</b>"
msgstr "<b>Gesamtwiedergabezeit:</b>"
#: mpdevil:1255
#: mpdevil:1290
msgid "<b>Database Update:</b>"
msgstr "<b>Datenbankaktualisierung:</b>"
#: mpdevil:1280
#: mpdevil:1314
msgid "A simple music browser for MPD"
msgstr "Ein einfacher Musikbrowser für MPD"
#: mpdevil:1360
#: mpdevil:1412
msgid "Open with…"
msgstr "Öffnen mit…"
#: mpdevil:1430
msgid "MPD-Tag"
msgstr "MPD-Tag"
#: mpdevil:1363
#: mpdevil:1433
msgid "Value"
msgstr "Wert"
#: mpdevil:1522
#: mpdevil:1564
msgid "_Append"
msgstr "_Anhängen"
#: mpdevil:1524
#: mpdevil:1566
msgid "Add all titles to playlist"
msgstr "Alle Titel der Wiedergabeliste anhängen"
#: mpdevil:1525
#: mpdevil:1567
msgid "_Play"
msgstr "Ab_spielen"
#: mpdevil:1527
#: mpdevil:1569
msgid "Directly play all titles"
msgstr "Alle Titel sofort abspielen"
#: mpdevil:1528
#: mpdevil:1570
msgid "_Enqueue"
msgstr "_Einreihen"
#: mpdevil:1530
#: mpdevil:1572
msgid ""
"Append all titles after the currently playing track and clear the playlist "
"from all other songs"
@@ -282,259 +273,304 @@ msgstr ""
"Alle Titel hinter dem aktuellen Stück einreihen und die weitere "
"Wiedergabeliste leeren"
#: mpdevil:1665
#: mpdevil:1827
msgid "all tags"
msgstr "Alle Tags"
#: mpdevil:1689
#: mpdevil:1856
#, python-brace-format
msgid "{num} hits"
msgstr "{num} Treffer"
msgid "{hits} hit"
msgid_plural "{hits} hits"
msgstr[0] "{hits} Treffer"
msgstr[1] "{hits} Treffer"
#: mpdevil:1727
#: mpdevil:1894
msgid "all genres"
msgstr "Alle Genres"
#: mpdevil:1830
#: mpdevil:1996
msgid "all artists"
msgstr "Alle Interpreten"
#: mpdevil:1942
msgid "Close"
msgstr "Schließen"
#: mpdevil:2113
#: mpdevil:2180 mpdevil:2805 mpdevil:3091 mpdevil:3092
#, python-brace-format
msgid "{titles} titles on {discs} discs ({length})"
msgstr "{titles} Titel auf {discs} CDs ({length})"
msgid "{titles} title"
msgid_plural "{titles} titles"
msgstr[0] "{titles} Titel"
msgstr[1] "{titles} Titel"
#: mpdevil:2116 mpdevil:2728
#: mpdevil:2182
#, python-brace-format
msgid "{titles} titles ({length})"
msgstr "{titles} Titel ({length})"
msgid "on {discs} discs"
msgstr "auf {discs} CDs"
#: mpdevil:2242 mpdevil:3368
#: mpdevil:2322 mpdevil:3536
msgid "Back to current album"
msgstr "Zurück zu aktuellem Album"
#: mpdevil:2244
#: mpdevil:2324
msgid "Search"
msgstr "Suche"
#: mpdevil:2421
#: mpdevil:2500
msgid "searching..."
msgstr "suche..."
#: mpdevil:2426
#: mpdevil:2505
msgid "connection error"
msgstr "Verbindungsfehler"
#: mpdevil:2428
#: mpdevil:2507
msgid "lyrics not found"
msgstr "Liedtext nicht gefunden"
#: mpdevil:2476
#: mpdevil:2552
#, python-brace-format
msgid ""
"{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, "
"{file_type}"
msgstr ""
"{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} Kanäle, "
"{file_type}"
msgid "{channels} channel"
msgid_plural "{channels} channels"
msgstr[0] "{channels} Kanal"
msgstr[1] "{channels} Kanäle"
#: mpdevil:2606
#: mpdevil:2680
msgid "Scroll to current song"
msgstr "Gehe zu aktuellem Lied"
#: mpdevil:2614 mpdevil:3384
#: mpdevil:2688 mpdevil:3552
msgid "Clear playlist"
msgstr "Wiedergabeliste leeren"
#: mpdevil:2883
#: mpdevil:2982
msgid "Show lyrics"
msgstr "Zeige Liedtext"
#: mpdevil:3161
#: mpdevil:3300
msgid "Random mode"
msgstr "Zufallsmodus"
#: mpdevil:3163
#: mpdevil:3302
msgid "Repeat mode"
msgstr "Dauerschleife"
#: mpdevil:3165
#: mpdevil:3304
msgid "Single mode"
msgstr "Einzelstückmodus"
#: mpdevil:3167
#: mpdevil:3306
msgid "Consume mode"
msgstr "Wiedergabeliste verbrauchen"
#: mpdevil:3346
#: mpdevil:3514
msgid "Window"
msgstr "Fenster"
#: mpdevil:3347
#: mpdevil:3515
msgid "Playback"
msgstr "Wiedergabe"
#: mpdevil:3348
#: mpdevil:3516
msgid "Search, Album Dialog and Album List"
msgstr "Suche, Albumdialog und Albumliste"
#: mpdevil:3358
#: mpdevil:3526
msgid "Open online help"
msgstr "Onlinehilfe öffnen"
#: mpdevil:3359
#: mpdevil:3527
msgid "Open shortcuts window"
msgstr "Tastenkürzelfenster öffnen"
#: mpdevil:3360
#: mpdevil:3528
msgid "Open menu"
msgstr "Menü öffnen"
#: mpdevil:3361 mpdevil:3504
#: mpdevil:3529 mpdevil:3672
msgid "Update database"
msgstr "Datenbank aktualisieren"
#: mpdevil:3362 mpdevil:3502
#: mpdevil:3530 mpdevil:3670
msgid "Quit"
msgstr "Beenden"
#: mpdevil:3363
#: mpdevil:3531
msgid "Cycle through profiles"
msgstr "Profile durchschalten"
#: mpdevil:3364
#: mpdevil:3532
msgid "Cycle through profiles in reversed order"
msgstr "Profile rückwärts durchschalten"
#: mpdevil:3365
#: mpdevil:3533
msgid "Toggle mini player"
msgstr "Miniplayer ein-/ausschalten"
#: mpdevil:3366
#: mpdevil:3534
msgid "Toggle lyrics"
msgstr "Liedtext ein-/ausblenden"
#: mpdevil:3367
#: mpdevil:3535
msgid "Toggle search"
msgstr "Suche ein-/ausblenden"
#: mpdevil:3369
#: mpdevil:3537
msgid "Play/Pause"
msgstr "Wiedergabe/Pause"
#: mpdevil:3370
#: mpdevil:3538
msgid "Stop"
msgstr "Stopp"
#: mpdevil:3371
#: mpdevil:3539
msgid "Next title"
msgstr "Nächster Titel"
#: mpdevil:3372
#: mpdevil:3540
msgid "Previous title"
msgstr "Vorheriger Titel"
#: mpdevil:3373
#: mpdevil:3541
msgid "Seek forward"
msgstr "Vorspulen"
#: mpdevil:3374
#: mpdevil:3542
msgid "Seek backward"
msgstr "Zurückspulen"
#: mpdevil:3375
#: mpdevil:3543
msgid "Toggle repeat mode"
msgstr "Dauerschleife ein-/ausschalten"
#: mpdevil:3376
#: mpdevil:3544
msgid "Toggle random mode"
msgstr "Zufallsmodus ein-/ausschalten"
#: mpdevil:3377
#: mpdevil:3545
msgid "Toggle single mode"
msgstr "Einzelstückmodus ein-/ausschalten"
#: mpdevil:3378
#: mpdevil:3546
msgid "Toggle consume mode"
msgstr "Wiedergabeliste verbrauchen ein-/ausschalten"
#: mpdevil:3379
#: mpdevil:3547
msgid "Play selected item (next)"
msgstr "Ausgewähltes Element (als Nächstes) abspielen"
#: mpdevil:3379
#: mpdevil:3547
msgid "Left-click"
msgstr "Linksklick"
#: mpdevil:3380
#: mpdevil:3548
msgid "Append selected item"
msgstr "Ausgewähltes Element anhängen"
#: mpdevil:3380 mpdevil:3383
#: mpdevil:3548 mpdevil:3551
msgid "Middle-click"
msgstr "Mittelklick"
#: mpdevil:3381
#: mpdevil:3549
msgid "Play selected item immediately"
msgstr "Ausgewähltes Element sofort abspielen"
#: mpdevil:3381
#: mpdevil:3549
msgid "Double-click"
msgstr "Doppelklick"
#: mpdevil:3382 mpdevil:3385
#: mpdevil:3550 mpdevil:3553
msgid "Show additional information"
msgstr "Zeige weitere Informationen"
#: mpdevil:3382 mpdevil:3385
#: mpdevil:3550 mpdevil:3553
msgid "Right-click"
msgstr "Rechtsklick"
#: mpdevil:3383
#: mpdevil:3551
msgid "Remove selected song"
msgstr "Ausgewählten Titel entfernen"
#: mpdevil:3427
#: mpdevil:3577
msgid "Connect"
msgstr "Verbinden"
#: mpdevil:3595
#, python-brace-format
msgid "Connection to “{profile}” ({host}:{port}) failed"
msgstr "Verbindung zu „{profile}“ ({host}:{port}) fehlgeschlagen"
#: mpdevil:3499
#: mpdevil:3667
msgid "Keyboard shortcuts"
msgstr "Tastenkürzel"
#: mpdevil:3500
#: mpdevil:3668
msgid "Help"
msgstr "Hilfe"
#: mpdevil:3501
#: mpdevil:3669
msgid "About"
msgstr "Über"
#: mpdevil:3505
#: mpdevil:3673
msgid "Server stats"
msgstr "Serverstatistik"
#: mpdevil:3510
#: mpdevil:3678
msgid "Mini player"
msgstr "Miniplayer"
#: mpdevil:3511
msgid "Save window layout"
msgstr "Fensterlayout speichern"
#: mpdevil:3516
#: mpdevil:3683
msgid "Menu"
msgstr "Menü"
#: mpdevil:3566 mpdevil:3568
#: mpdevil:3734 mpdevil:3736
msgid "connecting…"
msgstr "verbinden…"
#~ msgid "Sort albums in chronological order"
#~ msgstr "Alben chronologisch sortieren"
#~ msgid "name"
#~ msgstr "Name"
#~ msgid "year"
#~ msgstr "Jahr"
#~ msgid "Position of playlist:"
#~ msgstr "Wiedergabelistenposition:"
#~ msgid "bottom"
#~ msgstr "unten"
#~ msgid "right"
#~ msgstr "rechts"
#~ msgid "Show tooltips in album view"
#~ msgstr "Zeige Tooltips in Albumliste"
#~ msgid "Save window layout"
#~ msgstr "Fensterlayout speichern"
#, python-brace-format
#~ msgid ""
#~ "{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, "
#~ "{file_type}"
#~ msgstr ""
#~ "{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} Kanäle, "
#~ "{file_type}"
#, python-brace-format
#~ msgid "{titles} titles on {discs} discs ({length})"
#~ msgstr "{titles} Titel auf {discs} CDs ({length})"
#, python-brace-format
#~ msgid "{titles} titles ({length})"
#~ msgstr "{titles} Titel ({length})"
#, python-brace-format
#~ msgid "{num} hits"
#~ msgstr "{num} Treffer"
#~ msgid "Close"
#~ msgstr "Schließen"
#~ msgid "Album Artist"
#~ msgstr "Albuminterpret"
@@ -555,10 +591,6 @@ msgstr "verbinden…"
#~ msgid "not connected"
#~ msgstr "nicht verbunden"
#, python-format
#~ msgid "hits: %i"
#~ msgstr "Treffer: %i"
#~ msgid "Add"
#~ msgstr "Hinzufügen"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-20 18:10+0200\n"
"POT-Creation-Date: 2021-02-12 16:57+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"
@@ -16,511 +16,503 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: mpdevil:419
#: mpdevil:438
#, python-brace-format
msgid "{days} day"
msgid_plural "{days} days"
msgstr[0] ""
msgstr[1] ""
#: mpdevil:473
msgid "Unknown Title"
msgstr ""
#: mpdevil:719
#: mpdevil:802
msgid "Main cover size:"
msgstr ""
#: mpdevil:720
#: mpdevil:803
msgid "Album view cover size:"
msgstr ""
#: mpdevil:721
#: mpdevil:804
msgid "Action bar icon size:"
msgstr ""
#: mpdevil:722
#: mpdevil:805
msgid "Secondary icon size:"
msgstr ""
#: mpdevil:735
msgid "Sort albums by:"
msgstr ""
#: mpdevil:735
msgid "name"
msgstr ""
#: mpdevil:735
msgid "year"
msgstr ""
#: mpdevil:736
msgid "Position of playlist:"
msgstr ""
#: mpdevil:736
msgid "bottom"
msgstr ""
#: mpdevil:736
msgid "right"
msgstr ""
#: mpdevil:754
#: mpdevil:818
msgid "Use Client-side decoration"
msgstr ""
#: mpdevil:755
#: mpdevil:819
msgid "Show stop button"
msgstr ""
#: mpdevil:756
#: mpdevil:820
msgid "Show lyrics button"
msgstr ""
#: mpdevil:757
#: mpdevil:821
msgid "Show initials in artist view"
msgstr ""
#: mpdevil:758
msgid "Show tooltips in album view"
#: mpdevil:822
msgid "Place playlist at the side"
msgstr ""
#: mpdevil:759
#: mpdevil:823
msgid "Use “Album Artist” tag"
msgstr ""
#: mpdevil:760
#: mpdevil:824
msgid "Send notification on title change"
msgstr ""
#: mpdevil:761
#: mpdevil:825
msgid "Stop playback on quit"
msgstr ""
#: mpdevil:762
#: mpdevil:826
msgid "Play selected albums and titles immediately"
msgstr ""
#: mpdevil:775
#: mpdevil:827
msgid "Sort albums by year"
msgstr ""
#: mpdevil:839
msgid "<b>View</b>"
msgstr ""
#: mpdevil:776
#: mpdevil:840
msgid "<b>Behavior</b>"
msgstr ""
#: mpdevil:808
#: mpdevil:860
msgid "(restart required)"
msgstr ""
#: mpdevil:870 mpdevil:3409
msgid "Connect"
#: mpdevil:909
msgid "_Connect"
msgstr ""
#: mpdevil:886
#: mpdevil:925
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:891
#: mpdevil:930
msgid "Profile:"
msgstr ""
#: mpdevil:892
#: mpdevil:931
msgid "Name:"
msgstr ""
#: mpdevil:893
#: mpdevil:932
msgid "Host:"
msgstr ""
#: mpdevil:894
#: mpdevil:933
msgid "Password:"
msgstr ""
#: mpdevil:895
#: mpdevil:934
msgid "Music lib:"
msgstr ""
#: mpdevil:896
#: mpdevil:935
msgid "Cover regex:"
msgstr ""
#: mpdevil:1029
#: mpdevil:1070
msgid "Choose directory"
msgstr ""
#: mpdevil:1065
#: mpdevil:1101
msgid "Choose the order of information to appear in the playlist:"
msgstr ""
#: mpdevil:1082 mpdevil:1604 mpdevil:1930 mpdevil:2633
#: mpdevil:1118 mpdevil:1671 mpdevil:1766 mpdevil:2706
msgid "No"
msgstr ""
#: mpdevil:1082 mpdevil:2634
#: mpdevil:1118 mpdevil:2707
msgid "Disc"
msgstr ""
#: mpdevil:1082 mpdevil:1609 mpdevil:1933 mpdevil:2635
#: mpdevil:1118 mpdevil:1674 mpdevil:1771 mpdevil:2708
msgid "Title"
msgstr ""
#: mpdevil:1082 mpdevil:1615 mpdevil:2636
#: mpdevil:1118 mpdevil:1777 mpdevil:2709
msgid "Artist"
msgstr ""
#: mpdevil:1082 mpdevil:1621 mpdevil:2637
#: mpdevil:1118 mpdevil:1783 mpdevil:2710
msgid "Album"
msgstr ""
#: mpdevil:1082 mpdevil:1627 mpdevil:1937 mpdevil:2638
#: mpdevil:1118 mpdevil:1678 mpdevil:1789 mpdevil:2711
msgid "Length"
msgstr ""
#: mpdevil:1082 mpdevil:2639
#: mpdevil:1118 mpdevil:2712
msgid "Year"
msgstr ""
#: mpdevil:1082 mpdevil:2640
#: mpdevil:1118 mpdevil:2713
msgid "Genre"
msgstr ""
#: mpdevil:1198 mpdevil:1200 mpdevil:3498
#: mpdevil:1234 mpdevil:1236 mpdevil:3666
msgid "Settings"
msgstr ""
#: mpdevil:1213 mpdevil:1222 mpdevil:3345
#: mpdevil:1249 mpdevil:1258 mpdevil:3513
msgid "General"
msgstr ""
#: mpdevil:1214 mpdevil:1223 mpdevil:3509
#: mpdevil:1250 mpdevil:1259 mpdevil:3677
msgid "Profiles"
msgstr ""
#: mpdevil:1215 mpdevil:1224 mpdevil:3349
#: mpdevil:1251 mpdevil:1260 mpdevil:3517
msgid "Playlist"
msgstr ""
#: mpdevil:1238
#: mpdevil:1273
msgid "Stats"
msgstr ""
#: mpdevil:1248
#: mpdevil:1283
msgid "<b>Protocol:</b>"
msgstr ""
#: mpdevil:1249
#: mpdevil:1284
msgid "<b>Uptime:</b>"
msgstr ""
#: mpdevil:1250
#: mpdevil:1285
msgid "<b>Playtime:</b>"
msgstr ""
#: mpdevil:1251
#: mpdevil:1286
msgid "<b>Artists:</b>"
msgstr ""
#: mpdevil:1252
#: mpdevil:1287
msgid "<b>Albums:</b>"
msgstr ""
#: mpdevil:1253
#: mpdevil:1288
msgid "<b>Songs:</b>"
msgstr ""
#: mpdevil:1254
#: mpdevil:1289
msgid "<b>Total Playtime:</b>"
msgstr ""
#: mpdevil:1255
#: mpdevil:1290
msgid "<b>Database Update:</b>"
msgstr ""
#: mpdevil:1280
#: mpdevil:1314
msgid "A simple music browser for MPD"
msgstr ""
#: mpdevil:1360
#: mpdevil:1412
msgid "Open with…"
msgstr ""
#: mpdevil:1430
msgid "MPD-Tag"
msgstr ""
#: mpdevil:1363
#: mpdevil:1433
msgid "Value"
msgstr ""
#: mpdevil:1522
#: mpdevil:1564
msgid "_Append"
msgstr ""
#: mpdevil:1524
#: mpdevil:1566
msgid "Add all titles to playlist"
msgstr ""
#: mpdevil:1525
#: mpdevil:1567
msgid "_Play"
msgstr ""
#: mpdevil:1527
#: mpdevil:1569
msgid "Directly play all titles"
msgstr ""
#: mpdevil:1528
#: mpdevil:1570
msgid "_Enqueue"
msgstr ""
#: mpdevil:1530
#: mpdevil:1572
msgid ""
"Append all titles after the currently playing track and clear the playlist "
"from all other songs"
msgstr ""
#: mpdevil:1665
#: mpdevil:1827
msgid "all tags"
msgstr ""
#: mpdevil:1689
#: mpdevil:1856
#, python-brace-format
msgid "{num} hits"
msgstr ""
msgid "{hits} hit"
msgid_plural "{hits} hits"
msgstr[0] ""
msgstr[1] ""
#: mpdevil:1727
#: mpdevil:1894
msgid "all genres"
msgstr ""
#: mpdevil:1830
#: mpdevil:1996
msgid "all artists"
msgstr ""
#: mpdevil:1942
msgid "Close"
msgstr ""
#: mpdevil:2113
#: mpdevil:2180 mpdevil:2805 mpdevil:3091 mpdevil:3092
#, python-brace-format
msgid "{titles} titles on {discs} discs ({length})"
msgstr ""
msgid "{titles} title"
msgid_plural "{titles} titles"
msgstr[0] ""
msgstr[1] ""
#: mpdevil:2116 mpdevil:2728
#: mpdevil:2182
#, python-brace-format
msgid "{titles} titles ({length})"
msgid "on {discs} discs"
msgstr ""
#: mpdevil:2242 mpdevil:3368
#: mpdevil:2322 mpdevil:3536
msgid "Back to current album"
msgstr ""
#: mpdevil:2244
#: mpdevil:2324
msgid "Search"
msgstr ""
#: mpdevil:2421
#: mpdevil:2500
msgid "searching..."
msgstr ""
#: mpdevil:2426
#: mpdevil:2505
msgid "connection error"
msgstr ""
#: mpdevil:2428
#: mpdevil:2507
msgid "lyrics not found"
msgstr ""
#: mpdevil:2476
#: mpdevil:2552
#, python-brace-format
msgid ""
"{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, "
"{file_type}"
msgstr ""
msgid "{channels} channel"
msgid_plural "{channels} channels"
msgstr[0] ""
msgstr[1] ""
#: mpdevil:2606
#: mpdevil:2680
msgid "Scroll to current song"
msgstr ""
#: mpdevil:2614 mpdevil:3384
#: mpdevil:2688 mpdevil:3552
msgid "Clear playlist"
msgstr ""
#: mpdevil:2883
#: mpdevil:2982
msgid "Show lyrics"
msgstr ""
#: mpdevil:3161
#: mpdevil:3300
msgid "Random mode"
msgstr ""
#: mpdevil:3163
#: mpdevil:3302
msgid "Repeat mode"
msgstr ""
#: mpdevil:3165
#: mpdevil:3304
msgid "Single mode"
msgstr ""
#: mpdevil:3167
#: mpdevil:3306
msgid "Consume mode"
msgstr ""
#: mpdevil:3346
#: mpdevil:3514
msgid "Window"
msgstr ""
#: mpdevil:3347
#: mpdevil:3515
msgid "Playback"
msgstr ""
#: mpdevil:3348
#: mpdevil:3516
msgid "Search, Album Dialog and Album List"
msgstr ""
#: mpdevil:3358
#: mpdevil:3526
msgid "Open online help"
msgstr ""
#: mpdevil:3359
#: mpdevil:3527
msgid "Open shortcuts window"
msgstr ""
#: mpdevil:3360
#: mpdevil:3528
msgid "Open menu"
msgstr ""
#: mpdevil:3361 mpdevil:3504
#: mpdevil:3529 mpdevil:3672
msgid "Update database"
msgstr ""
#: mpdevil:3362 mpdevil:3502
#: mpdevil:3530 mpdevil:3670
msgid "Quit"
msgstr ""
#: mpdevil:3363
#: mpdevil:3531
msgid "Cycle through profiles"
msgstr ""
#: mpdevil:3364
#: mpdevil:3532
msgid "Cycle through profiles in reversed order"
msgstr ""
#: mpdevil:3365
#: mpdevil:3533
msgid "Toggle mini player"
msgstr ""
#: mpdevil:3366
#: mpdevil:3534
msgid "Toggle lyrics"
msgstr ""
#: mpdevil:3367
#: mpdevil:3535
msgid "Toggle search"
msgstr ""
#: mpdevil:3369
#: mpdevil:3537
msgid "Play/Pause"
msgstr ""
#: mpdevil:3370
#: mpdevil:3538
msgid "Stop"
msgstr ""
#: mpdevil:3371
#: mpdevil:3539
msgid "Next title"
msgstr ""
#: mpdevil:3372
#: mpdevil:3540
msgid "Previous title"
msgstr ""
#: mpdevil:3373
#: mpdevil:3541
msgid "Seek forward"
msgstr ""
#: mpdevil:3374
#: mpdevil:3542
msgid "Seek backward"
msgstr ""
#: mpdevil:3375
#: mpdevil:3543
msgid "Toggle repeat mode"
msgstr ""
#: mpdevil:3376
#: mpdevil:3544
msgid "Toggle random mode"
msgstr ""
#: mpdevil:3377
#: mpdevil:3545
msgid "Toggle single mode"
msgstr ""
#: mpdevil:3378
#: mpdevil:3546
msgid "Toggle consume mode"
msgstr ""
#: mpdevil:3379
#: mpdevil:3547
msgid "Play selected item (next)"
msgstr ""
#: mpdevil:3379
#: mpdevil:3547
msgid "Left-click"
msgstr ""
#: mpdevil:3380
#: mpdevil:3548
msgid "Append selected item"
msgstr ""
#: mpdevil:3380 mpdevil:3383
#: mpdevil:3548 mpdevil:3551
msgid "Middle-click"
msgstr ""
#: mpdevil:3381
#: mpdevil:3549
msgid "Play selected item immediately"
msgstr ""
#: mpdevil:3381
#: mpdevil:3549
msgid "Double-click"
msgstr ""
#: mpdevil:3382 mpdevil:3385
#: mpdevil:3550 mpdevil:3553
msgid "Show additional information"
msgstr ""
#: mpdevil:3382 mpdevil:3385
#: mpdevil:3550 mpdevil:3553
msgid "Right-click"
msgstr ""
#: mpdevil:3383
#: mpdevil:3551
msgid "Remove selected song"
msgstr ""
#: mpdevil:3427
#: mpdevil:3577
msgid "Connect"
msgstr ""
#: mpdevil:3595
#, python-brace-format
msgid "Connection to “{profile}” ({host}:{port}) failed"
msgstr ""
#: mpdevil:3499
#: mpdevil:3667
msgid "Keyboard shortcuts"
msgstr ""
#: mpdevil:3500
#: mpdevil:3668
msgid "Help"
msgstr ""
#: mpdevil:3501
#: mpdevil:3669
msgid "About"
msgstr ""
#: mpdevil:3505
#: mpdevil:3673
msgid "Server stats"
msgstr ""
#: mpdevil:3510
#: mpdevil:3678
msgid "Mini player"
msgstr ""
#: mpdevil:3511
msgid "Save window layout"
msgstr ""
#: mpdevil:3516
#: mpdevil:3683
msgid "Menu"
msgstr ""
#: mpdevil:3566 mpdevil:3568
#: mpdevil:3734 mpdevil:3736
msgid "connecting…"
msgstr ""

360
po/nl.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-20 18:10+0200\n"
"PO-Revision-Date: 2020-11-03 16:53+0100\n"
"POT-Creation-Date: 2021-02-12 16:57+0100\n"
"PO-Revision-Date: 2021-02-12 16:59+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: nl\n"
@@ -18,103 +18,90 @@ msgstr ""
"X-Generator: Poedit 2.3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: mpdevil:419
#: mpdevil:438
#, python-brace-format
msgid "{days} day"
msgid_plural "{days} days"
msgstr[0] "{days} dag"
msgstr[1] "{days} dagen"
#: mpdevil:473
msgid "Unknown Title"
msgstr "Onbekende titel"
#: mpdevil:719
#: mpdevil:802
msgid "Main cover size:"
msgstr "Grootte albumhoes:"
#: mpdevil:720
#: mpdevil:803
msgid "Album view cover size:"
msgstr "Hoesgrootte in albumlijst:"
#: mpdevil:721
#: mpdevil:804
msgid "Action bar icon size:"
msgstr "Grootte iconen werkbalk:"
#: mpdevil:722
#: mpdevil:805
msgid "Secondary icon size:"
msgstr "Grootte overige iconen:"
#: mpdevil:735
msgid "Sort albums by:"
msgstr "Albums sorteren op:"
#: mpdevil:735
msgid "name"
msgstr "naam"
#: mpdevil:735
msgid "year"
msgstr "jaar"
#: mpdevil:736
msgid "Position of playlist:"
msgstr "Positie afspeellijst:"
#: mpdevil:736
msgid "bottom"
msgstr "onder"
#: mpdevil:736
msgid "right"
msgstr "rechts"
#: mpdevil:754
#: mpdevil:818
msgid "Use Client-side decoration"
msgstr "Gebruik vensterdecoratie van mpdevil"
#: mpdevil:755
#: mpdevil:819
msgid "Show stop button"
msgstr "Toon stopknop"
#: mpdevil:756
#: mpdevil:820
msgid "Show lyrics button"
msgstr "Toon songtekstknop"
#: mpdevil:757
#: mpdevil:821
msgid "Show initials in artist view"
msgstr "Toon beginletters in artiestenlijst"
#: mpdevil:758
msgid "Show tooltips in album view"
msgstr "Toon tooltip in albumlijst"
#: mpdevil:822
msgid "Place playlist at the side"
msgstr "Plaats afspeellijst aan de zijkant"
#: mpdevil:759
#: mpdevil:823
msgid "Use “Album Artist” tag"
msgstr "Gebruik tag \"Album Artist\""
#: mpdevil:760
#: mpdevil:824
msgid "Send notification on title change"
msgstr "Verstuur een melding bij titelwisseling"
#: mpdevil:761
#: mpdevil:825
msgid "Stop playback on quit"
msgstr "Stop afspelen bij afsluiten"
#: mpdevil:762
#: mpdevil:826
msgid "Play selected albums and titles immediately"
msgstr "Geselecteerde albums en titels direct afspelen"
#: mpdevil:775
#: mpdevil:827
msgid "Sort albums by year"
msgstr "Sorteer albums op jaar"
#: mpdevil:839
msgid "<b>View</b>"
msgstr "<b>Beeld</b>"
#: mpdevil:776
#: mpdevil:840
msgid "<b>Behavior</b>"
msgstr "<b>Gedrag</b>"
#: mpdevil:808
#: mpdevil:860
msgid "(restart required)"
msgstr "(herstart vereist)"
#: mpdevil:870 mpdevil:3409
msgid "Connect"
msgstr "Verbinden"
#: mpdevil:909
msgid "_Connect"
msgstr "_Verbinden"
#: mpdevil:886
#: mpdevil:925
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 "
@@ -124,155 +111,159 @@ msgstr ""
"met deze regex wordt getoond. %AlbumArtist% en %Album% worden vervangen door "
"de bijbehorende tags van het muziekbestand."
#: mpdevil:891
#: mpdevil:930
msgid "Profile:"
msgstr "Profiel:"
#: mpdevil:892
#: mpdevil:931
msgid "Name:"
msgstr "Naam:"
#: mpdevil:893
#: mpdevil:932
msgid "Host:"
msgstr "Host:"
#: mpdevil:894
#: mpdevil:933
msgid "Password:"
msgstr "Wachtwoord:"
#: mpdevil:895
#: mpdevil:934
msgid "Music lib:"
msgstr "Muziekmap:"
#: mpdevil:896
#: mpdevil:935
msgid "Cover regex:"
msgstr "Regex albumhoes:"
#: mpdevil:1029
#: mpdevil:1070
msgid "Choose directory"
msgstr "Kies een map"
#: mpdevil:1065
#: mpdevil:1101
msgid "Choose the order of information to appear in the playlist:"
msgstr "Kies de volgorde van de informatie getoond in de afspeellijst:"
#: mpdevil:1082 mpdevil:1604 mpdevil:1930 mpdevil:2633
#: mpdevil:1118 mpdevil:1671 mpdevil:1766 mpdevil:2706
msgid "No"
msgstr "Nr"
#: mpdevil:1082 mpdevil:2634
#: mpdevil:1118 mpdevil:2707
msgid "Disc"
msgstr "Disc"
#: mpdevil:1082 mpdevil:1609 mpdevil:1933 mpdevil:2635
#: mpdevil:1118 mpdevil:1674 mpdevil:1771 mpdevil:2708
msgid "Title"
msgstr "Titel"
#: mpdevil:1082 mpdevil:1615 mpdevil:2636
#: mpdevil:1118 mpdevil:1777 mpdevil:2709
msgid "Artist"
msgstr "Artiest"
#: mpdevil:1082 mpdevil:1621 mpdevil:2637
#: mpdevil:1118 mpdevil:1783 mpdevil:2710
msgid "Album"
msgstr "Album"
#: mpdevil:1082 mpdevil:1627 mpdevil:1937 mpdevil:2638
#: mpdevil:1118 mpdevil:1678 mpdevil:1789 mpdevil:2711
msgid "Length"
msgstr "Lengte"
#: mpdevil:1082 mpdevil:2639
#: mpdevil:1118 mpdevil:2712
msgid "Year"
msgstr "Jaar"
#: mpdevil:1082 mpdevil:2640
#: mpdevil:1118 mpdevil:2713
msgid "Genre"
msgstr "Genre"
#: mpdevil:1198 mpdevil:1200 mpdevil:3498
#: mpdevil:1234 mpdevil:1236 mpdevil:3666
msgid "Settings"
msgstr "Instellingen"
#: mpdevil:1213 mpdevil:1222 mpdevil:3345
#: mpdevil:1249 mpdevil:1258 mpdevil:3513
msgid "General"
msgstr "Algemeen"
#: mpdevil:1214 mpdevil:1223 mpdevil:3509
#: mpdevil:1250 mpdevil:1259 mpdevil:3677
msgid "Profiles"
msgstr "Profielen"
#: mpdevil:1215 mpdevil:1224 mpdevil:3349
#: mpdevil:1251 mpdevil:1260 mpdevil:3517
msgid "Playlist"
msgstr "Afspeellijst"
#: mpdevil:1238
#: mpdevil:1273
msgid "Stats"
msgstr "Statistieken"
#: mpdevil:1248
#: mpdevil:1283
msgid "<b>Protocol:</b>"
msgstr "<b>Protocol:</b>"
#: mpdevil:1249
#: mpdevil:1284
msgid "<b>Uptime:</b>"
msgstr "<b>Uptime:</b>"
#: mpdevil:1250
#: mpdevil:1285
msgid "<b>Playtime:</b>"
msgstr "<b>Afspeeltijd:</b>"
#: mpdevil:1251
#: mpdevil:1286
msgid "<b>Artists:</b>"
msgstr "<b>Artiesten:</b>"
#: mpdevil:1252
#: mpdevil:1287
msgid "<b>Albums:</b>"
msgstr "<b>Albums:</b>"
#: mpdevil:1253
#: mpdevil:1288
msgid "<b>Songs:</b>"
msgstr "<b>Titels:</b>"
#: mpdevil:1254
#: mpdevil:1289
msgid "<b>Total Playtime:</b>"
msgstr "<b>Totale speelduur:</b>"
#: mpdevil:1255
#: mpdevil:1290
msgid "<b>Database Update:</b>"
msgstr "<b>Database bijgewerkt:</b>"
#: mpdevil:1280
#: mpdevil:1314
msgid "A simple music browser for MPD"
msgstr "Een simpele muziekspeler voor MPD"
#: mpdevil:1360
#: mpdevil:1412
msgid "Open with…"
msgstr "Openen met…"
#: mpdevil:1430
msgid "MPD-Tag"
msgstr "MPD-Tag"
#: mpdevil:1363
#: mpdevil:1433
msgid "Value"
msgstr "Waarde"
#: mpdevil:1522
#: mpdevil:1564
msgid "_Append"
msgstr "_Toevoegen"
#: mpdevil:1524
#: mpdevil:1566
msgid "Add all titles to playlist"
msgstr "Voeg alle titels toe aan de afspeellijst"
#: mpdevil:1525
#: mpdevil:1567
msgid "_Play"
msgstr "_Afspelen"
#: mpdevil:1527
#: mpdevil:1569
msgid "Directly play all titles"
msgstr "Alle titels direct afspelen"
#: mpdevil:1528
#: mpdevil:1570
msgid "_Enqueue"
msgstr "_In wachtrij plaatsen"
#: mpdevil:1530
#: mpdevil:1572
msgid ""
"Append all titles after the currently playing track and clear the playlist "
"from all other songs"
@@ -280,255 +271,292 @@ msgstr ""
"Alle titels toevoegen na de nu spelende titel en alle overige titels uit de "
"afspeellijst verwijderen"
#: mpdevil:1665
#: mpdevil:1827
msgid "all tags"
msgstr "alle tags"
#: mpdevil:1689
#: mpdevil:1856
#, python-brace-format
msgid "{num} hits"
msgstr "{num} hits"
msgid "{hits} hit"
msgid_plural "{hits} hits"
msgstr[0] "{hits} hit"
msgstr[1] "{hits} treffers"
#: mpdevil:1727
#: mpdevil:1894
msgid "all genres"
msgstr "alle genres"
#: mpdevil:1830
#: mpdevil:1996
msgid "all artists"
msgstr "alle artiesten"
#: mpdevil:1942
msgid "Close"
msgstr "Afsluiten"
#: mpdevil:2113
#: mpdevil:2180 mpdevil:2805 mpdevil:3091 mpdevil:3092
#, python-brace-format
msgid "{titles} titles on {discs} discs ({length})"
msgstr "{titles} titels op {discs} discs ({length})"
msgid "{titles} title"
msgid_plural "{titles} titles"
msgstr[0] "{titles} titel"
msgstr[1] "{titles} titels"
#: mpdevil:2116 mpdevil:2728
#: mpdevil:2182
#, python-brace-format
msgid "{titles} titles ({length})"
msgstr "{titles} titels ({length})"
msgid "on {discs} discs"
msgstr "op {discs} discs"
#: mpdevil:2242 mpdevil:3368
#: mpdevil:2322 mpdevil:3536
msgid "Back to current album"
msgstr "Terug naar huidige album"
#: mpdevil:2244
#: mpdevil:2324
msgid "Search"
msgstr "Zoeken"
#: mpdevil:2421
#: mpdevil:2500
msgid "searching..."
msgstr "bezig met zoeken..."
#: mpdevil:2426
#: mpdevil:2505
msgid "connection error"
msgstr "verbindingsfout"
#: mpdevil:2428
#: mpdevil:2507
msgid "lyrics not found"
msgstr "geen songtekst gevonden"
#: mpdevil:2476
#: mpdevil:2552
#, python-brace-format
msgid ""
"{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, "
"{file_type}"
msgstr ""
"{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} kanalen, "
"{file_type}"
msgid "{channels} channel"
msgid_plural "{channels} channels"
msgstr[0] "{channels} kanaal"
msgstr[1] "{channels} kanalen"
#: mpdevil:2606
#: mpdevil:2680
msgid "Scroll to current song"
msgstr "Naar de huidige titel scrollen"
#: mpdevil:2614 mpdevil:3384
#: mpdevil:2688 mpdevil:3552
msgid "Clear playlist"
msgstr "Afspeellijst legen"
#: mpdevil:2883
#: mpdevil:2982
msgid "Show lyrics"
msgstr "Toon songtekst"
#: mpdevil:3161
#: mpdevil:3300
msgid "Random mode"
msgstr "Willekeurige modus"
#: mpdevil:3163
#: mpdevil:3302
msgid "Repeat mode"
msgstr "Herhaalmodus"
#: mpdevil:3165
#: mpdevil:3304
msgid "Single mode"
msgstr "Enkele modus"
#: mpdevil:3167
#: mpdevil:3306
msgid "Consume mode"
msgstr "Verbruiksmodus"
#: mpdevil:3346
#: mpdevil:3514
msgid "Window"
msgstr "Venster"
#: mpdevil:3347
#: mpdevil:3515
msgid "Playback"
msgstr "Afspelen"
#: mpdevil:3348
#: mpdevil:3516
msgid "Search, Album Dialog and Album List"
msgstr "Zoeken, Albumdialoog en Albumlijst"
#: mpdevil:3358
#: mpdevil:3526
msgid "Open online help"
msgstr "Online hulp openen"
#: mpdevil:3359
#: mpdevil:3527
msgid "Open shortcuts window"
msgstr "Venster met sneltoetsen openen"
#: mpdevil:3360
#: mpdevil:3528
msgid "Open menu"
msgstr "Menu openen"
#: mpdevil:3361 mpdevil:3504
#: mpdevil:3529 mpdevil:3672
msgid "Update database"
msgstr "Database bijwerken"
#: mpdevil:3362 mpdevil:3502
#: mpdevil:3530 mpdevil:3670
msgid "Quit"
msgstr "Stoppen"
#: mpdevil:3363
#: mpdevil:3531
msgid "Cycle through profiles"
msgstr "Profielen doorlopen"
#: mpdevil:3364
#: mpdevil:3532
msgid "Cycle through profiles in reversed order"
msgstr "Profielen doorlopen in omgekeerde volgorde"
#: mpdevil:3365
#: mpdevil:3533
msgid "Toggle mini player"
msgstr "Omschakelen naar minispeler"
#: mpdevil:3366
#: mpdevil:3534
msgid "Toggle lyrics"
msgstr "Omschakelen naar songtekst"
#: mpdevil:3367
#: mpdevil:3535
msgid "Toggle search"
msgstr "Omschakelen naar zoeken"
#: mpdevil:3369
#: mpdevil:3537
msgid "Play/Pause"
msgstr "Afspelen/Pauzeren"
#: mpdevil:3370
#: mpdevil:3538
msgid "Stop"
msgstr "Stoppen"
#: mpdevil:3371
#: mpdevil:3539
msgid "Next title"
msgstr "Volgende titel"
#: mpdevil:3372
#: mpdevil:3540
msgid "Previous title"
msgstr "Vorige titel"
#: mpdevil:3373
#: mpdevil:3541
msgid "Seek forward"
msgstr "Vooruit spoelen"
#: mpdevil:3374
#: mpdevil:3542
msgid "Seek backward"
msgstr "Achteruit spoelen"
#: mpdevil:3375
#: mpdevil:3543
msgid "Toggle repeat mode"
msgstr "Omschakelen naar herhaalmodus"
#: mpdevil:3376
#: mpdevil:3544
msgid "Toggle random mode"
msgstr "Omschakelen naar willekeurige modus"
#: mpdevil:3377
#: mpdevil:3545
msgid "Toggle single mode"
msgstr "Omschakelen naar enkele modus"
#: mpdevil:3378
#: mpdevil:3546
msgid "Toggle consume mode"
msgstr "Omschakelen naar verbruiksmodus"
#: mpdevil:3379
#: mpdevil:3547
msgid "Play selected item (next)"
msgstr "Geselecteerde item afspelen (volgende)"
#: mpdevil:3379
#: mpdevil:3547
msgid "Left-click"
msgstr "Linksklik"
#: mpdevil:3380
#: mpdevil:3548
msgid "Append selected item"
msgstr "Geselecteerde item toevoegen"
#: mpdevil:3380 mpdevil:3383
#: mpdevil:3548 mpdevil:3551
msgid "Middle-click"
msgstr "Middelklik"
#: mpdevil:3381
#: mpdevil:3549
msgid "Play selected item immediately"
msgstr "Geselecteerde item direct afspelen"
#: mpdevil:3381
#: mpdevil:3549
msgid "Double-click"
msgstr "Dubbelklik"
#: mpdevil:3382 mpdevil:3385
#: mpdevil:3550 mpdevil:3553
msgid "Show additional information"
msgstr "Toon extra informatie"
#: mpdevil:3382 mpdevil:3385
#: mpdevil:3550 mpdevil:3553
msgid "Right-click"
msgstr "Rechtsklik"
#: mpdevil:3383
#: mpdevil:3551
msgid "Remove selected song"
msgstr "Geselecteerde titel verwijderen"
#: mpdevil:3427
#: mpdevil:3577
msgid "Connect"
msgstr "Verbinden"
#: mpdevil:3595
#, python-brace-format
msgid "Connection to “{profile}” ({host}:{port}) failed"
msgstr "Verbinding met “{profile}” ({host}:{port}) mislukt"
#: mpdevil:3499
#: mpdevil:3667
msgid "Keyboard shortcuts"
msgstr "Sneltoetsen"
#: mpdevil:3500
#: mpdevil:3668
msgid "Help"
msgstr "Hulp"
#: mpdevil:3501
#: mpdevil:3669
msgid "About"
msgstr "Over"
#: mpdevil:3505
#: mpdevil:3673
msgid "Server stats"
msgstr "Serverstatistieken"
#: mpdevil:3510
#: mpdevil:3678
msgid "Mini player"
msgstr "Minispeler"
#: mpdevil:3511
msgid "Save window layout"
msgstr "Vensterindeling opslaan"
#: mpdevil:3516
#: mpdevil:3683
msgid "Menu"
msgstr "Menu"
#: mpdevil:3566 mpdevil:3568
#: mpdevil:3734 mpdevil:3736
msgid "connecting…"
msgstr "verbinding maken…"
#~ msgid "Sort albums in chronological order"
#~ msgstr "Sorteer albums in chronologische volgorde"
#~ msgid "name"
#~ msgstr "naam"
#~ msgid "year"
#~ msgstr "jaar"
#~ msgid "Position of playlist:"
#~ msgstr "Positie afspeellijst:"
#~ msgid "bottom"
#~ msgstr "onder"
#~ msgid "right"
#~ msgstr "rechts"
#~ msgid "Show tooltips in album view"
#~ msgstr "Toon tooltip in albumlijst"
#~ msgid "Save window layout"
#~ msgstr "Vensterindeling opslaan"
#, python-brace-format
#~ msgid ""
#~ "{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, "
#~ "{file_type}"
#~ msgstr ""
#~ "{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} kanalen, "
#~ "{file_type}"
#, python-brace-format
#~ msgid "{titles} titles on {discs} discs ({length})"
#~ msgstr "{titles} titels op {discs} discs ({length})"
#~ msgid "Close"
#~ msgstr "Afsluiten"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1013 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -4,7 +4,7 @@ import DistUtilsExtra.auto
DistUtilsExtra.auto.setup(
name='mpdevil',
version='0.9.8', # sync with bin/mpdevil
version='1.1.0', # sync with bin/mpdevil
author="Martin Wagner",
author_email="martin.wagner.dev@gmail.com",
description=('A simple music browser for MPD'),
@@ -13,14 +13,17 @@ DistUtilsExtra.auto.setup(
data_files=[
('share/metainfo/', ['data/org.mpdevil.mpdevil.appdata.xml']),
('share/icons/hicolor/16x16/apps/', ['data/icons/16x16/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/22x22/apps/', ['data/icons/22x22/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/24x24/apps/', ['data/icons/24x24/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/32x32/apps/', ['data/icons/32x32/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/48x48/apps/', ['data/icons/48x48/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/64x64/apps/', ['data/icons/64x64/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/128x128/apps/', ['data/icons/128x128/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/256x256/apps/', ['data/icons/256x256/org.mpdevil.mpdevil.png']),
('share/icons/hicolor/scalable/apps/', ['data/icons/scalable/org.mpdevil.mpdevil.svg'])
('share/icons/hicolor/scalable/apps/', ['data/icons/scalable/org.mpdevil.mpdevil.svg']),
('share/icons/hicolor/scalable/apps/', ['data/icons/scalable/org.mpdevil.mpdevil-symbolic.svg']),
('share/icons/hicolor/scalable/status/', ['data/icons/scalable/org.mpdevil.mpdevil-single-symbolic.svg']),
('share/icons/hicolor/scalable/status/', ['data/icons/scalable/org.mpdevil.mpdevil-consume-symbolic.svg']),
('share/icons/hicolor/scalable/status/', ['data/icons/scalable/org.mpdevil.mpdevil-consume-symbolic-rtl.svg']),
],
)