You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
bandolier-website/api/livestream.js

87 lines
2.3 KiB

import { Livestream } from "../lib/models.js";
import logging from '../lib/logging.js';
import { API } from '../lib/api.js';
import { knex } from "../lib/ormish.js";
import { discord, socket } from "../lib/config.js";
import { send_update_viewers, add_view_count } from "../lib/queues.js";
const log = logging.create(import.meta.url);
const next_state = (stream) => {
if(stream.state === "pending") {
return "ready";
} else if(stream.state === "ready") {
return "live";
} else {
return "finished";
}
}
export const get = async (req, res) => {
const api = new API(req, res);
const { livestream_id } = req.query;
try {
if(livestream_id) {
const stream = await Livestream.first({id: livestream_id});
if(stream) {
stream.media = await stream.media();
add_view_count(livestream_id);
api.reply(200, stream);
} else {
api.error(404, "not found");
}
} else {
const streams = await knex(Livestream.table_name).
orderBy("episode", "desc");
api.reply(200, streams);
}
} catch (error) {
log.error(error);
api.error(500, error.message || "Internal Server Error");
}
}
export const post = async (req, res) => {
const api = new API(req, res);
const { livestream_id } = req.body;
try {
if(!api.admin_authenticated) {
return api.error(401, "Admin rights required.");
} else if(livestream_id) {
const stream = await Livestream.first({id: livestream_id});
if(stream) {
const live = next_state(stream);
// change state to live, then the live client
// should listen on the chat and then update the
// UI or reload or something
await Livestream.update({id: livestream_id}, {state: live});
// notify connected clients that the stream has changed
if(socket && socket.api_key) {
send_update_viewers(socket.api_key);
} else {
log.error("Socket not connected or no api_key.");
}
return api.reply(200, {"message": "OK"});
} else {
return api.error(404, "not found");
}
} else {
return api.error(404, "not found");
}
} catch (error) {
log.error(error);
return api.error(500, error.message || "Internal Server Error");
}
}
post.authenticated = true;