Containing spotify module to reside soley within polybar config directory
This commit is contained in:
parent
10787fb689
commit
f68eeb3231
3
polybar/spotify/launchlistener.sh
Executable file
3
polybar/spotify/launchlistener.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
/usr/bin/env python3 ~/.config/polybar/spotify/py_spotify_listener.py
|
||||
124
polybar/spotify/py_spotify_listener.py
Executable file
124
polybar/spotify/py_spotify_listener.py
Executable file
@ -0,0 +1,124 @@
|
||||
#!/usr/bin/env python3
|
||||
# Unwrap function: (C)2011-2015 Dennis Kaarsemaker
|
||||
# License: GPL3+
|
||||
"""Receiver related functionality."""
|
||||
import dbus.service
|
||||
import dbus.glib
|
||||
from os import system
|
||||
from gi.repository import GObject
|
||||
import dbus
|
||||
|
||||
|
||||
class Test(dbus.service.Object):
|
||||
"""Reciever test class."""
|
||||
|
||||
loop = None
|
||||
|
||||
def __init__(self, bus_name, object_path, loop):
|
||||
"""Initialize the DBUS service object."""
|
||||
dbus.service.Object.__init__(self, bus_name, object_path)
|
||||
self.loop = loop
|
||||
|
||||
@dbus.service.method('tld.domain.sub.TestInterface')
|
||||
def foo(self):
|
||||
"""Return a string."""
|
||||
return 'Foo'
|
||||
|
||||
# Stop the main loop
|
||||
@dbus.service.method('tld.domain.sub.TestInterface')
|
||||
def stop(self):
|
||||
"""Stop the receiver."""
|
||||
self.loop.quit()
|
||||
return 'Quit loop'
|
||||
|
||||
# Pass an exception through dbus
|
||||
@dbus.service.method('tld.domain.sub.TestInterface')
|
||||
def fail(self):
|
||||
"""Trigger an exception."""
|
||||
raise Exception('FAIL!')
|
||||
|
||||
|
||||
def catchall_handler(*args, **kwargs):
|
||||
"""Catch all handler.
|
||||
Catch and print information about all singals.
|
||||
"""
|
||||
print('---- Caught signal ----')
|
||||
print('%s:%s\n' % (kwargs['dbus_interface'], kwargs['member']))
|
||||
|
||||
print("\n")
|
||||
|
||||
def quit_handler():
|
||||
"""Signal handler for quitting the receiver."""
|
||||
print('Quitting....')
|
||||
loop.quit()
|
||||
|
||||
def event_handler(*args, **kwargs):
|
||||
"""event handler for the receiver."""
|
||||
"""arg[1] contains metadata"""
|
||||
"""arg[1][1] contains PlaybackStatus"""
|
||||
data = unwrap(args)
|
||||
if 'spotify' in data[1]['Metadata']['mpris:trackid']:
|
||||
if data[1]['PlaybackStatus'] == "Playing":
|
||||
print("Music is playing")
|
||||
system("polybar-msg hook playpause 2")
|
||||
""" Send IPC hook 2 to all bars for module playpause """
|
||||
if data[1]['PlaybackStatus'] == "Paused":
|
||||
print("Music is paused.")
|
||||
""" Send IPC hook 3 to all bars module playpause """
|
||||
system("polybar-msg hook playpause 3")
|
||||
""" Send IPC hook 2 to all bars for module spotify """
|
||||
system("polybar-msg hook spotify 2")
|
||||
|
||||
def unwrap(val):
|
||||
if isinstance(val, dbus.ByteArray):
|
||||
return "".join([str(x) for x in val])
|
||||
if isinstance(val, (dbus.Array, list, tuple)):
|
||||
return [unwrap(x) for x in val]
|
||||
if isinstance(val, (dbus.Dictionary, dict)):
|
||||
return dict([(unwrap(x), unwrap(y)) for x, y in val.items()])
|
||||
if isinstance(val, (dbus.Signature, dbus.String)):
|
||||
return str(val)
|
||||
if isinstance(val, dbus.Boolean):
|
||||
return bool(val)
|
||||
if isinstance(val, (dbus.Int16, dbus.UInt16, dbus.Int32, dbus.UInt32, dbus.Int64, dbus.UInt64)):
|
||||
return int(val)
|
||||
if isinstance(val, dbus.Byte):
|
||||
return bytes([int(val)])
|
||||
return val
|
||||
|
||||
loop = GObject.MainLoop()
|
||||
|
||||
"""
|
||||
First we get the bus to attach to. This may be either the session bus, of the
|
||||
system bus. For system bus root permission is required.
|
||||
We claim a bus name on the chosen bus. The name should be in form of a
|
||||
domain name.
|
||||
"""
|
||||
bus = dbus.SessionBus()
|
||||
# bus = dbus.SystemBus()
|
||||
bus_name = dbus.service.BusName('sub.domain.tld', bus=bus)
|
||||
|
||||
"""
|
||||
We initialize our service object with our name and object path. Object
|
||||
path should be in form of a reverse domain dame, delimited by / instead of .
|
||||
and the Class name as last part.
|
||||
The object path we set here is of importance for our invoker, since it will to
|
||||
call it exactly as defined here.
|
||||
"""
|
||||
obj = Test(bus_name, '/tld/domain/sub/Test', loop)
|
||||
|
||||
|
||||
"""
|
||||
Attach signal handler.
|
||||
Signal handlers may be attached in different ways, either by interface keyword
|
||||
or DBUS interface and a signal name or member keyword.
|
||||
You can easily gather all information by running the DBUS monitor.
|
||||
"""
|
||||
bus.add_signal_receiver(quit_handler,
|
||||
dbus_interface='tld.domain.sub.event',
|
||||
signal_name='quit_signal')
|
||||
bus.add_signal_receiver(event_handler,
|
||||
dbus_interface='org.freedesktop.DBus.Properties',
|
||||
member_keyword='PropertiesChanged')
|
||||
|
||||
loop.run()
|
||||
67
polybar/spotify/spotify_status.py
Executable file
67
polybar/spotify/spotify_status.py
Executable file
@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import dbus
|
||||
import argparse
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'-t',
|
||||
'--trunclen',
|
||||
type=int,
|
||||
metavar='trunclen'
|
||||
)
|
||||
parser.add_argument(
|
||||
'-f',
|
||||
'--format',
|
||||
type=str,
|
||||
metavar='custom format',
|
||||
dest='custom_format'
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
# Default parameters
|
||||
output = '{artist}: {song}'
|
||||
trunclen = 25
|
||||
|
||||
# parameters can be overwritten by args
|
||||
if args.trunclen is not None:
|
||||
trunclen = args.trunclen
|
||||
if args.custom_format is not None:
|
||||
output = args.custom_format
|
||||
|
||||
try:
|
||||
session_bus = dbus.SessionBus()
|
||||
spotify_bus = session_bus.get_object(
|
||||
'org.mpris.MediaPlayer2.spotify',
|
||||
'/org/mpris/MediaPlayer2'
|
||||
)
|
||||
|
||||
spotify_properties = dbus.Interface(
|
||||
spotify_bus,
|
||||
'org.freedesktop.DBus.Properties'
|
||||
)
|
||||
|
||||
metadata = spotify_properties.Get('org.mpris.MediaPlayer2.Player', 'Metadata')
|
||||
|
||||
artist = metadata['xesam:artist'][0]
|
||||
song = metadata['xesam:title']
|
||||
|
||||
if len(song) > trunclen:
|
||||
song = song[0:trunclen]
|
||||
song += '...'
|
||||
if ('(' in song) and (')' not in song):
|
||||
song += ')'
|
||||
|
||||
# Python3 uses UTF-8 by default.
|
||||
if sys.version_info.major == 3:
|
||||
print(output.format(artist=artist, song=song))
|
||||
else:
|
||||
print(output.format(artist=artist, song=song).encode('UTF-8'))
|
||||
except Exception as e:
|
||||
if isinstance(e, dbus.exceptions.DBusException):
|
||||
print('')
|
||||
else:
|
||||
print(e)
|
||||
|
||||
@ -277,7 +277,7 @@ click-left = "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org
|
||||
[module/spotify]
|
||||
type = custom/ipc
|
||||
hook-0 = echo ""
|
||||
hook-1 = python3 ~/scripts/spotify/spotify_status.py
|
||||
hook-1 = python3 ~/.config/polybar/spotify/spotify_status.py
|
||||
initial = 1
|
||||
format-padding = 4
|
||||
format-underline = #1db954
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user