allow base64 recordings fix outstanding bugs

- still must add sleep and execute functions
This commit is contained in:
Tim Fry 2024-11-26 02:29:24 -04:00
parent 8845885d21
commit 9f2e4c4ba3
3 changed files with 53 additions and 45 deletions

View File

@ -44,6 +44,13 @@ function build_data_array_from_post() {
$drop_rows = [];
$drop_row_count = 0;
//load sound files from the switch so we can validate selections
$sound_files = (new file)->sounds();
//recording_files are:
// 'recording_uuid' => 'recording.wav'
// OR
// 'recording_uuid' => '${lua streamfile.lua ' . base64_data .'}'
$recording_files = phrases::get_all_domain_recordings($settings);
//update the phrase information
$array['phrases'][0]['domain_uuid'] = $domain_uuid;
@ -53,10 +60,6 @@ function build_data_array_from_post() {
$array['phrases'][0]['phrase_enabled'] = $phrase_enabled;
$array['phrases'][0]['phrase_description'] = $phrase_description;
for ($i = 0; $i < count($_POST['phrase_detail_function']); $i++) {
//check for valid uuids
if (!empty($_POST['phrase_detail_uuid'][$i]) && !is_uuid($_POST['phrase_detail_uuid'][$i])) {
continue;
}
//check for the empty rows to delete
if (empty($_POST['phrase_detail_data'][$i]) && !empty($_POST['phrase_detail_uuid'][$i])) {
$drop_rows['phrase_details'][$drop_row_count++]['phrase_detail_uuid'] = $_POST['phrase_detail_uuid'][$i];
@ -64,6 +67,21 @@ function build_data_array_from_post() {
}
//only save rows with data
if (!empty($_POST['phrase_detail_data'][$i])) {
$recording_uuid_or_file = $_POST['phrase_detail_data'][$i];
//check for valid recordings and files
if (is_uuid($recording_uuid_or_file)) {
//recording UUID
$file = $recording_files[$recording_uuid_or_file];
} else {
//not a recording so must be valid path inside the switch recording files
if (in_array($recording_uuid_or_file, $sound_files)) {
//valid switch audio file
$file = $recording_uuid_or_file;
} else {
//ignore an invalid audio file
continue;
}
}
//build data array
if ($_POST['phrase_detail_function'][$i] == 'execute' && substr($_POST['phrase_detail_data'][$i], 0,5) != "sleep" && !permission_exists("phrase_execute")) {
header("Location: phrase_edit.php?id=".$phrase_uuid);
@ -78,7 +96,6 @@ function build_data_array_from_post() {
} else {
$phrase_detail_uuid = uuid();
}
$recording_uuid = $_POST['phrase_detail_data'][$i];
$array['phrase_details'][$i]['phrase_detail_uuid'] = $phrase_detail_uuid;
$array['phrase_details'][$i]['phrase_uuid'] = $phrase_uuid;
$array['phrase_details'][$i]['domain_uuid'] = $domain_uuid;
@ -86,7 +103,7 @@ function build_data_array_from_post() {
$array['phrase_details'][$i]['phrase_detail_tag'] = $_POST['phrase_detail_tag'];
$array['phrase_details'][$i]['phrase_detail_pattern'] = $_POST['phrase_detail_pattern'] ?? null;
$array['phrase_details'][$i]['phrase_detail_function'] = $_POST['phrase_detail_function'][$i];
$array['phrase_details'][$i]['phrase_detail_data'] = $recording_files[$recording_uuid]; //path and filename of recording
$array['phrase_details'][$i]['phrase_detail_data'] = $file; //path and filename of recording
$array['phrase_details'][$i]['phrase_detail_method'] = $_POST['phrase_detail_method'] ?? null;
$array['phrase_details'][$i]['phrase_detail_type'] = $_POST['phrase_detail_type'] ?? null;
$array['phrase_details'][$i]['phrase_detail_group'] = $_POST['phrase_detail_group'];
@ -227,22 +244,8 @@ if (count($_POST) > 0) {
}
if (!empty($_POST['phrase_detail_function'])) {
$array = build_data_array_from_post();
//execute update/insert
$p = new permissions;
$p->add('phrase_detail_add', 'temp');
$p->add('phrase_detail_edit', 'temp');
$p->add('phrase_detail_delete', 'temp');
$database->app_name = 'phrases';
$database->app_uuid = '5c6f597c-9b78-11e4-89d3-123b93f75cba';
if (count($array) > 0) {
$database->save($array);
}
if (count($drop_rows) > 0) {
$database->delete($drop_rows);
}
$p->delete('phrase_detail_add', 'temp');
}
//execute update/insert
//execute update/insert
$p = new permissions;
$p->add('phrase_detail_add', 'temp');
$p->add('phrase_detail_edit', 'temp');
@ -250,10 +253,12 @@ if (count($_POST) > 0) {
$database->app_name = 'phrases';
$database->app_uuid = '5c6f597c-9b78-11e4-89d3-123b93f75cba';
if (count($array) > 0) {
//$database->save($array);
$database->save($array);
unset($array);
}
if (count($drop_rows) > 0) {
$database->delete($drop_rows);
unset($drop_rows);
}
$p->delete('phrase_detail_add', 'temp');
//clear the cache
@ -387,7 +392,7 @@ if (count($_POST) > 0) {
if ($action == "update" && permission_exists('phrase_delete')) {
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'name'=>'btn_delete','style'=>'margin-left: 15px;','onclick'=>"modal_open('modal-delete','btn_delete');"]);
}
echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','style'=>'margin-left: 15px;']);
echo button::create(['type'=>'submit','onclick'=>'submit_phrase()','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','style'=>'margin-left: 15px;']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
@ -453,7 +458,7 @@ if (count($_POST) > 0) {
echo " </select>\n";
echo " </td>\n";
echo " <td class='vtable' style='border-bottom: none;' align='left' nowrap='nowrap'>\n";
echo " <select class='formfld' id='phrase_detail_data_empty' name='phrase_detail_data_empty' onchange='update_id(this)' style='width: 300px; min-width: 300px; max-width: 300px;' tag=''></select>";
echo " <select class='formfld' id='phrase_detail_data_empty' name='phrase_detail_data_empty' style='width: 300px; min-width: 300px; max-width: 300px;' tag=''></select>";
// if (if_group("superadmin")) {
// echo " <input id='phrase_detail_data_switch_empty' type='button' class='btn' style='margin-left: 4px; display: none;' value='&#9665;' onclick=\"action_to_select(); load_action_options(document.getElementById('phrase_detail_function_empty').selectedIndex);\">\n";
// }

View File

@ -451,6 +451,7 @@ if (!class_exists('phrases')) {
/**
* Returns an associative array of recordings with the uuid as key and recording filename as value.
* When the recording is a base64 encoded recording, the filename returned is the filename only with no path.
* @param settings $settings Settings object
* @param int $limit (Optional) Limit the number of results returned
* @return array
@ -459,18 +460,19 @@ if (!class_exists('phrases')) {
//set defaults
$recordings = [];
$parameters = [];
//get the database object and current domain_uuid
//get the database object from the settings object
$database = $settings->database();
//get the domain name
$domain_name = $database->select("SELECT domain_name from v_domains where domain_uuid = :domain_uuid", ['domain_uuid' => $database->domain_uuid], 'column');
//get the domain name using the domain_uuid in the database object
$domain_uuid = $settings->domain_uuid();
$domain_name = $database->select("SELECT domain_name from v_domains where domain_uuid = :domain_uuid", ['domain_uuid' => $domain_uuid], 'column');
//get the recording directory
$recordings_dir = $settings->get('switch', 'recordings', '/var/lib/freeswitch/recordings') . DIRECTORY_SEPARATOR . $domain_name;
//build initial sql
$sql = "SELECT recording_uuid, recording_filename FROM v_recordings";
//add domain_uuid to sql if needed
if (!empty($domain_name) && is_uuid($domain_name)) {
//build initial sql that ignores the domain_uuid
$sql = "SELECT recording_uuid, recording_filename, recording_base64 IS NOT NULL AS has_base64_recording FROM v_recordings";
//add domain_uuid to sql when available
if (!empty($domain_name) && is_uuid($domain_uuid)) {
$sql .= " where domain_uuid = :domain_uuid";
$parameters['domain_uuid'] = $domain_name;
$parameters['domain_uuid'] = $domain_uuid;
}
//add limit to sql if needed
if (!empty($limit)) {
@ -482,7 +484,11 @@ if (!class_exists('phrases')) {
if (!empty($rows)) {
//set the path and filename for each of the uuids
foreach($rows as $row) {
$recordings[$row['recording_uuid']] = $recordings_dir . DIRECTORY_SEPARATOR . $row['recording_filename'];
if ($row['has_base64_recording']) {
$recordings[$row['recording_uuid']] = '${lua streamfile.lua ' . basename($row['recording_filename']) .'}';
} else {
$recordings[$row['recording_uuid']] = $recordings_dir . DIRECTORY_SEPARATOR . $row['recording_filename'];
}
}
}
//return recordings or empty array

View File

@ -10,14 +10,14 @@ document.addEventListener("DOMContentLoaded", function () {
// Add recordings
grp_rec.label = 'Recordings';
for (let i = 0; i < window.phrase_recordings.length; i++) {
grp_rec.appendChild(new Option(' ' + window.phrase_recordings[i].recording_name, window.phrase_recordings[i].recording_uuid));
grp_rec.appendChild(new Option(window.phrase_recordings[i].recording_name, window.phrase_recordings[i].recording_uuid));
}
select.appendChild(grp_rec);
// Add sounds
grp_snd.label = 'Sounds';
for (let i = 0; i < window.phrase_sounds.length; i++) {
grp_snd.appendChild(new Option(' ' + window.phrase_sounds[i], i));
grp_snd.appendChild(new Option(window.phrase_sounds[i], window.phrase_sounds[i]));
}
select.appendChild(grp_snd);
@ -27,9 +27,6 @@ document.addEventListener("DOMContentLoaded", function () {
// add empty row
add_row();
// update order
update_order();
// Initialize draggable rows
add_draggable_rows();
});
@ -52,7 +49,6 @@ function add_existing() {
//recording select box
const select_recording = select_list[1];
select_recording.setAttribute('tag', window.phrase_details[i]['phrase_detail_uuid']);
select_by_text(select_recording, window.phrase_details[i]['phrase_detail_display_name']);
const input_fields = newRow.querySelectorAll('td input');
@ -87,11 +83,6 @@ function select_by_text(selectElement, textToFind) {
console.warn('Text not found in select options');
}
function update_id(element) {
index = element.index;
const hidden_input_field = document.getElementById('hidden_input_field[' + index +']');
}
// Add draggable functionality to rows
function add_draggable_rows() {
const tableBody = document.getElementById('structure');
@ -120,7 +111,6 @@ function add_draggable_rows() {
tableBody.addEventListener('dragend', () => {
draggedRow.classList.remove('dragging');
draggedRow = null;
update_order();
});
}
@ -154,6 +144,13 @@ function update_order() {
});
}
function submit_phrase() {
//ensure order is updated before submitting form
update_order();
//submit form
const form = document.getElementById('frm').submit();
}
// Add a new row to the table
function add_row() {
const tbody = document.getElementById('structure');