From b22fe1b2ee5a656f4a52e876c01545f27fe361f0 Mon Sep 17 00:00:00 2001 From: Miroslav Pejic Date: Tue, 8 Apr 2025 00:33:25 +0200 Subject: [PATCH] [mirotalk] - #281 - Add Support for Custom Avatar via Options Object --- README.md | 76 ++++++++++++------ app/api/join/join.js | 5 +- app/api/join/join.php | 5 +- app/api/join/join.py | 5 +- app/api/join/join.sh | 32 ++++++-- app/api/swagger.yaml | 5 ++ app/src/api.js | 4 +- app/src/server.js | 14 +++- package.json | 4 +- public/images/admin.png | Bin 0 -> 36490 bytes public/js/brand.js | 2 +- public/js/client.js | 141 +++++++++++++++++++++++++-------- public/js/iframe.js | 2 + public/js/speechRecognition.js | 1 + public/views/iframe.html | 1 + tests/test-api.js | 5 +- 16 files changed, 220 insertions(+), 82 deletions(-) create mode 100644 public/images/admin.png diff --git a/README.md b/README.md index fe98fd35..4ce08dc0 100644 --- a/README.md +++ b/README.md @@ -107,13 +107,14 @@
- You can `directly join a room` by using links like: -- https://p2p.mirotalk.com/join?room=test&name=mirotalk&audio=0&video=0&screen=0&hide=0¬ify=0 -- https://mirotalk.up.railway.app/join?room=test&name=mirotalk&audio=0&video=0&screen=0&hide=0¬ify=0 +- https://p2p.mirotalk.com/join?room=test&name=mirotalk&avatar=0&audio=0&video=0&screen=0&hide=0¬ify=0 +- https://mirotalk.up.railway.app/join?room=test&name=mirotalk&avatar=0&audio=0&video=0&screen=0&hide=0¬ify=0 | Params | Type | Description | | ------ | ------- | --------------- | | room | string | Room Id | | name | string | User name | + | avatar | Mixed | User avatar | | audio | boolean | Audio stream | | video | boolean | Video stream | | screen | boolean | Screen stream | @@ -233,33 +234,56 @@ To embed a meeting within `your service or app` using an iframe, you can use the - `Rest API:` The [API documentation](https://docs.mirotalk.com/mirotalk-p2p/api/) uses [swagger](https://swagger.io/) at http://localhost:3000/api/v1/docs. Or check it out on [live](https://p2p.mirotalk.com/api/v1/docs). +### 1. Stats Endpoint (Get server statistics) + ```bash -# The response will give you the total of rooms and peers. -$ curl -X GET "http://localhost:3000/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -$ curl -X GET "https://p2p.mirotalk.com/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -$ curl -X GET "https://mirotalk.up.railway.app/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -# The response will give you the active meetings (default disabled). -$ curl -X GET "http://localhost:3000/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -$ curl -X GET "https://p2p.mirotalk.com/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -$ curl -X GET "mirotalk.up.railway.app/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -# The response will give you a entrypoint / Room URL for your meeting. -$ curl -X POST "http://localhost:3000/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -$ curl -X POST "https://p2p.mirotalk.com/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -$ curl -X POST "https://mirotalk.up.railway.app/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" -# The response will give you a entrypoint / URL for the direct join to the meeting. -$ curl -X POST "http://localhost:3000/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":"true","video":"true","screen":"false","hide":"false","notify":"true"}' -$ curl -X POST "https://p2p.mirotalk.com/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":"true","video":"true","screen":"false","hide":"false","notify":"true"}' -$ curl -X POST "https://mirotalk.up.railway.app/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":"true","video":"true","screen":"false","hide":"false","notify":"true"}' -# The response will give you an entry point/URL for direct joining to the meeting with a token. -$ curl -X POST "http://localhost:3000/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":"true","video":"true","screen":"false","hide":"false","notify":"true","token":{"username":"username","password":"password","presenter":"true", "expire":"1h"}}' -$ curl -X POST "https://p2p.mirotalk.com/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":"true","video":"true","screen":"false","hide":"false","notify":"true","token":{"username":"username","password":"password","presenter":"true", "expire":"1h"}}' -$ curl -X POST "https://mirotalk.up.railway.app/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":"true","video":"true","screen":"false","hide":"false","notify":"true","token":{"username":"username","password":"password","presenter":"true", "expire":"1h"}}' -# The response will give you a valid token for a meeting. -$ curl -X POST "http://localhost:3000/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":"true", "expire":"1h"}' -$ curl -X POST "https://p2p.mirotalk.com/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":"true", "expire":"1h"}' -$ curl -X POST "https://mirotalk.up.railway.app/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":"true", "expire":"1h"}' +curl -X GET "http://localhost:3000/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +curl -X GET "https://p2p.mirotalk.com/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +curl -X GET "https://mirotalk.up.railway.app/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" ``` +### 2. Meetings Endpoint (Get active meetings) + +```bash +curl -X GET "http://localhost:3000/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +curl -X GET "https://p2p.mirotalk.com/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +curl -X GET "https://mirotalk.up.railway.app/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +``` + +### 3. Create Meeting + +```bash +curl -X POST "http://localhost:3000/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +curl -X POST "https://p2p.mirotalk.com/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +curl -X POST "https://mirotalk.up.railway.app/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" +``` + +### 4. Join Meeting (Basic) + +```bash +curl -X POST "http://localhost:3000/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","avatar":false,"audio":true,"video":true,"screen":false,"hide":false,"notify":true}' +curl -X POST "https://p2p.mirotalk.com/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","avatar":false,"audio":true,"video":true,"screen":false,"hide":false,"notify":true}' +curl -X POST "https://mirotalk.up.railway.app/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","avatar":false,"audio":true,"video":true,"screen":false,"hide":false,"notify":true}' +``` + +### 5. Join Meeting with Token + +```bash +curl -X POST "http://localhost:3000/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":true,"video":true,"screen":false,"hide":false,"notify":true,"token":{"username":"username","password":"password","presenter":true,"expire":"1h"}}' +curl -X POST "https://p2p.mirotalk.com/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":true,"video":true,"screen":false,"hide":false,"notify":true,"token":{"username":"username","password":"password","presenter":true,"expire":"1h"}}' +curl -X POST "https://mirotalk.up.railway.app/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalk","audio":true,"video":true,"screen":false,"hide":false,"notify":true,"token":{"username":"username","password":"password","presenter":true,"expire":"1h"}}' +``` + +### 6. Generate Token + +```bash +curl -X POST "http://localhost:3000/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":true,"expire":"1h"}' +curl -X POST "https://p2p.mirotalk.com/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":true,"expire":"1h"}' +curl -X POST "https://mirotalk.up.railway.app/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":true,"expire":"1h"}' +``` + +These commands should now work correctly with the MiroTalk P2P +
diff --git a/app/api/join/join.js b/app/api/join/join.js index 1e4179ac..2783780a 100644 --- a/app/api/join/join.js +++ b/app/api/join/join.js @@ -21,8 +21,9 @@ async function getJoin() { body: JSON.stringify({ room: 'test', name: 'mirotalk', - audio: true, - video: true, + avatar: false, + audio: false, + video: false, screen: false, hide: false, notify: true, diff --git a/app/api/join/join.php b/app/api/join/join.php index 4dbca02c..6851b340 100644 --- a/app/api/join/join.php +++ b/app/api/join/join.php @@ -20,8 +20,9 @@ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = array( "room" => "test", "name" => "mirotalk", - "audio" => true, - "video" => true, + "avatar" => false, + "audio" => false, + "video" => false, "screen" => false, "hide" => false, "notify" => true, diff --git a/app/api/join/join.py b/app/api/join/join.py index e6af1df9..858e5a9e 100644 --- a/app/api/join/join.py +++ b/app/api/join/join.py @@ -15,8 +15,9 @@ headers = { data = { "room": "test", "name": "mirotalk", - "audio": "true", - "video": "true", + "avatar": "false", + "audio": "false", + "video": "false", "screen": "false", "hide": "false", "notify": "true", diff --git a/app/api/join/join.sh b/app/api/join/join.sh index 09656044..a7b22e6d 100755 --- a/app/api/join/join.sh +++ b/app/api/join/join.sh @@ -1,12 +1,32 @@ #!/bin/bash +# Configuration API_KEY_SECRET="mirotalkp2p_default_secret" MIROTALK_URL="https://p2p.mirotalk.com/api/v1/join" +# Alternative URLs: # MIROTALK_URL="http://localhost:3000/api/v1/join" -# MIROTALK_URL = "https://mirotalk.up.railway.app/api/v1/join" +# MIROTALK_URL="https://mirotalk.up.railway.app/api/v1/join" -curl $MIROTALK_URL \ - --header "authorization: $API_KEY_SECRET" \ - --header "Content-Type: application/json" \ - --data '{"room":"test","name":"mirotalk","audio":"true","video":"true","screen":"false","hide":"false","notify":"true","token":{"username":"username","password":"password","presenter":"true", "expire":"1h"}}' \ - --request POST \ No newline at end of file +# Join request data +REQUEST_DATA='{ + "room": "test", + "name": "mirotalk", + "avatar": false, + "audio": false, + "video": false, + "screen": false, + "hide": false, + "notify": true, + "token": { + "username": "username", + "password": "password", + "presenter": true, + "expire": "1h" + } +}' + +# Make the API request +curl -X POST "$MIROTALK_URL" \ + -H "authorization: $API_KEY_SECRET" \ + -H "Content-Type: application/json" \ + -d "$REQUEST_DATA" \ No newline at end of file diff --git a/app/api/swagger.yaml b/app/api/swagger.yaml index 9c5dfb66..5eb7bc9b 100644 --- a/app/api/swagger.yaml +++ b/app/api/swagger.yaml @@ -84,6 +84,9 @@ paths: name: type: string default: 'mirotalk' + avatar: + type: string + default: '' audio: type: boolean default: false @@ -222,6 +225,8 @@ definitions: properties: peer_name: type: string + peer_avatar: + type: string peer_presenter: type: boolean peer_video: diff --git a/app/src/api.js b/app/src/api.js index f4298b24..0a594618 100644 --- a/app/src/api.js +++ b/app/src/api.js @@ -53,10 +53,11 @@ module.exports = class ServerApi { getJoinURL(data) { // Get data - const { room, name, audio, video, screen, notify, hide, token } = data; + const { room, name, avatar, audio, video, screen, notify, hide, token } = data; const roomValue = room || uuidV4(); const nameValue = name || 'User-' + this.getRandomNumber(); + const avatarValue = avatar || false; const audioValue = audio || false; const videoValue = video || false; const screenValue = screen || false; @@ -70,6 +71,7 @@ module.exports = class ServerApi { '/join?' + `room=${roomValue}` + `&name=${encodeURIComponent(nameValue)}` + + `&avatar=${encodeURIComponent(avatarValue)}` + `&audio=${audioValue}` + `&video=${videoValue}` + `&screen=${screenValue}` + diff --git a/app/src/server.js b/app/src/server.js index 6b5b46c9..5a2bb6ea 100755 --- a/app/src/server.js +++ b/app/src/server.js @@ -45,7 +45,7 @@ dependencies: { * @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon * @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661 * @author Miroslav Pejic - miroslav.pejic.85@gmail.com - * @version 1.4.99 + * @version 1.5.00 * */ @@ -1204,6 +1204,7 @@ io.sockets.on('connect', async (socket) => { channel_password, peer_uuid, peer_name, + peer_avatar, peer_token, peer_video, peer_audio, @@ -1310,6 +1311,7 @@ io.sockets.on('connect', async (socket) => { // collect peers info grp by channels peers[channel][socket.id] = { peer_name: peer_name, + peer_avatar: peer_avatar, peer_presenter: isPresenter, peer_video: peer_video, peer_audio: peer_audio, @@ -1458,7 +1460,7 @@ io.sockets.on('connect', async (socket) => { // Prevent XSS injection const config = checkXSS(cfg); // log.debug('Peer name', config); - const { room_id, peer_name_old, peer_name_new } = config; + const { room_id, peer_name_old, peer_name_new, peer_avatar } = config; let peer_id_to_update = null; @@ -1481,6 +1483,7 @@ io.sockets.on('connect', async (socket) => { const data = { peer_id: peer_id_to_update, peer_name: peer_name_new, + peer_avatar: peer_avatar, }; log.debug('[' + socket.id + '] emit peerName to [room_id: ' + room_id + ']', data); @@ -1556,7 +1559,8 @@ io.sockets.on('connect', async (socket) => { // Prevent XSS injection const config = checkXSS(cfg); // log.debug('Peer action', config); - const { room_id, peer_id, peer_uuid, peer_name, peer_use_video, peer_action, send_to_all } = config; + const { room_id, peer_id, peer_uuid, peer_name, peer_avatar, peer_use_video, peer_action, send_to_all } = + config; // Only the presenter can do this actions const presenterActions = ['muteAudio', 'hideVideo', 'ejectAll']; @@ -1570,6 +1574,7 @@ io.sockets.on('connect', async (socket) => { const data = { peer_id: peer_id, peer_name: peer_name, + peer_avatar: peer_avatar, peer_action: peer_action, peer_use_video: peer_use_video, }; @@ -1622,7 +1627,7 @@ io.sockets.on('connect', async (socket) => { // Prevent XSS injection const config = checkXSS(cfg); // log.debug('File info', config); - const { room_id, peer_id, peer_name, broadcast, file } = config; + const { room_id, peer_id, peer_name, peer_avatar, broadcast, file } = config; // check if valid fileName if (!isValidFileName(file.fileName)) { @@ -1639,6 +1644,7 @@ io.sockets.on('connect', async (socket) => { log.debug('[' + socket.id + '] Peer [' + peer_name + '] send file to room_id [' + room_id + ']', { peerName: peer_name, + peerAvatar: peer_avatar, fileName: file.fileName, fileSize: bytesToSize(file.fileSize), fileType: file.fileType, diff --git a/package.json b/package.json index 377d33e5..5f511fa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mirotalk", - "version": "1.4.99", + "version": "1.5.00", "description": "A free WebRTC browser-based video call", "main": "server.js", "scripts": { @@ -61,7 +61,7 @@ "jsonwebtoken": "^9.0.2", "js-yaml": "^4.1.0", "nodemailer": "^6.10.0", - "openai": "^4.91.1", + "openai": "^4.92.1", "qs": "^6.14.0", "socket.io": "^4.8.1", "swagger-ui-express": "^5.0.1", diff --git a/public/images/admin.png b/public/images/admin.png new file mode 100644 index 0000000000000000000000000000000000000000..07856acd0db2f31e272968353721885b9a769c25 GIT binary patch literal 36490 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 ${peer_name} - +