Add/improve e2e tests (#142)

https://github.com/gesellix/Bose-SoundTouch/issues/135
This commit is contained in:
Tobias Gesellchen
2026-04-04 13:10:13 +02:00
committed by GitHub
parent b79a168084
commit 7c92a785a4
10 changed files with 240 additions and 62 deletions
+3
View File
@@ -125,6 +125,9 @@ test-http-client:
/workdir/power_on.http \
/workdir/get_bmx_services.http \
/workdir/get_sourceproviders.http \
/workdir/get_software_update.http \
/workdir/get_soundtouch_updates.http \
/workdir/get_streaming_token.http \
/workdir/get_provider_settings.http \
/workdir/tunein_playback_station.http \
/workdir/set_preset_6.http \
@@ -25,10 +25,10 @@ User-Agent: Bose_Lisa/27.0.6
var settings = response.body.getElementsByTagName("providerSetting");
for (var i = 0; i < settings.length; i++) {
var setting = settings[i];
client.assert(setting.getElementsByTagName("boseId").length > 0, "Setting " + i + " missing 'boseId'");
client.assert(setting.getElementsByTagName("keyName").length > 0, "Setting " + i + " missing 'keyName'");
client.assert(setting.getElementsByTagName("value").length > 0, "Setting " + i + " missing 'value'");
client.assert(setting.getElementsByTagName("providerId").length > 0, "Setting " + i + " missing 'providerId'");
client.assert(setting.getElementsByTagName("boseId")[0].textContent.length > 0, "Setting " + i + " missing or empty 'boseId'");
client.assert(setting.getElementsByTagName("keyName")[0].textContent.length > 0, "Setting " + i + " missing or empty 'keyName'");
client.assert(setting.getElementsByTagName("value")[0].textContent.length > 0, "Setting " + i + " missing or empty 'value'");
client.assert(setting.getElementsByTagName("providerId")[0].textContent.length > 0, "Setting " + i + " missing or empty 'providerId'");
}
});
%}
@@ -0,0 +1,22 @@
### GET /streaming/software/update/account/{{accountId}}
GET {{host}}/streaming/software/update/account/{{accountId}}
User-Agent: Bose_Lisa/27.0.6
Accept: application/vnd.bose.streaming-v1.2+xml
Authorization: Bearer {{token}}
Content-Type: application/vnd.bose.streaming-v1.2+xml
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content-type is correct", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/vnd.bose.streaming-v1.2+xml", "Expected 'application/vnd.bose.streaming-v1.2+xml' but received '" + type + "'");
});
client.test("Response body structure", function() {
client.assert(response.body.getElementsByTagName("software_update").length > 0, "Missing 'software_update' root element");
client.assert(response.body.getElementsByTagName("softwareUpdateLocation").length > 0, "Missing 'softwareUpdateLocation' element");
});
%}
@@ -0,0 +1,20 @@
### GET /updates/soundtouch
GET {{host}}/updates/soundtouch?serialnumber={{serialNumber}}
User-Agent: Bose_Lisa/27.0.6
Accept: */*
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content-type is correct", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/vnd.bose.streaming-v1.2+xml", "Expected 'application/vnd.bose.streaming-v1.2+xml' but received '" + type + "'");
});
client.test("Response body structure", function() {
client.assert(response.body.getElementsByTagName("INDEX").length > 0, "Missing 'INDEX' root element");
client.assert(response.body.getElementsByTagName("DEVICE").length > 0, "Missing 'DEVICE' elements");
});
%}
@@ -18,17 +18,21 @@ Accept: application/vnd.bose.streaming-v1.2+xml
client.assert(response.body.getElementsByTagName("sourceprovider").length > 0, "Missing 'sourceprovider' elements");
});
client.test("Check specific source providers", function() {
client.test("Check source providers", function() {
var providers = response.body.getElementsByTagName("sourceprovider");
client.assert(providers.length > 0, "No 'sourceprovider' elements found");
var foundSpotify = false;
var foundTuneIn = false;
for (var i = 0; i < providers.length; i++) {
var provider = providers[i];
var id = provider.getAttribute("id");
var nameElement = provider.getElementsByTagName("name")[0];
var name = nameElement ? nameElement.textContent : "";
client.assert(id && id.length > 0, "Source provider at index " + i + " missing or empty 'id' attribute");
client.assert(name && name.length > 0, "Source provider at index " + i + " missing or empty 'name' element");
if (id === "15" && name === "SPOTIFY") {
foundSpotify = true;
}
@@ -0,0 +1,24 @@
### GET /streaming/device/{{deviceId}}/streaming_token
GET {{host}}/streaming/device/{{deviceId}}/streaming_token
User-Agent: Bose_Lisa/27.0.6
Accept: application/vnd.bose.streaming-v1.2+xml
Authorization: Bearer {{token}}
Content-Type: application/vnd.bose.streaming-v1.2+xml
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content-type is correct", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/vnd.bose.streaming-v1.2+xml", "Expected 'application/vnd.bose.streaming-v1.2+xml' but received '" + type + "'");
});
client.test("Response body structure", function() {
client.assert(response.body.getElementsByTagName("bearertoken").length > 0, "Missing 'bearertoken' element");
var tokenValue = response.body.getElementsByTagName("bearertoken")[0].getAttribute("value");
client.assert(tokenValue.startsWith("Bearer "), "Token value should start with 'Bearer '");
client.assert(tokenValue.length > 7, "Bearer token should not be empty");
});
%}
@@ -14,6 +14,7 @@
"deviceName": "SoundTouch-11",
"spotifyUserId": "13570",
"spotifyToken": "example-spotify-token",
"spotifyRefreshToken": "example-spotify-refresh-token",
"spotifyDisplayName": "For Lovers, Not Killers",
"bmxApiKey": "bmx-api-key"
},
@@ -32,6 +33,7 @@
"deviceName": "SoundTouch-12",
"spotifyUserId": "13570",
"spotifyToken": "example-spotify-token",
"spotifyRefreshToken": "example-spotify-refresh-token",
"spotifyDisplayName": "For Lovers, Not Killers",
"bmxApiKey": "bmx-api-key"
}
@@ -0,0 +1,37 @@
### POST /oauth/device/{{deviceId}}/music/musicprovider/15/token/cs3
POST {{host}}/oauth/device/{{deviceId}}/music/musicprovider/15/token/cs3
Accept: */*
Authorization: Bearer {{token}}
Content-Type: application/json
{
"code": "",
"grant_type": "refresh_token",
"redirect_uri": "",
"refresh_token": "{{spotifyRefreshToken}}"
}
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
client.test("Response content type is JSON", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");
});
client.test("Response body has expected structure", function() {
client.assert(response.body.hasOwnProperty("access_token"), "Response body missing 'access_token'");
client.assert(response.body.access_token.length > 0, "access_token is empty");
client.assert(response.body.hasOwnProperty("expires_in"), "Response body missing 'expires_in'");
client.assert(typeof response.body.expires_in === "number", "expires_in is not a number");
client.assert(response.body.hasOwnProperty("scope"), "Response body missing 'scope'");
client.assert(response.body.scope.length > 0, "scope is empty");
client.assert(response.body.hasOwnProperty("token_type"), "Response body missing 'token_type'");
client.assert(response.body.token_type === "Bearer", "token_type is not 'Bearer'");
});
%}
@@ -0,0 +1,66 @@
### POST /streaming/account/{{accountId}}/device/{{deviceId}}/recent
POST {{host}}/streaming/account/{{accountId}}/device/{{deviceId}}/recent
User-Agent: Bose_Lisa/27.0.6
Accept: application/vnd.bose.streaming-v1.2+xml
Authorization: Bearer {{token}}
Content-Type: application/vnd.bose.streaming-v1.2+xml
<?xml version="1.0" encoding="UTF-8" ?>
<recent>
<lastplayedat>2026-03-29T21:33:00+00:00</lastplayedat>
<sourceid>14774275</sourceid>
<name>SMOOTH JAZZ</name>
<location>/v1/playback/station/s166521</location>
<contentItemType>stationurl</contentItemType>
</recent>
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 201, "Response status is not 201");
});
client.test("Response content-type is correct", function() {
var type = response.contentType.mimeType;
client.assert(type === "application/vnd.bose.streaming-v1.2+xml", "Expected 'application/vnd.bose.streaming-v1.2+xml' but received '" + type + "'");
});
client.test("Response body structure", function() {
var recent = response.body.getElementsByTagName("recent")[0];
client.assert(recent !== null, "Missing 'recent' root element");
client.assert(recent.getAttribute("id").length > 0, "Missing or empty 'id' attribute on 'recent' element");
client.assert(recent.getElementsByTagName("contentItemType")[0].textContent.length > 0, "Missing or empty 'contentItemType'");
client.assert(recent.getElementsByTagName("createdOn")[0].textContent.length > 0, "Missing or empty 'createdOn'");
client.assert(recent.getElementsByTagName("lastplayedat")[0].textContent.length > 0, "Missing or empty 'lastplayedat'");
client.assert(recent.getElementsByTagName("location")[0].textContent.length > 0, "Missing or empty 'location'");
client.assert(recent.getElementsByTagName("name")[0].textContent.length > 0, "Missing or empty 'name'");
var source = recent.getElementsByTagName("source")[0];
client.assert(source !== null, "Missing 'source' element");
client.assert(source.getAttribute("id").length > 0, "Missing or empty 'source' id");
client.assert(source.getAttribute("type").length > 0, "Missing or empty 'source' type");
var source_createdOn = source.getElementsByTagName("createdOn");
if (source_createdOn.length > 0) {
client.assert(source_createdOn[0].textContent.length > 0, "Empty source 'createdOn'");
}
var credential = source.getElementsByTagName("credential")[0];
client.assert(credential.getAttribute("type").length > 0, "Missing or empty credential 'type'");
client.assert(credential.textContent.length > 0, "Missing or empty credential value");
client.assert(source.getElementsByTagName("name")[0] !== null, "Missing source 'name'");
client.assert(source.getElementsByTagName("sourceproviderid")[0].textContent.length > 0, "Missing or empty source 'sourceproviderid'");
client.assert(source.getElementsByTagName("sourcename")[0] !== null, "Missing source 'sourcename'");
var source_sourceSettings = source.getElementsByTagName("sourceSettings");
if (source_sourceSettings.length > 0) {
client.assert(source_sourceSettings[0] !== null, "Missing 'sourceSettings'");
}
var source_updatedOn = source.getElementsByTagName("updatedOn");
if (source_updatedOn.length > 0) {
client.assert(source_updatedOn[0].textContent.length > 0, "Empty source 'updatedOn'");
}
client.assert(source.getElementsByTagName("username")[0] !== null, "Missing source 'username'");
client.assert(recent.getElementsByTagName("sourceid")[0].textContent.length > 0, "Missing or empty 'sourceid'");
client.assert(recent.getElementsByTagName("updatedOn")[0].textContent.length > 0, "Missing or empty 'updatedOn'");
});
%}
+56 -56
View File
@@ -28,24 +28,24 @@ Interactions for `20260328-103522-477978/`:
| 0024 | self | | GET /streaming/account/{{accountId}}/full | 200 OK | ./self/streaming/account/{accountId}/full/0024-20260328-103733.945-GET.http |
| 0025 | mirror | | GET /streaming/account/{{accountId}}/full | 200 OK | ./mirror/streaming/account/{accountId}/full/0025-20260328-103734.751-GET.http |
| 0026 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0026-20260328-103735.894-GET.http |
| 0027 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0027-20260328-103735.914-GET.http |
| 0028 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0028-20260328-103735.931-GET.http |
| 0027 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0027-20260328-103735.914-GET.http |
| 0028 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0028-20260328-103735.931-GET.http |
| 0029 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0029-20260328-103735.954-GET.http |
| 0030 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0030-20260328-103736.065-GET.http |
| 0031 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0031-20260328-103736.093-GET.http |
| 0031 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0031-20260328-103736.093-GET.http |
| 0032 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0032-20260328-103736.130-GET.http |
| 0033 | self | | POST /oauth/device/{{device_id}}/music/musicprovider/15/token/cs3 | 200 OK | ./self/oauth/device/{device_id}/music/musicprovider/15/token/cs3/0033-20260328-103737.874-POST.http |
| 0034 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/presets | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/presets/0034-20260328-103905.297-GET.http |
| 0035 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0035-20260328-103905.306-GET.http |
| 0035 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0035-20260328-103905.306-GET.http |
| 0036 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/presets | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/presets/0036-20260328-103905.479-GET.http |
| 0037 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0037-20260328-103905.669-GET.http |
| 0038 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0038-20260328-103905.929-GET.http |
| 0039 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0039-20260328-104218.080-GET.http |
| 0040 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0040-20260328-104218.267-GET.http |
| 0041 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0041-20260328-104218.524-GET.http |
| 0042 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0042-20260328-104325.629-GET.http |
| 0043 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0043-20260328-104325.814-GET.http |
| 0044 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0044-20260328-104326.087-GET.http |
| 0037 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0037-20260328-103905.669-GET.http |
| 0038 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0038-20260328-103905.929-GET.http |
| 0039 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0039-20260328-104218.080-GET.http |
| 0040 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0040-20260328-104218.267-GET.http |
| 0041 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0041-20260328-104218.524-GET.http |
| 0042 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0042-20260328-104325.629-GET.http |
| 0043 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0043-20260328-104325.814-GET.http |
| 0044 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0044-20260328-104326.087-GET.http |
| 0045 | upstream | | DELETE https://streaming.bose.com/streaming/account/{{accountId}}/device/{{device_id}} | 400 Bad Request | ./upstream/streaming/account/{accountId}/device/{device_id}/0045-20260328-104348.987-DELETE.http |
| 0046 | self | | DELETE /streaming/account/{{accountId}}/device/{{device_id}} | 400 Bad Request | ./self/streaming/account/{accountId}/device/{device_id}/0046-20260328-104348.988-DELETE.http |
| 0047 | mirror | | DELETE /streaming/account/{{accountId}}/device/{{device_id}} | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/0047-20260328-104348.989-DELETE.http |
@@ -60,25 +60,25 @@ Interactions for `20260328-103522-477978/`:
| 0056 | self | | GET /streaming/account/{{accountId}}/full | 200 OK | ./self/streaming/account/{accountId}/full/0056-20260328-105135.102-GET.http |
| 0057 | mirror | | GET /streaming/account/{{accountId}}/full | 200 OK | ./mirror/streaming/account/{accountId}/full/0057-20260328-105135.727-GET.http |
| 0058 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0058-20260328-105138.259-GET.http |
| 0059 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0059-20260328-105138.265-GET.http |
| 0059 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0059-20260328-105138.265-GET.http |
| 0060 | self | ☑ | POST /streaming/support/customersupport | 200 OK | ./self/streaming/support/customersupport/0060-20260328-105138.304-POST.http |
| 0061 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0061-20260328-105138.369-GET.http |
| 0062 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0062-20260328-105138.442-GET.http |
| 0063 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0063-20260328-105138.464-GET.http |
| 0063 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0063-20260328-105138.464-GET.http |
| 0064 | mirror | ☑ | POST /streaming/support/customersupport | 200 OK | ./mirror/streaming/support/customersupport/0064-20260328-105138.499-POST.http |
| 0065 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0065-20260328-105138.554-GET.http |
| 0066 | upstream | | GET https://events.api.bosecm.com/v1/blacklist/{{device_id}} | 405 Method Not Allowed | ./upstream/v1/blacklist/{device_id}/0066-20260328-105138.587-GET.http |
| 0067 | self | | GET /v1/blacklist/{{device_id}} | 405 Method Not Allowed | ./self/v1/blacklist/{device_id}/0067-20260328-105138.588-GET.http |
| 0068 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0068-20260328-105138.703-GET.http |
| 0068 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0068-20260328-105138.703-GET.http |
| 0069 | self | ☑ | GET / | 200 OK | ./self/root/0069-20260328-105138.868-GET.http |
| 0070 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0070-20260328-105139.565-GET.http |
| 0070 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0070-20260328-105139.565-GET.http |
| 0071 | self | ☑ | GET /streaming/sourceproviders | 200 OK | ./self/streaming/sourceproviders/0071-20260328-105139.581-GET.http |
| 0072 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0072-20260328-105139.612-GET.http |
| 0073 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0073-20260328-105139.857-GET.http |
| 0073 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0073-20260328-105139.857-GET.http |
| 0074 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0074-20260328-105139.861-GET.http |
| 0075 | self | | GET /streaming/account/{{accountId}}/full | 200 OK | ./self/streaming/account/{accountId}/full/0075-20260328-105140.030-GET.http |
| 0076 | mirror | | GET /streaming/account/{{accountId}}/full | 200 OK | ./mirror/streaming/account/{accountId}/full/0076-20260328-105140.172-GET.http |
| 0077 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0077-20260328-105140.196-GET.http |
| 0077 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0077-20260328-105140.196-GET.http |
| 0078 | upstream | | GET https://events.api.bosecm.com/v1/blacklist/{{device_id}} | 405 Method Not Allowed | ./upstream/v1/blacklist/{device_id}/0078-20260328-105146.094-GET.http |
| 0079 | self | | GET /v1/blacklist/{{device_id}} | 405 Method Not Allowed | ./self/v1/blacklist/{device_id}/0079-20260328-105146.094-GET.http |
| 0080 | self | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./self/v1/scmudc/{device_id}/0080-20260328-105146.457-POST.http |
@@ -104,16 +104,16 @@ Interactions for `20260328-103522-477978/`:
| 0100 | self | | GET /streaming/account/{{accountId}}/full | 200 OK | ./self/streaming/account/{accountId}/full/0100-20260328-105552.656-GET.http |
| 0101 | mirror | | GET /streaming/account/{{accountId}}/full | 200 OK | ./mirror/streaming/account/{accountId}/full/0101-20260328-105552.796-GET.http |
| 0102 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0102-20260328-105554.172-GET.http |
| 0103 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0103-20260328-105554.207-GET.http |
| 0104 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0104-20260328-105554.210-GET.http |
| 0103 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0103-20260328-105554.207-GET.http |
| 0104 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0104-20260328-105554.210-GET.http |
| 0105 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0105-20260328-105554.216-GET.http |
| 0106 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0106-20260328-105554.347-GET.http |
| 0107 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0107-20260328-105554.395-GET.http |
| 0108 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0108-20260328-105554.406-GET.http |
| 0108 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0108-20260328-105554.406-GET.http |
| 0109 | self | | POST /oauth/device/{{device_id}}/music/musicprovider/15/token/cs3 | 200 OK | ./self/oauth/device/{device_id}/music/musicprovider/15/token/cs3/0109-20260328-105556.138-POST.http |
| 0110 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0110-20260328-105606.529-GET.http |
| 0111 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0111-20260328-105606.699-GET.http |
| 0112 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0112-20260328-105606.961-GET.http |
| 0110 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0110-20260328-105606.529-GET.http |
| 0111 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0111-20260328-105606.699-GET.http |
| 0112 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0112-20260328-105606.961-GET.http |
| 0113 | self | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./self/v1/scmudc/{device_id}/0113-20260328-105612.425-POST.http |
| 0114 | self | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./self/v1/scmudc/{device_id}/0114-20260328-105612.493-POST.http |
| 0115 | self | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./self/v1/scmudc/{device_id}/0115-20260328-105612.582-POST.http |
@@ -124,35 +124,35 @@ Interactions for `20260328-103522-477978/`:
| 0120 | mirror | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./mirror/v1/scmudc/{device_id}/0120-20260328-105614.649-POST.http |
| 0121 | self | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./self/v1/scmudc/{device_id}/0121-20260328-111412.273-POST.http |
| 0122 | mirror | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./mirror/v1/scmudc/{device_id}/0122-20260328-111412.689-POST.http |
| 0123 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0123-20260328-170446.020-GET.http |
| 0124 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0124-20260328-170446.206-GET.http |
| 0125 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0125-20260328-202258.172-GET.http |
| 0126 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0126-20260328-202258.374-GET.http |
| 0127 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0127-20260328-202300.656-GET.http |
| 0128 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0128-20260328-202300.841-GET.http |
| 0129 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0129-20260328-205953.361-GET.http |
| 0130 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0130-20260328-205953.560-GET.http |
| 0131 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0131-20260328-210005.518-GET.http |
| 0132 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0132-20260328-210005.707-GET.http |
| 0133 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0133-20260329-094502.893-GET.http |
| 0134 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0134-20260329-094503.109-GET.http |
| 0135 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0135-20260329-094510.575-GET.http |
| 0136 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0136-20260329-094510.907-GET.http |
| 0137 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0137-20260329-102911.229-GET.http |
| 0138 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0138-20260329-102911.443-GET.http |
| 0139 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0139-20260329-102923.636-GET.http |
| 0140 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0140-20260329-102923.807-GET.http |
| 0141 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0141-20260329-155214.420-GET.http |
| 0142 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0142-20260329-155216.805-GET.http |
| 0143 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0143-20260329-155221.905-GET.http |
| 0144 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0144-20260329-155222.082-GET.http |
| 0123 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0123-20260328-170446.020-GET.http |
| 0124 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0124-20260328-170446.206-GET.http |
| 0125 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0125-20260328-202258.172-GET.http |
| 0126 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0126-20260328-202258.374-GET.http |
| 0127 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0127-20260328-202300.656-GET.http |
| 0128 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0128-20260328-202300.841-GET.http |
| 0129 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0129-20260328-205953.361-GET.http |
| 0130 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0130-20260328-205953.560-GET.http |
| 0131 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0131-20260328-210005.518-GET.http |
| 0132 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0132-20260328-210005.707-GET.http |
| 0133 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0133-20260329-094502.893-GET.http |
| 0134 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0134-20260329-094503.109-GET.http |
| 0135 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0135-20260329-094510.575-GET.http |
| 0136 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0136-20260329-094510.907-GET.http |
| 0137 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0137-20260329-102911.229-GET.http |
| 0138 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0138-20260329-102911.443-GET.http |
| 0139 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0139-20260329-102923.636-GET.http |
| 0140 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0140-20260329-102923.807-GET.http |
| 0141 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0141-20260329-155214.420-GET.http |
| 0142 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0142-20260329-155216.805-GET.http |
| 0143 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0143-20260329-155221.905-GET.http |
| 0144 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0144-20260329-155222.082-GET.http |
| 0145 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/recents | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/recents/0145-20260329-185442.017-GET.http |
| 0146 | upstream | | GET https://streaming.bose.com/streaming/account/{{accountId}}/device/{{device_id}}/recents | 200 OK | ./upstream/streaming/account/{accountId}/device/{device_id}/recents/0146-20260329-185442.128-GET.http |
| 0147 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/recents | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/recents/0147-20260329-185442.130-GET.http |
| 0148 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0148-20260329-193915.264-GET.http |
| 0149 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0149-20260329-193915.468-GET.http |
| 0150 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0150-20260329-215246.808-GET.http |
| 0151 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0151-20260329-215247.001-GET.http |
| 0148 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0148-20260329-193915.264-GET.http |
| 0149 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0149-20260329-193915.468-GET.http |
| 0150 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0150-20260329-215246.808-GET.http |
| 0151 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0151-20260329-215247.001-GET.http |
| 0152 | self | ☑ | GET / | 200 OK | ./self/root/0152-20260329-233126.264-GET.http |
| 0153 | self | ☑ | GET /mgmt/spotify/accounts | 200 OK | ./self/mgmt/spotify/accounts/0153-20260329-233126.506-GET.http |
| 0154 | self | ☑ | GET /mgmt/spotify/accounts | 200 OK | ./self/mgmt/spotify/accounts/0154-20260329-233126.515-GET.http |
@@ -200,11 +200,11 @@ Interactions for `20260328-103522-477978/`:
| 0196 | mirror | | POST /bmx/tunein/v1/report?stream_id=e536753726&guide_id=s166521&listen_id=1774819980&stream_type=liveRadio | 200 OK | ./mirror/bmx/tunein/v1/report/0196-20260329-233306.072-POST.http |
| 0197 | upstream | | POST https://content.api.bose.io/bmx/tunein/v1/report?stream_id=e536753726&guide_id=s166521&listen_id=1774819980&stream_type=liveRadio | 200 OK | ./upstream/bmx/tunein/v1/report/0197-20260329-233306.182-POST.http |
| 0198 | self | | POST /bmx/tunein/v1/report?stream_id=e536753726&guide_id=s166521&listen_id=1774819980&stream_type=liveRadio | 200 OK | ./self/bmx/tunein/v1/report/0198-20260329-233306.184-POST.http |
| 0199 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0199-20260329-233317.196-GET.http |
| 0199 | self | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./self/streaming/software/update/account/{accountId}/0199-20260329-233317.196-GET.http |
| 0200 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/presets | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/presets/0200-20260329-233317.206-GET.http |
| 0201 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/presets | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/presets/0201-20260329-233317.394-GET.http |
| 0202 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0202-20260329-233317.409-GET.http |
| 0203 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0203-20260329-233317.838-GET.http |
| 0202 | mirror | | GET /streaming/software/update/account/{{accountId}} | 200 OK | ./mirror/streaming/software/update/account/{accountId}/0202-20260329-233317.409-GET.http |
| 0203 | self | | GET /updates/soundtouch?serialnumber=_serial_ | 200 OK | ./self/updates/soundtouch/0203-20260329-233317.838-GET.http |
| 0204 | self | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./self/v1/scmudc/{device_id}/0204-20260329-233330.871-POST.http |
| 0205 | mirror | | PUT /streaming/account/{{accountId}}/device/{{device_id}}/preset/6 | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/preset/6/0205-20260329-233331.093-PUT.http |
| 0206 | upstream | | PUT https://streaming.bose.com/streaming/account/{{accountId}}/device/{{device_id}}/preset/6 | 500 Internal Server Error | ./upstream/streaming/account/{accountId}/device/{device_id}/preset/6/0206-20260329-233331.096-PUT.http |
@@ -239,10 +239,10 @@ Interactions for `20260328-103522-477978/`:
| 0235 | self | | GET /streaming/account/{{accountId}}/full | 200 OK | ./self/streaming/account/{accountId}/full/0235-20260329-233507.099-GET.http |
| 0236 | mirror | ☑ | POST /v1/scmudc/{{device_id}} | 200 OK | ./mirror/v1/scmudc/{device_id}/0236-20260329-233507.137-POST.http |
| 0237 | mirror | | GET /streaming/account/{{accountId}}/full | 200 OK | ./mirror/streaming/account/{accountId}/full/0237-20260329-233507.277-GET.http |
| 0238 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0238-20260329-233508.639-GET.http |
| 0239 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0239-20260329-233508.642-GET.http |
| 0238 | self | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./self/streaming/account/{accountId}/device/{device_id}/group/0238-20260329-233508.639-GET.http |
| 0239 | self | | GET /streaming/device/{{device_id}}/streaming_token | 200 OK | ./self/streaming/device/{device_id}/streaming_token/0239-20260329-233508.642-GET.http |
| 0240 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0240-20260329-233508.755-GET.http |
| 0241 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0241-20260329-233508.809-GET.http |
| 0241 | mirror | | GET /streaming/account/{{accountId}}/device/{{device_id}}/group/ | 200 OK | ./mirror/streaming/account/{accountId}/device/{device_id}/group/0241-20260329-233508.809-GET.http |
| 0242 | self | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./self/streaming/account/{accountId}/provider_settings/0242-20260329-233508.866-GET.http |
| 0243 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0243-20260329-233508.968-GET.http |
| 0244 | mirror | ☑ | GET /streaming/account/{{accountId}}/provider_settings | 200 OK | ./mirror/streaming/account/{accountId}/provider_settings/0244-20260329-233509.041-GET.http |