Adding BONOB_SONOS_DEVICE_DISCOVERY env var for enabling/disabling auto-discovery

This commit is contained in:
simojenki
2021-03-11 21:36:13 +11:00
parent 9f484d5c01
commit 9e16dbd96e
4 changed files with 37 additions and 31 deletions

View File

@@ -28,7 +28,7 @@ docker run \
### Disabling sonos device discovery entirely ### Disabling sonos device discovery entirely
``` ```
docker run \ docker run \
-e BONOB_SONOS_SEED_HOST=disabled \ -e BONOB_SONOS_DEVICE_DISCOVERY=false \
-p 4534 \ -p 4534 \
simojenki/bonob simojenki/bonob
``` ```
@@ -40,7 +40,8 @@ item | default value | description
BONOB_PORT | 4534 | Default http port for bonob to listen on BONOB_PORT | 4534 | Default http port for bonob to listen on
BONOB_WEB_ADDRESS | http://localhost:4534 | Web address for bonob BONOB_WEB_ADDRESS | http://localhost:4534 | Web address for bonob
BONOB_SECRET | bonob | secret used for encrypting credentials BONOB_SECRET | bonob | secret used for encrypting credentials
BONOB_SONOS_SEED_HOST | undefined | sonos device seed host for auto-discovery, or 'disabled' to turn off device discovery entirely BONOB_SONOS_DEVICE_DISCOVERY | true | whether or not sonos device discovery should be enabled
BONOB_SONOS_SEED_HOST | undefined | sonos device seed host for discovery, or ommitted for for auto-discovery
BONOB_SONOS_SERVICE_NAME | bonob | service name for sonos BONOB_SONOS_SERVICE_NAME | bonob | service name for sonos
BONOB_SONOS_SERVICE_ID | 246 | service id for sonos BONOB_SONOS_SERVICE_ID | 246 | service id for sonos
BONOB_NAVIDROME_URL | http://localhost:4533 | URL for navidrome BONOB_NAVIDROME_URL | http://localhost:4533 | URL for navidrome

View File

