# try to recover from the situation where the player itself requests
# a stream that is already done
- if queue_stream is None:
+ if queue_stream is None or queue_stream.done.is_set():
self.logger.warning(
- "Got stream request for unknown or finished id: %s, trying resume",
+ "Got stream request for unknown or finished stream: %s",
stream_id,
)
if player := self.mass.players.get_player(client_id):
self.mass.create_task(player.active_queue.resume())
return web.FileResponse(SILENCE_FILE)
return web.Response(status=404)
- if queue_stream.done.is_set():
- self.logger.warning(
- "Got stream request for finished stream: %s, assuming resume", stream_id
- )
- self.mass.create_task(queue_stream.queue.resume())
- return web.FileResponse(SILENCE_FILE)
# handle a second connection for the same player
# this means either that the player itself want to skip to the next track
# or a misbehaving client which reconnects multiple times (e.g. Kodi)
- if queue_stream.all_clients_connected.is_set():
- self.logger.warning(
- "Got stream request for running stream: %s, assuming next", stream_id
- )
- self.mass.create_task(queue_stream.queue.next())
- return web.FileResponse(SILENCE_FILE)
-
if client_id in queue_stream.connected_clients:
self.logger.warning(
- "Simultanuous connections detected from %s, playback may be disturbed",
+ "Simultanuous connections detected from %s, playback may be disturbed!",
client_id,
)
client_id += uuid4().hex
+ elif queue_stream.all_clients_connected.is_set():
+ self.logger.info(
+ "Got stream request for running stream: %s, assuming next", stream_id
+ )
+ if not queue_stream.signal_next and queue_stream.queue.items:
+ self.mass.create_task(queue_stream.queue.next())
+ return web.FileResponse(SILENCE_FILE)
# prepare request, add some DLNA/UPNP compatible headers
headers = {
if self.closed:
return
if self.logger.isEnabledFor(logging.DEBUG):
- self.logger.getChild("event").debug(
- "%s %s", event.type.value, event.object_id or ""
- )
+ # do not log queue time updated events because that is too chatty
+ if event.type != EventType.QUEUE_TIME_UPDATED:
+ self.logger.getChild("event").debug(
+ "%s %s", event.type.value, event.object_id or ""
+ )
for cb_func, event_filter, id_filter in self._listeners:
if not (event_filter is None or event.type in event_filter):
continue
# create task from coroutine and attach task_done callback
next_job.timestamp = time()
next_job.status = JobStatus.RUNNING
- self.logger.debug("Start processing job [%s].", next_job.name)
task = self.create_task(next_job.coro)
task.set_name(next_job.name)
task.add_done_callback(partial(self.__job_done_cb, job=next_job))
job.timestamp = execution_time
if task.cancelled():
job.status = JobStatus.CANCELLED
- self.logger.debug("Job [%s] is cancelled.", job.name)
elif err := task.exception():
job.status = JobStatus.ERROR
self.logger.error(