mirror of
https://github.com/SoongNoonien/mpdevil.git
synced 2023-08-10 21:12:44 +03:00
Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
79b828511b | ||
![]() |
596bcec194 | ||
![]() |
d9e518c687 | ||
![]() |
2e5ce9bf2b | ||
![]() |
8f1678579f | ||
![]() |
6374fe1c28 | ||
![]() |
b833cb3ca2 | ||
![]() |
08ff73d797 | ||
![]() |
0c9635921d | ||
![]() |
06e690b8a3 | ||
![]() |
b167f69333 | ||
![]() |
88534a7054 | ||
![]() |
fff76e00ee | ||
![]() |
fe92ae094e |
@@ -19,7 +19,8 @@ Features
|
||||
|
||||
TODO
|
||||
----
|
||||
1. MPRIS interface
|
||||
1. Support media keys
|
||||
2. MPRIS interface
|
||||
|
||||
Building and installation
|
||||
-------------------------
|
||||
|
153
bin/mpdevil.py
153
bin/mpdevil.py
@@ -138,6 +138,8 @@ class Settings(Gio.Settings):
|
||||
BASE_KEY = "org.mpdevil"
|
||||
def __init__(self):
|
||||
super().__init__(schema=self.BASE_KEY)
|
||||
if len(self.get_value("profiles")) < (self.get_int("active-profile")+1):
|
||||
self.set_int("active-profile", 0)
|
||||
|
||||
def array_append(self, vtype, key, value): #append to Gio.Settings (self.settings) array
|
||||
array=self.get_value(key).unpack()
|
||||
@@ -297,6 +299,9 @@ class ArtistView(Gtk.ScrolledWindow):
|
||||
self.column_name.set_sort_column_id(0)
|
||||
self.treeview.append_column(self.column_name)
|
||||
|
||||
#connect
|
||||
self.treeview.connect("enter-notify-event", self.on_enter_event)
|
||||
|
||||
self.refresh()
|
||||
|
||||
self.add(self.treeview)
|
||||
@@ -329,6 +334,9 @@ class ArtistView(Gtk.ScrolledWindow):
|
||||
artists.append(selected_artist)
|
||||
return artists
|
||||
|
||||
def on_enter_event(self, widget, event):
|
||||
self.treeview.grab_focus()
|
||||
|
||||
class AlbumIconView(Gtk.IconView):
|
||||
def __init__(self, client, settings, window):
|
||||
Gtk.IconView.__init__(self)
|
||||
@@ -354,6 +362,7 @@ class AlbumIconView(Gtk.IconView):
|
||||
self.album_item_activated=self.connect("item-activated", self.on_album_item_activated)
|
||||
self.connect("button-press-event", self.on_album_view_button_press_event)
|
||||
self.settings.connect("changed::show-album-view-tooltips", self.tooltip_settings)
|
||||
self.connect("motion-notify-event", self.on_move_event)
|
||||
|
||||
def tooltip_settings(self, *args):
|
||||
if self.settings.get_boolean("show-album-view-tooltips"):
|
||||
@@ -399,11 +408,10 @@ class AlbumIconView(Gtk.IconView):
|
||||
else:
|
||||
break
|
||||
|
||||
def scroll_to_selected_album(self, first_run):
|
||||
def scroll_to_selected_album(self):
|
||||
songid=self.client.status()["songid"]
|
||||
song=self.client.playlistid(songid)[0]
|
||||
if not self.settings.get_boolean("add-album") or first_run:
|
||||
self.handler_block(self.album_change)
|
||||
self.handler_block(self.album_change)
|
||||
self.unselect_all()
|
||||
row_num=len(self.store)
|
||||
for i in range(0, row_num):
|
||||
@@ -413,8 +421,7 @@ class AlbumIconView(Gtk.IconView):
|
||||
self.select_path(path)
|
||||
self.scroll_to_path(path, True, 0, 0)
|
||||
break
|
||||
if not self.settings.get_boolean("add-album") or first_run:
|
||||
self.handler_unblock(self.album_change)
|
||||
self.handler_unblock(self.album_change)
|
||||
|
||||
def on_album_view_button_press_event(self, widget, event):
|
||||
path = widget.get_path_at_pos(int(event.x), int(event.y))
|
||||
@@ -454,6 +461,9 @@ class AlbumIconView(Gtk.IconView):
|
||||
selected_artist=self.store.get_value(treeiter, 5)
|
||||
self.client.album_to_playlist(selected_album, selected_artist, selected_album_year, False, True)
|
||||
|
||||
def on_move_event(self, widget, event):
|
||||
self.grab_focus()
|
||||
|
||||
class AlbumView(Gtk.ScrolledWindow):
|
||||
def __init__(self, client, settings, window):
|
||||
Gtk.ScrolledWindow.__init__(self)
|
||||
@@ -479,16 +489,17 @@ class AlbumView(Gtk.ScrolledWindow):
|
||||
self.iconview.show_all()
|
||||
self.iconview.populate(artists)
|
||||
|
||||
def scroll_to_selected_album(self, first_run):
|
||||
self.iconview.scroll_to_selected_album(first_run)
|
||||
def scroll_to_selected_album(self):
|
||||
self.iconview.scroll_to_selected_album()
|
||||
|
||||
class TrackView(Gtk.Box):
|
||||
def __init__(self, client, settings):
|
||||
def __init__(self, client, settings, window):
|
||||
Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL)
|
||||
self.settings = settings
|
||||
|
||||
#adding vars
|
||||
self.client=client
|
||||
self.window=window
|
||||
self.playlist=[]
|
||||
self.hovered_songpos=None
|
||||
self.song_file=None
|
||||
@@ -537,6 +548,8 @@ class TrackView(Gtk.Box):
|
||||
#cover
|
||||
self.cover=Gtk.Image.new()
|
||||
self.cover.set_from_pixbuf(Cover(client=self.client, lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=None).get_pixbuf(self.settings.get_int("track-cover"))) #set to fallback cover
|
||||
cover_event_box=Gtk.EventBox()
|
||||
cover_event_box.add(self.cover)
|
||||
|
||||
#audio infos
|
||||
audio=AudioType(self.client)
|
||||
@@ -548,6 +561,8 @@ class TrackView(Gtk.Box):
|
||||
|
||||
#status bar
|
||||
status_bar=Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
|
||||
status_bar.set_margin_start(4)
|
||||
status_bar.set_margin_end(4)
|
||||
status_bar.pack_start(self.playlist_info, True, True, 0)
|
||||
status_bar.pack_end(audio, False, False, 0)
|
||||
|
||||
@@ -560,9 +575,10 @@ class TrackView(Gtk.Box):
|
||||
self.treeview.connect("motion-notify-event", self.on_move_event)
|
||||
self.treeview.connect("leave-notify-event", self.on_leave_event)
|
||||
self.key_press_event=self.treeview.connect("key-press-event", self.on_key_press_event)
|
||||
cover_event_box.connect("button-press-event", self.on_button_press_event)
|
||||
|
||||
#packing
|
||||
self.pack_start(self.cover, False, False, 0)
|
||||
self.pack_start(cover_event_box, False, False, 0)
|
||||
self.pack_start(scroll, True, True, 0)
|
||||
self.pack_end(status_bar, False, False, 0)
|
||||
|
||||
@@ -700,9 +716,40 @@ class TrackView(Gtk.Box):
|
||||
selected_title=self.store.get_path(treeiter)
|
||||
self.client.play(selected_title)
|
||||
|
||||
def on_button_press_event(self, widget, event):
|
||||
if self.client.connected():
|
||||
song=self.client.currentsong()
|
||||
if not song == {}:
|
||||
try:
|
||||
artist=song["albumartist"]
|
||||
except:
|
||||
artist=""
|
||||
try:
|
||||
album=song["album"]
|
||||
except:
|
||||
album=""
|
||||
try:
|
||||
album_year=song["date"]
|
||||
except:
|
||||
album_year=""
|
||||
if event.button == 1:
|
||||
self.client.album_to_playlist(album, artist, album_year, False)
|
||||
elif event.button == 2:
|
||||
self.client.album_to_playlist(album, artist, album_year, True)
|
||||
elif event.button == 3:
|
||||
album_dialog = AlbumDialog(self.window, self.client, album, artist, album_year)
|
||||
response = album_dialog.run()
|
||||
if response == Gtk.ResponseType.OK:
|
||||
self.client.album_to_playlist(album, artist, album_year, False)
|
||||
elif response == Gtk.ResponseType.ACCEPT:
|
||||
self.client.album_to_playlist(album, artist, album_year, True)
|
||||
elif response == Gtk.ResponseType.YES:
|
||||
self.client.album_to_playlist(album, artist, album_year, False, True)
|
||||
album_dialog.destroy()
|
||||
|
||||
class Browser(Gtk.Box):
|
||||
def __init__(self, client, settings, window):
|
||||
Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=3)
|
||||
Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=4)
|
||||
|
||||
#adding vars
|
||||
self.client=client
|
||||
@@ -712,7 +759,7 @@ class Browser(Gtk.Box):
|
||||
#widgets
|
||||
self.artist_list=ArtistView(self.client)
|
||||
self.album_list=AlbumView(self.client, self.settings, self.window)
|
||||
self.title_list=TrackView(self.client, self.settings)
|
||||
self.title_list=TrackView(self.client, self.settings, self.window)
|
||||
|
||||
#connect
|
||||
self.artist_change=self.artist_list.selection.connect("changed", self.on_artist_selection_change)
|
||||
@@ -722,7 +769,9 @@ class Browser(Gtk.Box):
|
||||
|
||||
#packing
|
||||
self.paned1=Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
|
||||
self.paned1.set_wide_handle(True)
|
||||
self.paned2=Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
|
||||
self.paned2.set_wide_handle(True)
|
||||
self.paned1.pack1(self.artist_list, False, False)
|
||||
self.paned1.pack2(self.album_list, True, False)
|
||||
self.paned2.pack1(self.paned1, True, False)
|
||||
@@ -744,7 +793,7 @@ class Browser(Gtk.Box):
|
||||
return_val=self.artist_list.refresh()
|
||||
self.artist_list.selection.handler_unblock(self.artist_change)
|
||||
if return_val:
|
||||
self.go_home(self, first_run=True)
|
||||
self.go_home(self)
|
||||
else:
|
||||
self.artist_list.selection.handler_block(self.artist_change)
|
||||
self.artist_list.clear()
|
||||
@@ -752,7 +801,7 @@ class Browser(Gtk.Box):
|
||||
self.album_list.clear()
|
||||
return True
|
||||
|
||||
def go_home(self, widget, first_run=False): #TODO
|
||||
def go_home(self, widget): #TODO
|
||||
try:
|
||||
songid=self.client.status()["songid"]
|
||||
song=self.client.playlistid(songid)[0]
|
||||
@@ -766,7 +815,7 @@ class Browser(Gtk.Box):
|
||||
self.artist_list.selection.select_iter(treeiter)
|
||||
self.artist_list.treeview.scroll_to_cell(path)
|
||||
break
|
||||
self.album_list.scroll_to_selected_album(first_run)
|
||||
self.album_list.scroll_to_selected_album()
|
||||
except:
|
||||
pass
|
||||
self.title_list.scroll_to_selected_title()
|
||||
@@ -778,9 +827,9 @@ class Browser(Gtk.Box):
|
||||
class ProfileSettings(Gtk.Grid):
|
||||
def __init__(self, parent, settings):
|
||||
Gtk.Grid.__init__(self)
|
||||
self.set_row_spacing(3)
|
||||
self.set_column_spacing(3)
|
||||
self.set_property("border-width", 3)
|
||||
self.set_row_spacing(4)
|
||||
self.set_column_spacing(4)
|
||||
self.set_property("border-width", 4)
|
||||
|
||||
#adding vars
|
||||
self.settings = settings
|
||||
@@ -861,6 +910,7 @@ class ProfileSettings(Gtk.Grid):
|
||||
self.settings.array_append('as', "profiles", "new profile")
|
||||
self.settings.array_append('as', "hosts", "localhost")
|
||||
self.settings.array_append('ai', "ports", 6600)
|
||||
self.settings.array_append('as', "passwords", "")
|
||||
self.settings.array_append('as', "paths", "")
|
||||
self.profiles_combo_reload()
|
||||
self.profiles_combo.set_active(pos)
|
||||
@@ -870,9 +920,13 @@ class ProfileSettings(Gtk.Grid):
|
||||
self.settings.array_delete('as', "profiles", pos)
|
||||
self.settings.array_delete('as', "hosts", pos)
|
||||
self.settings.array_delete('ai', "ports", pos)
|
||||
self.settings.array_delete('as', "passwords", pos)
|
||||
self.settings.array_delete('as', "paths", pos)
|
||||
self.profiles_combo_reload()
|
||||
self.profiles_combo.set_active(0)
|
||||
if len(self.settings.get_value("profiles")) == 0:
|
||||
self.on_add_button_clicked()
|
||||
else:
|
||||
self.profiles_combo_reload()
|
||||
self.profiles_combo.set_active(0)
|
||||
|
||||
def on_profile_entry_changed(self, *args):
|
||||
pos=self.profiles_combo.get_active()
|
||||
@@ -898,6 +952,7 @@ class ProfileSettings(Gtk.Grid):
|
||||
response = dialog.run()
|
||||
if response == Gtk.ResponseType.OK:
|
||||
self.settings.array_modify('as', "paths", self.profiles_combo.get_active(), dialog.get_filename())
|
||||
self.path_select_button.set_tooltip_text(dialog.get_filename())
|
||||
dialog.destroy()
|
||||
|
||||
def on_profiles_changed(self, *args):
|
||||
@@ -921,9 +976,9 @@ class ProfileSettings(Gtk.Grid):
|
||||
class GeneralSettings(Gtk.Grid):
|
||||
def __init__(self, settings):
|
||||
Gtk.Grid.__init__(self)
|
||||
self.set_row_spacing(3)
|
||||
self.set_column_spacing(3)
|
||||
self.set_property("border-width", 3)
|
||||
self.set_row_spacing(4)
|
||||
self.set_column_spacing(4)
|
||||
self.set_property("border-width", 4)
|
||||
|
||||
#adding vars
|
||||
self.settings = settings
|
||||
@@ -1018,7 +1073,7 @@ class SettingsDialog(Gtk.Dialog):
|
||||
|
||||
class ClientControl(Gtk.ButtonBox):
|
||||
def __init__(self, client, settings):
|
||||
Gtk.ButtonBox.__init__(self, spacing=3)
|
||||
Gtk.ButtonBox.__init__(self, spacing=4)
|
||||
|
||||
#adding vars
|
||||
self.client=client
|
||||
@@ -1117,6 +1172,7 @@ class SeekBar(Gtk.Box):
|
||||
self.rest.set_width_chars(8)
|
||||
self.scale=Gtk.Scale.new_with_range(orientation=Gtk.Orientation.HORIZONTAL, min=0, max=100, step=0.001)
|
||||
self.scale.set_draw_value(False)
|
||||
self.scale.set_can_focus(False)
|
||||
|
||||
#connect
|
||||
self.scale.connect("change-value", self.seek)
|
||||
@@ -1265,7 +1321,7 @@ class PlaybackOptions(Gtk.Box):
|
||||
class AudioType(Gtk.EventBox):
|
||||
def __init__(self, client):
|
||||
Gtk.EventBox.__init__(self)
|
||||
self.set_tooltip_text(_("Right click to show additional information"))
|
||||
self.set_tooltip_text(_("Click to show additional information"))
|
||||
|
||||
#adding vars
|
||||
self.client=client
|
||||
@@ -1275,6 +1331,7 @@ class AudioType(Gtk.EventBox):
|
||||
self.label.set_xalign(1)
|
||||
self.label.set_ellipsize(Pango.EllipsizeMode.END)
|
||||
self.popover=Gtk.Popover()
|
||||
self.popover.set_relative_to(self)
|
||||
|
||||
#Store
|
||||
#(tag, value)
|
||||
@@ -1290,19 +1347,21 @@ class AudioType(Gtk.EventBox):
|
||||
renderer_text = Gtk.CellRendererText()
|
||||
|
||||
self.column_tag = Gtk.TreeViewColumn(_("MPD-Tag"), renderer_text, text=0)
|
||||
self.column_tag.set_property("resizable", False)
|
||||
self.treeview.append_column(self.column_tag)
|
||||
|
||||
self.column_value = Gtk.TreeViewColumn(_("Value"), renderer_text, text=1)
|
||||
self.column_value.set_property("resizable", False)
|
||||
self.treeview.append_column(self.column_value)
|
||||
|
||||
self.popover.add(self.treeview)
|
||||
|
||||
#timeouts
|
||||
GLib.timeout_add(1000, self.update)
|
||||
|
||||
#connect
|
||||
self.connect("button-press-event", self.on_button_press_event)
|
||||
|
||||
#packing
|
||||
self.popover.add(self.treeview)
|
||||
self.add(self.label)
|
||||
|
||||
def update(self):
|
||||
@@ -1322,11 +1381,9 @@ class AudioType(Gtk.EventBox):
|
||||
return True
|
||||
|
||||
def on_button_press_event(self, widget, event):
|
||||
if event.button == 3:
|
||||
self.popover.remove(self.treeview) #workaround
|
||||
self.store.clear()
|
||||
self.popover.add(self.treeview) #workaround
|
||||
if event.button == 1 or event.button == 2 or event.button == 3:
|
||||
try:
|
||||
self.store.clear()
|
||||
song=self.client.status()["song"]
|
||||
tags=self.client.playlistinfo(song)[0]
|
||||
for key in tags:
|
||||
@@ -1334,9 +1391,8 @@ class AudioType(Gtk.EventBox):
|
||||
self.store.append([key, str(datetime.timedelta(seconds=int(tags[key])))])
|
||||
else:
|
||||
self.store.append([key, tags[key]])
|
||||
self.popover.set_relative_to(self)
|
||||
self.popover.show_all()
|
||||
self.popover.popup()
|
||||
self.treeview.queue_resize()
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -1357,15 +1413,13 @@ class ProfileSelect(Gtk.ComboBoxText):
|
||||
self.settings.connect("changed::paths", self.on_settings_changed)
|
||||
|
||||
self.reload()
|
||||
self.handler_block(self.changed)
|
||||
self.set_active(self.settings.get_int("active-profile"))
|
||||
self.handler_unblock(self.changed)
|
||||
|
||||
def reload(self, *args):
|
||||
self.handler_block(self.changed)
|
||||
self.remove_all()
|
||||
for profile in self.settings.get_value("profiles"):
|
||||
self.append_text(profile)
|
||||
self.set_active(self.settings.get_int("active-profile"))
|
||||
self.handler_unblock(self.changed)
|
||||
|
||||
def on_settings_changed(self, *args):
|
||||
@@ -1572,7 +1626,8 @@ class LyricsWindow(Gtk.Window): #Lyrics view with own client because MPDClient i
|
||||
while not self.stop:
|
||||
if self.client.connected():
|
||||
cs=self.client.currentsong()
|
||||
cs.pop("pos") #avoid unnecessary reloads caused by position change of current title
|
||||
if not cs == {}:
|
||||
cs.pop("pos") #avoid unnecessary reloads caused by position change of current title
|
||||
if cs != self.current_song:
|
||||
GLib.idle_add(update_label, _("searching..."))
|
||||
try:
|
||||
@@ -1696,6 +1751,7 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||
self.search_button.connect("clicked", self.on_search_clicked)
|
||||
self.lyrics_button.connect("toggled", self.on_lyrics_toggled)
|
||||
self.info_bar.connect("response", self.on_info_bar_response)
|
||||
self.settings.connect("changed::profiles", self.on_settings_changed)
|
||||
#unmap space
|
||||
binding_set=Gtk.binding_set_find('GtkTreeView')
|
||||
Gtk.binding_entry_remove(binding_set, 32, Gdk.ModifierType.MOD2_MASK)
|
||||
@@ -1706,8 +1762,11 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||
GLib.timeout_add(1000, self.update, app)
|
||||
|
||||
#packing
|
||||
self.vbox=Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=3)
|
||||
self.hbox=Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=3)
|
||||
self.vbox=Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=4)
|
||||
self.hbox=Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=4)
|
||||
self.hbox.set_margin_start(2)
|
||||
self.hbox.set_margin_end(2)
|
||||
self.hbox.set_margin_bottom(2)
|
||||
self.vbox.pack_start(self.info_bar, False, False, 0)
|
||||
self.vbox.pack_start(self.browser, True, True, 0)
|
||||
self.vbox.pack_start(self.hbox, False, False, 0)
|
||||
@@ -1716,7 +1775,8 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||
self.hbox.pack_start(self.go_home_button, False, False, 0)
|
||||
self.hbox.pack_start(self.search_button, False, False, 0)
|
||||
self.hbox.pack_start(self.lyrics_button, False, False, 0)
|
||||
self.hbox.pack_start(self.profiles, False, False, 0)
|
||||
if len(self.settings.get_value("profiles")) > 1:
|
||||
self.hbox.pack_start(self.profiles, False, False, 0)
|
||||
self.hbox.pack_start(self.play_opts, False, False, 0)
|
||||
self.hbox.pack_end(menu_button, False, False, 0)
|
||||
|
||||
@@ -1785,8 +1845,14 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||
self.lyrics_win.destroy()
|
||||
|
||||
def on_key_press_event(self, widget, event):
|
||||
if event.keyval == 32:
|
||||
if event.keyval == 32: #space
|
||||
self.control.play_button.grab_focus()
|
||||
if event.keyval == 269025044: #AudioPlay
|
||||
self.control.play_button.emit("clicked")
|
||||
elif event.keyval == 269025047: #AudioNext
|
||||
self.control.next_button.emit("clicked")
|
||||
elif event.keyval == 269025046: #AudioPrev
|
||||
self.control.prev_button.emit("clicked")
|
||||
|
||||
def on_save(self, action, param):
|
||||
size=self.get_size()
|
||||
@@ -1809,6 +1875,13 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||
if self.client.connected():
|
||||
self.client.update()
|
||||
|
||||
def on_settings_changed(self, *args):
|
||||
self.hbox.remove(self.profiles)
|
||||
if len(self.settings.get_value("profiles")) > 1:
|
||||
self.hbox.pack_start(self.profiles, False, False, 0)
|
||||
self.hbox.reorder_child(self.profiles, 5)
|
||||
self.profiles.show()
|
||||
|
||||
class mpdevil(Gtk.Application):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, application_id="org.mpdevil", flags=Gio.ApplicationFlags.FLAGS_NONE, **kwargs)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
dnl -*- Mode: autoconf -*-
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ([2.68])
|
||||
AC_INIT([mpdevil], [0.4.3])
|
||||
AC_INIT([mpdevil], [0.5.0])
|
||||
AC_CONFIG_SRCDIR([bin/mpdevil.py])
|
||||
AM_INIT_AUTOMAKE
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
@@ -32,7 +32,7 @@
|
||||
<description></description>
|
||||
</key>
|
||||
<key type="i" name="icon-size">
|
||||
<default>16</default>
|
||||
<default>24</default>
|
||||
<summary>Size of button icons in control bar</summary>
|
||||
<description></description>
|
||||
</key>
|
||||
|
120
po/de.po
120
po/de.po
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-02-01 15:50+0100\n"
|
||||
"PO-Revision-Date: 2020-02-01 15:50+0100\n"
|
||||
"POT-Creation-Date: 2020-02-02 18:07+0100\n"
|
||||
"PO-Revision-Date: 2020-02-02 18:08+0100\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: de\n"
|
||||
@@ -18,27 +18,27 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.2.4\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: mpdevil.py:199 mpdevil.py:512 mpdevil.py:1453
|
||||
#: mpdevil.py:199 mpdevil.py:522 mpdevil.py:1474
|
||||
msgid "No"
|
||||
msgstr "Nr."
|
||||
|
||||
#: mpdevil.py:204 mpdevil.py:517 mpdevil.py:1459
|
||||
#: mpdevil.py:204 mpdevil.py:527 mpdevil.py:1480
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
|
||||
#: mpdevil.py:209 mpdevil.py:522 mpdevil.py:1465
|
||||
#: mpdevil.py:209 mpdevil.py:532 mpdevil.py:1486
|
||||
msgid "Artist"
|
||||
msgstr "Interpret"
|
||||
|
||||
#: mpdevil.py:214 mpdevil.py:527 mpdevil.py:1477
|
||||
#: mpdevil.py:214 mpdevil.py:537 mpdevil.py:1498
|
||||
msgid "Length"
|
||||
msgstr "Länge"
|
||||
|
||||
#: mpdevil.py:254 mpdevil.py:621 mpdevil.py:1514
|
||||
#: mpdevil.py:254 mpdevil.py:633 mpdevil.py:1535
|
||||
msgid "Unknown Title"
|
||||
msgstr "Unbekannter Titel"
|
||||
|
||||
#: mpdevil.py:258 mpdevil.py:629 mpdevil.py:1522
|
||||
#: mpdevil.py:258 mpdevil.py:641 mpdevil.py:1543
|
||||
msgid "Unknown Artist"
|
||||
msgstr "Unbekannter Künstler"
|
||||
|
||||
@@ -46,120 +46,120 @@ msgstr "Unbekannter Künstler"
|
||||
msgid "Album Artist"
|
||||
msgstr "Albuminterpret"
|
||||
|
||||
#: mpdevil.py:374 mpdevil.py:596
|
||||
#: mpdevil.py:381 mpdevil.py:608
|
||||
#, python-format
|
||||
msgid "%(total_tracks)i titles (%(total_length)s)"
|
||||
msgstr "%(total_tracks)i Titel (%(total_length)s)"
|
||||
|
||||
#: mpdevil.py:633 mpdevil.py:1526
|
||||
#: mpdevil.py:645 mpdevil.py:1547
|
||||
msgid "Unknown Album"
|
||||
msgstr "Unbekanntes Album"
|
||||
|
||||
#: mpdevil.py:800
|
||||
#: mpdevil.py:814
|
||||
msgid "Select"
|
||||
msgstr "Auswählen"
|
||||
|
||||
#: mpdevil.py:802
|
||||
#: mpdevil.py:816
|
||||
msgid "Profile:"
|
||||
msgstr "Profil:"
|
||||
|
||||
#: mpdevil.py:804
|
||||
#: mpdevil.py:818
|
||||
msgid "Name:"
|
||||
msgstr "Name:"
|
||||
|
||||
#: mpdevil.py:806
|
||||
#: mpdevil.py:820
|
||||
msgid "Host:"
|
||||
msgstr "Host:"
|
||||
|
||||
#: mpdevil.py:808
|
||||
#: mpdevil.py:822
|
||||
msgid "Port:"
|
||||
msgstr "Port:"
|
||||
|
||||
#: mpdevil.py:810
|
||||
#: mpdevil.py:824
|
||||
msgid "Password:"
|
||||
msgstr "Passwort:"
|
||||
|
||||
#: mpdevil.py:812
|
||||
#: mpdevil.py:826
|
||||
msgid "Music lib:"
|
||||
msgstr "Musikverzeichnis:"
|
||||
|
||||
#: mpdevil.py:893
|
||||
#: mpdevil.py:912
|
||||
msgid "Choose directory"
|
||||
msgstr "Verzeichnis Wählen"
|
||||
|
||||
#: mpdevil.py:932
|
||||
#: mpdevil.py:952
|
||||
msgid "Main cover size:"
|
||||
msgstr "Größe des Haupt-Covers:"
|
||||
|
||||
#: mpdevil.py:934
|
||||
#: mpdevil.py:954
|
||||
msgid "Album-view cover size:"
|
||||
msgstr "Covergröße in Albumansicht:"
|
||||
|
||||
#: mpdevil.py:940
|
||||
#: mpdevil.py:960
|
||||
msgid "Button icon size (restart required):"
|
||||
msgstr "Symbolgröße der Knöpfe (Neustart erforderlich):"
|
||||
|
||||
#: mpdevil.py:949
|
||||
#: mpdevil.py:969
|
||||
msgid "Show stop button"
|
||||
msgstr "Zeige Stopp-Knopf"
|
||||
|
||||
#: mpdevil.py:952
|
||||
#: mpdevil.py:972
|
||||
msgid "Show tooltips in album view"
|
||||
msgstr "Zeige Tooltips in Albumansicht"
|
||||
|
||||
#: mpdevil.py:955
|
||||
#: mpdevil.py:975
|
||||
msgid "Send notification on title change"
|
||||
msgstr "Sende Benachrichtigung bei Titelwechsel"
|
||||
|
||||
#: mpdevil.py:958
|
||||
#: mpdevil.py:978
|
||||
msgid "Stop playback on quit"
|
||||
msgstr "Wiedergabe beim Beenden stoppen"
|
||||
|
||||
#: mpdevil.py:961
|
||||
#: mpdevil.py:981
|
||||
msgid "Play selected album after current title"
|
||||
msgstr "Ausgewähltes Album hinter aktuellem Titel einreihen"
|
||||
|
||||
#: mpdevil.py:999 mpdevil.py:1683
|
||||
#: mpdevil.py:1019 mpdevil.py:1704
|
||||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: mpdevil.py:1012
|
||||
#: mpdevil.py:1032
|
||||
msgid "General"
|
||||
msgstr "Allgemein"
|
||||
|
||||
#: mpdevil.py:1013
|
||||
#: mpdevil.py:1033
|
||||
msgid "Profiles"
|
||||
msgstr "Profile"
|
||||
|
||||
#: mpdevil.py:1167
|
||||
#: mpdevil.py:1188
|
||||
msgid "Random mode"
|
||||
msgstr "Zufallsmodus"
|
||||
|
||||
#: mpdevil.py:1169
|
||||
#: mpdevil.py:1190
|
||||
msgid "Repeat mode"
|
||||
msgstr "Dauerschleife"
|
||||
|
||||
#: mpdevil.py:1171
|
||||
#: mpdevil.py:1192
|
||||
msgid "Single mode"
|
||||
msgstr "Einzelstückmodus"
|
||||
|
||||
#: mpdevil.py:1173
|
||||
#: mpdevil.py:1194
|
||||
msgid "Consume mode"
|
||||
msgstr "Playliste verbrauchen"
|
||||
|
||||
#: mpdevil.py:1268
|
||||
msgid "Right click to show additional information"
|
||||
msgstr "Rechtsclick für weitere Informationen"
|
||||
#: mpdevil.py:1289
|
||||
msgid "Click to show additional information"
|
||||
msgstr "Klicken für weitere Informationen"
|
||||
|
||||
#: mpdevil.py:1292
|
||||
#: mpdevil.py:1313
|
||||
msgid "MPD-Tag"
|
||||
msgstr "MPD-Tag"
|
||||
|
||||
#: mpdevil.py:1295 mpdevil.py:1403
|
||||
#: mpdevil.py:1316 mpdevil.py:1424
|
||||
msgid "Value"
|
||||
msgstr "Wert"
|
||||
|
||||
#: mpdevil.py:1316
|
||||
#: mpdevil.py:1337
|
||||
#, python-format
|
||||
msgid ""
|
||||
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
|
||||
@@ -168,88 +168,88 @@ msgstr ""
|
||||
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
|
||||
"Kanäle, %(file_type)s"
|
||||
|
||||
#: mpdevil.py:1382
|
||||
#: mpdevil.py:1403
|
||||
msgid "Stats"
|
||||
msgstr "Statistik"
|
||||
|
||||
#: mpdevil.py:1400
|
||||
#: mpdevil.py:1421
|
||||
msgid "Tag"
|
||||
msgstr "Tag"
|
||||
|
||||
#: mpdevil.py:1420
|
||||
#: mpdevil.py:1441
|
||||
msgid "Search"
|
||||
msgstr "Suche"
|
||||
|
||||
#: mpdevil.py:1471
|
||||
#: mpdevil.py:1492
|
||||
msgid "Album"
|
||||
msgstr "Album"
|
||||
|
||||
#: mpdevil.py:1533
|
||||
#: mpdevil.py:1554
|
||||
#, python-format
|
||||
msgid "Hits: %i"
|
||||
msgstr "Treffer: %i"
|
||||
|
||||
#: mpdevil.py:1537
|
||||
#: mpdevil.py:1558
|
||||
msgid "Lyrics"
|
||||
msgstr "Liedtext"
|
||||
|
||||
#: mpdevil.py:1577
|
||||
#: mpdevil.py:1598
|
||||
msgid "searching..."
|
||||
msgstr "suche..."
|
||||
|
||||
#: mpdevil.py:1581
|
||||
#: mpdevil.py:1602
|
||||
msgid "not found"
|
||||
msgstr "nicht gefunden"
|
||||
|
||||
#: mpdevil.py:1586
|
||||
#: mpdevil.py:1607
|
||||
msgid "not connected"
|
||||
msgstr "nicht verbunden"
|
||||
|
||||
#: mpdevil.py:1663
|
||||
#: mpdevil.py:1684
|
||||
msgid "Select profile"
|
||||
msgstr "Profil auswählen"
|
||||
|
||||
#: mpdevil.py:1667
|
||||
#: mpdevil.py:1688
|
||||
msgid "Return to album of current title"
|
||||
msgstr "Zu Album des aktuellen Titels zurückkehren"
|
||||
|
||||
#: mpdevil.py:1669
|
||||
#: mpdevil.py:1690
|
||||
msgid "Title search"
|
||||
msgstr "Titelsuche"
|
||||
|
||||
#: mpdevil.py:1671
|
||||
#: mpdevil.py:1692
|
||||
msgid "Show lyrics"
|
||||
msgstr "Zeige Liedtext"
|
||||
|
||||
#: mpdevil.py:1678
|
||||
#: mpdevil.py:1699
|
||||
msgid "Not connected to MPD-server. Reconnect?"
|
||||
msgstr "Nicht mit MPD-Server verbunden. Verbindung wiederherstellen?"
|
||||
|
||||
#: mpdevil.py:1682
|
||||
#: mpdevil.py:1703
|
||||
msgid "Save window size"
|
||||
msgstr "Fenstergröße speichern"
|
||||
|
||||
#: mpdevil.py:1684
|
||||
#: mpdevil.py:1705
|
||||
msgid "Update database"
|
||||
msgstr "Datenbank aktualisieren"
|
||||
|
||||
#: mpdevil.py:1685
|
||||
#: mpdevil.py:1706
|
||||
msgid "Server stats"
|
||||
msgstr "Serverstatistik"
|
||||
|
||||
#: mpdevil.py:1686
|
||||
#: mpdevil.py:1707
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
|
||||
#: mpdevil.py:1687
|
||||
#: mpdevil.py:1708
|
||||
msgid "Quit"
|
||||
msgstr "Beenden"
|
||||
|
||||
#: mpdevil.py:1692
|
||||
#: mpdevil.py:1713
|
||||
msgid "Main menu"
|
||||
msgstr "Hauptmenu"
|
||||
|
||||
#: mpdevil.py:1845
|
||||
#: mpdevil.py:1869
|
||||
msgid "A small MPD client written in python"
|
||||
msgstr ""
|
||||
|
||||
|
116
po/mpdevil.pot
116
po/mpdevil.pot
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-02-01 15:50+0100\n"
|
||||
"POT-Creation-Date: 2020-02-02 18:07+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -17,27 +17,27 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: mpdevil.py:199 mpdevil.py:512 mpdevil.py:1453
|
||||
#: mpdevil.py:199 mpdevil.py:522 mpdevil.py:1474
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:204 mpdevil.py:517 mpdevil.py:1459
|
||||
#: mpdevil.py:204 mpdevil.py:527 mpdevil.py:1480
|
||||
msgid "Title"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:209 mpdevil.py:522 mpdevil.py:1465
|
||||
#: mpdevil.py:209 mpdevil.py:532 mpdevil.py:1486
|
||||
msgid "Artist"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:214 mpdevil.py:527 mpdevil.py:1477
|
||||
#: mpdevil.py:214 mpdevil.py:537 mpdevil.py:1498
|
||||
msgid "Length"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:254 mpdevil.py:621 mpdevil.py:1514
|
||||
#: mpdevil.py:254 mpdevil.py:633 mpdevil.py:1535
|
||||
msgid "Unknown Title"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:258 mpdevil.py:629 mpdevil.py:1522
|
||||
#: mpdevil.py:258 mpdevil.py:641 mpdevil.py:1543
|
||||
msgid "Unknown Artist"
|
||||
msgstr ""
|
||||
|
||||
@@ -45,207 +45,207 @@ msgstr ""
|
||||
msgid "Album Artist"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:374 mpdevil.py:596
|
||||
#: mpdevil.py:381 mpdevil.py:608
|
||||
#, python-format
|
||||
msgid "%(total_tracks)i titles (%(total_length)s)"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:633 mpdevil.py:1526
|
||||
#: mpdevil.py:645 mpdevil.py:1547
|
||||
msgid "Unknown Album"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:800
|
||||
#: mpdevil.py:814
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:802
|
||||
#: mpdevil.py:816
|
||||
msgid "Profile:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:804
|
||||
#: mpdevil.py:818
|
||||
msgid "Name:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:806
|
||||
#: mpdevil.py:820
|
||||
msgid "Host:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:808
|
||||
#: mpdevil.py:822
|
||||
msgid "Port:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:810
|
||||
#: mpdevil.py:824
|
||||
msgid "Password:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:812
|
||||
#: mpdevil.py:826
|
||||
msgid "Music lib:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:893
|
||||
#: mpdevil.py:912
|
||||
msgid "Choose directory"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:932
|
||||
#: mpdevil.py:952
|
||||
msgid "Main cover size:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:934
|
||||
#: mpdevil.py:954
|
||||
msgid "Album-view cover size:"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:940
|
||||
#: mpdevil.py:960
|
||||
msgid "Button icon size (restart required):"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:949
|
||||
#: mpdevil.py:969
|
||||
msgid "Show stop button"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:952
|
||||
#: mpdevil.py:972
|
||||
msgid "Show tooltips in album view"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:955
|
||||
#: mpdevil.py:975
|
||||
msgid "Send notification on title change"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:958
|
||||
#: mpdevil.py:978
|
||||
msgid "Stop playback on quit"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:961
|
||||
#: mpdevil.py:981
|
||||
msgid "Play selected album after current title"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:999 mpdevil.py:1683
|
||||
#: mpdevil.py:1019 mpdevil.py:1704
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1012
|
||||
#: mpdevil.py:1032
|
||||
msgid "General"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1013
|
||||
#: mpdevil.py:1033
|
||||
msgid "Profiles"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1167
|
||||
#: mpdevil.py:1188
|
||||
msgid "Random mode"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1169
|
||||
#: mpdevil.py:1190
|
||||
msgid "Repeat mode"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1171
|
||||
#: mpdevil.py:1192
|
||||
msgid "Single mode"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1173
|
||||
#: mpdevil.py:1194
|
||||
msgid "Consume mode"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1268
|
||||
msgid "Right click to show additional information"
|
||||
#: mpdevil.py:1289
|
||||
msgid "Click to show additional information"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1292
|
||||
#: mpdevil.py:1313
|
||||
msgid "MPD-Tag"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1295 mpdevil.py:1403
|
||||
#: mpdevil.py:1316 mpdevil.py:1424
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1316
|
||||
#: mpdevil.py:1337
|
||||
#, python-format
|
||||
msgid ""
|
||||
"%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s "
|
||||
"channels, %(file_type)s"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1382
|
||||
#: mpdevil.py:1403
|
||||
msgid "Stats"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1400
|
||||
#: mpdevil.py:1421
|
||||
msgid "Tag"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1420
|
||||
#: mpdevil.py:1441
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1471
|
||||
#: mpdevil.py:1492
|
||||
msgid "Album"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1533
|
||||
#: mpdevil.py:1554
|
||||
#, python-format
|
||||
msgid "Hits: %i"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1537
|
||||
#: mpdevil.py:1558
|
||||
msgid "Lyrics"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1577
|
||||
#: mpdevil.py:1598
|
||||
msgid "searching..."
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1581
|
||||
#: mpdevil.py:1602
|
||||
msgid "not found"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1586
|
||||
#: mpdevil.py:1607
|
||||
msgid "not connected"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1663
|
||||
#: mpdevil.py:1684
|
||||
msgid "Select profile"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1667
|
||||
#: mpdevil.py:1688
|
||||
msgid "Return to album of current title"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1669
|
||||
#: mpdevil.py:1690
|
||||
msgid "Title search"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1671
|
||||
#: mpdevil.py:1692
|
||||
msgid "Show lyrics"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1678
|
||||
#: mpdevil.py:1699
|
||||
msgid "Not connected to MPD-server. Reconnect?"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1682
|
||||
#: mpdevil.py:1703
|
||||
msgid "Save window size"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1684
|
||||
#: mpdevil.py:1705
|
||||
msgid "Update database"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1685
|
||||
#: mpdevil.py:1706
|
||||
msgid "Server stats"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1686
|
||||
#: mpdevil.py:1707
|
||||
msgid "About"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1687
|
||||
#: mpdevil.py:1708
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1692
|
||||
#: mpdevil.py:1713
|
||||
msgid "Main menu"
|
||||
msgstr ""
|
||||
|
||||
#: mpdevil.py:1845
|
||||
#: mpdevil.py:1869
|
||||
msgid "A small MPD client written in python"
|
||||
msgstr ""
|
||||
|
Reference in New Issue
Block a user