11
11
from dbus .mainloop .glib import DBusGMainLoop
12
12
from gi .repository import GLib
13
13
DBusGMainLoop (set_as_default = True )
14
-
14
+ import threading
15
15
16
16
FORMAT_STRING = '{icon} {artist} - {title}'
17
17
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):
34
34
35
35
if self ._connect :
36
36
self .connect ()
37
+
38
+ # keep writing the latest players to the file
39
+ threading .Thread (target = self .saveCurrentPlayersToFile ).start ()
40
+
37
41
loop = GLib .MainLoop ()
38
42
try :
39
43
loop .run ()
40
44
except KeyboardInterrupt :
45
+ self .connected = False
41
46
print ("interrupt received, stopping…" )
42
47
43
48
def connect (self ):
@@ -116,17 +121,38 @@ def changePlayerOwner(self, bus_name, old_owner, new_owner):
116
121
self .players [new_owner ] = player
117
122
del self .players [old_owner ]
118
123
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
+
119
144
# Get a list of player owners sorted by current status and age
120
145
def getSortedPlayerOwnerList (self ):
121
146
players = [
122
147
{
123
148
'number' : int (owner .split ('.' )[- 1 ]),
124
149
'status' : 2 if player .status == 'playing' else 1 if player .status == 'paused' else 0 ,
125
- 'owner' : owner
150
+ 'owner' : owner ,
151
+ 'lastChanged' : player ._timeStatusChanged
126
152
}
127
153
for owner , player in self .players .items ()
128
154
]
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' ))) ]
130
156
131
157
# Get latest player that's currently playing
132
158
def getCurrentPlayer (self ):
@@ -170,6 +196,9 @@ def __init__(self, session_bus, bus_name, owner = None, connect = True, _print =
170
196
'track' : 0
171
197
}
172
198
199
+ # time when the player's status was last changed
200
+ self ._timeStatusChanged = time .time ()
201
+
173
202
self ._rate = 1.
174
203
self ._positionAtLastUpdate = 0.
175
204
self ._timeAtLastUpdate = time .time ()
@@ -335,6 +364,7 @@ def onPropertiesChanged(self, interface, properties, signature):
335
364
self .refreshPosition ()
336
365
337
366
if updated :
367
+ self ._timeStatusChanged = time .time ()
338
368
self .refreshPosition ()
339
369
self .printStatus ()
340
370
@@ -527,7 +557,13 @@ def _printFlush(status, **kwargs):
527
557
PlayerManager (filter_list = filter_list , block_mode = block_mode )
528
558
else :
529
559
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
531
567
if args .command == 'play' and current_player :
532
568
current_player .play ()
533
569
elif args .command == 'pause' and current_player :
0 commit comments