Skip to content

Commit 7f91ee8

Browse files
Fix enqueue from interfering with buffering media (#508)
* Introduce enqueue media to store next item so we can also support seeking * Introduce buffering_media to store next item so we can also support seeking * Cleanup
1 parent ff07d0a commit 7f91ee8

1 file changed

Lines changed: 24 additions & 18 deletions

File tree

aioslimproto/client.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ def __init__(
9393
self._last_timestamp: float = 0
9494
self._elapsed_milliseconds: float = 0
9595
self._current_media: MediaDetails | None = None
96+
self._buffering_media: MediaDetails | None = None
9697
self._next_media: MediaDetails | None = None
9798
self._connected: bool = False
9899
self._last_heartbeat = 0
99100
self._auto_play: bool = False
100-
self._enqueue_pending: bool = False
101101
self._reader_task = create_task(self._socket_reader())
102102
self._heartbeat_task: asyncio.Task | None = None
103103
self._presets: list[Preset] = []
@@ -407,6 +407,7 @@ async def play_url(
407407
- send_flush: advanced option to flush the buffer before playback.
408408
"""
409409
self.logger.debug("play url (enqueue: %s): %s", enqueue, url)
410+
410411
if not url.startswith("http"):
411412
raise UnsupportedContentType(f"Invalid URL: {url}") # noqa: TRY003
412413

@@ -415,19 +416,21 @@ async def play_url(
415416
await self._send_strm(b"f", autostart=b"0")
416417
await self._send_strm(b"q", flags=0)
417418

418-
self._next_media = MediaDetails(
419+
media_details = MediaDetails(
419420
url=url,
420421
mime_type=mime_type,
421422
metadata=metadata or {},
422423
transition=transition,
423424
transition_duration=transition_duration,
424425
)
425-
self.extra_data["playlist_timestamp"] = int(time.time())
426-
self.signal_update()
427426
if enqueue:
428-
self._enqueue_pending = True
427+
self._next_media = media_details
428+
self.extra_data["playlist_timestamp"] = int(time.time())
429+
self.signal_update()
429430
return
430-
self._enqueue_pending = False
431+
self._buffering_media = media_details
432+
self.extra_data["playlist_timestamp"] = int(time.time())
433+
self.signal_update()
431434
# power on if we're not already powered
432435
if not self._powered:
433436
await self.power(powered=True)
@@ -456,7 +459,7 @@ async def play_url(
456459
"HTTPS stream requested but player does not support HTTPS, "
457460
"trying HTTP instead but playback may fail.",
458461
)
459-
self._next_media.url = url.replace("https", "http")
462+
self._buffering_media.url = url.replace("https", "http")
460463
scheme = "http"
461464
port = 80
462465

@@ -816,13 +819,15 @@ def _process_stat_stmd(self, data: bytes) -> None:
816819
self.logger.debug("STMd received - decoder ready.")
817820
if self._next_media:
818821
# a next url has been enqueued
822+
enqueued_media = self._next_media
823+
self._next_media = None
819824
asyncio.create_task(
820825
self.play_url(
821-
url=self._next_media.url,
822-
mime_type=self._next_media.mime_type,
823-
metadata=self._next_media.metadata,
824-
transition=self._next_media.transition,
825-
transition_duration=self._next_media.transition_duration,
826+
url=enqueued_media.url,
827+
mime_type=enqueued_media.mime_type,
828+
metadata=enqueued_media.metadata,
829+
transition=enqueued_media.transition,
830+
transition_duration=enqueued_media.transition_duration,
826831
enqueue=False,
827832
autostart=True,
828833
send_flush=False,
@@ -868,9 +873,9 @@ async def _process_stat_stms(self, data: bytes) -> None:
868873
"""Process incoming stat STMs message: Playback of new track has started."""
869874
self.logger.debug("STMs received - playback of new track has started")
870875
self._state = PlayerState.PLAYING
871-
if not self._enqueue_pending and self._next_media:
872-
self._current_media = self._next_media
873-
self._next_media = None
876+
if self._buffering_media:
877+
self._current_media = self._buffering_media
878+
self._buffering_media = None
874879
self.extra_data["playlist_timestamp"] = int(time.time())
875880
self.signal_update()
876881
await self._render_display("playback_start")
@@ -906,6 +911,7 @@ async def _process_stat_stmu(self, data: bytes) -> None:
906911
self._state = PlayerState.STOPPED
907912
# invalidate url/metadata
908913
self._current_media = None
914+
self._buffering_media = None
909915
self._next_media = None
910916
self.extra_data["playlist_timestamp"] = int(time.time())
911917
self.signal_update()
@@ -963,10 +969,10 @@ async def _process_resp(self, data: bytes) -> None:
963969
# parse ICY metadata
964970
if (
965971
"icy-name" in headers
966-
and self._next_media
967-
and not self._next_media.metadata.get("title")
972+
and self._buffering_media
973+
and not self._buffering_media.metadata.get("title")
968974
):
969-
self._next_media.metadata["title"] = headers["icy-name"]
975+
self._buffering_media.metadata["title"] = headers["icy-name"]
970976

971977
# send continue (used when autoplay 1 or 3)
972978
if self._auto_play:

0 commit comments

Comments
 (0)