Added checking of .wav files for asterisk-compatible format in Audio Store

Added display of bad wav file formats on sounds_list Non-Agent API function

git-svn-id: svn://192.168.202.10@3398 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
mattf
2021-03-22 16:52:40 +00:00
parent 721358510e
commit a571da5d91
6 changed files with 171 additions and 10 deletions
+3
View File
@@ -602,6 +602,9 @@ OTHER CHANGES:
throttling if set to an audible sound at a 20 second interval. Tested
with the 'click_quiet' sound file at a volume of '25'.
169. Added WAV audio file validation for Audio Store, and display of badly
formatted WAV files in the audio chooser in admin.php
+2 -1
View File
@@ -1,4 +1,4 @@
NON-AGENT API DOCUMENT Started: 2008-07-24 Updated: 2021-03-20
NON-AGENT API DOCUMENT Started: 2008-07-24 Updated: 2021-03-22
This document describes the functions of an API(Application Programming
Interface) for all functions NOT directly relating to the VICIDIAL Agent screen.
@@ -180,6 +180,7 @@ Changes:
210316-2207 - Added lead_all_info function
210319-1720 - Added special 'xDAYS' value option for callback_datetime
210320-2127 - Added 'custom_fields_add' option for update_list function
210322-1218 - Added display of bad wav file formats on sounds_list function
API Functions use the 'function' variable
+3 -1
View File
@@ -3440,6 +3440,8 @@ audio_format VARCHAR(10) default 'unknown',
audio_filesize BIGINT(20) UNSIGNED default '0',
audio_epoch BIGINT(20) UNSIGNED default '0',
audio_length INT(10) UNSIGNED default '0',
wav_format_details VARCHAR(255) default '',
wav_asterisk_valid ENUM('','GOOD','BAD','NA') default '',
unique index (audio_filename)
) ENGINE=MyISAM;
@@ -4869,4 +4871,4 @@ INSERT INTO vicidial_settings_containers(container_id,container_notes,container_
UPDATE system_settings set vdc_agent_api_active='1';
UPDATE system_settings SET db_schema_version='1624',db_schema_update_date=NOW(),reload_timestamp=NOW();
UPDATE system_settings SET db_schema_version='1625',db_schema_update_date=NOW(),reload_timestamp=NOW();
+5
View File
@@ -1594,3 +1594,8 @@ ALTER TABLE quality_control_checkpoint_log ADD checkpoint_text_presets TEXT AFTE
ALTER TABLE quality_control_checkpoints ADD checkpoint_text_presets TEXT AFTER checkpoint_text;
UPDATE system_settings SET db_schema_version='1624',db_schema_update_date=NOW() where db_schema_version < 1624;
ALTER TABLE audio_store_details ADD wav_format_details VARCHAR(255) default '';
ALTER TABLE audio_store_details ADD wav_asterisk_valid ENUM('','GOOD','BAD','NA') default '';
UPDATE system_settings SET db_schema_version='1625',db_schema_update_date=NOW() where db_schema_version < 1625;
+132 -5
View File
@@ -32,15 +32,17 @@
# 180618-2300 - Modified calls to audio file chooser function
# 201002-1536 - Allowed for secure sounds_web_server setting
# 210321-0131 - Added classAudioFile PHP library for WAV file format validation
# 210322-1220 - Added checking of .wav files for asterisk-compatible format
#
$version = '2.14-24';
$build = '210321-0131';
$version = '2.14-25';
$build = '210322-1220';
$MT[0]='';
require("dbconnect_mysqli.php");
require("functions.php");
require ('classAudioFile.php');
$server_name = getenv("SERVER_NAME");
$PHP_SELF=$_SERVER['PHP_SELF'];
@@ -320,6 +322,112 @@ if ($action == "LIST")
}
##### BEGIN go through all Audio Store WAV files and validate for asterisk compatibility #####
$stmt = "SELECT count(*) FROM audio_store_details where audio_format='wav' and wav_asterisk_valid='';";
$rslt=mysql_to_mysqli($stmt, $link);
if ($DB) {echo "$stmt\n";}
$wuv_ct = mysqli_num_rows($rslt);
if ( ($wuv_ct > 0) or ($action == "ALL_WAV_VALIDATION") )
{
$i=0;
$filename_sort=$MT;
$dirpath = "$WeBServeRRooT/$sounds_web_directory";
$dh = opendir($dirpath);
while (false !== ($file = readdir($dh)))
{
# Do not list subdirectories
if ( (!is_dir("$dirpath/$file")) and (preg_match('/\.wav$|\.gsm$/', $file)) )
{
if (file_exists("$dirpath/$file"))
{
$file_names[$i] = $file;
$file_epoch[$i] = filemtime("$dirpath/$file");
$file_dates[$i] = date ("Y-m-d H:i:s.", filemtime("$dirpath/$file"));
$file_sizes[$i] = filesize("$dirpath/$file");
$filename_sort[$i] = $file . "----------" . $i . "----------" . $file_sizes[$i];
$i++;
}
}
}
closedir($dh);
sort($filename_sort);
sleep(1);
$wav_valid=0;
$wav_invalid=0;
$not_wav=0;
$k=0;
while($k < $i)
{
$filename_split = explode('----------',$filename_sort[$k]);
$m = $filename_split[1];
$size = $filename_split[2];
$audio_filesize = filesize("$dirpath/$file_names[$m]");
if ($size == $audio_filesize)
{
$audio_filename = $file_names[$m];
$audio_epoch = date("U");
$wav_format_details='';
$wav_asterisk_valid='NA';
if (preg_match("/\.wav$/", $audio_filename))
{
$audio_format='wav';
$audio_length = ($audio_filesize / 16000);
$AF = new AudioFile;
$AF->loadFile("$dirpath/$file_names[$m]");
$wav_type = $AF->wave_type;
$wav_compression = $AF->getCompression ($AF->wave_compression);
$wav_channels = $AF->wave_channels;
$wav_framerate = $AF->wave_framerate;
$wav_bits=$AF->wave_bits;
$audio_length=number_format ($AF->wave_length,"0");
$invalid_wav=0;
if (!preg_match('/^wav/i',$wav_type)) {$invalid_wav++;}
if (!preg_match('/^pcm/i',$wav_compression)) {$invalid_wav++;}
if ($wav_channels > 1) {$invalid_wav++;}
if ( ($wav_framerate > 8000) or ($wav_framerate < 8000) ) {$invalid_wav++;}
if ( ($wav_bits > 16) or ($wav_bits < 16) ) {$invalid_wav++;}
$wav_format_details = "$wav_type channels: $wav_channels framerate: $wav_framerate bits: $wav_bits length: $audio_length compression: $wav_compression";
if ($invalid_wav > 0)
{
$wav_asterisk_valid='BAD';
$wav_invalid++;
}
else
{
$wav_asterisk_valid='GOOD';
$wav_valid++;
}
$stmt="INSERT IGNORE INTO audio_store_details SET audio_filename='$audio_filename',audio_format='$audio_format',audio_filesize='$audio_filesize',audio_epoch='$audio_epoch',audio_length='$audio_length',wav_format_details='$wav_format_details',wav_asterisk_valid='$wav_asterisk_valid' ON DUPLICATE KEY UPDATE audio_filesize='$audio_filesize',audio_epoch='$audio_epoch',audio_length='$audio_length',wav_format_details='$wav_format_details',wav_asterisk_valid='$wav_asterisk_valid';";
if ($DB) {echo "|$stmt|\n";}
$rslt=mysql_to_mysqli($stmt, $link);
$affected_rowsX = mysqli_affected_rows($link);
}
else
{
$not_wav++;
}
if ($DB) {echo "$k\t$file_names[$m]\t$wav_asterisk_valid\n";}
}
$k++;
}
if ($DB) {echo "SUMMARY: WAV VALID: $wav_valid WAV INVALID: $wav_invalid NOT WAV: $not_wav\n";}
}
##### END go through all Audio Store WAV files and validate for asterisk compatibility #####
### upload audio file from server to webserver
# curl 'http://10.0.0.4/vicidial/audio_store.php?action=AUTOUPLOAD' -F "audiofile=@/var/lib/asterisk/sounds/beep.gsm"
if ($action == "AUTOUPLOAD")
@@ -546,14 +654,22 @@ if ($action == "MANUALUPLOAD")
$audiofile_name = preg_replace("/\^/",'',$audiofile_name);
if (preg_match("/\.wav$|\.gsm$/", $audiofile_name))
{
$audio_epoch = date("U");
$audio_format='gsm';
$audio_filesize = filesize("$WeBServeRRooT/$sounds_web_directory/$audiofile_name");
$audio_length = ($audio_filesize / 1650);
$wav_format_details='';
$wav_asterisk_valid='NA';
copy($AF_path, "$WeBServeRRooT/$sounds_web_directory/$audiofile_name");
chmod("$WeBServeRRooT/$sounds_web_directory/$audiofile_name", 0766);
echo "<BR>"._QXZ("SUCCESS").": $audiofile_name "._QXZ("uploaded")." "._QXZ("size").":" . filesize("$WeBServeRRooT/$sounds_web_directory/$audiofile_name") . "<BR><BR>\n";
echo "<BR>"._QXZ("SUCCESS").": $audiofile_name "._QXZ("uploaded")." "._QXZ("size").": $audio_filesize<BR><BR>\n";
if (preg_match("/\.wav$/", $audiofile_name))
{
require ('classAudioFile.php');
$audio_format='wav';
$audio_length = ($audio_filesize / 16000);
$AF = new AudioFile;
$AF->loadFile("$WeBServeRRooT/$sounds_web_directory/$audiofile_name");
@@ -563,6 +679,7 @@ if ($action == "MANUALUPLOAD")
$wav_channels = $AF->wave_channels;
$wav_framerate = $AF->wave_framerate;
$wav_bits=$AF->wave_bits;
$audio_length=number_format ($AF->wave_length,"0");
$invalid_wav=0;
if (!preg_match('/^wav/i',$wav_type)) {$invalid_wav++;}
@@ -571,25 +688,35 @@ if ($action == "MANUALUPLOAD")
if ( ($wav_framerate > 8000) or ($wav_framerate < 8000) ) {$invalid_wav++;}
if ( ($wav_bits > 16) or ($wav_bits < 16) ) {$invalid_wav++;}
$wav_format_details = "$wav_type channels: $wav_channels framerate: $wav_framerate bits: $wav_bits length: $audio_length compression: $wav_compression";
if ($invalid_wav > 0)
{
$wav_asterisk_valid='BAD';
echo " &nbsp; <BR><BR><font color=red>"._QXZ("INVALID WAV FILE FORMAT").": ($audiofile_name)</font><BR> &nbsp; </FONT><FONT FACE=\"ARIAL,HELVETICA\" COLOR=BLACK SIZE=2>$wav_type &nbsp; "._QXZ("channels").": $wav_channels &nbsp; "._QXZ("framerate").": $wav_framerate &nbsp; "._QXZ("bits").": $wav_bits &nbsp; "._QXZ("compression").": $wav_compression<BR><BR><BR>\n";
}
else
{
$wav_asterisk_valid='GOOD';
echo " &nbsp; </FONT><FONT FACE=\"ARIAL,HELVETICA\" COLOR=BLACK SIZE=1>"._QXZ("WAV FILE FORMAT VALIDATED").": $wav_type &nbsp; "._QXZ("channels").": $wav_channels &nbsp; "._QXZ("framerate").": $wav_framerate &nbsp; "._QXZ("bits").": $wav_bits &nbsp; "._QXZ("compression").": $wav_compression<BR><BR>\n";
}
echo "</FONT><FONT FACE=\"ARIAL,HELVETICA\" COLOR=BLACK SIZE=3>";
}
$stmt="INSERT IGNORE INTO audio_store_details SET audio_filename='$audiofile_name',audio_format='$audio_format',audio_filesize='$audio_filesize',audio_epoch='$audio_epoch',audio_length='$audio_length',wav_format_details='$wav_format_details',wav_asterisk_valid='$wav_asterisk_valid' ON DUPLICATE KEY UPDATE audio_filesize='$audio_filesize',audio_epoch='$audio_epoch',audio_length='$audio_length',wav_format_details='$wav_format_details',wav_asterisk_valid='$wav_asterisk_valid';";
if ($DB) {echo "|$stmt|\n";}
$rslt=mysql_to_mysqli($stmt, $link);
$affected_rowsX = mysqli_affected_rows($link);
$stmt="UPDATE servers SET sounds_update='Y';";
$rslt=mysql_to_mysqli($stmt, $link);
$affected_rowsY = mysqli_affected_rows($link);
### LOG INSERTION Admin Log Table ###
$SQL_log = "$stmt|";
$SQL_log = preg_replace('/;/', '', $SQL_log);
$SQL_log = addslashes($SQL_log);
$stmt="INSERT INTO vicidial_admin_log set event_date=NOW(), user='$PHP_AUTH_USER', ip_address='$ip', event_section='AUDIOSTORE', event_type='LOAD', record_id='manualupload', event_code='$audiofile_name " . filesize("$WeBServeRRooT/$sounds_web_directory/$audiofile_name") . "', event_sql=\"$SQL_log\", event_notes='$audiofile_name $AF_path $AF_orig Invalid: $invalid_wav $wav_type &nbsp; "._QXZ("channels").": $wav_channels &nbsp; "._QXZ("framerate").": $wav_framerate &nbsp; "._QXZ("bits").": $wav_bits &nbsp; "._QXZ("compression").": $wav_compression';";
$stmt="INSERT INTO vicidial_admin_log set event_date=NOW(), user='$PHP_AUTH_USER', ip_address='$ip', event_section='AUDIOSTORE', event_type='LOAD', record_id='manualupload', event_code='$audiofile_name $audio_filesize', event_sql=\"$SQL_log\", event_notes='$audiofile_name $AF_path $AF_orig Invalid: $invalid_wav $wav_type &nbsp; "._QXZ("channels").": $wav_channels &nbsp; "._QXZ("framerate").": $wav_framerate &nbsp; "._QXZ("bits").": $wav_bits &nbsp; "._QXZ("compression").": $wav_compression "._QXZ("length").": $audio_length $affected_rowsX|$affected_rowsY';";
if ($DB) {echo "|$stmt|\n";}
$rslt=mysql_to_mysqli($stmt, $link);
}
+26 -3
View File
@@ -168,10 +168,11 @@
# 210316-2207 - Added lead_all_info function
# 210319-1720 - Added special 'xDAYS' value option for callback_datetime
# 210320-2127 - Added 'custom_fields_add' option for update_list function
# 210322-1218 - Added display of bad wav file formats on sounds_list function
#
$version = '2.14-145';
$build = '210320-2127';
$version = '2.14-146';
$build = '210322-1218';
$api_url_log = 0;
$startMS = microtime();
@@ -1202,6 +1203,18 @@ if ($function == 'sounds_list')
exit;
}
$bad_wavs='|';
$stmt="SELECT audio_filename from audio_store_details where wav_asterisk_valid='BAD';";
$rslt=mysql_to_mysqli($stmt, $link);
$bw_ct = mysqli_num_rows($rslt);
$bw=0;
while ($bw_ct > $bw)
{
$row=mysqli_fetch_row($rslt);
$bad_wavs .= "$row[0]|";
$bw++;
}
$dh = opendir($dirpath);
if ($DB>0) {echo "DEBUG: sounds_list variables - $dirpath|$stage|$format\n";}
@@ -1297,8 +1310,18 @@ if ($function == 'sounds_list')
echo "</tr>\n";
}
$sf++;
$BWB=''; $BWE='';
if ( (preg_match('/\.wav$/', $file_names[$m])) and (strlen($bad_wavs) > 2) )
{
$temp_filename = $file_names[$m];
if (preg_match("/\|$temp_filename\|/",$bad_wavs))
{
$BWB='<font color=red><b>';
$BWE=" &nbsp; &nbsp; "._QXZ("BAD WAV FORMAT")."</b></font>";
}
}
echo "<tr><td><font size=1 face=\"Arial,Helvetica\">$sf</td>\n";
echo "<td><a href=\"javascript:choose_file('$file_namesPROMPT[$m]','$comments');\"><font size=1 face=\"Arial,Helvetica\">$file_names[$m]</a></td>\n";
echo "<td><a href=\"javascript:choose_file('$file_namesPROMPT[$m]','$comments');\"><font size=1 face=\"Arial,Helvetica\">$BWB$file_names[$m]$BWE</a></td>\n";
echo "<td><font size=1 face=\"Arial,Helvetica\">$file_dates[$m]</td>\n";
echo "<td><font size=1 face=\"Arial,Helvetica\">$file_sizes[$m]</td>\n";
echo "<td><a href=\"$admDIR/$admin_web_dir$sounds_web_directory/$file_names[$m]\" target=\"_blank\"><font size=1 face=\"Arial,Helvetica\">"._QXZ("PLAY")."</a></td></tr>\n";