☎️ Web interface for viewing and processing Asterisk call logs (2020)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

170 lines
5.7 KiB

'use strict';
const player = document.querySelector('.body-wrapper > .player');
const audio = player.querySelector('.core');
const handlerPlay = function(ev, id) {
player.classList.add('active');
changeSVGImage(player.querySelector('.button.play-pause'), 'icon-pause');
player.querySelector('.time-slider').value = 0;
player.querySelector('.time-slider').max = 0;
player.querySelector('.time').innerHTML = '00:00';
player.querySelector('.duration').innerHTML = '00:00';
audio.src = '/api/recording/' + id + '?asFile=false';
audio.volume = storageGet('player-volume') || 0.25;
player.querySelector('.volume-slider').value = audio.volume;
audio.load();
audio.play();
ev.stopPropagation();
};
(() => {
let isDragging = false;
const onLoadedMetadata = () => {
if (audio.duration && !isNaN(audio.duration)) {
player.querySelector('.duration').innerHTML = common.convertToDuration(Math.ceil(audio.duration));
player.querySelector('.time-slider').max = audio.duration;
audio.playbackRate = storageGet('player-speed') || 1;
player.querySelector('.speed-slider').value = audio.playbackRate;
player.querySelector('.current-speed').innerHTML = audio.playbackRate * 100 + "%";
}
};
const onEnded = () => {
changeSVGImage(player.querySelector('.button.play-pause'), 'icon-play-fill');
player.querySelector('.time-slider').value = audio.duration;
player.querySelector('.time').innerHTML = common.convertToDuration(Math.ceil(audio.duration));
};
const onError = e => {
let errorText = "";
switch (e.target.error.code) {
case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
errorText = "Файл записи не найден на сервере";
break;
case e.target.error.MEDIA_ERR_NETWORK:
errorText = "Что-то произошло с сетевым подключением";
break;
case e.target.error.MEDIA_ERR_DECODE:
errorText = "Проблема с декодированием аудиофайла";
break;
default:
errorText = "Неизвестная ошибка: " + e.target.error.code;
}
showMessage({
icon: 'icon-error',
header: 'Ошибка!',
text: errorText
});
player.classList.remove('active');
};
const handlerPlayPause = (ev, el) => {
if (!audio.paused) {
changeSVGImage(el, 'icon-play-fill');
audio.pause();
} else {
changeSVGImage(el, 'icon-pause');
audio.play();
}
};
const handlerVolume = () => {
player.querySelector('.volume-bar').classList.toggle('active');
};
const handlerSpeed = () => {
player.querySelector('.speed-bar').classList.toggle('active');
};
const handlerClose = () => {
player.classList.remove('active');
audio.pause();
};
const handlerChangeVolume = (ev, el) => {
if (el.value >= 0 && el.value <= 1) {
audio.volume = el.value;
}
};
const handlerSaveVolume = (ev, el) => {
if (el.value >= 0 && el.value <= 1) {
storageSet('player-volume', el.value);
}
};
const handlerChangeSpeed = (ev, el) => {
audio.playbackRate = el.value;
player.querySelector('.current-speed').innerHTML = audio.playbackRate * 100 + "%";
};
const handlerSaveSpeed = (ev, el) => {
if (el.value >= 0) {
storageSet('player-speed', el.value);
}
};
const handlerResetSpeed = (ev, el) => {
el.value = 1;
audio.playbackRate = 1;
player.querySelector('.speed-slider').value = 1;
player.querySelector('.current-speed').innerHTML = "100%";
storageSet('player-speed', 1);
};
const handlerProgress = () => {
if (!isNaN(audio.currentTime) && !isNaN(audio.duration)) {
if (!isDragging) {
player.querySelector('.time-slider').value = audio.currentTime;
}
player.querySelector('.time').innerHTML = common.convertToDuration(audio.currentTime);
}
};
const handlerChangeTime = e => {
if (!isNaN(audio.duration)) {
const pb = player.querySelector('.time-slider');
audio.currentTime = pb.value;
}
};
createListener(player.querySelector('.button.play-pause'), 'click', handlerPlayPause);
createListener(player.querySelector('.volume-slider'), 'input', handlerChangeVolume);
createListener(player.querySelector('.volume-slider'), 'change', handlerSaveVolume);
createListener(player.querySelector('.speed-slider'), 'input', handlerChangeSpeed);
createListener(player.querySelector('.speed-slider'), 'change', handlerSaveSpeed);
createListener(player.querySelector('.button.reset-speed'), 'click', handlerResetSpeed);
player.querySelector('.button.volume').addEventListener('click', handlerVolume);
player.querySelector('.button.speed').addEventListener('click', handlerSpeed);
player.querySelector('.button.close').addEventListener('click', handlerClose);
player.querySelector('.time-slider').addEventListener('change', handlerChangeTime);
player.querySelector('.time-slider').addEventListener('mousedown', () => {isDragging = true});
player.querySelector('.time-slider').addEventListener('mouseup', () => {isDragging = false});
audio.addEventListener('timeupdate', handlerProgress);
audio.addEventListener('loadedmetadata', onLoadedMetadata);
audio.addEventListener('ended', onEnded);
audio.addEventListener('error', onError);
})();