Add custom file name for call recording download

This uses the new setting category call_recordings name record_name. The record_name is used as a template

Call recording download template. 

Options: ${uuid}, ${caller_id_name}, ${caller_id_number}, ${caller_destination}, ${destination_number},  ${destination_number},  ${date}, ${call_direction}, ${year}, ${month_name}, ${month_number}, ${day}, ${time}
This commit is contained in:
FusionPBX
2025-05-13 13:57:39 -06:00
committed by GitHub
parent b8f1be9c90
commit b7821ab738

View File

@@ -36,6 +36,8 @@
private $app_uuid;
private $name;
private $table;
private $settings;
private $database;
private $description_field;
private $location;
public $recording_uuid;
@@ -52,6 +54,12 @@
$this->table = 'call_recordings';
$this->description_field = 'call_recording_description';
$this->location = 'call_recordings.php';
//allow global
$this->database = database::new();
//initialize the settings object
$this->settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]);
}
/**
@@ -84,20 +92,21 @@
$sql .= "from view_call_recordings ";
$sql .= "where call_recording_uuid = :call_recording_uuid ";
$parameters['call_recording_uuid'] = $record['uuid'];
$database = new database;
$field = $database->select($sql, $parameters, 'row');
$field = $this->database->select($sql, $parameters, 'row');
if (is_array($field) && @sizeof($field) != 0) {
//delete the file on the file system
if (file_exists($field['call_recording_path'].'/'.$field['call_recording_name'])) {
unlink($field['call_recording_path'].'/'.$field['call_recording_name']);
}
if (file_exists($field['call_recording_path'].'/'.$field['call_recording_name'])) {
unlink($field['call_recording_path'].'/'.$field['call_recording_name']);
}
//build call recording delete array
$array['xml_cdr'][$x]['xml_cdr_uuid'] = $record['uuid'];
$array['xml_cdr'][$x]['record_path'] = null;
$array['xml_cdr'][$x]['record_name'] = null;
$array['xml_cdr'][$x]['record_length'] = null;
$array['xml_cdr'][$x]['xml_cdr_uuid'] = $record['uuid'];
$array['xml_cdr'][$x]['record_path'] = null;
$array['xml_cdr'][$x]['record_name'] = null;
$array['xml_cdr'][$x]['record_length'] = null;
//increment the id
$x++;
$x++;
}
unset($sql, $parameters, $field);
}
@@ -111,11 +120,10 @@
$p->add('xml_cdr_edit', 'temp');
//remove record_path, record_name and record_length
$database = new database;
$database->app_name = 'xml_cdr';
$database->app_uuid = '4a085c51-7635-ff03-f67b-86e834422848';
$database->save($array, false);
$message = $database->message;
$this->database->app_name = 'xml_cdr';
$this->database->app_uuid = '4a085c51-7635-ff03-f67b-86e834422848';
$this->database->save($array, false);
$message = $this->database->message;
unset($array);
//remove the temporary permissions
@@ -148,14 +156,13 @@
}
//add the settings object
$settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]);
$transcribe_enabled = $settings->get('transcribe', 'enabled', false);
$transcribe_engine = $settings->get('transcribe', 'engine', '');
$transcribe_enabled = $this->settings->get('transcribe', 'enabled', false);
$transcribe_engine = $this->settings->get('transcribe', 'engine', '');
//transcribe multiple recordings
if ($transcribe_enabled && !empty($transcribe_engine) && is_array($records) && @sizeof($records) != 0) {
//add the transcribe object
$transcribe = new transcribe($settings);
$transcribe = new transcribe($this->settings);
//build the array
$x = 0;
@@ -169,24 +176,25 @@
$sql .= "where call_recording_uuid = :call_recording_uuid ";
$sql .= "and call_recording_transcription is null ";
$parameters['call_recording_uuid'] = $record['uuid'];
$database = new database;
$field = $database->select($sql, $parameters, 'row');
$field = $this->database->select($sql, $parameters, 'row');
if (
is_array($field) &&
@sizeof($field) != 0 &&
file_exists($field['call_recording_path'].'/'.$field['call_recording_name'])
) {
//audio to text - get the transcription from the audio file
$transcribe->audio_path = $field['call_recording_path'];
$transcribe->audio_filename = $field['call_recording_name'];
$record_transcription = $transcribe->transcribe();
$transcribe->audio_path = $field['call_recording_path'];
$transcribe->audio_filename = $field['call_recording_name'];
$record_transcription = $transcribe->transcribe();
//build call recording data array
if (!empty($record_transcription)) {
$array['xml_cdr'][$x]['xml_cdr_uuid'] = $record['uuid'];
$array['xml_cdr'][$x]['record_transcription'] = $record_transcription;
}
if (!empty($record_transcription)) {
$array['xml_cdr'][$x]['xml_cdr_uuid'] = $record['uuid'];
$array['xml_cdr'][$x]['record_transcription'] = $record_transcription;
}
//increment the id
$x++;
$x++;
}
unset($sql, $parameters, $field);
@@ -201,11 +209,10 @@
$p->add('xml_cdr_edit', 'temp');
//remove record_path, record_name and record_length
$database = new database;
$database->app_name = 'xml_cdr';
$database->app_uuid = '4a085c51-7635-ff03-f67b-86e834422848';
$database->save($array, false);
$message = $database->message;
$this->database->app_name = 'xml_cdr';
$this->database->app_uuid = '4a085c51-7635-ff03-f67b-86e834422848';
$this->database->save($array, false);
$message = $this->database->message;
unset($array);
//remove the temporary permissions
@@ -226,24 +233,70 @@
public function download($records = null) {
if (permission_exists('call_recording_play') || permission_exists('call_recording_download')) {
//get the settings
$record_name = $this->settings->get('call_recordings', 'record_name', '');
$storage_type = $this->settings->get('call_recordings', 'storage_type', '');
$time_zone = $this->settings->get('domain', 'time_zone', '');
//set the time zone
if (!empty($time_zone)) {
$time_zone = $time_zone;
}
else {
$time_zone = date_default_timezone_get();
}
//single recording
if (empty($records) || !is_array($records) || @sizeof($records) == 0) {
//get call recording from database
if (is_uuid($this->recording_uuid)) {
$sql = "select call_recording_name, call_recording_path ";
if (!empty($_SESSION['call_recordings']['storage_type']['text']) && $_SESSION['call_recordings']['storage_type']['text'] == 'base64' && !empty($row['call_recording_base64'])) {
$sql = ", call_recording_base64 ";
$sql = "select ";
$sql .= "domain_uuid, ";
$sql .= "call_recording_uuid, ";
$sql .= "caller_id_name, ";
$sql .= "caller_id_number, ";
$sql .= "caller_destination, ";
$sql .= "destination_number, ";
$sql .= "call_recording_name, ";
$sql .= "call_recording_path, ";
$sql .= "call_recording_transcription, ";
$sql .= "call_recording_length, ";
$sql .= "call_recording_date, ";
$sql .= "call_direction, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'YYYY') AS call_recording_year, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'Month') AS call_recording_month_name, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'MM') AS call_recording_month_number, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'DD') AS call_recording_day, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'HH24MISS') AS call_recording_time, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'DD Mon YYYY') as call_recording_date_formatted, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'HH12:MI:SS am') as call_recording_time_formatted ";
if (!empty($storage_type) && $storage_type == 'base64' && !empty($row['call_recording_base64'])) {
$sql .= ", call_recording_base64 ";
}
$sql .= "from view_call_recordings ";
$sql .= "where call_recording_uuid = :call_recording_uuid ";
$parameters['call_recording_uuid'] = $this->recording_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
$parameters['time_zone'] = $time_zone;
$row = $this->database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
$call_recording_uuid = $row['call_recording_uuid'];
$caller_id_name = $row['caller_id_name'];
$caller_id_number = $row['caller_id_number'];
$caller_destination = $row['caller_destination'];
$destination_number = $row['destination_number'];
$call_recording_name = $row['call_recording_name'];
$call_recording_path = $row['call_recording_path'];
if (!empty($_SESSION['call_recordings']['storage_type']['text']) && $_SESSION['call_recordings']['storage_type']['text'] == 'base64' && !empty($row['call_recording_base64'])) {
$call_recording_date = $row['call_recording_date'];
$call_direction = $row['call_direction'];
$call_recording_year = $row['call_recording_year'];
$call_recording_month_name = $row['call_recording_month_name'];
$call_recording_month_number = $row['call_recording_month_number'];
$call_recording_day = $row['call_recording_day'];
$call_recording_time = $row['call_recording_time'];
$call_recording_date_formatted = $row['call_recording_date_formatted'];
$call_recording_time_formatted = $row['call_recording_time_formatted'];
if (!empty($storage_type) && $storage_type == 'base64' && !empty($row['call_recording_base64'])) {
file_put_contents($call_recording_path.'/'.$call_recording_name, base64_decode($row['call_recording_base64']));
}
}
@@ -253,6 +306,23 @@
//build full path
$full_recording_path = $call_recording_path.'/'.$call_recording_name;
//created custom name
$call_recording_name_download = $call_recording_name;
if (!empty($record_name)) {
$call_recording_name_download = str_replace('${uuid}', $call_recording_uuid, $record_name);
$call_recording_name_download = str_replace('${caller_id_name}', $caller_id_name, $call_recording_name_download);
$call_recording_name_download = str_replace('${caller_id_number}', $caller_id_number, $call_recording_name_download);
$call_recording_name_download = str_replace('${caller_destination}', $caller_destination, $call_recording_name_download);
$call_recording_name_download = str_replace('${destination_number}', $destination_number, $call_recording_name_download);
$call_recording_name_download = str_replace('${date}', $call_recording_date, $call_recording_name_download);
$call_recording_name_download = str_replace('${call_direction}', $call_direction, $call_recording_name_download);
$call_recording_name_download = str_replace('${year}', $call_recording_year, $call_recording_name_download);
$call_recording_name_download = str_replace('${month_name}', $call_recording_month_name, $call_recording_name_download);
$call_recording_name_download = str_replace('${month_number}', $call_recording_month_number, $call_recording_name_download);
$call_recording_name_download = str_replace('${day}', $call_recording_day, $call_recording_name_download);
$call_recording_name_download = str_replace('${time}', $call_recording_time, $call_recording_name_download);
}
//download the file
if ($full_recording_path != '/' && file_exists($full_recording_path)) {
ob_clean();
@@ -271,8 +341,8 @@
case "ogg" : header("Content-Type: audio/ogg"); break;
}
}
$call_recording_name = preg_replace('#[^a-zA-Z0-9_\-\.]#', '', $call_recording_name);
header('Content-Disposition: attachment; filename="'.$call_recording_name.'"');
$call_recording_name_download = preg_replace('#[^a-zA-Z0-9_\-\.]#', '', $call_recording_name_download);
header('Content-Disposition: attachment; filename="'.$call_recording_name_download.'"');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
if ($this->binary) {
@@ -289,14 +359,11 @@
}
//if base64, remove temp recording file
if (!empty($_SESSION['call_recordings']['storage_type']['text']) && $_SESSION['call_recordings']['storage_type']['text'] == 'base64' && !empty($row['call_recording_base64'])) {
if (!empty($storage_type) && $storage_type == 'base64' && !empty($row['call_recording_base64'])) {
@unlink($full_recording_path);
}
}
//multiple recordings
else {
} else { //multiple recordings
//add multi-lingual support
$language = new text;
@@ -320,24 +387,85 @@
//get data for recordings
if (!empty($uuids) && is_array($uuids) && @sizeof($uuids) != 0) {
$sql = "select call_recording_name, call_recording_path ";
if (!empty($_SESSION['call_recordings']['storage_type']['text']) && $_SESSION['call_recordings']['storage_type']['text'] == 'base64' && $row['call_recording_base64'] != '') {
$sql = ", call_recording_base64 ";
$sql = "select ";
$sql .= "domain_uuid, ";
$sql .= "call_recording_uuid, ";
$sql .= "caller_id_name, ";
$sql .= "caller_id_number, ";
$sql .= "caller_destination, ";
$sql .= "destination_number, ";
$sql .= "call_recording_name, ";
$sql .= "call_recording_path, ";
$sql .= "call_recording_transcription, ";
$sql .= "call_recording_length, ";
$sql .= "call_recording_date, ";
$sql .= "call_direction, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'YYYY') AS call_recording_year, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'Month') AS call_recording_month_name, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'MM') AS call_recording_month_number, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'DD') AS call_recording_day, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'HH24MISS') AS call_recording_time, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'DD Mon YYYY') as call_recording_date_formatted, ";
$sql .= "TO_CHAR(timezone(:time_zone, call_recording_date), 'HH12:MI:SS am') as call_recording_time_formatted ";
if (!empty($storage_type) && $storage_type == 'base64' && $row['call_recording_base64'] != '') {
$sql .= ", call_recording_base64 ";
}
$sql .= "from view_call_recordings ";
$sql .= "where call_recording_uuid in ('".implode("','", $uuids)."') ";
$database = new database;
$rows = $database->select($sql, null, 'all');
$parameters['time_zone'] = $time_zone;
$rows = $this->database->select($sql, $parameters, 'all');
if (!empty($rows) && is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
$call_recording_uuid = $row['call_recording_uuid'];
$caller_id_name = $row['caller_id_name'];
$caller_id_number = $row['caller_id_number'];
$caller_destination = $row['caller_destination'];
$destination_number = $row['destination_number'];
$call_recording_name = $row['call_recording_name'];
$call_recording_path = $row['call_recording_path'];
if (!empty($_SESSION['call_recordings']['storage_type']['text']) && $_SESSION['call_recordings']['storage_type']['text'] == 'base64' && !empty($row['call_recording_base64'])) {
$call_recording_date = $row['call_recording_date'];
$call_direction = $row['call_direction'];
$call_recording_year = $row['call_recording_year'];
$call_recording_month_name = $row['call_recording_month_name'];
$call_recording_month_number = $row['call_recording_month_number'];
$call_recording_day = $row['call_recording_day'];
$call_recording_time = $row['call_recording_time'];
$call_recording_date_formatted = $row['call_recording_date_formatted'];
$call_recording_time_formatted = $row['call_recording_time_formatted'];
if (!empty($storage_type) && $storage_type == 'base64' && !empty($row['call_recording_base64'])) {
file_put_contents($call_recording_path.'/'.$call_recording_name, base64_decode($row['call_recording_base64']));
}
if (file_exists($call_recording_path.'/'.$call_recording_name)) {
$full_recording_paths[] = $call_recording_path.'/'.$call_recording_name;
//add the original file to the array - use original file name
if (empty($record_name)) {
$full_recording_paths[] = $call_recording_path.'/'.$call_recording_name;
}
//created the custom name using the record_name as a template
if (!empty($record_name)) {
$call_recording_name_download = str_replace('${uuid}', $call_recording_uuid, $record_name);
$call_recording_name_download = str_replace('${caller_id_name}', $caller_id_name, $call_recording_name_download);
$call_recording_name_download = str_replace('${caller_id_number}', $caller_id_number, $call_recording_name_download);
$call_recording_name_download = str_replace('${caller_destination}', $caller_destination, $call_recording_name_download);
$call_recording_name_download = str_replace('${destination_number}', $destination_number, $call_recording_name_download);
$call_recording_name_download = str_replace('${date}', $call_recording_date, $call_recording_name_download);
$call_recording_name_download = str_replace('${call_direction}', $call_direction, $call_recording_name_download);
$call_recording_name_download = str_replace('${year}', $call_recording_year, $call_recording_name_download);
$call_recording_name_download = str_replace('${month_name}', $call_recording_month_name, $call_recording_name_download);
$call_recording_name_download = str_replace('${month_number}', $call_recording_month_number, $call_recording_name_download);
$call_recording_name_download = str_replace('${day}', $call_recording_day, $call_recording_name_download);
$call_recording_name_download = str_replace('${time}', $call_recording_time, $call_recording_name_download);
//create a symbolic link with custom name
$command = 'ln -s '.$call_recording_path.'/'.$call_recording_name.' '.$call_recording_path.'/'.$call_recording_name_download;
system($command);
//build the array for all the call recording with the new file name
$full_recording_paths[] = $call_recording_path.'/'.$call_recording_name_download;
}
}
}
}
unset($sql, $rows, $row);
@@ -353,14 +481,21 @@
passthru("zip -qj - ".implode(' ', $full_recording_paths));
}
//if base64, remove temp recording file
if (!empty($_SESSION['call_recordings']['storage_type']['text']) && $_SESSION['call_recordings']['storage_type']['text'] == 'base64' && !empty($row['call_recording_base64'])) {
if (!empty($storage_type) && $storage_type == 'base64' && !empty($row['call_recording_base64'])) {
foreach ($full_recording_paths as $full_recording_path) {
@unlink($full_recording_path);
}
}
//remove the symbolic links to the custom file names
if (!empty($record_name)) {
foreach ($full_recording_paths as $full_recording_path) {
@unlink($full_recording_path);
}
}
//end the script
exit;
}