Update music_on_hold.php

Update music_on_hold.php prevent duplciate records if the path already exists.
This commit is contained in:
FusionPBX 2016-07-03 00:56:15 -06:00 committed by GitHub
parent a20881395e
commit e3d23acb3c
1 changed files with 166 additions and 214 deletions

View File

@ -46,100 +46,121 @@
//increase the exucution time
ini_set('max_execution_time', 7200);
//get music_on_hold records, build array
//get the music_on_hold array
$sql = "select * from v_music_on_hold ";
$sql .= "where domain_uuid = '".$domain_uuid."' ";
$sql .= "where ( ";
$sql .= "domain_uuid = '".$_SESSION['domain_uuid']."' ";
if (permission_exists('music_on_hold_global_view')) {
$sql .= "or domain_uuid is null ";
}
$sql .= ") ";
$sql .= "order by domain_uuid desc, music_on_hold_rate asc, music_on_hold_name asc";
$prep_statement = $db->prepare(check_sql($sql));
$prep_statement->execute();
$result = $prep_statement->fetchAll(PDO::FETCH_NAMED);
if (count($result) > 0) {
foreach($result as $row) {
$stream_name_only = (substr_count($row['music_on_hold_name'], '/') > 0) ? substr($row['music_on_hold_name'], 0, strpos($row['music_on_hold_name'], '/')) : $row['music_on_hold_name'];
$stream_domain_uuid = ($row['domain_uuid'] != '') ? $row['domain_uuid'] : '_global_';
$stream_rate = $row['music_on_hold_rate'];
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['uuid'] = $row['music_on_hold_uuid'];
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['name'] = $row['music_on_hold_name']; //value may include '/[rate]'
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['path'] = str_replace('$${sounds_dir}', $_SESSION['switch']['sounds']['dir'], $row['music_on_hold_path']);
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['shuffle'] = $row['music_on_hold_shuffle'];
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['channels'] = $row['music_on_hold_channels'];
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['interval'] = $row['music_on_hold_interval'];
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['chime_list'] = $row['music_on_hold_chime_list'];
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['chime_freq'] = $row['music_on_hold_chime_freq'];
$mohs[$stream_domain_uuid][$stream_name_only][$stream_rate]['chime_max'] = $row['music_on_hold_chime_max'];
$stream_names[(($stream_domain_uuid == '_global_') ? 'global' : 'local')][] = $stream_name_only;
$stream_paths[$row['music_on_hold_uuid']] = str_replace('$${sounds_dir}', $_SESSION['switch']['sounds']['dir'], $row['music_on_hold_path']);
$stream_domains[$row['music_on_hold_uuid']][] = $row['domain_uuid'];
}
}
unset($sql, $prep_statement, $result);
foreach ($mohs as &$moh) { ksort($moh); }
$stream_names['global'] = array_unique($stream_names['global']);
$stream_names['local'] = array_unique($stream_names['local']);
sort($stream_names['global'], SORT_NATURAL);
sort($stream_names['local'], SORT_NATURAL);
//echo "<pre>".print_r($mohs, true)."</pre>\n\n\n\n\n"; exit;
$streams = $prep_statement->fetchAll(PDO::FETCH_NAMED);
//download music on hold file
if ($_GET['action'] == "download") {
$stream_uuid = $_GET['id'];
$stream_file = base64_decode($_GET['file']);
$stream_full_path = path_join($stream_paths[$stream_uuid], $stream_file);
//get the uuid
$stream_uuid = $_GET['id'];
session_cache_limiter('public');
if (file_exists($stream_full_path)) {
$fd = fopen($stream_full_path, "rb");
if ($_GET['t'] == "bin") {
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
}
else {
$stream_file_ext = pathinfo($stream_file, PATHINFO_EXTENSION);
switch ($stream_file_ext) {
case "wav" : header("Content-Type: audio/x-wav"); break;
case "mp3" : header("Content-Type: audio/mpeg"); break;
case "ogg" : header("Content-Type: audio/ogg"); break;
//get the record
foreach($streams as $row) {
if ($stream_uuid == $row['music_on_hold_uuid']) {
$stream_domain_uuid = $row['domain_uuid'];
$stream_name = $row['music_on_hold_name'];
$stream_path = $row['music_on_hold_path'];
break;
}
}
header('Content-Disposition: attachment; filename="'.$stream_file.'"');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Content-Length: ".filesize($stream_full_path));
fpassthru($fd);
}
exit;
//replace the sounds_dir variable in the path
// str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
$stream_path = str_replace('$${sounds_dir}', $_SESSION['switch']['sounds']['dir'], $stream_path);
//get the file
$stream_file = base64_decode($_GET['file']);
$stream_full_path = path_join($stream_path, $stream_file);
//dowload the file
session_cache_limiter('public');
if (file_exists($stream_full_path)) {
$fd = fopen($stream_full_path, "rb");
if ($_GET['t'] == "bin") {
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
}
else {
$stream_file_ext = pathinfo($stream_file, PATHINFO_EXTENSION);
switch ($stream_file_ext) {
case "wav" : header("Content-Type: audio/x-wav"); break;
case "mp3" : header("Content-Type: audio/mpeg"); break;
case "ogg" : header("Content-Type: audio/ogg"); break;
}
}
header('Content-Disposition: attachment; filename="'.$stream_file.'"');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Content-Length: ".filesize($stream_full_path));
fpassthru($fd);
}
exit;
}
//upload music on hold file
if ($_POST['action'] == 'upload' && is_array($_FILES) && is_uploaded_file($_FILES['file']['tmp_name'])) {
//determine name & scope
if ($_POST['name_new'] != '') {
$stream_scope = (permission_exists('music_on_hold_global_add')) ? $_POST['scope'] : 'local';
if (permission_exists('music_on_hold_global_add')) { $stream_scope = $_POST['scope']; } else { $stream_scope = 'local'; }
$stream_name_only = strtolower($_POST['name_new']);
$stream_new_name = true;
if (is_numeric($_POST['rate'])) { $stream_rate = $_POST['rate']; } else { $stream_rate = ''; }
}
else {
$tmp = explode('|', $_POST['name']);
$stream_scope = $tmp[0];
$stream_name_only = $tmp[1];
$stream_new_name = false;
$stream_uuid = $_POST['name'];
foreach ($streams as $row) {
if ($stream_uuid == $row['music_on_hold_uuid']) {
//set the variables
$stream_domain_uuid = $row['domain_uuid'];
$stream_name = $row['music_on_hold_name'];
$stream_path = $row['music_on_hold_path'];
$stream_rate = $row['music_on_hold_rate'];
$stream_shuffle = $row['music_on_hold_shuffle'];
$stream_channels = $row['music_on_hold_channels'];
$stream_internal = $row['music_on_hold_interval'];
$stream_timer_name = $row['music_on_hold_timer_name'];
$stream_chime_list = $row['music_on_hold_chime_list'];
$stream_chime_freq = $row['music_on_hold_chime_freq'];
$stream_chime_max = $row['music_on_hold_chime_max'];
$stream_rate = $row['music_on_hold_rate'];
//set the scope
if (strlen($stream_domain_uuid) == 0) {
$stream_scope = "public";
}
else {
$stream_scope = "local";
}
//end the loop
break;
}
}
$stream_name_only = $stream_name;
}
//get remaining values
$stream_rate = $_POST['rate'];
$stream_file_name_temp = $_FILES['file']['tmp_name'];
$stream_file_name = $_FILES['file']['name'];
$stream_file_ext = strtolower(pathinfo($stream_file_name, PATHINFO_EXTENSION));
//check file type
$valid_file_type = ($stream_file_ext == 'wav' || $stream_file_ext == 'mp3' || $stream_file_ext == 'ogg') ? true : false;
//check permissions
$has_permission = ( ($stream_scope == 'global' && permission_exists('music_on_hold_global_add')) || ($stream_scope == 'local' && permission_exists('music_on_hold_add')) ) ? true : false;
$has_permission = (($stream_scope == 'global' && permission_exists('music_on_hold_global_add'))
|| ($stream_scope == 'local' && permission_exists('music_on_hold_add')) ) ? true : false;
//process, if possible
if (!$valid_file_type) {
$_SESSION['message'] = $text['message-unsupported_file_type'];
@ -166,35 +187,50 @@
(($stream_scope == 'global') ? 'global' : $_SESSION['domain_name']),
$stream_name_only, $path_rate
);
//flag to mark if there already has such music on hold profile
$stream_path_found = false;
//begin query
$music_on_hold_uuid = uuid();
$sql = "insert into v_music_on_hold ";
$sql .= "( ";
$sql .= "music_on_hold_uuid, ";
$sql .= "domain_uuid, ";
$sql .= "music_on_hold_name, ";
$sql .= "music_on_hold_path, ";
$sql .= "music_on_hold_rate, ";
$sql .= "music_on_hold_shuffle, ";
$sql .= "music_on_hold_channels, ";
$sql .= "music_on_hold_interval, ";
$sql .= "music_on_hold_timer_name, ";
$sql .= "music_on_hold_chime_list, ";
$sql .= "music_on_hold_chime_freq, ";
$sql .= "music_on_hold_chime_max ";
$sql .= ") values ";
//new name
if ($stream_new_name) {
//find whether the path already exists
$stream_new_name = true;
foreach ($streams as $row) {
$alternate_path = str_replace('$${sounds_dir}', $_SESSION['switch']['sounds']['dir'], $row['music_on_hold_path']);
if ($stream_path == $row['music_on_hold_path']
|| $stream_path == $alternate_path) {
$stream_new_name = false;
break;
}
}
//set the variables
$music_on_hold_name = $stream_name_only;
$music_on_hold_path = str_replace($_SESSION['switch']['sounds']['dir'], '$${sounds_dir}', $stream_path);
$music_on_hold_path = str_replace('$${sounds_dir}', $_SESSION['switch']['sounds']['dir'], $stream_path);
//begin query
if ($stream_new_name) {
$music_on_hold_uuid = uuid();
$sql = "insert into v_music_on_hold ";
$sql .= "( ";
$sql .= "music_on_hold_uuid, ";
$sql .= "domain_uuid, ";
$sql .= "music_on_hold_name, ";
$sql .= "music_on_hold_path, ";
$sql .= "music_on_hold_rate, ";
$sql .= "music_on_hold_shuffle, ";
$sql .= "music_on_hold_channels, ";
$sql .= "music_on_hold_interval, ";
$sql .= "music_on_hold_timer_name, ";
$sql .= "music_on_hold_chime_list, ";
$sql .= "music_on_hold_chime_freq, ";
$sql .= "music_on_hold_chime_max ";
$sql .= ") ";
$sql .= "values ( ";
$sql .= "'".$music_on_hold_uuid."',";
$sql .= (($stream_scope == 'global') ? 'null' : "'".$domain_uuid."'").", ";
$sql .= "'".check_str($music_on_hold_name)."', ";
$sql .= "'".check_str($music_on_hold_path)."', ";
$sql .= "'".check_str($stream_rate)."', ";
if (strlen($stream_rate) == 0) {
$sql .= "null, ";
}
else {
$sql .= "'".$stream_rate."', ";
}
$sql .= "'false', ";
$sql .= "1, ";
$sql .= "20, ";
@ -205,41 +241,11 @@
$sql .= ") ";
unset($music_on_hold_name, $music_on_hold_path);
}
//existing name
else {
//get existing path
$stream_settings = $mohs[(($stream_scope == 'global') ? '_global_' : $domain_uuid)][$stream_name_only][$stream_rate];
if (($stream_rate_auto && $stream_name_only == $stream_settings['name']) ||
(!$stream_rate_auto && path_join($stream_name_only, $stream_rate) == $stream_settings['name'])) {
$stream_path = $stream_settings['path'];
$stream_path_found = true;
}
//not found, finish query
else {
$music_on_hold_name = $stream_name_only;
$music_on_hold_path = str_replace($_SESSION['switch']['sounds']['dir'], '$${sounds_dir}', $stream_path);
$sql .= "( ";
$sql .= "'".$music_on_hold_uuid."',";
$sql .= (($stream_scope == 'global') ? 'null' : "'".$domain_uuid."'").", ";
$sql .= "'".check_str($music_on_hold_name)."', ";
$sql .= "'".check_str($music_on_hold_path)."', ";
$sql .= "'".check_str($stream_rate)."', ";
$sql .= "'false', ";
$sql .= "1, ";
$sql .= "20, ";
$sql .= "'soft', ";
$sql .= "null, ";
$sql .= "null, ";
$sql .= "null ";
$sql .= ") ";
unset($music_on_hold_name, $music_on_hold_path);
}
}
//execute query
if (!$stream_path_found) {
$db->exec(check_sql($sql));
unset($sql);
$db->exec(check_sql($sql));
unset($sql);
}
//check target folder, move uploaded file
if (!is_dir($stream_path)) {
@ -261,15 +267,26 @@
//delete the music on hold file
if ($_GET['action'] == "delete") {
//get submitted values
$stream_uuid = check_str($_GET['id']);
$stream_file = check_str(base64_decode($_GET['file']));
//get the record
foreach($streams as $row) {
if ($stream_uuid == $row['music_on_hold_uuid']) {
$stream_domain_uuid = $row['domain_uuid'];
$stream_name = $row['music_on_hold_name'];
$stream_path = $row['music_on_hold_path'];
$stream_rate = $row['music_on_hold_rate'];
break;
}
}
//check permissions
if (
($stream_domains[$stream_uuid] == '' && permission_exists('music_on_hold_global_delete')) ||
($stream_domains[$stream_uuid] != '' && permission_exists('music_on_hold_delete'))
) {
$stream_path = $stream_paths[$stream_uuid];
if (($stream_domain_uuid == '' && permission_exists('music_on_hold_global_delete')) ||
($stream_domain_uuid != '' && permission_exists('music_on_hold_delete'))) {
//remove specified file
if ($stream_file != '') {
@unlink(path_join($stream_path, $stream_file));
@ -292,7 +309,7 @@
$sql = "delete from v_music_on_hold ";
$sql .= "where music_on_hold_uuid = '".$stream_uuid."' ";
if (!permission_exists('music_on_hold_global_delete')) {
$sql .= "and domain_uuid = '".$domain_uuid."' ";
$sql .= "and domain_uuid = '".$stream_domain_uuid."' ";
}
//echo $sql; exit;
$prep_statement = $db->prepare(check_sql($sql));
@ -311,75 +328,6 @@
exit;
}
//get variables used to control the order
$order_by = check_str($_GET["order_by"]);
$order = check_str($_GET["order"]);
//add the search term
$search = check_str($_GET["search"]);
if (strlen($search) > 0) {
$sql_search = "and (";
$sql_search .= "music_on_hold_name like '%".$search."%'";
$sql_search .= "or music_on_hold_path like '%".$search."%'";
$sql_search .= "or music_on_hold_rate like '%".$search."%'";
$sql_search .= "or music_on_hold_shuffle like '%".$search."%'";
$sql_search .= "or music_on_hold_channels like '%".$search."%'";
$sql_search .= "or music_on_hold_interval like '%".$search."%'";
$sql_search .= "or music_on_hold_timer_name like '%".$search."%'";
$sql_search .= "or music_on_hold_chime_list like '%".$search."%'";
$sql_search .= "or music_on_hold_chime_freq like '%".$search."%'";
$sql_search .= "or music_on_hold_chime_max like '%".$search."%'";
$sql_search .= ")";
}
//additional includes
require_once "resources/paging.php";
//prepare to page the results
$sql = "select count(*) as num_rows from v_music_on_hold ";
$sql .= "where domain_uuid = '$domain_uuid' ";
$sql .= $sql_search;
if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; }
$prep_statement = $db->prepare($sql);
if ($prep_statement) {
$prep_statement->execute();
$row = $prep_statement->fetch(PDO::FETCH_ASSOC);
if ($row['num_rows'] > 0) {
$num_rows = $row['num_rows'];
}
else {
$num_rows = '0';
}
}
//prepare to page the results
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
$param = "";
$page = $_GET['page'];
if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; }
list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page);
$offset = $rows_per_page * $page;
//set the default order by
if (strlen($order_by) == 0) { $order_by = 'music_on_hold_name, music_on_hold_rate'; }
if (strlen($order) == 0) { $order = 'asc'; }
//get the list
$sql = "select * from v_music_on_hold ";
$sql .= "where (";
$sql .= "domain_uuid = '".$_SESSION['domain_uuid']."' ";
if (permission_exists('music_on_hold_global_view')) {
$sql .= "or domain_uuid is null ";
}
$sql .= ") ";
$sql .= $sql_search;
$sql .= "order by $order_by $order ";
$sql .= "limit $rows_per_page offset $offset ";
$prep_statement = $db->prepare(check_sql($sql));
$prep_statement->execute();
$streams = $prep_statement->fetchAll(PDO::FETCH_NAMED);
unset ($prep_statement, $sql);
//include the header
require_once "resources/header.php";
$document['title'] = $text['title-music_on_hold'];
@ -450,31 +398,36 @@
echo " </td>\n";
echo " <td class='vtable' width='70%' style='white-space: nowrap;'>\n";
echo " <select name='name' id='name_select' class='formfld' style='width: auto;'>\n";
if (is_array($stream_names['local']) && sizeof($stream_names['local']) > 0) {
if (permission_exists('music_on_hold_global_view') && permission_exists('music_on_hold_global_add')) {
echo " <optgroup label='".$text['option-local']."'>\n";
}
foreach ($stream_names['local'] as $local_stream_name) {
echo " <option value='local|".$local_stream_name."'>".str_replace('_',' ',$local_stream_name)."</option>\n";
}
if (permission_exists('music_on_hold_global_view') && permission_exists('music_on_hold_global_add')) {
echo " </optgroup>\n";
echo " <optgroup label='".$text['option-local']."'>\n";
foreach ($streams as $row) {
if (strlen($row['domain_uuid']) > 0) {
if (strlen($row['music_on_hold_rate']) == 0) { $option_name = $row['music_on_hold_name']; }
if (strlen($row['music_on_hold_rate']) > 0) { $option_name = $row['music_on_hold_name'] .'/'.$row['music_on_hold_rate']; }
echo " <option value='".$row['music_on_hold_uuid']."'>".$option_name."</option>\n";
}
}
if (permission_exists('music_on_hold_global_add') && is_array($stream_names['global']) && sizeof($stream_names['global']) > 0) {
echo " </optgroup>\n";
if (permission_exists('music_on_hold_global_add')) {
echo " <optgroup label='".$text['option-global']."'>\n";
foreach ($stream_names['global'] as $global_stream_name) {
echo " <option value='global|".$global_stream_name."' style='font-style: italic;'>".str_replace('_',' ',$global_stream_name)."</option>\n";
foreach ($streams as $row) {
if (strlen($row['domain_uuid']) == 0) {
if (strlen($row['music_on_hold_rate']) == 0) { $option_name = $row['music_on_hold_name']; }
if (strlen($row['music_on_hold_rate']) > 0) { $option_name = $row['music_on_hold_name'] .'/'.$row['music_on_hold_rate']; }
echo " <option value='".$row['music_on_hold_uuid']."'>".$option_name."</option>\n";
}
}
echo " </optgroup>\n";
}
echo " </select>";
echo " <button type='button' id='btn_new' class='btn btn-default list_control_icon' style='margin-left: 3px;' onclick=\"name_mode('new');\"><span class='glyphicon glyphicon-plus'></span></button>";
if (permission_exists('music_on_hold_global_view') && permission_exists('music_on_hold_global_add')) {
echo " <select name='scope' id='scope' class='formfld' style='display: none;' onchange=\"document.getElementById('name_new').focus();\">\n";
echo " <option value='local' selected>".$text['option-local']."</option>\n";
echo " <option value='global'>".$text['option-global']."</option>\n";
echo " </select>\n";
echo " </select>\n";
}
echo " <input class='formfld' style='width: 100px; display: none;' type='text' name='name_new' id='name_new' maxlength='255' value=''>";
echo " <button type='button' id='btn_select' class='btn btn-default list_control_icon' style='display: none; margin-left: 3px;' onclick=\"name_mode('select');\"><span class='glyphicon glyphicon-list-alt'></span></button>";
@ -550,13 +503,12 @@
//set the variables
$music_on_hold_name = $row['music_on_hold_name'];
$music_on_hold_rate = $row['music_on_hold_rate'];
$stream_scope = $row['domain_uuid'];
if (!$stream_scope) $stream_scope = '_global_';
$tmp = explode('/', $row['music_on_hold_name']);
$stream_name_only = $tmp[0];
$stream_rate = $row['music_on_hold_rate'];
$stream_settings = $mohs[$stream_scope][$stream_name_only][$stream_rate];
//add vertical space
echo "<tr class='tr_link_void'><td colspan='5'><div style='width: 1px; height: 10px;'></div></td></tr>\n";
@ -581,20 +533,20 @@
$i = 0;
if (permission_exists('music_on_hold_path')) {
$stream_icons[$i]['glyphicon'] = 'glyphicon-folder-open';
$stream_icons[$i]['title'] = $stream_paths[$row['music_on_hold_uuid']];
$stream_icons[$i]['title'] = $row['music_on_hold_name'];
$i++;
}
if ($stream_settings['shuffle'] == 'true') {
if ($row['music_on_hold_shuffle'] == 'true') {
$stream_icons[$i]['glyphicon'] = 'glyphicon-random';
$stream_icons[$i]['title'] = $text['label-shuffle'];
$i++;
}
if ($stream_settings['chime_list'] != '') {
if ($row['music_on_hold_chime_list'] != '') {
$stream_icons[$i]['glyphicon'] = 'glyphicon-bell';
$stream_icons[$i]['title'] = $text['label-chime_list'].': '.$stream_settings['chime_list'];
$stream_icons[$i]['title'] = $text['label-chime_list'].': '.$row['music_on_hold_chime_list'];
$i++;
}
if ($stream_settings['channels'] == '2') {
if ($row['music_on_hold_channels'] == '2') {
$stream_icons[$i]['glyphicon'] = 'glyphicon-headphones';
$stream_icons[$i]['title'] = $text['label-stereo'];
$stream_icons[$i]['margin'] = 6;