mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-19 09:06:14 +00:00
Close the speaker/service-contract gaps found comparing against a reference
implementation — three real Bose routes we did not serve:
- DELETE /streaming/account/{account}/source/{sourceID} — removes a configured
source from every device of the account (HandleMargeDeleteSource +
marge.RemoveSourceFromAccount), mirroring the account-level POST add-source.
Bare 200, empty body. Previously source removal was only reachable via the
admin /setup surface.
- GET /bmx/tunein — bare TuneIn service descriptor (the registry's `self` link),
HandleTuneInService. chi routes both /bmx/tunein and /bmx/tunein/.
- GET /core02/svc-bmx-adapter-orion/prod/orion — bare Orion (LOCAL_INTERNET_RADIO)
adapter descriptor, HandleOrionService.
The two descriptors reuse the existing extractBMXService + applyBMXTemplate
helpers (same {BMX_SERVER}/{MEDIA_SERVER} substitution the registry applies).
Contract tests added (delete_source.http, get_bmx_service_descriptors.http);
router + frozen-coverage goldens updated.
make test-http-client: 95 requests, 0 failed. go test + golangci-lint clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
16 lines
709 B
HTTP
16 lines
709 B
HTTP
### DELETE /streaming/account/{accountId}/source/{sourceId} (remove a configured source)
|
|
###
|
|
### Frozen Marge route: removes the source from every device of the account
|
|
### (HandleMargeDeleteSource), mirroring the account-level POST add-source.
|
|
### Idempotent — a 200 is returned whether or not the source was present, so this
|
|
### pins the route + contract without depending on prior state.
|
|
DELETE {{host}}/streaming/account/{{accountId}}/source/SRC_contract_test
|
|
Authorization: Bearer {{token}}
|
|
User-Agent: Bose_Lisa/27.0.6
|
|
|
|
> {%
|
|
client.test("Source removal accepted (200)", function () {
|
|
client.assert(response.status === 200, "Response status is not 200, got " + response.status);
|
|
});
|
|
%}
|