112 lines
2.8 KiB
Python
Executable File
112 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import gi
|
|
import os
|
|
import sys
|
|
import json
|
|
import time
|
|
|
|
try:
|
|
gi.require_version('Playerctl', '2.0')
|
|
except:
|
|
sys.exit(1)
|
|
|
|
from gi.repository import Playerctl, GLib
|
|
|
|
title_maxlen = 30;
|
|
artist_maxlen = 30;
|
|
|
|
class Status:
|
|
|
|
def __init__(self):
|
|
self.running = False
|
|
self.playing = False
|
|
self.title = None
|
|
self.artist = None
|
|
self.album = None
|
|
self.album_artist = None
|
|
|
|
def _dict_dump(self):
|
|
return {
|
|
"running": self.running,
|
|
"playing": self.playing,
|
|
"title": self.title,
|
|
"artist": self.artist,
|
|
"album": self.album,
|
|
"album_artist": self.album_artist
|
|
}
|
|
|
|
def __str__(self):
|
|
return json.dumps(self._dict_dump())
|
|
|
|
class StatusDisplay:
|
|
|
|
def __init__(self):
|
|
self._player = None
|
|
|
|
def show(self):
|
|
self._init_player()
|
|
|
|
main = GLib.MainLoop()
|
|
main.run()
|
|
|
|
def _get_status(self, playing = None):
|
|
if self._player:
|
|
status = Status()
|
|
status.running = self._player.props.playback_status != 2
|
|
if playing == None:
|
|
status.playing = self._player.props.playback_status == 0
|
|
else:
|
|
status.playing = playing
|
|
status.title = self._player.get_title() or ""
|
|
status.artist = self._player.get_artist() or ""
|
|
status.album = self._player.get_album() or ""
|
|
|
|
if len(status.title) > title_maxlen:
|
|
status.title = status.title[:title_maxlen-1] + '…'
|
|
if len(status.artist) > artist_maxlen:
|
|
status.artist = status.artist[:artist_maxlen-1] + '…'
|
|
|
|
return status
|
|
else:
|
|
return Status()
|
|
|
|
def _print_status(self, status):
|
|
print(status, flush=True)
|
|
|
|
def _init_player(self):
|
|
|
|
success = False
|
|
|
|
while not success:
|
|
try:
|
|
self._player = Playerctl.Player()
|
|
self._player.connect('metadata', self._on_update)
|
|
self._player.connect('play', self._on_play)
|
|
self._player.connect('pause', self._on_pause)
|
|
self._player.connect('exit', self._on_exit)
|
|
|
|
self._print_status(self._get_status())
|
|
|
|
success = True
|
|
except:
|
|
|
|
self._print_status(Status())
|
|
time.sleep(2)
|
|
|
|
def _on_update(self, *args):
|
|
self._print_status(self._get_status())
|
|
|
|
def _on_play(self, *args):
|
|
self._print_status(self._get_status(playing=True))
|
|
|
|
def _on_pause(self, *args):
|
|
self._print_status(self._get_status(playing=False))
|
|
|
|
def _on_exit(self, player):
|
|
del self._player
|
|
self._player = None
|
|
self._init_player()
|
|
|
|
StatusDisplay().show()
|