secubox-openwrt/package/secubox/luci-app-voip/htdocs/luci-static/resources/voip/api.js
CyberMind-FR 91cfd35d7a feat(voip): Add call recording feature with LuCI management
- Add MixMonitor integration for automatic call recording
- Add voipctl rec commands: enable/disable/status/list/play/download/delete/cleanup
- Add recordings.js LuCI view with audio player and date filtering
- Add RPCD methods for recording management
- Add UCI config section for recording settings (format, retention)
- Fix OVH API signature to use openssl instead of sha1sum
- Improve PJSIP trunk config with realm and qualify settings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-19 15:11:46 +01:00

187 lines
4.3 KiB
JavaScript

'use strict';
'require rpc';
var callStatus = rpc.declare({
object: 'luci.voip',
method: 'status',
expect: {}
});
var callExtensions = rpc.declare({
object: 'luci.voip',
method: 'extensions',
expect: { extensions: [] }
});
var callCalls = rpc.declare({
object: 'luci.voip',
method: 'calls',
expect: { calls: [] }
});
var callVoicemails = rpc.declare({
object: 'luci.voip',
method: 'voicemails',
expect: { voicemails: [] }
});
var callTrunkStatus = rpc.declare({
object: 'luci.voip',
method: 'trunk_status',
expect: {}
});
var callInstall = rpc.declare({
object: 'luci.voip',
method: 'install',
expect: {}
});
var callStart = rpc.declare({
object: 'luci.voip',
method: 'start',
expect: {}
});
var callStop = rpc.declare({
object: 'luci.voip',
method: 'stop',
expect: {}
});
var callRestart = rpc.declare({
object: 'luci.voip',
method: 'restart',
expect: {}
});
var callReload = rpc.declare({
object: 'luci.voip',
method: 'reload',
expect: {}
});
var callExtAdd = rpc.declare({
object: 'luci.voip',
method: 'ext_add',
params: ['number', 'name', 'password'],
expect: {}
});
var callExtDel = rpc.declare({
object: 'luci.voip',
method: 'ext_del',
params: ['number'],
expect: {}
});
var callExtPasswd = rpc.declare({
object: 'luci.voip',
method: 'ext_passwd',
params: ['number', 'password'],
expect: {}
});
var callOriginate = rpc.declare({
object: 'luci.voip',
method: 'call_originate',
params: ['from_ext', 'to_number'],
expect: {}
});
var callHangup = rpc.declare({
object: 'luci.voip',
method: 'call_hangup',
params: ['channel'],
expect: {}
});
var callTrunkTest = rpc.declare({
object: 'luci.voip',
method: 'trunk_test',
expect: {}
});
var callVmDelete = rpc.declare({
object: 'luci.voip',
method: 'vm_delete',
params: ['extension', 'msg_id'],
expect: {}
});
// Recording methods
var callRecStatus = rpc.declare({
object: 'luci.voip',
method: 'rec_status',
expect: {}
});
var callRecEnable = rpc.declare({
object: 'luci.voip',
method: 'rec_enable',
expect: {}
});
var callRecDisable = rpc.declare({
object: 'luci.voip',
method: 'rec_disable',
expect: {}
});
var callRecList = rpc.declare({
object: 'luci.voip',
method: 'rec_list',
params: ['date'],
expect: {}
});
var callRecDelete = rpc.declare({
object: 'luci.voip',
method: 'rec_delete',
params: ['filename'],
expect: {}
});
var callRecDownload = rpc.declare({
object: 'luci.voip',
method: 'rec_download',
params: ['filename'],
expect: {}
});
var callRecCleanup = rpc.declare({
object: 'luci.voip',
method: 'rec_cleanup',
params: ['days'],
expect: {}
});
return L.Class.extend({
getStatus: function() { return callStatus(); },
getExtensions: function() { return callExtensions(); },
getCalls: function() { return callCalls(); },
getVoicemails: function() { return callVoicemails(); },
getTrunkStatus: function() { return callTrunkStatus(); },
install: function() { return callInstall(); },
start: function() { return callStart(); },
stop: function() { return callStop(); },
restart: function() { return callRestart(); },
reload: function() { return callReload(); },
addExtension: function(num, name, pwd) { return callExtAdd(num, name, pwd); },
delExtension: function(num) { return callExtDel(num); },
setExtPassword: function(num, pwd) { return callExtPasswd(num, pwd); },
originateCall: function(from, to) { return callOriginate(from, to); },
hangupCall: function(ch) { return callHangup(ch); },
testTrunk: function() { return callTrunkTest(); },
deleteVoicemail: function(ext, id) { return callVmDelete(ext, id); },
// Recording methods
getRecordingStatus: function() { return callRecStatus(); },
enableRecording: function() { return callRecEnable(); },
disableRecording: function() { return callRecDisable(); },
listRecordings: function(date) { return callRecList(date || ''); },
deleteRecording: function(filename) { return callRecDelete(filename); },
downloadRecording: function(filename) { return callRecDownload(filename); },
cleanupRecordings: function(days) { return callRecCleanup(days || 30); }
});