return
# enqueue next track on the player if we're not in flow mode
task_id = f"enqueue_next_item_{queue_id}"
- self.mass.call_later(5, self._enqueue_next_item, queue_id, item_id, task_id=task_id)
+ self.mass.call_later(2, self._enqueue_next_item, queue_id, item_id, task_id=task_id)
# Main queue manipulation methods
VolumeNormalizationMode,
)
from music_assistant_models.errors import (
+ AudioError,
InvalidDataError,
MediaNotFoundError,
MusicAssistantError,
buffer = buffer[pcm_format.pcm_sample_size :]
# end of audio/track reached
+ if bytes_sent == 0:
+ # edge case: no audio data was sent
+ raise AudioError("No audio was received")
+
logger.log(VERBOSE_LOG_LEVEL, "End of stream reached.")
if strip_silence_end and buffer:
# strip silence from end of audio
yield buffer
del buffer
finished = True
-
+ except Exception as err:
+ if isinstance(err, asyncio.CancelledError):
+ # we were cancelled, just raise
+ raise
+ logger.error("Error while streaming %s: %s", streamdetails.uri, err)
+ streamdetails.stream_error = True
finally:
logger.log(VERBOSE_LOG_LEVEL, "Closing ffmpeg...")
await ffmpeg_proc.close()
- if bytes_sent == 0:
- # edge case: no audio data was sent
- streamdetails.stream_error = True
- seconds_streamed = 0
- logger.warning("Stream error on %s", streamdetails.uri)
- else:
- # try to determine how many seconds we've streamed
- seconds_streamed = bytes_sent / pcm_format.pcm_sample_size if bytes_sent else 0
- logger.debug(
- "stream %s (with code %s) for %s - seconds streamed: %s",
- "finished" if finished else "aborted",
- ffmpeg_proc.returncode,
- streamdetails.uri,
- seconds_streamed,
- )
-
+ # try to determine how many seconds we've streamed
+ seconds_streamed = bytes_sent / pcm_format.pcm_sample_size if bytes_sent else 0
+ logger.debug(
+ "stream %s (with code %s) for %s - seconds streamed: %s",
+ "finished" if finished else "aborted",
+ ffmpeg_proc.returncode,
+ streamdetails.uri,
+ seconds_streamed,
+ )
streamdetails.seconds_streamed = seconds_streamed
# store accurate duration
if finished and not streamdetails.seek_position and seconds_streamed:
generator_exhausted = True
except Exception as err:
cancelled = isinstance(err, asyncio.CancelledError)
- if not cancelled:
- self.logger.error(
- "Stream error: %s",
- str(err) or err.__class__.__name__,
- exc_info=err if self.logger.isEnabledFor(VERBOSE_LOG_LEVEL) else None,
- )
+ if cancelled:
+ raise
+ self.logger.error(
+ "Stream error: %s",
+ str(err) or err.__class__.__name__,
+ exc_info=err if self.logger.isEnabledFor(VERBOSE_LOG_LEVEL) else None,
+ )
finally:
if not cancelled:
await self.write_eof()