☎️ Web interface for viewing and processing Asterisk call logs (2020)
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.
asterisk-cdr-viewer/server/recording.js

65 lines
1.6 KiB

2 years ago
'use strict';
const Joi = require('joi');
const Boom = require('@hapi/boom');
const Rfr = require('rfr');
const ComSrv = Rfr('/server/comsrv');
const Calls = Rfr('/server/sections/calls');
const getRecordingInfo = async (uid) => {
let res = {
file: uid + '.' + process.env.RECORD_EXT
};
res.name = res.file;
if (process.env.RECORD_PRETTY_NAMES) {
try {
res.name = (await Calls.getCdrById(uid)).date + '.' + process.env.RECORD_EXT
} catch (e) {
console.warn(`Failed to get CDR info by ID: ${e}`);
}
}
return res;
};
const recordingHandler = async (request, h) => {
const recording = await getRecordingInfo(request.params.id);
ComSrv.debug(`Serving recording: ${recording.name} as ${request.query.asFile ? 'file' : 'inline'}`);
return h.file(recording.file, {
confine: process.env.RECORD_DIR ?? true,
mode: request.query.asFile ? 'attachment' : 'inline',
filename: recording.name
});
}
module.exports = {
routes: [{
method: 'GET',
path: '/api/recording/{id}',
handler: recordingHandler,
options: {
validate: {
params: Joi.object({
id: Joi.string().min(1).max(10000)
}),
query: Joi.object({
asFile: Joi.boolean().optional().default(true)
})
}
}
}],
config: Joi.object({
RECORD_DIR: Joi.string().min(1).required(),
RECORD_EXT: Joi.string().min(1).optional().default('ogg'),
RECORD_PRETTY_NAMES: Joi.boolean().optional().default(true)
})
};