Dwelling/radio.js

75 lines
1.9 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const Koa = require("koa");
const koaPug = require("koa-pug");
const koaRouter = require("koa-router");
const fetch = require("node-fetch");
const config = require("./config");
const util = require("./util");
async function getRadioStatus() {
try {
let status = await fetch('http://radio.home/status-json.xsl').then(r => r.json());
return {
server_start_iso8601: status.icestats.server_start_iso8601,
server_start_date: util.datetime(status.icestats.server_start_iso8601, util.post_date_format),
song: `${status.icestats.source.artist} - ${status.icestats.source.title}`,
listener_peak: status.icestats.source.listener_peak,
listeners: status.icestats.source.listeners
}
} catch {
return {
server_start_iso8601: "n/a",
server_start_date: "n/a",
song: "n/a",
listener_peak: "n/a",
listeners: "n/a"
}
}
}
function setRoutes(router) {
router.get('/', async ctx => {
await ctx.render('index', {
title: "/ Radio",
description: "Internet-radio broadcasting from under my desk.",
main_site: util.getServiceByHost(ctx.header.host),
radio_status: await getRadioStatus()
});
})
.get('/filelist', async ctx => {
ctx.type = 'text/html';
ctx.body = fs.readFileSync(
path.join(__dirname, '/static/radio/assets/files/radio_filelist.html'));
})
.get('/playlist', async ctx => {
ctx.attachment('radio.arav.top.m3u');
ctx.body = fs.readFileSync(
path.join(__dirname, '/static/radio/assets/files/radio.arav.top.m3u'));
})
.get('/stats', async ctx => {
ctx.body = await getRadioStatus();
});
}
module.exports = () => {
const app = new Koa();
const pug = new koaPug({
viewPath: path.join(__dirname, "views", "radio"),
locals: {
moment: util.datetime },
app: app
});
const radio_router = koaRouter();
setRoutes(radio_router);
app.proxy = true;
app
.use(radio_router.routes())
.listen(config.radio.port, config.radio.host);
return app;
}