From b7821ab7385293227413896a96613bb08f0abff9 Mon Sep 17 00:00:00 2001 From: FusionPBX Date: Tue, 13 May 2025 13:57:39 -0600 Subject: [PATCH] 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} --- .../resources/classes/call_recordings.php | 247 ++++++++++++++---- 1 file changed, 191 insertions(+), 56 deletions(-) diff --git a/app/call_recordings/resources/classes/call_recordings.php b/app/call_recordings/resources/classes/call_recordings.php index 46065b13dc..f6a67d3698 100644 --- a/app/call_recordings/resources/classes/call_recordings.php +++ b/app/call_recordings/resources/classes/call_recordings.php @@ -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; }