mirror of
https://github.com/wkulhanek/bonob.git
synced 2025-12-22 18:03:30 +01:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8111041551 | ||
|
|
df2ef9b152 | ||
|
|
33473cd387 | ||
|
|
7f743aaa7e | ||
|
|
d4bed77c54 | ||
|
|
29531a6e01 | ||
|
|
e78b6c4fbc | ||
|
|
2941f6f595 |
32
.github/workflows/ci.yml
vendored
32
.github/workflows/ci.yml
vendored
@@ -17,9 +17,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Check out the repo
|
name: Check out the repo
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
-
|
-
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: '16'
|
node-version: '16'
|
||||||
-
|
-
|
||||||
@@ -29,37 +29,47 @@ jobs:
|
|||||||
|
|
||||||
|
|
||||||
push_to_registry:
|
push_to_registry:
|
||||||
name: Push Docker image to Docker Hub
|
name: Push Docker image to Docker registries
|
||||||
needs: build_and_test
|
needs: build_and_test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Check out the repo
|
name: Check out the repo
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
-
|
-
|
||||||
name: Set up QEMU
|
name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v2
|
||||||
-
|
-
|
||||||
name: Set up Docker Buildx
|
name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v2
|
||||||
-
|
-
|
||||||
name: Docker meta
|
name: Docker meta
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v3
|
uses: docker/metadata-action@v4
|
||||||
with:
|
with:
|
||||||
images: simojenki/bonob
|
images: |
|
||||||
|
simojenki/bonob
|
||||||
|
ghcr.io/simojenki/bonob
|
||||||
-
|
-
|
||||||
name: Login to DockerHub
|
name: Login to DockerHub
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
-
|
-
|
||||||
name: Push to Docker Hub
|
name: Log in to GitHub Container registry
|
||||||
uses: docker/build-push-action@v2
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Push image
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
||||||
|
|||||||
@@ -48,7 +48,10 @@ RUN apt-get update && \
|
|||||||
|
|
||||||
FROM node:16-bullseye-slim
|
FROM node:16-bullseye-slim
|
||||||
|
|
||||||
LABEL maintainer=simojenki
|
LABEL maintainer="simojenki" \
|
||||||
|
org.opencontainers.image.source="https://github.com/simojenki/bonob" \
|
||||||
|
org.opencontainers.image.description="bonob SONOS SMAPI implementation" \
|
||||||
|
org.opencontainers.image.licenses="GPLv3"
|
||||||
|
|
||||||
ENV BNB_PORT=4534
|
ENV BNB_PORT=4534
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
@@ -71,7 +74,8 @@ RUN apt-get update && \
|
|||||||
apt-get -y upgrade && \
|
apt-get -y upgrade && \
|
||||||
apt-get -y install --no-install-recommends \
|
apt-get -y install --no-install-recommends \
|
||||||
libvips \
|
libvips \
|
||||||
tzdata && \
|
tzdata \
|
||||||
|
wget && \
|
||||||
apt-get clean && \
|
apt-get clean && \
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
|||||||
20
README.md
20
README.md
@@ -25,7 +25,23 @@ Support for Subsonic API clones (tested against Navidrome and Gonic).
|
|||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
bonob is distributed via docker and can be run in a number of ways
|
bonob is packaged as an OCI image to both the docker hub registry and github registry.
|
||||||
|
|
||||||
|
ie.
|
||||||
|
```bash
|
||||||
|
docker pull docker.io/simojenki/bonob
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```bash
|
||||||
|
docker pull ghcr.io/simojenki/bonob
|
||||||
|
```
|
||||||
|
|
||||||
|
tag | description
|
||||||
|
--- | ---
|
||||||
|
latest | Latest release, intended to be stable
|
||||||
|
master | Laster build from master, probably works, however is currently under test in
|
||||||
|
vX.Y.Z | Fixed release versions from tags, for those that want to pin to specific release
|
||||||
|
|
||||||
|
|
||||||
### Full sonos device auto-discovery and auto-registration using docker --network host
|
### Full sonos device auto-discovery and auto-registration using docker --network host
|
||||||
|
|
||||||
@@ -146,6 +162,8 @@ BNB_PORT | 4534 | Default http port for bonob to listen on
|
|||||||
BNB_URL | http://$(hostname):4534 | URL (including path) for bonob so that sonos devices can communicate. **This must be either the public IP or DNS entry of the bonob instance so that the sonos devices can communicate with it.**
|
BNB_URL | http://$(hostname):4534 | URL (including path) for bonob so that sonos devices can communicate. **This must be either the public IP or DNS entry of the bonob instance so that the sonos devices can communicate with it.**
|
||||||
BNB_SECRET | bonob | secret used for encrypting credentials
|
BNB_SECRET | bonob | secret used for encrypting credentials
|
||||||
BNB_AUTH_TIMEOUT | 1h | Timeout for the sonos auth token, described in the format [ms](https://github.com/vercel/ms), ie. '5s' == 5 seconds, '11h' == 11 hours. In the case of using Navidrome this should be less than the value for ND_SESSIONTIMEOUT
|
BNB_AUTH_TIMEOUT | 1h | Timeout for the sonos auth token, described in the format [ms](https://github.com/vercel/ms), ie. '5s' == 5 seconds, '11h' == 11 hours. In the case of using Navidrome this should be less than the value for ND_SESSIONTIMEOUT
|
||||||
|
BNB_LOG_LEVEL | info | Log level. One of ['debug', 'info', 'warn', 'error']
|
||||||
|
BNB_SERVER_LOG_REQUESTS | false | Whether or not to log http requests
|
||||||
BNB_SONOS_AUTO_REGISTER | false | Whether or not to try and auto-register on startup
|
BNB_SONOS_AUTO_REGISTER | false | Whether or not to try and auto-register on startup
|
||||||
BNB_SONOS_DEVICE_DISCOVERY | true | Enable/Disable sonos device discovery entirely. Setting this to 'false' will disable sonos device search, regardless of whether a seed host is specified.
|
BNB_SONOS_DEVICE_DISCOVERY | true | Enable/Disable sonos device discovery entirely. Setting this to 'false' will disable sonos device search, regardless of whether a seed host is specified.
|
||||||
BNB_SONOS_SEED_HOST | undefined | sonos device seed host for discovery, or ommitted for for auto-discovery
|
BNB_SONOS_SEED_HOST | undefined | sonos device seed host for discovery, or ommitted for for auto-discovery
|
||||||
|
|||||||
@@ -62,8 +62,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "rm -Rf build node_modules",
|
"clean": "rm -Rf build node_modules",
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"dev": "BNB_DEBUG=true BNB_SCROBBLE_TRACKS=false BNB_REPORT_NOW_PLAYING=false BNB_ICON_FOREGROUND_COLOR=white BNB_ICON_BACKGROUND_COLOR=darkgrey BNB_SONOS_SERVICE_NAME=bonobDev BNB_SONOS_DEVICE_DISCOVERY=true nodemon -V ./src/app.ts",
|
"dev": "BNB_LOG_LEVEL=debug BNB_DEBUG=true BNB_SCROBBLE_TRACKS=false BNB_REPORT_NOW_PLAYING=false BNB_ICON_FOREGROUND_COLOR=white BNB_ICON_BACKGROUND_COLOR=darkgrey BNB_SONOS_SERVICE_NAME=bonobDev BNB_SONOS_DEVICE_DISCOVERY=true nodemon -V ./src/app.ts",
|
||||||
"devr": "BNB_DEBUG=true BNB_SCROBBLE_TRACKS=false BNB_REPORT_NOW_PLAYING=false BNB_ICON_FOREGROUND_COLOR=white BNB_ICON_BACKGROUND_COLOR=darkgrey BNB_SONOS_SERVICE_NAME=bonobDev BNB_SONOS_DEVICE_DISCOVERY=true BNB_SONOS_AUTO_REGISTER=true nodemon -V ./src/app.ts",
|
"devr": "BNB_LOG_LEVEL=debug BNB_DEBUG=true BNB_SCROBBLE_TRACKS=false BNB_REPORT_NOW_PLAYING=false BNB_ICON_FOREGROUND_COLOR=white BNB_ICON_BACKGROUND_COLOR=darkgrey BNB_SONOS_SERVICE_NAME=bonobDev BNB_SONOS_DEVICE_DISCOVERY=true BNB_SONOS_AUTO_REGISTER=true nodemon -V ./src/app.ts",
|
||||||
"register-dev": "ts-node ./src/register.ts http://$(hostname):4534",
|
"register-dev": "ts-node ./src/register.ts http://$(hostname):4534",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"gitinfo": "git describe --tags > .gitinfo"
|
"gitinfo": "git describe --tags > .gitinfo"
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ const app = server(
|
|||||||
clock,
|
clock,
|
||||||
iconColors: config.icons,
|
iconColors: config.icons,
|
||||||
applyContextPath: true,
|
applyContextPath: true,
|
||||||
logRequests: true,
|
logRequests: config.logRequests,
|
||||||
version,
|
version,
|
||||||
smapiAuthTokens: new JWTSmapiLoginTokens(clock, config.secret, config.authTimeout),
|
smapiAuthTokens: new JWTSmapiLoginTokens(clock, config.secret, config.authTimeout),
|
||||||
externalImageResolver: artistImageFetcher
|
externalImageResolver: artistImageFetcher
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ export default function () {
|
|||||||
validationPattern: COLOR,
|
validationPattern: COLOR,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
logRequests: bnbEnvVar<boolean>("SERVER_LOG_REQUESTS", { default: false, parser: asBoolean }),
|
||||||
sonos: {
|
sonos: {
|
||||||
serviceName: bnbEnvVar<string>("SONOS_SERVICE_NAME", { default: "bonob" })!,
|
serviceName: bnbEnvVar<string>("SONOS_SERVICE_NAME", { default: "bonob" })!,
|
||||||
discovery: {
|
discovery: {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export function debugIt<T>(thing: T): T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const logger = createLogger({
|
const logger = createLogger({
|
||||||
level: 'debug',
|
level: process.env["BNB_LOG_LEVEL"] || 'info',
|
||||||
format: format.combine(
|
format: format.combine(
|
||||||
format.timestamp({
|
format.timestamp({
|
||||||
format: 'YYYY-MM-DD HH:mm:ss'
|
format: 'YYYY-MM-DD HH:mm:ss'
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ function server(
|
|||||||
const id = req.params["id"]!;
|
const id = req.params["id"]!;
|
||||||
const trace = uuid();
|
const trace = uuid();
|
||||||
|
|
||||||
logger.info(
|
logger.debug(
|
||||||
`${trace} bnb<- ${req.method} ${req.path}?${JSON.stringify(
|
`${trace} bnb<- ${req.method} ${req.path}?${JSON.stringify(
|
||||||
req.query
|
req.query
|
||||||
)}, headers=${JSON.stringify({ ...req.headers, "bnbt": "*****", "bnbk": "*****" })}`
|
)}, headers=${JSON.stringify({ ...req.headers, "bnbt": "*****", "bnbk": "*****" })}`
|
||||||
@@ -409,7 +409,7 @@ function server(
|
|||||||
.then((stream) => ({ musicLibrary: it, stream }))
|
.then((stream) => ({ musicLibrary: it, stream }))
|
||||||
)
|
)
|
||||||
.then(({ musicLibrary, stream }) => {
|
.then(({ musicLibrary, stream }) => {
|
||||||
logger.info(
|
logger.debug(
|
||||||
`${trace} bnb<- stream response from music service for ${id}, status=${
|
`${trace} bnb<- stream response from music service for ${id}, status=${
|
||||||
stream.status
|
stream.status
|
||||||
}, headers=(${JSON.stringify(stream.headers)})`
|
}, headers=(${JSON.stringify(stream.headers)})`
|
||||||
@@ -435,7 +435,7 @@ function server(
|
|||||||
sendStream: boolean;
|
sendStream: boolean;
|
||||||
nowPlaying: boolean;
|
nowPlaying: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
logger.info(
|
logger.debug(
|
||||||
`${trace} bnb-> ${
|
`${trace} bnb-> ${
|
||||||
req.path
|
req.path
|
||||||
}, status=${status}, headers=${JSON.stringify(headers)}`
|
}, status=${status}, headers=${JSON.stringify(headers)}`
|
||||||
|
|||||||
@@ -1066,8 +1066,9 @@ function bindSmapiSoapServiceToExpress(
|
|||||||
|
|
||||||
soapyService.log = (type, data) => {
|
soapyService.log = (type, data) => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
// routing all soap info messages to debug so less noisy
|
||||||
case "info":
|
case "info":
|
||||||
logger.info({ level: "info", data });
|
logger.debug({ level: "info", data });
|
||||||
break;
|
break;
|
||||||
case "warn":
|
case "warn":
|
||||||
logger.warn({ level: "warn", data });
|
logger.warn({ level: "warn", data });
|
||||||
|
|||||||
@@ -271,6 +271,15 @@ describe("config", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("logRequests", () => {
|
||||||
|
describeBooleanConfigValue(
|
||||||
|
"logRequests",
|
||||||
|
"BNB_SERVER_LOG_REQUESTS",
|
||||||
|
false,
|
||||||
|
(config) => config.logRequests
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
describe("sonos", () => {
|
describe("sonos", () => {
|
||||||
describe("serviceName", () => {
|
describe("serviceName", () => {
|
||||||
it("should default to bonob", () => {
|
it("should default to bonob", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user