Fix audiobooks always start from beginning on Sonos (#140663)

* play audible favorite

* play audible favorite

* simplify tests
This commit is contained in:
Pete Sage 2025-03-16 05:11:08 -04:00 committed by GitHub
parent 6b6470f345
commit 5f8564bfc5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 5 deletions

View File

@ -462,11 +462,20 @@ class SonosMediaPlayerEntity(SonosEntity, MediaPlayerEntity):
"""Play a favorite.""" """Play a favorite."""
uri = favorite.reference.get_uri() uri = favorite.reference.get_uri()
soco = self.coordinator.soco soco = self.coordinator.soco
if soco.music_source_from_uri(uri) in [ if (
MUSIC_SRC_RADIO, soco.music_source_from_uri(uri)
MUSIC_SRC_LINE_IN, in [
]: MUSIC_SRC_RADIO,
soco.play_uri(uri, title=favorite.title, timeout=LONG_SERVICE_TIMEOUT) MUSIC_SRC_LINE_IN,
]
or favorite.reference.item_class == "object.item.audioItem.audioBook"
):
soco.play_uri(
uri,
title=favorite.title,
meta=favorite.resource_meta_data,
timeout=LONG_SERVICE_TIMEOUT,
)
else: else:
soco.clear_queue() soco.clear_queue()
soco.add_to_queue(favorite.reference, timeout=LONG_SERVICE_TIMEOUT) soco.add_to_queue(favorite.reference, timeout=LONG_SERVICE_TIMEOUT)

View File

@ -692,6 +692,7 @@ async def test_select_source_line_in_tv(
"play_uri": 1, "play_uri": 1,
"play_uri_uri": "x-sonosapi-radio:ST%3aetc", "play_uri_uri": "x-sonosapi-radio:ST%3aetc",
"play_uri_title": "James Taylor Radio", "play_uri_title": "James Taylor Radio",
"play_uri_meta": '<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="100c2068ST%3a1683194971234567890" parentID="10fe2064myStations" restricted="true"><dc:title>James Taylor Radio</dc:title><upnp:class>object.item.audioItem.audioBroadcast.#station</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON60423_X_#Svc60423-99999999-Token</desc></item></DIDL-Lite>',
}, },
), ),
( (
@ -700,6 +701,16 @@ async def test_select_source_line_in_tv(
"play_uri": 1, "play_uri": 1,
"play_uri_uri": "x-sonosapi-hls:Api%3atune%3aliveAudio%3ajazzcafe%3aetc", "play_uri_uri": "x-sonosapi-hls:Api%3atune%3aliveAudio%3ajazzcafe%3aetc",
"play_uri_title": "66 - Watercolors", "play_uri_title": "66 - Watercolors",
"play_uri_meta": '<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="10090120Api%3atune%3aliveAudio%3ajazzcafe%3ae4b5402c-9999-9999-9999-4bc8e2cdccce" parentID="10086064live%3f93b0b9cb-9999-9999-9999-bcf75971fcfe" restricted="false"><dc:title>66 - Watercolors</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON9479_X_#Svc9479-99999999-Token</desc></item></DIDL-Lite>',
},
),
(
"American Tall Tales",
{
"play_uri": 1,
"play_uri_uri": "x-rincon-cpcontainer:101340c8reftitle%C9F27_com?sid=239&flags=16584&sn=5",
"play_uri_title": "American Tall Tales",
"play_uri_meta": '<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="101340c8reftitleC9F27_com" parentID="101340c8reftitleC9F27_com" restricted="true"><dc:title>American Tall Tales</dc:title><upnp:class>object.item.audioItem.audioBook</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON61191_X_#Svc6-0-Token</desc></item></DIDL-Lite>',
}, },
), ),
], ],
@ -726,6 +737,7 @@ async def test_select_source_play_uri(
soco_mock.play_uri.assert_called_with( soco_mock.play_uri.assert_called_with(
result.get("play_uri_uri"), result.get("play_uri_uri"),
title=result.get("play_uri_title"), title=result.get("play_uri_title"),
meta=result.get("play_uri_meta"),
timeout=LONG_SERVICE_TIMEOUT, timeout=LONG_SERVICE_TIMEOUT,
) )