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
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);
|
|
})();
|
|
|