Skip to content

Commit

Permalink
[mirotalkbro] - improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
miroslavpejic85 committed Jan 16, 2025
1 parent b158334 commit 6554b1a
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 46 deletions.
2 changes: 1 addition & 1 deletion app/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @license For open source under AGPL-3.0
* @license For private project or commercial purposes contact us at: [email protected]
* @author Miroslav Pejic - [email protected]
* @version 1.0.72
* @version 1.0.73
*/

require('dotenv').config();
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mirotalkbro",
"version": "1.0.72",
"version": "1.0.73",
"description": "P2P WebRTC audio, video and screen live broadcast",
"main": "app/server.js",
"scripts": {
Expand All @@ -23,7 +23,7 @@
"author": "Miroslav Pejic",
"license": "AGPLv3",
"dependencies": {
"@sentry/node": "^8.48.0",
"@sentry/node": "^8.50.0",
"compression": "^1.7.5",
"cors": "^2.8.5",
"dotenv": "^16.4.7",
Expand Down
26 changes: 23 additions & 3 deletions public/js/broadcast.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ const settingsForm = document.getElementById('broadcasterSettingsForm');

const copyRoom = document.getElementById('copyRoom');
const shareRoom = document.getElementById('shareRoom');
const enableAudio = document.getElementById('enableAudio');
const disableAudio = document.getElementById('disableAudio');
const videoBtn = document.getElementById('videoBtn');
const screenShareStart = document.getElementById('screenShareStart');
const screenShareStop = document.getElementById('screenShareStop');
Expand Down Expand Up @@ -81,6 +83,8 @@ const isSpeechSynthesisSupported = 'speechSynthesis' in window;
const broadcastTooltips = [
{ element: copyRoom, text: 'Copy and share room URL', position: 'top' },
{ element: shareRoom, text: 'Share room URL', position: 'top' },
{ element: enableAudio, text: 'Enable audio', position: 'top' },
{ element: disableAudio, text: 'Disable audio', position: 'top' },
{ element: videoBtn, text: 'Toggle video', position: 'top' },
{ element: screenShareStart, text: 'Start screen sharing', position: 'top' },
{ element: screenShareStop, text: 'Stop screen sharing', position: 'top' },
Expand Down Expand Up @@ -147,11 +151,9 @@ socket.on('viewer', (id, iceServers, username) => {

handleDataChannels(id);

connectedPeers.innerText = Object.keys(peerConnections).length;

addViewer(id, username);

// popupMessage('toast', 'New viewer', `${username} join`, 'top', 2000);
connectedPeers.innerText = Object.keys(peerConnections).length;

playSound('viewer');

Expand Down Expand Up @@ -270,6 +272,8 @@ elementDisplay(screenShareStop, false);
elementDisplay(settingsForm, broadcastSettings.options.settings, broadcastSettings.options.settings ? 'grid' : 'none');
elementDisplay(copyRoom, broadcastSettings.buttons.copyRoom);
elementDisplay(shareRoom, broadcastSettings.buttons.shareRoom);
elementDisplay(disableAudio, broadcastSettings.buttons.audio);
elementDisplay(enableAudio, broadcastSettings.buttons.audio && false);
elementDisplay(videoBtn, broadcastSettings.buttons.video);
elementDisplay(screenShareStart, broadcastSettings.buttons.screenShareStart);
elementDisplay(recordingStart, broadcastSettings.buttons.recordingStart);
Expand Down Expand Up @@ -366,6 +370,22 @@ navigator.share
? shareRoom.addEventListener('click', shareRoomNavigator)
: shareRoom.addEventListener('click', shareRoomQR);

// =====================================================
// Handle audio
// =====================================================

enableAudio.addEventListener('click', () => toggleAudio(true));
disableAudio.addEventListener('click', () => toggleAudio(false));

function toggleAudio(enable) {
const audioTrack = broadcastStream.getAudioTracks()[0];
if (audioTrack) {
audioTrack.enabled = enable;
}
elementDisplay(enableAudio, !enable);
elementDisplay(disableAudio, enable && broadcastSettings.buttons.audio);
}

// =====================================================
// Handle video stream
// =====================================================
Expand Down
4 changes: 2 additions & 2 deletions public/js/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ const broadcastSettings = {
buttons: {
copyRoom: true,
shareRoom: true,
screenShareStart: true,
audio: true,
video: true,
screenShareStart: true,
recordingStart: true,
messagesOpenForm: true,
viewersOpenForm: true,
Expand All @@ -24,7 +25,6 @@ const broadcastSettings = {

const viewerSettings = {
buttons: {
audio: true,
snapshot: true,
recordingStart: true,
fullScreenOn: true,
Expand Down
23 changes: 16 additions & 7 deletions public/js/swal.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,28 @@ function popupMessage(icon, title, message, position = 'center', timer = 3000) {
}
}

function popupEnableAudio() {
function popupEnableAutoPlay() {
Swal.fire({
allowOutsideClick: false,
allowEscapeKey: false,
showDenyButton: true,
showDenyButton: false,
icon: 'warning',
position: 'top',
title: 'Broadcaster audio',
text: 'Do you want to enable the broadcaster audio?',
confirmButtonText: `Yes`,
denyButtonText: `No`,
title: 'Autoplay is not allowed',
text: 'Please click Play to start playback',
confirmButtonText: '<i class="fas fa-play"></i>',
showClass: { popup: 'animate__animated animate__fadeInDown' },
hideClass: { popup: 'animate__animated animate__fadeOutUp' },
}).then((result) => {
result.isConfirmed ? enableAudio.click() : disableAudio.click();
if (result.isConfirmed) {
video.play().catch((error) => {
console.error('Playback failed', error);
Swal.fire({
icon: 'error',
title: 'Playback Error',
text: 'Failed to start playback. Please try again',
});
});
}
});
}
36 changes: 7 additions & 29 deletions public/js/viewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ const sessionTime = document.getElementById('sessionTime');
const video = document.querySelector('video');
const videoOff = document.getElementById('videoOff');

const enableAudio = document.getElementById('enableAudio');
const disableAudio = document.getElementById('disableAudio');
const recordingStart = document.getElementById('recordingStart');
const recordingStop = document.getElementById('recordingStop');
const recordingLabel = document.getElementById('recordingLabel');
Expand All @@ -45,8 +43,6 @@ const isMobileDevice = deviceType === 'mobile';
// =====================================================

const viewerTooltips = [
{ element: enableAudio, text: 'Enable audio', position: 'top' },
{ element: disableAudio, text: 'Disable audio', position: 'top' },
{ element: recordingStart, text: 'Start recording', position: 'top' },
{ element: recordingStop, text: 'Stop recording', position: 'top' },
{ element: snapshot, text: 'Take a snapshot', position: 'top' },
Expand Down Expand Up @@ -104,10 +100,8 @@ socket.on('offer', (id, description, iceServers) => {
peerConnection.ontrack = (event) => {
saveRecording();
attachStream(event.streams[0]);
if (event.track.kind === 'audio') {
popupEnableAudio();
}
};

peerConnection.onicecandidate = (event) => {
if (event.candidate) {
socket.emit('candidate', id, event.candidate);
Expand Down Expand Up @@ -195,8 +189,6 @@ if (getMode === 'dark') body.classList.toggle('dark');
elementDisplay(fullScreenOff, false);
elementDisplay(recordingLabel, false);
elementDisplay(recordingStop, false);
elementDisplay(disableAudio, viewerSettings.buttons.audio);
elementDisplay(enableAudio, !viewerSettings.buttons.audio);
elementDisplay(snapshot, viewerSettings.buttons.snapshot);
elementDisplay(recordingStart, viewerSettings.buttons.recordingStart);
elementDisplay(fullScreenOn, viewerSettings.buttons.fullScreenOn && isFullScreenSupported());
Expand Down Expand Up @@ -281,29 +273,15 @@ function attachStream(stream) {
video.srcObject = stream;
video.playsInline = true;
video.autoplay = true;
video.muted = true;
video.controls = false;
}

// =====================================================
// Handle audio
// =====================================================

enableAudio.addEventListener('click', setAudioOn);
disableAudio.addEventListener('click', setAudioOff);

function setAudioOn() {
if (!peerConnection) return;
video.muted = false;
elementDisplay(enableAudio, false);
elementDisplay(disableAudio, viewerSettings.buttons.audio);
}

function setAudioOff() {
video.muted = true;
elementDisplay(disableAudio, false);
elementDisplay(enableAudio, true);
}
video.addEventListener('loadeddata', () => {
video.play().catch((error) => {
console.error('Autoplay failed', error.message);
popupEnableAutoPlay();
});
});

// =====================================================
// Handle recording
Expand Down
2 changes: 2 additions & 0 deletions public/views/broadcast.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
<button id="screenShareStart"><i class="fas fa-display"></i></button>
<button id="screenShareStop" class="pulse-bg"><i class="fa-solid fa-circle-stop"></i></button>
<button id="videoBtn"><i class="fas fa-video"></i></button>
<button id="enableAudio" class="color-red"><i class="fas fa-microphone"></i></button>
<button id="disableAudio"><i class="fas fa-microphone"></i></button>
<button id="shareRoom"><i class="fas fa-share-alt"></i></button>
<button id="copyRoom"><i class="fas fa-copy"></i></button>
</div>
Expand Down
2 changes: 0 additions & 2 deletions public/views/viewer.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@
<button id="snapshot"><i class="fas fa-camera-retro"></i></button>
<button id="recordingStart"><i class="fas fa-record-vinyl"></i></button>
<button id="recordingStop" class="color-red"><i class="fas fa-record-vinyl"></i></button>
<button id="enableAudio"><i class="fas fa-microphone-slash"></i></button>
<button id="disableAudio"><i class="fas fa-microphone"></i></button>
</div>
<div id="messagesForm" class="animate__animated animate__zoomIn">
<input id="messageInput" maxlength="1024" name="message" placeholder="Type message..." />
Expand Down

0 comments on commit 6554b1a

Please sign in to comment.