@@ -8,6 +8,10 @@ const PORT = +(process.env["BONOB_PORT"] || 4534);
const WEB_ADDRESS = const WEB_ADDRESS =
process.env["BONOB_WEB_ADDRESS"] || `http://localhost:${PORT}`; process.env["BONOB_WEB_ADDRESS"] || `http://localhost:${PORT}`;
const SONOS_DEVICE_DISCOVERY =
(process.env["BONOB_SONOS_DEVICE_DISCOVERY"] || "true") == "true";
const SONOS_SEED_HOST = process.env["BONOB_SONOS_SEED_HOST"];
const bonob = bonobService( const bonob = bonobService(
process.env["BONOB_SONOS_SERVICE_NAME"] || "bonob", process.env["BONOB_SONOS_SERVICE_NAME"] || "bonob",
Number(process.env["BONOS_SONOS_SERVICE_ID"] || "246"), Number(process.env["BONOS_SONOS_SERVICE_ID"] || "246"),
@@ -15,10 +19,13 @@ const bonob = bonobService(
"AppLink" "AppLink"
); );
const app = server( const app = server(
sonos(process.env["BONOB_SONOS_SEED_HOST"]), sonos(SONOS_DEVICE_DISCOVERY, SONOS_SEED_HOST),
bonob, bonob,
WEB_ADDRESS, WEB_ADDRESS,
new Navidrome(process.env["BONOB_NAVIDROME_URL"] || "http://localhost:4533", encryption(process.env["BONOB_SECRET"] || "bonob")) new Navidrome(
process.env["BONOB_NAVIDROME_URL"] || "http://localhost:4533",
encryption(process.env["BONOB_SECRET"] || "bonob")
)
); );
app.listen(PORT, () => { app.listen(PORT, () => {

View File

@@ -4,8 +4,8 @@ import { parse } from "node-html-parser";
import { MusicService } from "@svrooij/sonos/lib/services"; import { MusicService } from "@svrooij/sonos/lib/services";
import { head } from "underscore"; import { head } from "underscore";
import logger from "./logger"; import logger from "./logger";
import STRINGS from './strings'; import STRINGS from "./strings";
import { SOAP_PATH, STRINGS_ROUTE, PRESENTATION_MAP_ROUTE } from './smapi'; import { SOAP_PATH, STRINGS_ROUTE, PRESENTATION_MAP_ROUTE } from "./smapi";
export type Device = { export type Device = {
name: string; name: string;
@@ -22,7 +22,7 @@ export type Service = {
strings: { uri?: string; version?: string }; strings: { uri?: string; version?: string };
presentation: { uri?: string; version?: string }; presentation: { uri?: string; version?: string };
pollInterval?: number; pollInterval?: number;
authType: 'Anonymous' | 'AppLink' | 'DeviceLink' | 'UserId'; authType: "Anonymous" | "AppLink" | "DeviceLink" | "UserId";
}; };
const stripTailingSlash = (url: string) => const stripTailingSlash = (url: string) =>
@@ -32,7 +32,7 @@ export const bonobService = (
name: string, name: string,
sid: number, sid: number,
bonobRoot: string, bonobRoot: string,
authType: 'Anonymous' | 'AppLink' | 'DeviceLink' | 'UserId' = 'AppLink' authType: "Anonymous" | "AppLink" | "DeviceLink" | "UserId" = "AppLink"
): Service => ({ ): Service => ({
name, name,
sid, sid,
@@ -150,9 +150,9 @@ export function autoDiscoverySonos(sonosSeedHost?: string): Sonos {
const anyDevice = await sonosDevices().then((devices) => head(devices)); const anyDevice = await sonosDevices().then((devices) => head(devices));
if (!anyDevice) { if (!anyDevice) {
logger.warn("Failed to find a device to register with...") logger.warn("Failed to find a device to register with...");
return false return false;
}; }
const customd = `http://${anyDevice.Host}:${anyDevice.Port}/customsd`; const customd = `http://${anyDevice.Host}:${anyDevice.Port}/customsd`;
@@ -164,9 +164,11 @@ export function autoDiscoverySonos(sonosSeedHost?: string): Sonos {
); );
if (!csrfToken) { if (!csrfToken) {
logger.warn(`Failed to find csrfToken at GET -> ${customd}, cannot register service`) logger.warn(
return false `Failed to find csrfToken at GET -> ${customd}, cannot register service`
}; );
return false;
}
return axios return axios
.post(customd, new URLSearchParams(asCustomdForm(csrfToken, service)), { .post(customd, new URLSearchParams(asCustomdForm(csrfToken, service)), {
@@ -179,14 +181,10 @@ export function autoDiscoverySonos(sonosSeedHost?: string): Sonos {
}; };
} }
export default function sonos( const sonos = (
discoveryEnabled: boolean = true,
sonosSeedHost: string | undefined = undefined sonosSeedHost: string | undefined = undefined
): Sonos { ): Sonos =>
switch (sonosSeedHost) { discoveryEnabled ? autoDiscoverySonos(sonosSeedHost) : SONOS_DISABLED;
case "disabled":
logger.info("Sonos device discovery disabled"); export default sonos;
return SONOS_DISABLED;
default:
return autoDiscoverySonos(sonosSeedHost);
}
}

View File

@@ -235,7 +235,7 @@ describe("sonos", () => {
describe("when is disabled", () => { describe("when is disabled", () => {
it("should return a disabled client", async () => { it("should return a disabled client", async () => {
const disabled = sonos("disabled"); const disabled = sonos(false);
expect(disabled).toEqual(SONOS_DISABLED); expect(disabled).toEqual(SONOS_DISABLED);
expect(await disabled.devices()).toEqual([]); expect(await disabled.devices()).toEqual([]);
@@ -271,7 +271,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeWithDiscovery.mockResolvedValue(true); sonosManager.InitializeWithDiscovery.mockResolvedValue(true);
const actualDevices = await sonos(undefined).devices(); const actualDevices = await sonos(true, undefined).devices();
expect(SonosManager).toHaveBeenCalledTimes(1); expect(SonosManager).toHaveBeenCalledTimes(1);
expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10); expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10);
@@ -292,7 +292,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeWithDiscovery.mockResolvedValue(true); sonosManager.InitializeWithDiscovery.mockResolvedValue(true);
const actualDevices = await sonos("").devices(); const actualDevices = await sonos(true, "").devices();
expect(SonosManager).toHaveBeenCalledTimes(1); expect(SonosManager).toHaveBeenCalledTimes(1);
expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10); expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10);
@@ -315,7 +315,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeFromDevice.mockResolvedValue(true); sonosManager.InitializeFromDevice.mockResolvedValue(true);
const actualDevices = await sonos(seedHost).devices(); const actualDevices = await sonos(true, seedHost).devices();
expect(SonosManager).toHaveBeenCalledTimes(1); expect(SonosManager).toHaveBeenCalledTimes(1);
expect(sonosManager.InitializeFromDevice).toHaveBeenCalledWith( expect(sonosManager.InitializeFromDevice).toHaveBeenCalledWith(
@@ -338,7 +338,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeWithDiscovery.mockResolvedValue(true); sonosManager.InitializeWithDiscovery.mockResolvedValue(true);
const actualDevices = await sonos(undefined).devices(); const actualDevices = await sonos(true, undefined).devices();
expect(actualDevices).toEqual([ expect(actualDevices).toEqual([
{ {
@@ -369,7 +369,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeWithDiscovery.mockResolvedValue(false); sonosManager.InitializeWithDiscovery.mockResolvedValue(false);
expect(await sonos("").devices()).toEqual([]); expect(await sonos(true, "").devices()).toEqual([]);
}); });
}); });
}); });