small code style changes

This commit is contained in:
Martin Wagner 2020-04-09 00:26:21 +02:00
parent 3f42f62be6
commit da2eb5cba0

View File

@ -41,10 +41,10 @@ import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
import base64
DATADIR = '@datadir@'
NAME = 'mpdevil'
VERSION = '@version@'
PACKAGE = NAME.lower()
DATADIR='@datadir@'
NAME='mpdevil'
VERSION='@version@'
PACKAGE=NAME.lower()
try:
locale.setlocale(locale.LC_ALL, '')
@ -61,7 +61,7 @@ except locale.Error:
class IntEntry(Gtk.SpinButton):
def __init__(self, default, lower, upper, step):
Gtk.SpinButton.__init__(self)
adj = Gtk.Adjustment(value=default, lower=lower, upper=upper, step_increment=step)
adj=Gtk.Adjustment(value=default, lower=lower, upper=upper, step_increment=step)
self.set_adjustment(adj)
def get_int(self):
@ -76,12 +76,12 @@ class FocusFrame(Gtk.Frame):
#css
self.style_context=self.get_style_context()
self.provider = Gtk.CssProvider()
css = b"""* {border-color: @theme_selected_bg_color;}"""
self.provider=Gtk.CssProvider()
css=b"""* {border-color: @theme_selected_bg_color;}"""
self.provider.load_from_data(css)
provider_start = Gtk.CssProvider()
css_start = b"""* {border-color: @theme_bg_color;}"""
provider_start=Gtk.CssProvider()
css_start=b"""* {border-color: @theme_bg_color;}"""
provider_start.load_from_data(css_start)
self.style_context.add_provider(provider_start, 800)
@ -112,13 +112,13 @@ class Cover(object):
def get_pixbuf(self, size):
if self.path == None:
self.path = Gtk.IconTheme.get_default().lookup_icon("mpdevil", size, Gtk.IconLookupFlags.FORCE_SVG).get_filename() #fallback cover
self.path=Gtk.IconTheme.get_default().lookup_icon("mpdevil", size, Gtk.IconLookupFlags.FORCE_SVG).get_filename() #fallback cover
return GdkPixbuf.Pixbuf.new_from_file_at_size(self.path, size, size)
class AutoSettingsClient(MPDClient):
def __init__(self, settings):
MPDClient.__init__(self)
self.settings = settings
self.settings=settings
self.settings.connect("changed::active-profile", self.on_settings_changed)
def try_connect_default(self):
@ -143,7 +143,7 @@ class AutoSettingsClient(MPDClient):
self.disconnect()
class MpdEventEmitter(GObject.Object):
__gsignals__ = {
__gsignals__={
'database': (GObject.SignalFlags.RUN_FIRST, None, ()),
'update': (GObject.SignalFlags.RUN_FIRST, None, ()),
'stored_playlist': (GObject.SignalFlags.RUN_FIRST, None, ()),
@ -305,11 +305,11 @@ class Client(AutoSettingsClient):
self.emitter.emit("update")
class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
__introspect_interface = "org.freedesktop.DBus.Introspectable"
__prop_interface = dbus.PROPERTIES_IFACE
__introspect_interface="org.freedesktop.DBus.Introspectable"
__prop_interface=dbus.PROPERTIES_IFACE
# python dbus bindings don't include annotations and properties
MPRIS2_INTROSPECTION = """<node name="/org/mpris/MediaPlayer2">
MPRIS2_INTROSPECTION="""<node name="/org/mpris/MediaPlayer2">
<interface name="org.freedesktop.DBus.Introspectable">
<method name="Introspect">
<arg direction="out" name="xml_data" type="s"/>
@ -417,7 +417,7 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
</node>"""
# MPRIS allowed metadata tags
allowed_tags = {
allowed_tags={
'mpris:trackid': dbus.ObjectPath,
'mpris:length': dbus.Int64,
'mpris:artUrl': str,
@ -443,11 +443,11 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
def __init__(self, window, client, settings):
dbus.service.Object.__init__(self, dbus.SessionBus(), "/org/mpris/MediaPlayer2")
self._name = "org.mpris.MediaPlayer2.mpdevil"
self._name="org.mpris.MediaPlayer2.mpdevil"
self._bus = dbus.SessionBus()
self._uname = self._bus.get_unique_name()
self._dbus_obj = self._bus.get_object("org.freedesktop.DBus", "/org/freedesktop/DBus")
self._bus=dbus.SessionBus()
self._uname=self._bus.get_unique_name()
self._dbus_obj=self._bus.get_object("org.freedesktop.DBus", "/org/freedesktop/DBus")
self._dbus_obj.connect_to_signal("NameOwnerChanged", self._name_owner_changed_callback, arg0=self._name)
self.window=window
@ -483,101 +483,101 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
http://www.freedesktop.org/wiki/Specifications/mpris-spec/metadata
"""
mpd_meta = self.client.currentsong()
self.metadata = {}
mpd_meta=self.client.currentsong()
self.metadata={}
for tag in ('album', 'title'):
if tag in mpd_meta:
self.metadata['xesam:%s' % tag] = mpd_meta[tag]
self.metadata['xesam:%s' % tag]=mpd_meta[tag]
if 'id' in mpd_meta:
self.metadata['mpris:trackid'] = "/org/mpris/MediaPlayer2/Track/%s" % mpd_meta['id']
self.metadata['mpris:trackid']="/org/mpris/MediaPlayer2/Track/%s" % mpd_meta['id']
if 'time' in mpd_meta:
self.metadata['mpris:length'] = int(mpd_meta['time']) * 1000000
self.metadata['mpris:length']=int(mpd_meta['time']) * 1000000
if 'date' in mpd_meta:
self.metadata['xesam:contentCreated'] = mpd_meta['date'][0:4]
self.metadata['xesam:contentCreated']=mpd_meta['date'][0:4]
if 'track' in mpd_meta:
# TODO: Is it even *possible* for mpd_meta['track'] to be a list?
if type(mpd_meta['track']) == list and len(mpd_meta['track']) > 0:
track = str(mpd_meta['track'][0])
track=str(mpd_meta['track'][0])
else:
track = str(mpd_meta['track'])
track=str(mpd_meta['track'])
m = re.match('^([0-9]+)', track)
m=re.match('^([0-9]+)', track)
if m:
self.metadata['xesam:trackNumber'] = int(m.group(1))
self.metadata['xesam:trackNumber']=int(m.group(1))
# Ensure the integer is signed 32bit
if self.metadata['xesam:trackNumber'] & 0x80000000:
self.metadata['xesam:trackNumber'] += -0x100000000
else:
self.metadata['xesam:trackNumber'] = 0
self.metadata['xesam:trackNumber']=0
if 'disc' in mpd_meta:
# TODO: Same as above. When is it a list?
if type(mpd_meta['disc']) == list and len(mpd_meta['disc']) > 0:
disc = str(mpd_meta['disc'][0])
disc=str(mpd_meta['disc'][0])
else:
disc = str(mpd_meta['disc'])
disc=str(mpd_meta['disc'])
m = re.match('^([0-9]+)', disc)
m=re.match('^([0-9]+)', disc)
if m:
self.metadata['xesam:discNumber'] = int(m.group(1))
self.metadata['xesam:discNumber']=int(m.group(1))
if 'artist' in mpd_meta:
if type(mpd_meta['artist']) == list:
self.metadata['xesam:artist'] = mpd_meta['artist']
self.metadata['xesam:artist']=mpd_meta['artist']
else:
self.metadata['xesam:artist'] = [mpd_meta['artist']]
self.metadata['xesam:artist']=[mpd_meta['artist']]
if 'composer' in mpd_meta:
if type(mpd_meta['composer']) == list:
self.metadata['xesam:composer'] = mpd_meta['composer']
self.metadata['xesam:composer']=mpd_meta['composer']
else:
self.metadata['xesam:composer'] = [mpd_meta['composer']]
self.metadata['xesam:composer']=[mpd_meta['composer']]
# Stream: populate some missings tags with stream's name
if 'name' in mpd_meta:
if 'xesam:title' not in self.metadata:
self.metadata['xesam:title'] = mpd_meta['name']
self.metadata['xesam:title']=mpd_meta['name']
elif 'xesam:album' not in self.metadata:
self.metadata['xesam:album'] = mpd_meta['name']
self.metadata['xesam:album']=mpd_meta['name']
if 'file' in mpd_meta:
song_file = mpd_meta['file']
self.metadata['xesam:url'] = "file://"+os.path.join(self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file)
song_file=mpd_meta['file']
self.metadata['xesam:url']="file://"+os.path.join(self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file)
cover=Cover(lib_path=self.settings.get_value("paths")[self.settings.get_int("active-profile")], song_file=song_file)
if not cover.path == None:
self.metadata['mpris:artUrl'] = "file://"+cover.path
self.metadata['mpris:artUrl']="file://"+cover.path
else:
self.metadata['mpris:artUrl'] = None
self.metadata['mpris:artUrl']=None
# Cast self.metadata to the correct type, or discard it
for key, value in self.metadata.items():
try:
self.metadata[key] = self.allowed_tags[key](value)
self.metadata[key]=self.allowed_tags[key](value)
except ValueError:
del self.metadata[key]
def _name_owner_changed_callback(self, name, old_owner, new_owner):
if name == self._name and old_owner == self._uname and new_owner != "":
try:
pid = self._dbus_obj.GetConnectionUnixProcessID(new_owner)
pid=self._dbus_obj.GetConnectionUnixProcessID(new_owner)
except:
pid = None
pid=None
loop.quit()
def acquire_name(self):
self._bus_name = dbus.service.BusName(self._name, bus=self._bus, allow_replacement=True, replace_existing=True)
self._bus_name=dbus.service.BusName(self._name, bus=self._bus, allow_replacement=True, replace_existing=True)
def release_name(self):
if hasattr(self, "_bus_name"):
del self._bus_name
__root_interface = "org.mpris.MediaPlayer2"
__root_props = {
__root_interface="org.mpris.MediaPlayer2"
__root_props={
"CanQuit": (False, None),
"CanRaise": (True, None),
"DesktopEntry": ("mpdevil", None),
@ -588,7 +588,7 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
}
def __get_playback_status(self):
status = self.client.status()
status=self.client.status()
return {'play': 'Playing', 'pause': 'Paused', 'stop': 'Stopped'}[status['state']]
def __set_loop_status(self, value):
@ -606,7 +606,7 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
return
def __get_loop_status(self):
status = self.client.status()
status=self.client.status()
if int(status['repeat']) == 1:
if int(status.get('single', 0)) == 1:
return "Track"
@ -629,7 +629,7 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
return dbus.Dictionary(self.metadata, signature='sv')
def __get_volume(self):
vol = float(self.client.status().get('volume', 0))
vol=float(self.client.status().get('volume', 0))
if vol > 0:
return vol / 100.0
else:
@ -641,22 +641,22 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
return
def __get_position(self):
status = self.client.status()
status=self.client.status()
if 'time' in status:
current, end = status['time'].split(':')
current, end=status['time'].split(':')
return dbus.Int64((int(current) * 1000000))
else:
return dbus.Int64(0)
def __get_can_next_prev(self):
status = self.client.status()
status=self.client.status()
if status['state'] == "stop":
return False
else:
return True
__player_interface = "org.mpris.MediaPlayer2.Player"
__player_props = {
__player_interface="org.mpris.MediaPlayer2.Player"
__player_props={
"PlaybackStatus": (__get_playback_status, None),
"LoopStatus": (__get_loop_status, __set_loop_status),
"Rate": (1.0, None),
@ -674,7 +674,7 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
"CanControl": (True, None),
}
__prop_mapping = {
__prop_mapping={
__player_interface: __player_props,
__root_interface: __root_props,
}
@ -689,33 +689,33 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
@dbus.service.method(__prop_interface, in_signature="ss", out_signature="v")
def Get(self, interface, prop):
getter, setter = self.__prop_mapping[interface][prop]
getter, setter=self.__prop_mapping[interface][prop]
if callable(getter):
return getter(self)
return getter
@dbus.service.method(__prop_interface, in_signature="ssv", out_signature="")
def Set(self, interface, prop, value):
getter, setter = self.__prop_mapping[interface][prop]
getter, setter=self.__prop_mapping[interface][prop]
if setter is not None:
setter(self, value)
@dbus.service.method(__prop_interface, in_signature="s", out_signature="a{sv}")
def GetAll(self, interface):
read_props = {}
props = self.__prop_mapping[interface]
read_props={}
props=self.__prop_mapping[interface]
for key, (getter, setter) in props.items():
if callable(getter):
getter = getter(self)
read_props[key] = getter
getter=getter(self)
read_props[key]=getter
return read_props
def update_property(self, interface, prop):
getter, setter = self.__prop_mapping[interface][prop]
getter, setter=self.__prop_mapping[interface][prop]
if callable(getter):
value = getter(self)
value=getter(self)
else:
value = getter
value=getter
self.PropertiesChanged(interface, {prop: value}, [])
return value
@ -747,7 +747,7 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
@dbus.service.method(__player_interface, in_signature='', out_signature='')
def PlayPause(self):
status = self.client.status()
status=self.client.status()
if status['state'] == 'play':
self.client.pause(1)
else:
@ -766,27 +766,27 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
@dbus.service.method(__player_interface, in_signature='x', out_signature='')
def Seek(self, offset): #TODO
status = self.client.status()
current, end = status['time'].split(':')
current = int(current)
end = int(end)
offset = int(offset) / 1000000
status=self.client.status()
current, end=status['time'].split(':')
current=int(current)
end=int(end)
offset=int(offset) / 1000000
if current + offset <= end:
position = current + offset
position=current + offset
if position < 0:
position = 0
position=0
self.client.seekid(int(status['songid']), position)
self.Seeked(position * 1000000)
return
@dbus.service.method(__player_interface, in_signature='ox', out_signature='')
def SetPosition(self, trackid, position):
song = self.client.currentsong()
song=self.client.currentsong()
# FIXME: use real dbus objects
if str(trackid) != '/org/mpris/MediaPlayer2/Track/%s' % song['id']:
return
# Convert position to seconds
position = int(position) / 1000000
position=int(position) / 1000000
if position <= int(song['time']):
self.client.seekid(int(song['id']), position)
self.Seeked(position * 1000000)
@ -801,7 +801,7 @@ class MPRISInterface(dbus.service.Object): #TODO emit Seeked if needed
return
class Settings(Gio.Settings):
BASE_KEY = "org.mpdevil"
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):
@ -852,43 +852,43 @@ class SongsView(Gtk.ScrolledWindow):
#store
#(track, title, artist, album, duration, file)
self.store = Gtk.ListStore(str, str, str, str, str, str)
self.store=Gtk.ListStore(str, str, str, str, str, str)
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview=Gtk.TreeView(model=self.store)
self.treeview.set_search_column(-1)
self.treeview.columns_autosize()
#selection
self.selection = self.treeview.get_selection()
self.selection=self.treeview.get_selection()
self.selection.set_mode(Gtk.SelectionMode.SINGLE)
#columns
renderer_text = Gtk.CellRendererText()
renderer_text_ralign = Gtk.CellRendererText(xalign=1.0)
renderer_text=Gtk.CellRendererText()
renderer_text_ralign=Gtk.CellRendererText(xalign=1.0)
self.column_track = Gtk.TreeViewColumn(_("No"), renderer_text_ralign, text=0)
self.column_track=Gtk.TreeViewColumn(_("No"), renderer_text_ralign, text=0)
self.column_track.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_track.set_property("resizable", False)
self.treeview.append_column(self.column_track)
self.column_title = Gtk.TreeViewColumn(_("Title"), renderer_text, text=1)
self.column_title=Gtk.TreeViewColumn(_("Title"), renderer_text, text=1)
self.column_title.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_title.set_property("resizable", False)
self.treeview.append_column(self.column_title)
self.column_artist = Gtk.TreeViewColumn(_("Artist"), renderer_text, text=2)
self.column_artist=Gtk.TreeViewColumn(_("Artist"), renderer_text, text=2)
self.column_artist.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_artist.set_property("resizable", False)
self.treeview.append_column(self.column_artist)
self.column_album = Gtk.TreeViewColumn(_("Album"), renderer_text, text=3)
self.column_album=Gtk.TreeViewColumn(_("Album"), renderer_text, text=3)
self.column_album.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_album.set_property("resizable", False)
if show_album:
self.treeview.append_column(self.column_album)
self.column_time = Gtk.TreeViewColumn(_("Length"), renderer_text, text=4)
self.column_time=Gtk.TreeViewColumn(_("Length"), renderer_text, text=4)
self.column_time.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_time.set_property("resizable", False)
self.treeview.append_column(self.column_time)
@ -913,13 +913,13 @@ class SongsView(Gtk.ScrolledWindow):
def on_button_press_event(self, widget, event):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
try:
path = widget.get_path_at_pos(int(event.x), int(event.y))[0]
path=widget.get_path_at_pos(int(event.x), int(event.y))[0]
self.client.files_to_playlist([self.store[path][5]], False)
except:
pass
elif event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
try:
path = widget.get_path_at_pos(int(event.x), int(event.y))[0]
path=widget.get_path_at_pos(int(event.x), int(event.y))[0]
self.client.files_to_playlist([self.store[path][5]], True)
except:
pass
@ -981,7 +981,7 @@ class AlbumDialog(Gtk.Dialog):
self.show_all()
def open(self):
response = self.run()
response=self.run()
if response == Gtk.ResponseType.OK:
self.client.album_to_playlist(self.album, self.artist, self.year, False)
elif response == Gtk.ResponseType.ACCEPT:
@ -1041,28 +1041,28 @@ class ArtistView(FocusFrame):
#artistStore
#(name, weight, initial-letter, weight-initials)
self.store = Gtk.ListStore(str, Pango.Weight, str, Pango.Weight)
self.store=Gtk.ListStore(str, Pango.Weight, str, Pango.Weight)
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview=Gtk.TreeView(model=self.store)
self.treeview.set_search_column(0)
self.treeview.columns_autosize()
self.treeview.set_property("activate-on-single-click", True)
#artistSelection
self.selection = self.treeview.get_selection()
self.selection=self.treeview.get_selection()
self.selection.set_mode(Gtk.SelectionMode.SINGLE)
#Columns
renderer_text_malign = Gtk.CellRendererText(xalign=0.5)
self.column_initials = Gtk.TreeViewColumn("", renderer_text_malign, text=2, weight=3)
renderer_text_malign=Gtk.CellRendererText(xalign=0.5)
self.column_initials=Gtk.TreeViewColumn("", renderer_text_malign, text=2, weight=3)
self.column_initials.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_initials.set_property("resizable", False)
self.column_initials.set_visible(self.settings.get_boolean("show-initials"))
self.treeview.append_column(self.column_initials)
renderer_text = Gtk.CellRendererText()
self.column_name = Gtk.TreeViewColumn("", renderer_text, text=0, weight=1)
renderer_text=Gtk.CellRendererText()
self.column_name=Gtk.TreeViewColumn("", renderer_text, text=0, weight=1)
self.column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
self.column_name.set_property("resizable", False)
self.treeview.append_column(self.column_name)
@ -1128,7 +1128,7 @@ class ArtistView(FocusFrame):
return artists
def on_row_activated(self, widget, path, view_column):
if self.last_artist_path != None:
if not self.last_artist_path == None:
try:
self.store[self.last_artist_path][1]=Pango.Weight.BOOK
except:
@ -1152,7 +1152,7 @@ class AlbumIconView(Gtk.IconView):
self.stop_flag=True
#cover, display_label, tooltip(titles), album, year, artist
self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str, str, str)
self.store=Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str, str, str)
self.sort_settings()
#iconview
@ -1221,9 +1221,9 @@ class AlbumIconView(Gtk.IconView):
return
#display albums
if self.settings.get_boolean("sort-albums-by-year"):
albums = sorted(albums, key=lambda k: k['year'])
albums=sorted(albums, key=lambda k: k['year'])
else:
albums = sorted(albums, key=lambda k: k['album'])
albums=sorted(albums, key=lambda k: k['album'])
music_lib=self.settings.get_value("paths")[self.settings.get_int("active-profile")]
size=self.settings.get_int("album-cover")
z=0
@ -1258,7 +1258,7 @@ class AlbumIconView(Gtk.IconView):
row_num=len(self.store)
for i in range(0, row_num):
path=Gtk.TreePath(i)
treeiter = self.store.get_iter(path)
treeiter=self.store.get_iter(path)
if self.store.get_value(treeiter, 3) == song["album"]:
self.set_cursor(path, None, False)
self.select_path(path)
@ -1276,12 +1276,12 @@ class AlbumIconView(Gtk.IconView):
album=self.store[path][3]
year=self.store[path][4]
artist=self.store[path][5]
album_dialog = AlbumDialog(self.window, self.client, self.settings, album, artist, year)
album_dialog=AlbumDialog(self.window, self.client, self.settings, album, artist, year)
album_dialog.open()
album_dialog.destroy()
def on_button_press_event(self, widget, event):
path = widget.get_path_at_pos(int(event.x), int(event.y))
path=widget.get_path_at_pos(int(event.x), int(event.y))
if not path == None:
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
self.path_to_playlist(path, False)
@ -1388,8 +1388,8 @@ class MainCover(Gtk.Frame):
Gtk.Frame.__init__(self)
#css
style_context=self.get_style_context()
provider = Gtk.CssProvider()
css = b"""* {background-color: @theme_base_color; border-radius: 6px;}"""
provider=Gtk.CssProvider()
css=b"""* {background-color: @theme_base_color; border-radius: 6px;}"""
provider.load_from_data(css)
style_context.add_provider(provider, 800)
@ -1450,7 +1450,7 @@ class MainCover(Gtk.Frame):
elif event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
self.client.album_to_playlist(album, artist, album_year, True)
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
album_dialog = AlbumDialog(self.window, self.client, self.settings, album, artist, album_year)
album_dialog=AlbumDialog(self.window, self.client, self.settings, album, artist, album_year)
album_dialog.open()
album_dialog.destroy()
@ -1469,44 +1469,44 @@ class PlaylistView(Gtk.Box):
#Store
#(track, disc, title, artist, album, duration, date, genre, file, weight)
self.store = Gtk.ListStore(str, str, str, str, str, str, str, str, str, Pango.Weight)
self.store=Gtk.ListStore(str, str, str, str, str, str, str, str, str, Pango.Weight)
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview=Gtk.TreeView(model=self.store)
self.treeview.set_search_column(2)
self.treeview.set_property("activate-on-single-click", True)
#selection
self.selection = self.treeview.get_selection()
self.selection=self.treeview.get_selection()
self.selection.set_mode(Gtk.SelectionMode.SINGLE)
#Column
renderer_text = Gtk.CellRendererText()
renderer_text_ralign = Gtk.CellRendererText(xalign=1.0)
renderer_text=Gtk.CellRendererText()
renderer_text_ralign=Gtk.CellRendererText(xalign=1.0)
self.columns=[None, None, None, None, None, None, None, None]
self.columns[0] = Gtk.TreeViewColumn(_("No"), renderer_text_ralign, text=0, weight=9)
self.columns[0]=Gtk.TreeViewColumn(_("No"), renderer_text_ralign, text=0, weight=9)
self.columns[0].set_property("resizable", True)
self.columns[1] = Gtk.TreeViewColumn(_("Disc"), renderer_text_ralign, text=1, weight=9)
self.columns[1]=Gtk.TreeViewColumn(_("Disc"), renderer_text_ralign, text=1, weight=9)
self.columns[1].set_property("resizable", True)
self.columns[2] = Gtk.TreeViewColumn(_("Title"), renderer_text, text=2, weight=9)
self.columns[2]=Gtk.TreeViewColumn(_("Title"), renderer_text, text=2, weight=9)
self.columns[2].set_property("resizable", True)
self.columns[3] = Gtk.TreeViewColumn(_("Artist"), renderer_text, text=3, weight=9)
self.columns[3]=Gtk.TreeViewColumn(_("Artist"), renderer_text, text=3, weight=9)
self.columns[3].set_property("resizable", True)
self.columns[4] = Gtk.TreeViewColumn(_("Album"), renderer_text, text=4, weight=9)
self.columns[4]=Gtk.TreeViewColumn(_("Album"), renderer_text, text=4, weight=9)
self.columns[4].set_property("resizable", True)
self.columns[5] = Gtk.TreeViewColumn(_("Length"), renderer_text, text=5, weight=9)
self.columns[5]=Gtk.TreeViewColumn(_("Length"), renderer_text, text=5, weight=9)
self.columns[5].set_property("resizable", True)
self.columns[6] = Gtk.TreeViewColumn(_("Year"), renderer_text, text=6, weight=9)
self.columns[6]=Gtk.TreeViewColumn(_("Year"), renderer_text, text=6, weight=9)
self.columns[6].set_property("resizable", True)
self.columns[7] = Gtk.TreeViewColumn(_("Genre"), renderer_text, text=7, weight=9)
self.columns[7]=Gtk.TreeViewColumn(_("Genre"), renderer_text, text=7, weight=9)
self.columns[7].set_property("resizable", True)
self.load_settings()
@ -1600,7 +1600,7 @@ class PlaylistView(Gtk.Box):
row[9]=Pango.Weight.BOOK
try:
song=self.client.status()["song"]
path = Gtk.TreePath(int(song))
path=Gtk.TreePath(int(song))
self.selection.select_path(path)
self.store[path][9]=Pango.Weight.BOLD
self.scroll_to_selected_title()
@ -1632,7 +1632,7 @@ class PlaylistView(Gtk.Box):
def on_button_press_event(self, widget, event):
if event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
try:
path = widget.get_path_at_pos(int(event.x), int(event.y))[0]
path=widget.get_path_at_pos(int(event.x), int(event.y))[0]
self.remove_song(path)
except:
pass
@ -1785,7 +1785,7 @@ class Browser(Gtk.Box):
if self.client.connected():
def set_active(*args):
self.search_button.set_active(False)
self.search_win = SearchWindow(self.client)
self.search_win=SearchWindow(self.client)
self.search_win.connect("destroy", set_active)
else:
self.search_win.destroy()
@ -1822,7 +1822,7 @@ class ProfileSettings(Gtk.Grid):
self.set_property("border-width", 18)
#adding vars
self.settings = settings
self.settings=settings
#widgets
self.profiles_combo=Gtk.ComboBoxText()
@ -1944,12 +1944,12 @@ class ProfileSettings(Gtk.Grid):
self.settings.array_modify('as', "paths", self.profiles_combo.get_active(), self.path_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=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)
dialog.set_current_folder(self.settings.get_value("paths")[self.profiles_combo.get_active()])
response = dialog.run()
response=dialog.run()
if response == Gtk.ResponseType.OK:
self.settings.array_modify('as', "paths", self.profiles_combo.get_active(), dialog.get_filename())
self.path_entry.set_text(dialog.get_filename())
@ -1979,7 +1979,7 @@ class GeneralSettings(Gtk.Box):
self.set_property("border-width", 18)
#adding vars
self.settings = settings
self.settings=settings
#widgets
track_cover_label=Gtk.Label(label=_("Main cover size:"))
@ -2107,7 +2107,7 @@ class PlaylistSettings(Gtk.Box):
self.set_property("border-width", 18)
#adding vars
self.settings = settings
self.settings=settings
#label
label=Gtk.Label(label=_("Choose the order of information to appear in the playlist:"))
@ -2116,20 +2116,20 @@ class PlaylistSettings(Gtk.Box):
#Store
#(toggle, header, index)
self.store = Gtk.ListStore(bool, str, int)
self.store=Gtk.ListStore(bool, str, int)
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview=Gtk.TreeView(model=self.store)
self.treeview.set_search_column(-1)
self.treeview.set_reorderable(True)
self.treeview.set_headers_visible(False)
#selection
self.selection = self.treeview.get_selection()
self.selection=self.treeview.get_selection()
#Column
renderer_text = Gtk.CellRendererText()
renderer_toggle = Gtk.CellRendererToggle()
renderer_text=Gtk.CellRendererText()
renderer_toggle=Gtk.CellRendererToggle()
column_toggle=Gtk.TreeViewColumn("", renderer_toggle, active=0)
self.treeview.append_column(column_toggle)
@ -2179,7 +2179,7 @@ class PlaylistSettings(Gtk.Box):
self.pack_start(column_chooser, True, True, 0)
def on_cell_toggled(self, widget, path):
self.store[path][0] = not self.store[path][0]
self.store[path][0]=not self.store[path][0]
self.settings.array_modify('ab', "column-visibilities", self.store[path][2], self.store[path][0])
def save_permutation(self, *args):
@ -2228,7 +2228,7 @@ class SettingsDialog(Gtk.Dialog):
self.set_default_size(500, 400)
#adding vars
self.settings = settings
self.settings=settings
#widgets
general=GeneralSettings(self.settings)
@ -2236,7 +2236,7 @@ class SettingsDialog(Gtk.Dialog):
playlist=PlaylistSettings(self.settings)
#packing
tabs = Gtk.Notebook()
tabs=Gtk.Notebook()
tabs.append_page(general, Gtk.Label(label=_("General")))
tabs.append_page(profiles, Gtk.Label(label=_("Profiles")))
tabs.append_page(playlist, Gtk.Label(label=_("Playlist")))
@ -2256,10 +2256,10 @@ class ClientControl(Gtk.ButtonBox):
self.icon_size=self.settings.get_gtk_icon_size("icon-size")
#widgets
self.play_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-start-symbolic", self.icon_size))
self.stop_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-stop-symbolic", self.icon_size))
self.prev_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-backward-symbolic", self.icon_size))
self.next_button = Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-forward-symbolic", self.icon_size))
self.play_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-start-symbolic", self.icon_size))
self.stop_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("media-playback-stop-symbolic", self.icon_size))
self.prev_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-backward-symbolic", self.icon_size))
self.next_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("media-skip-forward-symbolic", self.icon_size))
#connect
self.play_button.connect("clicked", self.on_play_clicked)
@ -2352,8 +2352,8 @@ class SeekBar(Gtk.Box):
#css (scale)
style_context=self.scale.get_style_context()
provider = Gtk.CssProvider()
css = b"""scale fill { background-color: @theme_selected_bg_color; }"""
provider=Gtk.CssProvider()
css=b"""scale fill { background-color: @theme_selected_bg_color; }"""
provider.load_from_data(css)
style_context.add_provider(provider, 800)
@ -2620,23 +2620,23 @@ class AudioType(Gtk.Button):
#Store
#(tag, value)
self.store = Gtk.ListStore(str, str)
self.store=Gtk.ListStore(str, str)
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview=Gtk.TreeView(model=self.store)
self.treeview.set_can_focus(False)
self.treeview.set_search_column(-1)
sel = self.treeview.get_selection()
sel=self.treeview.get_selection()
sel.set_mode(Gtk.SelectionMode.NONE)
#Column
renderer_text = Gtk.CellRendererText()
renderer_text=Gtk.CellRendererText()
self.column_tag = Gtk.TreeViewColumn(_("MPD-Tag"), renderer_text, text=0)
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=Gtk.TreeViewColumn(_("Value"), renderer_text, text=1)
self.column_value.set_property("resizable", False)
self.treeview.append_column(self.column_value)
@ -2655,9 +2655,9 @@ class AudioType(Gtk.Button):
status=self.client.status()
try:
file_type=self.client.playlistinfo(status["song"])[0]["file"].split('.')[-1]
freq, res, chan = status["audio"].split(':')
freq, res, chan=status["audio"].split(':')
freq=str(float(freq)/1000)
brate = status["bitrate"]
brate=status["bitrate"]
string=_("%(bitrate)s kb/s, %(frequency)s kHz, %(resolution)s bit, %(channels)s channels, %(file_type)s") % {"bitrate": brate, "frequency": freq, "resolution": res, "channels": chan, "file_type": file_type}
self.label.set_text(string)
except:
@ -2719,22 +2719,22 @@ class ServerStats(Gtk.Dialog):
#Store
#(tag, value)
self.store = Gtk.ListStore(str, str)
self.store=Gtk.ListStore(str, str)
#TreeView
self.treeview = Gtk.TreeView(model=self.store)
self.treeview=Gtk.TreeView(model=self.store)
self.treeview.set_can_focus(False)
self.treeview.set_search_column(-1)
sel = self.treeview.get_selection()
sel=self.treeview.get_selection()
sel.set_mode(Gtk.SelectionMode.NONE)
#Column
renderer_text = Gtk.CellRendererText()
renderer_text=Gtk.CellRendererText()
self.column_tag = Gtk.TreeViewColumn(_("Tag"), renderer_text, text=0)
self.column_tag=Gtk.TreeViewColumn(_("Tag"), renderer_text, text=0)
self.treeview.append_column(self.column_tag)
self.column_value = Gtk.TreeViewColumn(_("Value"), renderer_text, text=1)
self.column_value=Gtk.TreeViewColumn(_("Value"), renderer_text, text=1)
self.treeview.append_column(self.column_value)
stats=self.client.stats()
@ -2837,19 +2837,19 @@ class LyricsWindow(Gtk.Window):
def getLyrics(self, singer, song): #partially copied from PyLyrics 1.1.0
#Replace spaces with _
singer = singer.replace(' ', '_')
song = song.replace(' ', '_')
r = requests.get('http://lyrics.wikia.com/{0}:{1}'.format(singer,song))
s = BeautifulSoup(r.text)
singer=singer.replace(' ', '_')
song=song.replace(' ', '_')
r=requests.get('http://lyrics.wikia.com/{0}:{1}'.format(singer,song))
s=BeautifulSoup(r.text)
#Get main lyrics holder
lyrics = s.find("div",{'class':'lyricbox'})
lyrics=s.find("div",{'class':'lyricbox'})
if lyrics is None:
raise ValueError("Song or Singer does not exist or the API does not have Lyrics")
return None
#Remove Scripts
[s.extract() for s in lyrics('script')]
#Remove Comments
comments = lyrics.findAll(text=lambda text:isinstance(text, Comment))
comments=lyrics.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
#Remove span tag (Needed for instrumantal)
if not lyrics.span == None:
@ -2859,7 +2859,7 @@ class LyricsWindow(Gtk.Window):
for match in lyrics.findAll(tag):
match.replaceWithChildren()
#Get output as a string and remove non unicode characters and replace <br> with newlines
output = str(lyrics).encode('utf-8', errors='replace')[22:-6:].decode("utf-8").replace('\n','').replace('<br/>','\n')
output=str(lyrics).encode('utf-8', errors='replace')[22:-6:].decode("utf-8").replace('\n','').replace('<br/>','\n')
try:
return output
except:
@ -2870,7 +2870,7 @@ class MainWindow(Gtk.ApplicationWindow):
Gtk.ApplicationWindow.__init__(self, title=("mpdevil"), application=app)
Notify.init("mpdevil")
self.set_icon_name("mpdevil")
self.settings = settings
self.settings=settings
self.set_default_size(self.settings.get_int("width"), self.settings.get_int("height"))
#adding vars
@ -2880,22 +2880,22 @@ class MainWindow(Gtk.ApplicationWindow):
#MPRIS
DBusGMainLoop(set_as_default=True)
self.dbus_service = MPRISInterface(self, self.client, self.settings)
self.dbus_service=MPRISInterface(self, self.client, self.settings)
#actions
save_action = Gio.SimpleAction.new("save", None)
save_action=Gio.SimpleAction.new("save", None)
save_action.connect("activate", self.on_save)
self.add_action(save_action)
settings_action = Gio.SimpleAction.new("settings", None)
settings_action=Gio.SimpleAction.new("settings", None)
settings_action.connect("activate", self.on_settings)
self.add_action(settings_action)
stats_action = Gio.SimpleAction.new("stats", None)
stats_action=Gio.SimpleAction.new("stats", None)
stats_action.connect("activate", self.on_stats)
self.add_action(stats_action)
update_action = Gio.SimpleAction.new("update", None)
update_action=Gio.SimpleAction.new("update", None)
update_action.connect("activate", self.on_update)
self.add_action(update_action)
@ -2910,7 +2910,7 @@ class MainWindow(Gtk.ApplicationWindow):
self.play_opts=PlaybackOptions(self.client, self.settings)
#menu
menu = Gio.Menu()
menu=Gio.Menu()
menu.append(_("Save window layout"), "win.save")
menu.append(_("Settings"), "win.settings")
menu.append(_("Update database"), "win.update")
@ -2918,8 +2918,8 @@ class MainWindow(Gtk.ApplicationWindow):
menu.append(_("About"), "app.about")
menu.append(_("Quit"), "app.quit")
menu_button = Gtk.MenuButton.new()
menu_popover = Gtk.Popover.new_from_model(menu_button, menu)
menu_button=Gtk.MenuButton.new()
menu_popover=Gtk.Popover.new_from_model(menu_button, menu)
menu_button.set_popover(menu_popover)
menu_button.set_tooltip_text(_("Menu"))
menu_button.set_image(image=Gtk.Image.new_from_icon_name("open-menu-symbolic", self.icon_size))
@ -2989,7 +2989,7 @@ class MainWindow(Gtk.ApplicationWindow):
if self.client.connected():
def set_active(*args):
self.lyrics_button.set_active(False)
self.lyrics_win = LyricsWindow(self.client, self.settings)
self.lyrics_win=LyricsWindow(self.client, self.settings)
self.lyrics_win.connect("destroy", set_active)
else:
self.lyrics_win.destroy()
@ -3022,13 +3022,13 @@ class MainWindow(Gtk.ApplicationWindow):
self.browser.save_settings()
def on_settings(self, action, param):
settings = SettingsDialog(self, self.settings)
settings=SettingsDialog(self, self.settings)
settings.run()
settings.destroy()
def on_stats(self, action, param):
if self.client.connected():
stats = ServerStats(self, self.client)
stats=ServerStats(self, self.client)
stats.run()
stats.destroy()
@ -3045,24 +3045,24 @@ class MainWindow(Gtk.ApplicationWindow):
class mpdevil(Gtk.Application):
def __init__(self, *args, **kwargs):
super().__init__(*args, application_id="org.mpdevil", flags=Gio.ApplicationFlags.FLAGS_NONE, **kwargs)
self.settings = Settings()
self.settings=Settings()
self.client=Client(self.settings)
self.window=None
def do_activate(self):
if not self.window: #allow just one instance
self.window = MainWindow(self, self.client, self.settings)
self.window=MainWindow(self, self.client, self.settings)
self.window.connect("delete-event", self.on_delete_event)
self.window.present()
def do_startup(self):
Gtk.Application.do_startup(self)
action = Gio.SimpleAction.new("about", None)
action=Gio.SimpleAction.new("about", None)
action.connect("activate", self.on_about)
self.add_action(action)
action = Gio.SimpleAction.new("quit", None)
action=Gio.SimpleAction.new("quit", None)
action.connect("activate", self.on_quit)
self.add_action(action)
@ -3089,6 +3089,6 @@ class mpdevil(Gtk.Application):
self.quit()
if __name__ == '__main__':
app = mpdevil()
app=mpdevil()
app.run(sys.argv)