AutorÃa | Ultima modificación | Ver Log |
// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>.///*** Atto recordrtc library functions** @package atto_recordrtc* @author Jesus Federico (jesus [at] blindsidenetworks [dt] com)* @author Jacob Prud'homme (jacob [dt] prudhomme [at] blindsidenetworks [dt] com)* @copyright 2017 Blindside Networks Inc.* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/// ESLint directives./* eslint-disable camelcase, spaced-comment */// Scrutinizer CI directives./** global: M *//** global: Y */M.atto_recordrtc = M.atto_recordrtc || {};// Shorten access to module namespaces.var cm = M.atto_recordrtc.commonmodule,am = M.atto_recordrtc.abstractmodule,ccm = M.atto_recordrtc.compatcheckmodule;M.atto_recordrtc.videomodule = {init: function(scope) {// Assignment of global variables.cm.editorScope = scope; // Allows access to the editor's "this" context.cm.alertWarning = Y.one('div#alert-warning');cm.alertDanger = Y.one('div#alert-danger');cm.player = Y.one('video#player');cm.playerDOM = document.querySelector('video#player');cm.startStopBtn = Y.one('button#start-stop');cm.uploadBtn = Y.one('button#upload');cm.recType = 'video';cm.maxUploadSize = scope.get('maxrecsize');// Show alert and close plugin if WebRTC is not supported.ccm.check_has_gum();// Show alert and redirect user if connection is not secure.ccm.check_secure();// Run when user clicks on "record" button.cm.startStopBtn.on('click', function() {cm.startStopBtn.set('disabled', true);// If button is displaying "Start Recording" or "Record Again".if ((cm.startStopBtn.get('textContent') === M.util.get_string('startrecording', 'atto_recordrtc')) ||(cm.startStopBtn.get('textContent') === M.util.get_string('recordagain', 'atto_recordrtc')) ||(cm.startStopBtn.get('textContent') === M.util.get_string('recordingfailed', 'atto_recordrtc'))) {// Make sure the upload button is not shown.cm.uploadBtn.ancestor().ancestor().addClass('hide');// Change look of recording button.cm.startStopBtn.replaceClass('btn-outline-danger', 'btn-danger');// Empty the array containing the previously recorded chunks.cm.chunks = [];cm.blobSize = 0;cm.uploadBtn.detach('click');// Initialize common configurations.var commonConfig = {// When the stream is captured from the microphone/webcam.onMediaCaptured: function(stream) {// Make video stream available at a higher level by making it a property of the common module.cm.stream = stream;cm.start_recording(cm.recType, cm.stream);},// Revert button to "Record Again" when recording is stopped.onMediaStopped: function(btnLabel) {cm.startStopBtn.set('textContent', btnLabel);cm.startStopBtn.set('disabled', false);cm.startStopBtn.replaceClass('btn-danger', 'btn-outline-danger');},// Handle recording errors.onMediaCapturingFailed: function(error) {am.handle_gum_errors(error, commonConfig);}};// Show video tag without controls to view webcam stream.cm.player.ancestor().ancestor().removeClass('hide');cm.player.set('controls', false);// Capture audio+video stream from webcam/microphone.M.atto_recordrtc.videomodule.capture_audio_video(commonConfig);} else { // If button is displaying "Stop Recording".// First of all clears the countdownTicker.window.clearInterval(cm.countdownTicker);// Disable "Record Again" button for 1s to allow background processing (closing streams).window.setTimeout(function() {cm.startStopBtn.set('disabled', false);}, 1000);// Stop recording.cm.stop_recording(cm.stream);// Change button to offer to record again.cm.startStopBtn.set('textContent', M.util.get_string('recordagain', 'atto_recordrtc'));cm.startStopBtn.replaceClass('btn-danger', 'btn-outline-danger');}// Get dialogue centered.cm.editorScope.getDialogue().centered();});},// Setup to get audio+video stream from microphone/webcam.capture_audio_video: function(config) {cm.capture_user_media(// Media constraints.{audio: true,video: {width: {ideal: 640},height: {ideal: 480}}},// Success callback.function(audioVideoStream) {// Set video player source to microphone+webcam stream, and play it back as it's recording.cm.playerDOM.srcObject = audioVideoStream;cm.playerDOM.play();config.onMediaCaptured(audioVideoStream);},// Error callback.function(error) {config.onMediaCapturingFailed(error);});}};