mirror of
https://github.com/wkulhanek/bonob.git
synced 2025-12-22 01:43:29 +01:00
Add simple listing of sonos devices and basic Dockefile for running it
This commit is contained in:
35
src/app.ts
35
src/app.ts
@@ -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
24
src/logger.ts
Normal 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
20
src/music_service.ts
Normal 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
48
src/sonos.ts
Normal 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;
|
||||
});
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user