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; }