From e28d985c104e26fbb779f3ed2d2bae9cc54ed1fb Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Mon, 18 May 2026 17:22:04 +0300 Subject: [PATCH] feat: convert outgoing audio to MP3 inside send_media case to bypass getAudioDuration --- whatsapp_app/ios/Podfile.lock | 13 +++++++++++++ whatsapp_bridge/server.js | 16 +++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/whatsapp_app/ios/Podfile.lock b/whatsapp_app/ios/Podfile.lock index a21288e..9d15db5 100644 --- a/whatsapp_app/ios/Podfile.lock +++ b/whatsapp_app/ios/Podfile.lock @@ -1,4 +1,7 @@ PODS: + - audioplayers_darwin (0.0.1): + - Flutter + - FlutterMacOS - Firebase/CoreOnly (10.25.0): - FirebaseCore (= 10.25.0) - Firebase/Messaging (10.25.0): @@ -65,6 +68,8 @@ PODS: - GoogleUtilities/UserDefaults (7.13.3): - GoogleUtilities/Logger - GoogleUtilities/Privacy + - image_picker_ios (0.0.1): + - Flutter - nanopb (2.30910.0): - nanopb/decode (= 2.30910.0) - nanopb/encode (= 2.30910.0) @@ -79,11 +84,13 @@ PODS: - FlutterMacOS DEPENDENCIES: + - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/darwin`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - Flutter (from `Flutter`) - flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) @@ -100,6 +107,8 @@ SPEC REPOS: - PromisesObjC EXTERNAL SOURCES: + audioplayers_darwin: + :path: ".symlinks/plugins/audioplayers_darwin/darwin" firebase_core: :path: ".symlinks/plugins/firebase_core/ios" firebase_messaging: @@ -110,12 +119,15 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_contacts/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sqflite_darwin: :path: ".symlinks/plugins/sqflite_darwin/darwin" SPEC CHECKSUMS: + audioplayers_darwin: 835ced6edd4c9fc8ebb0a7cc9e294a91d99917d5 Firebase: 0312a2352584f782ea56f66d91606891d4607f06 firebase_core: 3b49a055ff54114cae400581c13671fe53936c36 firebase_messaging: 30fa3ec8cd0dc8a860b7817548911b97345a0875 @@ -128,6 +140,7 @@ SPEC CHECKSUMS: flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100 GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 + image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 nanopb: 438bc412db1928dac798aa6fd75726007be04262 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb diff --git a/whatsapp_bridge/server.js b/whatsapp_bridge/server.js index 9684efb..923429a 100644 --- a/whatsapp_bridge/server.js +++ b/whatsapp_bridge/server.js @@ -459,10 +459,24 @@ async function handleMessage(ws, raw) { if (!clientReady) { return respond({ type: 'error', message: 'WhatsApp is not ready' }); } - const { chatId, base64, mimetype, filename, caption } = payload; + let { chatId, base64, mimetype, filename, caption } = payload; if (!chatId || !base64 || !mimetype) { return respond({ type: 'error', message: 'chatId, base64, and mimetype are required' }); } + + // If it is an OGG audio file being sent, convert it to MP3 so the headless browser can decode it and calculate duration + if (mimetype && (mimetype.includes('audio/ogg') || mimetype.includes('ogg'))) { + try { + console.log(`[WS] Converting outgoing OGG audio to MP3 for Puppeteer compatibility...`); + const mp3Base64 = await convertOggToMp3(base64); + base64 = mp3Base64; + mimetype = 'audio/mp3'; + filename = 'voice_note.mp3'; + } catch (err) { + console.error(`[WS] Outgoing audio conversion failed (sending raw Ogg instead):`, err.message); + } + } + try { const { MessageMedia } = require('whatsapp-web.js'); const media = new MessageMedia(mimetype, base64, filename || 'file');