353 lines
14 KiB
JavaScript
353 lines
14 KiB
JavaScript
jQuery(document).ready(function($) {
|
|
let mediaRecorder;
|
|
let audioChunks = [];
|
|
let isRecording = false;
|
|
let audioContext, analyser, dataArray, bufferLength, source;
|
|
|
|
function visualize(stream) {
|
|
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
|
analyser = audioContext.createAnalyser();
|
|
source = audioContext.createMediaStreamSource(stream);
|
|
source.connect(analyser);
|
|
analyser.fftSize = 2048;
|
|
bufferLength = analyser.frequencyBinCount;
|
|
dataArray = new Uint8Array(bufferLength);
|
|
|
|
const canvas = document.getElementById('visualizer');
|
|
const canvasCtx = canvas.getContext('2d');
|
|
|
|
function draw() {
|
|
requestAnimationFrame(draw);
|
|
analyser.getByteTimeDomainData(dataArray);
|
|
|
|
canvasCtx.clearRect(0, 0, canvas.width, canvas.height);
|
|
|
|
const centerY = canvas.height / 2;
|
|
canvasCtx.beginPath();
|
|
canvasCtx.moveTo(0, centerY);
|
|
canvasCtx.lineTo(canvas.width, centerY);
|
|
canvasCtx.strokeStyle = 'rgba(0, 0, 0, 0.2)';
|
|
canvasCtx.lineWidth = 1;
|
|
canvasCtx.stroke();
|
|
|
|
canvasCtx.lineWidth = 2;
|
|
canvasCtx.strokeStyle = 'rgb(0, 0, 0)';
|
|
|
|
canvasCtx.beginPath();
|
|
let sliceWidth = canvas.width * 1.0 / bufferLength;
|
|
let x = 0;
|
|
|
|
for (let i = 0; i < bufferLength; i++) {
|
|
let v = dataArray[i] / 128.0;
|
|
let y = v * canvas.height / 2;
|
|
|
|
if (i === 0) {
|
|
canvasCtx.moveTo(x, y);
|
|
} else {
|
|
canvasCtx.lineTo(x, y);
|
|
}
|
|
|
|
x += sliceWidth;
|
|
}
|
|
|
|
canvasCtx.lineTo(canvas.width, canvas.height / 2);
|
|
canvasCtx.stroke();
|
|
}
|
|
|
|
draw();
|
|
}
|
|
|
|
|
|
$('#download-zip').on('click', function() {
|
|
var selectedFiles = [];
|
|
$('.select-audio:checked').each(function() {
|
|
selectedFiles.push($(this).val());
|
|
});
|
|
|
|
if (selectedFiles.length > 0) {
|
|
var form = document.createElement('form');
|
|
form.method = 'POST';
|
|
form.action = '';
|
|
|
|
selectedFiles.forEach(function(file) {
|
|
var input = document.createElement('input');
|
|
input.type = 'hidden';
|
|
input.name = 'selected_files[]';
|
|
input.value = file;
|
|
form.appendChild(input);
|
|
});
|
|
|
|
document.body.appendChild(form);
|
|
form.submit();
|
|
} else {
|
|
$.toast({
|
|
text: "Please select at least one audio file to download.",
|
|
heading: 'Note',
|
|
icon: 'error',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#FF0000',
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
|
|
$('#recording-button').on('click', function() {
|
|
if (!isRecording) {
|
|
navigator.mediaDevices.getUserMedia({ audio: true })
|
|
.then(stream => {
|
|
mediaRecorder = new MediaRecorder(stream);
|
|
mediaRecorder.start();
|
|
visualize(stream);
|
|
|
|
mediaRecorder.ondataavailable = function(event) {
|
|
audioChunks.push(event.data);
|
|
};
|
|
|
|
mediaRecorder.onstop = function() {
|
|
const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
|
|
audioChunks = [];
|
|
const audioUrl = URL.createObjectURL(audioBlob);
|
|
$('#audio-player').attr('src', audioUrl).addClass('show');
|
|
|
|
let formData = new FormData();
|
|
formData.append('audio_data', audioBlob, 'audio.wav');
|
|
formData.append('action', 'save_audio');
|
|
|
|
$.ajax({
|
|
url: ajaxurl,
|
|
type: 'POST',
|
|
data: formData,
|
|
processData: false,
|
|
contentType: false,
|
|
success: function(response) {
|
|
if (response.success) {
|
|
$.toast({
|
|
text: "Audio saved successfully",
|
|
heading: 'Note',
|
|
icon: 'success',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#9EC600',
|
|
});
|
|
} else {
|
|
$.toast({
|
|
text: "Failed to save audio",
|
|
heading: 'Note',
|
|
icon: 'error',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#9EC600',
|
|
});
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
$('#visualizer').show();
|
|
isRecording = true;
|
|
$('#recording-button').css('background-color', 'green');
|
|
});
|
|
} else {
|
|
mediaRecorder.stop();
|
|
$('#visualizer').hide();
|
|
isRecording = false;
|
|
$('#recording-button').css('background-color', 'red');
|
|
}
|
|
});
|
|
|
|
$('#download-selected').on('click', function() {
|
|
let selectedFiles = [];
|
|
$('.select-audio:checked').each(function() {
|
|
selectedFiles.push($(this).val());
|
|
});
|
|
|
|
if (selectedFiles.length > 0) {
|
|
$.ajax({
|
|
url: ajaxurl,
|
|
type: 'POST',
|
|
data: {
|
|
action: 'download_zip',
|
|
files: selectedFiles
|
|
},
|
|
success: function(response) {
|
|
if (response.success) {
|
|
$.toast({
|
|
text: "Zip file created successfully",
|
|
heading: 'Note',
|
|
icon: 'success',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#9EC600',
|
|
});
|
|
|
|
// ایجاد لینک دانلود
|
|
let downloadLink = document.createElement('a');
|
|
downloadLink.href = response.data.zip_url;
|
|
downloadLink.download = response.data.zip_url.split('/').pop();
|
|
document.body.appendChild(downloadLink);
|
|
downloadLink.click();
|
|
document.body.removeChild(downloadLink);
|
|
|
|
// برداشتن انتخاب فایلهای صوتی
|
|
$('.select-audio').prop('checked', false);
|
|
} else {
|
|
$.toast({
|
|
text: "Failed to create zip file: " + response.data,
|
|
heading: 'Error',
|
|
icon: 'error',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#FF0000',
|
|
});
|
|
}
|
|
},
|
|
error: function(jqXHR, textStatus, errorThrown) {
|
|
console.log('AJAX Error: ' + textStatus + ': ' + errorThrown);
|
|
$.toast({
|
|
text: "AJAX Error: " + textStatus + ": " + errorThrown,
|
|
heading: 'Error',
|
|
icon: 'error',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#FF0000',
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
$('#select-all').on('click', function() {
|
|
let isSelectAll = $(this).data('select-all');
|
|
|
|
if (isSelectAll) {
|
|
$('.select-audio').prop('checked', true);
|
|
$(this).text('Unselect All');
|
|
} else {
|
|
$('.select-audio').prop('checked', false);
|
|
$(this).text('Select All');
|
|
}
|
|
|
|
// تغییر حالت دکمه
|
|
$(this).data('select-all', !isSelectAll);
|
|
});
|
|
|
|
|
|
// حذف فایلهای انتخابشده
|
|
$('#delete-selected').on('click', function() {
|
|
let selectedFiles = [];
|
|
$('.select-audio:checked').each(function() {
|
|
selectedFiles.push($(this).val());
|
|
});
|
|
|
|
if (selectedFiles.length > 0 && confirm("Are you sure you want to delete selected audio files?")) {
|
|
$.ajax({
|
|
url: ajaxurl,
|
|
type: 'POST',
|
|
data: {
|
|
action: 'delete_selected_audios',
|
|
files: selectedFiles
|
|
},
|
|
success: function(response) {
|
|
if (response.success) {
|
|
$.toast({
|
|
text: "Selected audio files deleted successfully",
|
|
heading: 'Note',
|
|
icon: 'success',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#9EC600',
|
|
});
|
|
|
|
// پس از حذف موفق فایلها، لیست را بهروزرسانی کنید
|
|
selectedFiles.forEach(function(fileName) {
|
|
$('.delete-audio[data-file="' + fileName + '"]').closest('tr').fadeOut(400, function() {
|
|
$(this).remove();
|
|
});
|
|
});
|
|
} else {
|
|
$.toast({
|
|
text: "Failed to delete selected audio files: " + response.data,
|
|
heading: 'Error',
|
|
icon: 'error',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#FF0000',
|
|
});
|
|
}
|
|
},
|
|
error: function(jqXHR, textStatus, errorThrown) {
|
|
console.log('AJAX Error: ' + textStatus + ': ' + errorThrown);
|
|
$.toast({
|
|
text: "AJAX Error: " + textStatus + ": " + errorThrown,
|
|
heading: 'Error',
|
|
icon: 'error',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#FF0000',
|
|
});
|
|
}
|
|
});
|
|
} else {
|
|
$.toast({
|
|
text: "Please select at least one audio file to delete.",
|
|
heading: 'Error',
|
|
icon: 'error',
|
|
showHideTransition: 'fade',
|
|
allowToastClose: true,
|
|
hideAfter: 3000,
|
|
stack: 3,
|
|
position: 'bottom-center',
|
|
textAlign: 'left',
|
|
loader: true,
|
|
loaderBg: '#FF0000',
|
|
});
|
|
}
|
|
});
|
|
}); |