88from typing import List
99
1010from music_assistant .constants import (
11- EVENT_PLAYBACK_STARTED ,
12- EVENT_PLAYBACK_STOPPED ,
1311 EVENT_QUEUE_ITEMS_UPDATED ,
12+ EVENT_QUEUE_TIME_UPDATED ,
1413 EVENT_QUEUE_UPDATED ,
1514)
1615from music_assistant .models .media_types import Track
@@ -67,7 +66,6 @@ def __init__(self, mass, player_id):
6766 self ._last_item_time = 0
6867 self ._last_queue_startindex = 0
6968 self ._next_queue_startindex = 0
70- self ._last_player_state = PlayerState .Stopped
7169 self ._last_track = None
7270 # load previous queue settings from disk
7371 self .mass .add_job (self .__async_restore_saved_state ())
@@ -237,6 +235,7 @@ async def async_next(self):
237235 return
238236 if self .use_queue_stream :
239237 return await self .async_play_index (self .cur_index + 1 )
238+ await self .mass .player_manager .async_cmd_power_on (self .player_id )
240239 return await self .mass .player_manager .get_player_provider (
241240 self .player_id
242241 ).async_cmd_next (self .player_id )
@@ -245,13 +244,15 @@ async def async_previous(self):
245244 """Play the previous track in the queue."""
246245 if self .cur_index is None :
247246 return
247+ await self .mass .player_manager .async_cmd_power_on (self .player_id )
248248 if self .use_queue_stream :
249249 return await self .async_play_index (self .cur_index - 1 )
250250 return await self .mass .player_manager .async_cmd_previous (self .player_id )
251251
252252 async def async_resume (self ):
253253 """Resume previous queue."""
254254 if self .items :
255+ await self .mass .player_manager .async_cmd_power_on (self .player_id )
255256 prev_index = self .cur_index
256257 supports_queue = PlayerFeature .QUEUE in self .player .features
257258 if self .use_queue_stream or not supports_queue :
@@ -271,6 +272,7 @@ async def async_resume(self):
271272
272273 async def async_play_index (self , index ):
273274 """Play item at index X in queue."""
275+ await self .mass .player_manager .async_cmd_power_on (self .player_id )
274276 player_prov = self .mass .player_manager .get_player_provider (self .player_id )
275277 supports_queue = PlayerFeature .QUEUE in self .player .features
276278 if not isinstance (index , int ):
@@ -329,6 +331,7 @@ async def async_move_item(self, queue_item_id, pos_shift=1):
329331
330332 async def async_load (self , queue_items : List [QueueItem ]):
331333 """Load (overwrite) queue with new items."""
334+ await self .mass .player_manager .async_cmd_power_on (self .player_id )
332335 supports_queue = PlayerFeature .QUEUE in self .player .features
333336 for index , item in enumerate (queue_items ):
334337 item .sort_index = index
@@ -470,7 +473,6 @@ async def async_update_state(self):
470473 break
471474 # process new index
472475 await self .async_process_queue_update (cur_index , track_time )
473- self .mass .signal_event (EVENT_QUEUE_UPDATED , self .to_dict ())
474476
475477 async def async_start_queue_stream (self ):
476478 """Call when queue_streamer starts playing the queue stream."""
@@ -521,34 +523,21 @@ def __get_queue_stream_index(self):
521523 async def async_process_queue_update (self , new_index , track_time ):
522524 """Compare the queue index to determine if playback changed."""
523525 new_track = self .get_item (new_index )
524- if (not self ._last_track and new_track ) or self ._last_track != new_track :
526+ self ._cur_item_time = track_time
527+ self ._cur_index = new_index
528+ if self ._last_track != new_track :
525529 # queue track updated
526- # account for track changing state so trigger track change after 1 second
527- if self ._last_track and self ._last_track .streamdetails :
528- self ._last_track .streamdetails .seconds_played = self ._last_item_time
529- self .mass .signal_event (
530- EVENT_PLAYBACK_STOPPED , self ._last_track .streamdetails
531- )
532- if new_track and new_track .streamdetails :
533- self .mass .signal_event (EVENT_PLAYBACK_STARTED , new_track .streamdetails )
534- self ._last_track = new_track
535- if self ._last_player_state != self .player .state :
536- self ._last_player_state = self .player .state
537- if self .player .elapsed_time == 0 and self .player .state in [
538- PlayerState .Stopped ,
539- PlayerState .Off ,
540- ]:
541- # player stopped playing
542- if self ._last_track :
543- self .mass .signal_event (
544- EVENT_PLAYBACK_STOPPED , self ._last_track .streamdetails
545- )
530+ self ._last_track = new_track
531+ self .mass .signal_event (EVENT_QUEUE_UPDATED , self .to_dict ())
532+ if self ._last_track :
533+ self ._last_track .streamdetails = None # invalidate streamdetails
546534 # update vars
547- if track_time > 2 :
548- # account for track changing state so keep this a few seconds behind
535+ if self ._last_item_time != track_time :
549536 self ._last_item_time = track_time
550- self ._cur_item_time = track_time
551- self ._cur_index = new_index
537+ self .mass .signal_event (
538+ EVENT_QUEUE_TIME_UPDATED ,
539+ {"player_id" : self .player_id , "cur_item_time" : track_time },
540+ )
552541
553542 @staticmethod
554543 def __shuffle_items (queue_items ):
0 commit comments