2020-06-03 21:39:27 +02:00
# pylint: disable=C0111,R0903
""" Displays information about the current song in vlc, audacious, bmp, xmms2, spotify and others
Requires the following executable :
* playerctl
2020-12-27 17:02:45 +01:00
Parameters :
2021-06-11 12:12:13 +02:00
* playerctl . format : Format string ( defaults to ' {{ artist}} - {{ title}} {{ duration(position)}}/ {{ duration(mpris:length)}} ' ) .
The format string is passed to ' playerctl -f ' as an argument . Read ` the README < https : / / github . com / altdesktop / playerctl #printing-properties-and-metadata>`_ for more information.
2020-12-27 17:02:45 +01:00
* playerctl . layout : Comma - separated list to change order of widgets ( defaults to song , previous , pause , next )
Widget names are : playerctl . song , playerctl . prev , playerctl . pause , playerctl . next
2021-06-11 11:34:46 +02:00
* playerctl . args : The arguments added to playerctl .
You can check ' playerctl --help ' or ` its README < https : / / github . com / altdesktop / playerctl #using-the-cli>`_. For example, it could be '-p vlc,%any'.
2022-04-23 15:44:35 +02:00
* playerctl . hide : Hide the widgets when no players are found . Defaults to " false " .
2020-12-27 17:02:45 +01:00
2021-06-11 11:34:46 +02:00
Parameters are inspired by the ` spotify ` module , many thanks to its developers !
2020-06-03 21:39:27 +02:00
2020-12-27 17:02:45 +01:00
contributed by ` smitajit < https : / / github . com / smitajit > ` _ - many thanks !
2020-06-03 21:39:27 +02:00
"""
2020-06-06 14:39:50 +02:00
import core . module
import core . widget
import core . input
import util . cli
2020-12-27 17:02:45 +01:00
import util . format
import logging
2020-06-03 21:39:27 +02:00
2020-06-06 14:39:50 +02:00
class Module ( core . module . Module ) :
2020-12-27 17:02:45 +01:00
def __init__ ( self , config , theme ) :
super ( Module , self ) . __init__ ( config , theme , [ ] )
2020-06-03 21:39:27 +02:00
2020-12-27 17:02:45 +01:00
self . background = True
2022-04-23 15:44:35 +02:00
self . __hide = util . format . asbool ( self . parameter ( " hide " , " false " ) ) ;
2023-03-15 19:01:48 +01:00
self . __hidden = self . __hide
2022-04-23 15:44:35 +02:00
2020-12-27 17:02:45 +01:00
self . __layout = util . format . aslist (
self . parameter (
" layout " , " playerctl.prev, playerctl.song, playerctl.pause, playerctl.next "
)
)
2020-06-03 21:39:27 +02:00
2021-06-11 11:34:46 +02:00
self . __cmd = " playerctl " + self . parameter ( " args " , " " ) + " "
self . __format = self . parameter ( " format " , " {{ artist}} - {{ title}} {{ duration(position)}}/ {{ duration(mpris:length)}} " )
2020-06-03 21:39:27 +02:00
2020-12-27 17:02:45 +01:00
widget_map = { }
for widget_name in self . __layout :
widget = self . add_widget ( name = widget_name )
if widget_name == " playerctl.prev " :
widget_map [ widget ] = {
" button " : core . input . LEFT_MOUSE ,
" cmd " : self . __cmd + " previous " ,
}
elif widget_name == " playerctl.pause " :
widget_map [ widget ] = {
" button " : core . input . LEFT_MOUSE ,
" cmd " : self . __cmd + " play-pause " ,
}
elif widget_name == " playerctl.next " :
widget_map [ widget ] = {
" button " : core . input . LEFT_MOUSE ,
" cmd " : self . __cmd + " next " ,
}
elif widget_name == " playerctl.song " :
widget_map [ widget ] = [
{
" button " : core . input . LEFT_MOUSE ,
" cmd " : self . __cmd + " play-pause " ,
} , {
" button " : core . input . WHEEL_UP ,
" cmd " : self . __cmd + " next " ,
} , {
" button " : core . input . WHEEL_DOWN ,
" cmd " : self . __cmd + " previous " ,
}
]
else :
raise KeyError (
" The playerctl module does not have a {widget_name!r} widget " . format (
widget_name = widget_name
)
)
for widget , callback_options in widget_map . items ( ) :
if isinstance ( callback_options , dict ) :
core . input . register ( widget , * * callback_options )
2022-04-23 15:44:35 +02:00
def hidden ( self ) :
2023-03-15 19:01:48 +01:00
return self . __hidden
2022-04-23 15:44:35 +02:00
def status ( self ) :
2020-06-03 21:39:27 +02:00
try :
2021-12-17 11:07:45 +01:00
playback_status = str ( util . cli . execute ( self . __cmd + " status 2>&1 || true " , shell = True ) ) . strip ( )
if playback_status == " No players found " :
2022-04-23 15:44:35 +02:00
return None
return playback_status
2020-12-27 17:02:45 +01:00
except Exception as e :
logging . exception ( e )
2022-04-23 15:44:35 +02:00
return None
def update ( self ) :
2022-04-24 17:09:54 +02:00
playback_status = self . status ( )
2023-03-15 19:01:48 +01:00
if not playback_status :
self . __hidden = self . __hide
else :
self . __hidden = False
2021-06-11 11:34:46 +02:00
for widget in self . widgets ( ) :
if playback_status :
if widget . name == " playerctl.pause " :
if playback_status == " Playing " :
widget . set ( " state " , " playing " )
elif playback_status == " Paused " :
widget . set ( " state " , " paused " )
2021-06-26 12:19:12 +02:00
elif playback_status == " Stopped " :
widget . set ( " state " , " stopped " )
2021-06-11 11:34:46 +02:00
else :
widget . set ( " state " , " " )
elif widget . name == " playerctl.next " :
widget . set ( " state " , " next " )
elif widget . name == " playerctl.prev " :
widget . set ( " state " , " prev " )
elif widget . name == " playerctl.song " :
widget . full_text ( self . __get_song ( ) )
else :
widget . set ( " state " , " " )
widget . full_text ( " " )
2020-12-27 17:02:45 +01:00
def __get_song ( self ) :
2021-06-11 11:34:46 +02:00
try :
return str ( util . cli . execute ( self . __cmd + " metadata -f ' " + self . __format + " ' " ) ) . strip ( )
except Exception as e :
logging . exception ( e )
return " "