{"id":630,"date":"2018-09-26T18:25:31","date_gmt":"2018-09-26T08:25:31","guid":{"rendered":"https:\/\/cost.rocks\/?p=630"},"modified":"2018-10-21T09:24:52","modified_gmt":"2018-10-20T23:24:52","slug":"squwalk-2","status":"publish","type":"post","link":"https:\/\/cost.rocks\/?p=630","title":{"rendered":"SQuWALK"},"content":{"rendered":"<p><script src=\"https:\/\/cost.rocks\/RecordRTC.js\"><\/script><br \/>\n<script src=\"https:\/\/cost.rocks\/gumadapter.js\"><\/script><\/p>\n<style>\n    audio { vertical-align: bottom; width: 20em;}\n    video { max-width: 100%; vertical-align: top;}\n    input { border: 1px solid #d9d9d9; border-radius: 1px;      font-size: 2em; margin: .2em; width: 30%;}\n    p,\n    .inner { padding: 1em;}\n    .li {\n        border-bottom: 1px solid rgb(189, 189, 189);\n        border-left: 1px solid rgb(189, 189, 189);\n        padding: .5em;\n    }\n    label {\n        display: inline-block;\n        width: 8em;\n    }\n    <\/style>\n<style>\n        .recordrtc button {\n            font-size: inherit;\n        }\n        .recordrtc button, .recordrtc select {\n            vertical-align: middle;\n            line-height: 1;\n            padding: 2px 5px;\n            height: auto;\n            font-size: inherit;\n            margin: 0;\n        }\n        .recordrtc, .recordrtc .header {\n            display: block;\n            text-align: center;\n            padding-top: 0;\n        }\n        .recordrtc video {\n            width: 70%;\n        }\n        .recordrtc option[disabled] {\n            display: none;\n        }\n    <\/style>\n<div class=\"github-stargazers\"><\/div>\n<section class=\"experiment recordrtc\"><button>Start Recording<\/button><\/p>\n<div style=\"text-align: center; display: none;\"><button id=\"save-to-disk\">Save To Disk<\/button><br \/>\n<button id=\"open-new-tab\">Open New Tab<\/button><br \/>\n<button id=\"upload-to-server\">Upload To Server<\/button><\/div>\n<p><select class=\"recording-media\"><option value=\"record-audio\">Audio<\/option><\/select><br \/>\ninto<br \/>\n<select class=\"media-container-format\"><option>Ogg<\/option><\/select><br \/>\n<audio>controls muted&gt;<\/audio><br \/>\n<\/section>\n<p><script>\n            (function() {\n                var params = {},\n                    r = \/([^&=]+)=?([^&]*)\/g;\n                    function d(s) {\n                    return decodeURIComponent(s.replace(\/\\+\/g, ' '));\n                }\n                var match, search = window.location.search;\n                while (match = r.exec(search.substring(1))) {\n                    params[d(match[1])] = d(match[2]);\n                    if(d(match[2]) === 'true' || d(match[2]) === 'false') {\n                        params[d(match[1])] = d(match[2]) === 'true' ? true : false;\n                    }\n                }\n                window.params = params;\n            })();\n        <\/script><br \/>\n<script>\n            var recordingDIV = document.querySelector('.recordrtc');\n            var recordingMedia = recordingDIV.querySelector('.recording-media');\n            var recordingPlayer = recordingDIV.querySelector('audio');\n            var mediaContainerFormat = recordingDIV.querySelector('.media-container-format');\n            recordingDIV.querySelector('button').onclick = function() {\n                var button = this;\n                if(button.innerHTML === 'Stop Recording') {\n                    button.disabled = true;\n                    button.disableStateWaiting = true;\n                    setTimeout(function() {\n                        button.disabled = false;\n                        button.disableStateWaiting = false;\n                    }, 5 * 1000);\n                    button.innerHTML = 'Start Recording';\n                    function stopStream() {\n                        if(button.stream && button.stream.stop) {\n                            button.stream.stop();\n                            button.stream = null;\n                        }\n                    }\n                    if(button.recordRTC) {\n                        if(button.recordRTC.length) {\n                            button.recordRTC.stopRecording(function(url) {\n                                if(!button.recordRTC) {\n                                    button.recordingEndedCallback(url);\n                                    stopStream();\n                                    saveToDiskOrOpenNewTab(button.recordRTC);\n                                    return;\n                                }\n                                button.recordRTC.stopRecording(function(url) {\n                                    button.recordingEndedCallback(url);\n                                    stopStream();\n                                });\n                            });\n                        }\n                        else {\n                            button.recordRTC.stopRecording(function(url) {\n                                button.recordingEndedCallback(url);\n                                stopStream();\n                                saveToDiskOrOpenNewTab(button.recordRTC);\n                            });\n                        }\n                    }\n                    return;\n                }\n                button.disabled = true;\n                var commonConfig = {\n                    onMediaCaptured: function(stream) {\n                        button.stream = stream;\n                        if(button.mediaCapturedCallback) {\n                            button.mediaCapturedCallback();\n                        }\n                        button.innerHTML = 'Stop Recording';\n                        button.disabled = false;\n                    },\n                    onMediaStopped: function() {\n                        button.innerHTML = 'Start Recording';\n                        if(!button.disableStateWaiting) {\n                            button.disabled = false;\n                        }\n                    },\n                    onMediaCapturingFailed: function(error) {\n                        if(error.name === 'PermissionDeniedError' && !!navigator.mozGetUserMedia) {\n                            InstallTrigger.install({\n                                'Foo': {\n                                    \/\/ https:\/\/addons.mozilla.org\/firefox\/downloads\/latest\/655146\/addon-655146-latest.xpi?src=dp-btn-primary\n                                    URL: 'https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/enable-screen-capturing\/',\n                                    toString: function () {\n                                        return this.URL;\n                                    }\n                                }\n                            });\n                        }\n                        commonConfig.onMediaStopped();\n                    }\n                };\n                if(recordingMedia.value === 'record-video') {\n                    captureVideo(commonConfig);\n                    button.mediaCapturedCallback = function() {\n                        button.recordRTC = RecordRTC(button.stream, {\n                            type: mediaContainerFormat.value === 'Gif' ? 'gif' : 'video',\n                            disableLogs: params.disableLogs || false,\n                            canvas: {\n                                width: params.canvas_width || 320,\n                                height: params.canvas_height || 240\n                            },\n                            frameInterval: typeof params.frameInterval !== 'undefined' ? parseInt(params.frameInterval) : 20 \/\/ minimum time between pushing frames to Whammy (in milliseconds)\n                        });\n                        button.recordingEndedCallback = function(url) {\n                            recordingPlayer.src = null;\n                            recordingPlayer.srcObject = null;\n                            if(mediaContainerFormat.value === 'Gif') {\n                                recordingPlayer.pause();\n                                recordingPlayer.poster = url;\n                                recordingPlayer.onended = function() {\n                                    recordingPlayer.pause();\n                                    recordingPlayer.poster = URL.createObjectURL(button.recordRTC.blob);\n                                };\n                                return;\n                            }\n                            recordingPlayer.src = url;\n                            recordingPlayer.play();\n                            recordingPlayer.onended = function() {\n                                recordingPlayer.pause();\n                                recordingPlayer.src = URL.createObjectURL(button.recordRTC.blob);\n                            };\n                        };\n                        button.recordRTC.startRecording();\n                    };\n                }\n                if(recordingMedia.value === 'record-audio') {\n                    captureAudio(commonConfig);\n                    button.mediaCapturedCallback = function() {\n                        button.recordRTC = RecordRTC(button.stream, {\n                        type: 'audio',\n                        bufferSize: typeof params.bufferSize == 'undefined' ? 0 : parseInt(params.bufferSize),\n                        sampleRate: typeof params.sampleRate == 'undefined' ? 44100 : parseInt(params.sampleRate),\n                        leftChannel: params.leftChannel || false,\n                        disableLogs: params.disableLogs || false,\n                        recorderType: webrtcDetectedBrowser === 'edge' ? StereoAudioRecorder : null\n                     });\n                     button.recordingEndedCallback = function(url) {\n                            recordingDIV.querySelector('button').click('upload-to-server');\n\/\/                            var audio = new Audio();\n\/\/                            audio.src = url;\n\/\/                            audio.controls = true;\n\/\/                            recordingPlayer.parentNode.appendChild(document.createElement('hr'));\n\/\/                            recordingPlayer.parentNode.appendChild(audio);\n\/\/                            if(audio.paused) audio.play();\n\/\/                            audio.onended = function() {\n\/\/                                audio.pause();\n\/\/                                audio.src = URL.createObjectURL(button.recordRTC.blob);\n\/\/                            };\n                      };\n                      button.recordRTC.setRecordingDuration(5 * 1000).onRecordingStopped(function(url) {\n                            recordingPlayer.pause();\n                            var audio = new Audio();\n                            audio.src = url;\n                            audio.controls = true;\n                            audio.pause();\n                            recordingPlayer.parentNode.appendChild(document.createElement('hr'));\n                            recordingPlayer.parentNode.appendChild(audio);\n                            if(audio.paused) audio.play();\n                            audio.onended = function() {\n                                audio.pause();\n                                audio.src = URL.createObjectURL(button.recordRTC.blob);\n                                recordingDIV.querySelector('button').click();\n                                saveToDiskOrOpenNewTab(button.recordRTC);\n                                uploadToServer(button.recordRTC, function(progress, fileURL) {\n                                     if(progress === 'ended') {\n                                          button.disabled = false;\n                                          button.innerHTML = 'Start Recording';\n                                          return;\n                                    }\n                                    button.innerHTML = progress;\n                               });\n                         };\n                        })\n                        button.recordRTC.startRecording();\n                    };\n                }\n                if(recordingMedia.value === 'record-audio-plus-video') {\n                    captureAudioPlusVideo(commonConfig);\n                    button.mediaCapturedCallback = function() {\n                        if(webrtcDetectedBrowser !== 'firefox') { \/\/ opera or chrome etc.\n                            button.recordRTC = [];\n                            if(!params.bufferSize) {\n                                \/\/ it fixes audio issues whilst recording 720p\n                                params.bufferSize = 16384;\n                            }\n                            var audioRecorder = RecordRTC(button.stream, {\n                                type: 'audio',\n                                bufferSize: typeof params.bufferSize == 'undefined' ? 0 : parseInt(params.bufferSize),\n                                sampleRate: typeof params.sampleRate == 'undefined' ? 44100 : parseInt(params.sampleRate),\n                                leftChannel: params.leftChannel || false,\n                                disableLogs: params.disableLogs || false,\n                                recorderType: webrtcDetectedBrowser === 'edge' ? StereoAudioRecorder : null\n                            });\n                            var videoRecorder = RecordRTC(button.stream, {\n                                type: 'video',\n                                disableLogs: params.disableLogs || false,\n                                canvas: {\n                                    width: params.canvas_width || 320,\n                                    height: params.canvas_height || 240\n                                },\n                                frameInterval: typeof params.frameInterval !== 'undefined' ? parseInt(params.frameInterval) : 20 \/\/ minimum time between pushing frames to Whammy (in milliseconds)\n                            });\n                            \/\/ to sync audio\/video playbacks in browser!\n                            videoRecorder.initRecorder(function() {\n                                audioRecorder.initRecorder(function() {\n                                    audioRecorder.startRecording();\n                                    videoRecorder.startRecording();\n                                });\n                            });\n                            button.recordRTC.push(audioRecorder, videoRecorder);\n                            button.recordingEndedCallback = function() {\n                                var audio = new Audio();\n                                audio.src = audioRecorder.toURL();\n                                audio.controls = true;\n                                audio.autoplay = true;\n                                audio.onloadedmetadata = function() {\n                                    recordingPlayer.src = videoRecorder.toURL();\n                                    recordingPlayer.play();\n                                };\n                                recordingPlayer.parentNode.appendChild(document.createElement('hr'));\n                                recordingPlayer.parentNode.appendChild(audio);\n                                if(audio.paused) audio.play();\n                            };\n                            return;\n                        }\n                        button.recordRTC = RecordRTC(button.stream, {\n                            type: 'video',\n                            disableLogs: params.disableLogs || false,\n                            \/\/ we can't pass bitrates or framerates here\n                            \/\/ Firefox MediaRecorder API lakes these features\n                        });\n                        button.recordinugEndedCallback = function(url) {\n                            recordingPlayer.srcObject = null;\n                            recordingPlayer.muted = false;\n                            recordingPlayer.src = url;\n                            recordingPlayer.play();\n                            recordingPlayer.onended = function() {\n                                recordingPlayer.pause();\n                                recordingPlayer.src = URL.createObjectURL(button.recordRTC.blob);\n                            };\n                        };\n                        button.recordRTC.startRecording();\n                    };\n                }\n                if(recordingMedia.value === 'record-screen') {\n                    captureScreen(commonConfig);\n                    button.mediaCapturedCallback = function() {\n                        button.recordRTC = RecordRTC(button.stream, {\n                            type: mediaContainerFormat.value === 'Gif' ? 'gif' : 'video',\n                            disableLogs: params.disableLogs || false,\n                            canvas: {\n                                width: params.canvas_width || 320,\n                                height: params.canvas_height || 240\n                            }\n                        });\n                        button.recordingEndedCallback = function(url) {\n                            recordingPlayer.src = null;\n                            recordingPlayer.srcObject = null;\n                            if(mediaContainerFormat.value === 'Gif') {\n                                recordingPlayer.pause();\n                                recordingPlayer.poster = url;\n                                recordingPlayer.onended = function() {\n                                    recordingPlayer.pause();\n                                    recordingPlayer.poster = URL.createObjectURL(button.recordRTC.blob);\n                                };\n                                return;\n                            }\n                            recordingPlayer.src = url;\n                            recordingPlayer.play();\n                        };\n                        button.recordRTC.startRecording();\n                    };\n                }\n                if(recordingMedia.value === 'record-audio-plus-screen') {\n                    captureAudioPlusScreen(commonConfig);\n                    button.mediaCapturedCallback = function() {\n                        button.recordRTC = RecordRTC(button.stream, {\n                            type: 'video',\n                            disableLogs: params.disableLogs || false,\n                            \/\/ we can't pass bitrates or framerates here\n                            \/\/ Firefox MediaRecorder API lakes these features\n                        });\n                        button.recordingEndedCallback = function(url) {\n                            recordingPlayer.srcObject = null;\n                            recordingPlayer.muted = false;\n                            recordingPlayer.src = url;\n                            recordingPlayer.play();\n                            recordingPlayer.onended = function() {\n                                recordingPlayer.pause();\n                                recordingPlayer.src = URL.createObjectURL(button.recordRTC.blob);\n                            };\n                        };\n                        button.recordRTC.startRecording();\n                    };\n                }\n            };\n            function captureVideo(config) {\n                captureUserMedia({video: true}, function(videoStream) {\n                    recordingPlayer.srcObject = videoStream;\n                    recordingPlayer.play();\n                    config.onMediaCaptured(videoStream);\n                    videoStream.onended = function() {\n                        config.onMediaStopped();\n                    };\n                }, function(error) {\n                    config.onMediaCapturingFailed(error);\n                });\n            }\n            function captureAudio(config) {\n                captureUserMedia({audio: true}, function(audioStream) {\n                    recordingPlayer.srcObject = audioStream;\n                    recordingPlayer.play();\n                    config.onMediaCaptured(audioStream);\n                    audioStream.onended = function() {\n                        config.onMediaStopped();\n                    };\n                }, function(error) {\n                    config.onMediaCapturingFailed(error);\n                });\n            }\n            function captureAudioPlusVideo(config) {\n                captureUserMedia({video: true, audio: true}, function(audioVideoStream) {\n                    recordingPlayer.srcObject = audioVideoStream;\n                    recordingPlayer.play();\n                    config.onMediaCaptured(audioVideoStream);\n                    audioVideoStream.onended = function() {\n                        config.onMediaStopped();\n                    };\n                }, function(error) {\n                    config.onMediaCapturingFailed(error);\n                });\n            }\n            function captureScreen(config) {\n                getScreenId(function(error, sourceId, screenConstraints) {\n                    if (error === 'not-installed') {\n                        document.write('&gt;h1&lt;&gt;a target=\"_blank\" href=\"https:\/\/chrome.google.com\/webstore\/detail\/screen-capturing\/ajhifddimkapgcifgcodmmfdlknahffk\"&lt;Please install this chrome extension then reload the page.&gt;\/a&lt;&gt;\/h1&lt;');\n                    }\n                    if (error === 'permission-denied') {\n                        alert('Screen capturing permission is denied.');\n                    }\n                    if (error === 'installed-disabled') {\n                        alert('Please enable chrome screen capturing extension.');\n                    }\n                    if(error) {\n                        config.onMediaCapturingFailed(error);\n                        return;\n                    }\n                    captureUserMedia(screenConstraints, function(screenStream) {\n                        recordingPlayer.srcObject = screenStream;\n                        recordingPlayer.play();\n                        config.onMediaCaptured(screenStream);\n                        screenStream.onended = function() {\n                            config.onMediaStopped();\n                        };\n                    }, function(error) {\n                        config.onMediaCapturingFailed(error);\n                    });\n                });\n            }\n            function captureAudioPlusScreen(config) {\n                getScreenId(function(error, sourceId, screenConstraints) {\n                    if (error === 'not-installed') {\n                        document.write('&gt;h1&lt;&gt;a target=\"_blank\" href=\"https:\/\/chrome.google.com\/webstore\/detail\/screen-capturing\/ajhifddimkapgcifgcodmmfdlknahffk\">Please install this chrome extension then reload the page.&gt;\/a&lt;&gt\/h1&lt;');\n                    }\n                    if (error === 'permission-denied') {\n                        alert('Screen capturing permission is denied.');\n                    }\n                    if (error === 'installed-disabled') {\n                        alert('Please enable chrome screen capturing extension.');\n                    }\n                    if(error) {\n                        config.onMediaCapturingFailed(error);\n                        return;\n                    }\n                    screenConstraints.audio = true;\n                    captureUserMedia(screenConstraints, function(screenStream) {\n                        recordingPlayer.srcObject = screenStream;\n                        recordingPlayer.play();\n                        config.onMediaCaptured(screenStream);\n                        screenStream.onended = function() {\n                            config.onMediaStopped();\n                        };\n                    }, function(error) {\n                        config.onMediaCapturingFailed(error);\n                    });\n                });\n            }\n            function captureUserMedia(mediaConstraints, successCallback, errorCallback) {\n             navigator.mediaDevices.getUserMedia(mediaConstraints).then(successCallback).catch(errorCallback);\n            }\n            function setMediaContainerFormat(arrayOfOptionsSupported) {\n                var options = Array.prototype.slice.call(\n                    mediaContainerFormat.querySelectorAll('option')\n                );\n                var selectedItem;\n                options.forEach(function(option) {\n                    option.disabled = true;\n                    if(arrayOfOptionsSupported.indexOf(option.value) !== -1) {\n                        option.disabled = false;\n                        if(!selectedItem) {\n                            option.selected = true;\n                            selectedItem = option;\n                        }\n                    }\n                });\n            }\n            recordingMedia.onchange = function() {\n                if(this.value === 'record-audio') {\n                    setMediaContainerFormat(['WAV', 'Ogg']);\n                    return;\n                }\n\/\/              setMediaContainerFormat(['WebM', \/*'Mp4',*\/ 'Gif']);\n            };\n            if(webrtcDetectedBrowser === 'edge') {\n                \/\/ webp isn't supported in Microsoft Edge\n                \/\/ neither MediaRecorder API\n                \/\/ so lets disable both video\/screen recording options\n                console.warn('Neither MediaRecorder API nor webp is supported in Microsoft Edge. You cam merely record audio.');\n                recordingMedia.innerHTML = '<option value=\"record-audio\">Audio<\/option>';\n                setMediaContainerFormat(['WAV']);\n            }\n            if(webrtcDetectedBrowser === 'firefox') {\n                \/\/ Firefox implemented both MediaRecorder API as well as WebAudio API\n                \/\/ Their MediaRecorder implementation supports both audio\/video recording in single container format\n                \/\/ Remember, we can't currently pass bit-rates or frame-rates values over MediaRecorder API (their implementation lakes these features)\n                recordingMedia.innerHTML = '<option value=\"record-audio-plus-video\">Audio+Video<\/option>'\n                                            + '<option value=\"record-audio-plus-screen\">Audio+Screen<\/option>'\n                                            + recordingMedia.innerHTML;\n            }\n            \/\/ disabling this option because currently this demo\n            \/\/ doesn't supports publishing two blobs.\n            \/\/ todo: add support of uploading both WAV\/WebM to server.\n            if(false && webrtcDetectedBrowser === 'chrome') {\n                recordingMedia.innerHTML = '<option value=\"record-audio-plus-video\">Audio+Video<\/option>'\n                                            + recordingMedia.innerHTML;\n                console.info('This RecordRTC demo merely tries to playback recorded audio\/video sync inside the browser. It still generates two separate files (WAV\/WebM).');\n            }\n            function saveToDiskOrOpenNewTab(recordRTC) {\n                recordingDIV.querySelector('#save-to-disk').parentNode.style.display = 'block';\n                recordingDIV.querySelector('#save-to-disk').onclick = function() {\n                    if(!recordRTC) return alert('No recording found.');\n                    recordRTC.save();\n                };\n                recordingDIV.querySelector('#open-new-tab').onclick = function() {\n                    if(!recordRTC) return alert('No recording found.');\n                    window.open(recordRTC.toURL());\n                };\n                recordingDIV.querySelector('#upload-to-server').disabled = false;\n                recordingDIV.querySelector('#upload-to-server').onclick = function() {\n                    if(!recordRTC) return alert('No recording found.');\n                    this.disabled = true;\n                    var button = this;\n                    uploadToServer(recordRTC, function(progress, fileURL) {\n                        if(progress === 'ended') {\n                            button.disabled = false;\n                            button.innerHTML = 'Click to download from server';\n                            button.onclick = function() {\n                                window.open(fileURL);\n                            };\n                            return;\n                        }\n                        else if(progress === 'Upload Progress 100%') {\n                            button.disabled = false;\n                            button.innerHTML = 'Click to download from server';\n                            button.onclick = function() {\n                                window.open(fileURL);\n                            };\n                            return;\n                        }\n                        else if(progress === 'progress-ended') {\n                            button.disabled = false;\n                            button.innerHTML = 'Click to download from server';\n                            button.onclick = function() {\n                                window.open(fileURL);\n                            };\n                            return;\n                        }\n                        button.innerHTML = progress;\n                        button.click();\n                    });\n                };\n            }\n            var listOfFilesUploaded = [];\n            function uploadToServer(recordRTC, callback) {\n                var blob = recordRTC instanceof Blob ? recordRTC : recordRTC.blob;\n                var fileType = blob.type.split('\/')[0] || 'audio';\n                var fileName = (Math.random() * 1000).toString().replace('.', '');\n                if (fileType === 'audio') {\n                    fileName += '.' + (!!navigator.mozGetUserMedia ? 'ogg' : 'wav');\n                } else {\n                    fileName += '.webm';\n                }\n                \/\/ create FormData\n                var formData = new FormData();\n                formData.append(fileType + '-filename', fileName);\n                formData.append(fileType + '-blob', blob);\n                callback('Uploading ' + fileType + ' recording to server.');\n                makeXMLHttpRequest('save.php', formData, function(progress) {\n                    if (progress !== 'upload-ended') {\n                        callback(progress);\n                        return;\n                    }\n                    var initialURL = location.href.replace(location.href.split('\/').pop(), '') + 'uploads\/';\n                    callback('ended', initialURL + fileName);\n                    \/\/ to make sure we can delete as soon as visitor leaves\n                    listOfFilesUploaded.push(initialURL + fileName);\n                });\n            }\n            function makeXMLHttpRequest(url, data, callback) {\n                var request = new XMLHttpRequest();\n                request.onreadystatechange = function() {\n                    if (request.readyState == 4 && request.status == 200) {\n                        callback('upload-ended');\n                    }\n                };\n                request.upload.onloadstart = function() {\n                    callback('Upload started...');\n                };\n                request.upload.onprogress = function(event) {\n                    callback('Upload Progress ' + Math.round(event.loaded \/ event.total * 100) + \"%\");\n                };\n                request.upload.onload = function() {\n                    callback('progress-about-to-end');\n                };\n                request.upload.onload = function() {\n                    callback('progress-ended');\n                };\n                request.upload.onerror = function(error) {\n                    callback('Failed to upload to server');\n                    console.error('XMLHttpRequest failed', error);\n                };\n                request.upload.onabort = function(error) {\n                    callback('Upload aborted.');\n                    console.error('XMLHttpRequest aborted', error);\n                };\n                request.open('POST', url);\n                request.send(data);\n            }\n            window.onbeforeunload = function() {\n                recordingDIV.querySelector('button').disabled = false;\n                recordingMedia.disabled = false;\n                mediaContainerFormat.disabled = false;\n                if(!listOfFilesUploaded.length) return;\n\/\/                listOfFilesUploaded.forEach(function(fileURL) {\n\/\/                    var request = new XMLHttpRequest();\n\/\/                    request.onreadystatechange = function() {\n\/\/                        if (request.readyState == 4 && request.status == 200) {\n\/\/                            if(this.responseText === ' problem deleting files.') {\n\/\/                                alert('Failed to delete ' + fileURL + ' from the server.');\n\/\/                                return;\n\/\/                            }\n\/\/                            listOfFilesUploaded = [];\n\/\/                            alert('You can leave now. Your files are removed from the server.');\n\/\/                        }\n\/\/                    };\n\/\/                    request.open('POST', 'delete.php');\n\/\/                    var formData = new FormData();\n\/\/                    formData.append('delete-file', fileURL.split('\/').pop());\n\/\/                  request.send(formData);\n\/\/              });\n                return 'Please wait few seconds before your recordings are deleted from the server.';\n            };\n        <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Start Recording Save To Disk Open New Tab Upload To Server Audio into Ogg controls muted&gt;<\/p>\n","protected":false},"author":1,"featured_media":193,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"gallery","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-630","post","type-post","status-publish","format-gallery","has-post-thumbnail","hentry","category-current","post_format-post-format-gallery"],"_links":{"self":[{"href":"https:\/\/cost.rocks\/index.php?rest_route=\/wp\/v2\/posts\/630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cost.rocks\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cost.rocks\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cost.rocks\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cost.rocks\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=630"}],"version-history":[{"count":17,"href":"https:\/\/cost.rocks\/index.php?rest_route=\/wp\/v2\/posts\/630\/revisions"}],"predecessor-version":[{"id":988,"href":"https:\/\/cost.rocks\/index.php?rest_route=\/wp\/v2\/posts\/630\/revisions\/988"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cost.rocks\/index.php?rest_route=\/wp\/v2\/media\/193"}],"wp:attachment":[{"href":"https:\/\/cost.rocks\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cost.rocks\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cost.rocks\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}