Skip to content

Commit f33eb75

Browse files
committed
fix(player-mpris-tail): fixes polybar#335
1 parent 150e468 commit f33eb75

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

polybar-scripts/player-mpris-tail/player-mpris-tail.py

+40-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from dbus.mainloop.glib import DBusGMainLoop
1212
from gi.repository import GLib
1313
DBusGMainLoop(set_as_default=True)
14-
14+
import threading
1515

1616
FORMAT_STRING = '{icon} {artist} - {title}'
1717
FORMAT_REGEX = re.compile(r'(\{:(?P<tag>.*?)(:(?P<format>[wt])(?P<formatlen>\d+))?:(?P<text>.*?):\})', re.I)
@@ -34,10 +34,15 @@ def __init__(self, filter_list, block_mode = True, connect = True):
3434

3535
if self._connect:
3636
self.connect()
37+
38+
# keep writing the latest players to the file
39+
threading.Thread(target=self.saveCurrentPlayersToFile).start()
40+
3741
loop = GLib.MainLoop()
3842
try:
3943
loop.run()
4044
except KeyboardInterrupt:
45+
self.connected = False
4146
print("interrupt received, stopping…")
4247

4348
def connect(self):
@@ -116,17 +121,38 @@ def changePlayerOwner(self, bus_name, old_owner, new_owner):
116121
self.players[new_owner] = player
117122
del self.players[old_owner]
118123

124+
def saveCurrentPlayersToFile(self):
125+
while self.connected:
126+
player_owners = self.getSortedPlayerOwnerList()
127+
current_folder = os.path.dirname(os.path.abspath(__file__))
128+
with open(os.path.join(current_folder, 'players.txt'), 'w') as f:
129+
for player_owner in player_owners:
130+
f.write(player_owner + '\n')
131+
time.sleep(0.2)
132+
133+
def readCurrentPlayersFromFile(self):
134+
players = []
135+
current_folder = os.path.dirname(os.path.abspath(__file__))
136+
try:
137+
with open(os.path.join(current_folder, 'players.txt'), 'r') as f:
138+
for line in f:
139+
players.append(line.strip())
140+
except FileNotFoundError:
141+
pass
142+
return players
143+
119144
# Get a list of player owners sorted by current status and age
120145
def getSortedPlayerOwnerList(self):
121146
players = [
122147
{
123148
'number': int(owner.split('.')[-1]),
124149
'status': 2 if player.status == 'playing' else 1 if player.status == 'paused' else 0,
125-
'owner': owner
150+
'owner': owner,
151+
'lastChanged': player._timeStatusChanged
126152
}
127153
for owner, player in self.players.items()
128154
]
129-
return [ info['owner'] for info in reversed(sorted(players, key=itemgetter('status', 'number'))) ]
155+
return [ info['owner'] for info in reversed(sorted(players, key=itemgetter('status', 'lastChanged', 'number'))) ]
130156

131157
# Get latest player that's currently playing
132158
def getCurrentPlayer(self):
@@ -170,6 +196,9 @@ def __init__(self, session_bus, bus_name, owner = None, connect = True, _print =
170196
'track' : 0
171197
}
172198

199+
# time when the player's status was last changed
200+
self._timeStatusChanged = time.time()
201+
173202
self._rate = 1.
174203
self._positionAtLastUpdate = 0.
175204
self._timeAtLastUpdate = time.time()
@@ -335,6 +364,7 @@ def onPropertiesChanged(self, interface, properties, signature):
335364
self.refreshPosition()
336365

337366
if updated:
367+
self._timeStatusChanged = time.time()
338368
self.refreshPosition()
339369
self.printStatus()
340370

@@ -527,7 +557,13 @@ def _printFlush(status, **kwargs):
527557
PlayerManager(filter_list = filter_list, block_mode = block_mode)
528558
else:
529559
player_manager = PlayerManager(filter_list = filter_list, block_mode = block_mode, connect = False)
530-
current_player = player_manager.getCurrentPlayer()
560+
players = player_manager.readCurrentPlayersFromFile()
561+
# enumerate the players, get the most recent one that is also in the player_manager
562+
current_player = None
563+
for player in players:
564+
if player in player_manager.players.keys():
565+
current_player = player_manager.players[player]
566+
break
531567
if args.command == 'play' and current_player:
532568
current_player.play()
533569
elif args.command == 'pause' and current_player:

0 commit comments

Comments
 (0)