Add simple listing of sonos devices and basic Dockefile for running it

This commit is contained in:
simojenki
2021-01-29 12:34:02 +11:00
parent da61f079bc
commit 769a3e50d4
14 changed files with 935 additions and 45 deletions

View File

@@ -1,11 +1,26 @@
import {createServer} from './utils/server'
import express from "express";
import * as Eta from "eta";
createServer()
.then(server => {
server.listen(3000, () => {
console.info(`Listening on http://localhost:3000`)
})
})
.catch(err => {
console.error(`Error: ${err}`)
})
// import { Navidrome } from "./music_service";
import makeSonos from "./sonos";
const PORT = 3000;
makeSonos().then((sonos) => {
const app = express();
app.use(express.static("./web/public"));
app.engine("eta", Eta.renderFile);
app.set("view engine", "eta");
app.set("views", "./web/views");
app.get("/", (_, res) => {
res.render("index", {
devices: sonos.devices(),
});
});
app.listen(PORT, () => {
console.info(`Listening on ${PORT}`);
});
});

24
src/logger.ts Normal file
View File

@@ -0,0 +1,24 @@
import { createLogger, format, transports } from 'winston';
export function debugIt<T>(thing: T): T {
logger.debug(thing);
return thing;
}
const logger = createLogger({
level: 'debug',
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
format.errors({ stack: true }),
format.splat(),
format.json()
),
defaultMeta: { service: 'bonob' },
transports: [
new transports.Console()
]
});
export default logger;

20
src/music_service.ts Normal file
View File

@@ -0,0 +1,20 @@
import axios from "axios";
import { Md5 } from "ts-md5/dist/md5";
const s = "foobar100";
const navidrome = process.env["BONOB_NAVIDROME_URL"];
const u = process.env["BONOB_USER"];
const t = Md5.hashStr(`${process.env["BONOB_PASSWORD"]}${s}`);
export class Navidrome {
ping = (): Promise<boolean> =>
axios
.get(
`${navidrome}/rest/ping.view?u=${u}&t=${t}&s=${s}&v=1.16.1.0&c=myapp`
)
.then((_) => true)
.catch((e) => {
console.log(e);
return false;
});
}

48
src/sonos.ts Normal file
View File

@@ -0,0 +1,48 @@
import { SonosManager } from "@svrooij/sonos";
import logger from "./logger";
type Device = {
name: string;
group: string;
ip: string;
port: number;
};
interface Sonos
{
devices: () => Device[];
}
class RealSonos implements Sonos {
manager: SonosManager;
constructor(manager: SonosManager) {
this.manager = manager;
}
devices = (): Device[] => {
const devices = this.manager.Devices.map((d) => ({
name: d.Name,
group: d.GroupName || "",
ip: d.Host,
port: d.Port,
}));
logger.debug({ devices })
return devices;
}
}
const SonosDisabled: Sonos = {
devices: () => [],
};
export default function (): Promise<Sonos> {
const manager = new SonosManager();
return manager
.InitializeWithDiscovery(10)
.then((it) => (it ? new RealSonos(manager) : SonosDisabled))
.catch((_) => {
return SonosDisabled;
});
}

View File

@@ -1,10 +0,0 @@
import express from 'express'
import {Express} from 'express-serve-static-core'
export async function createServer(): Promise<Express> {
const server = express()
server.get('/', (_, res) => {
res.send('Hello world!!!')
})
return server
}