Merge pull request #841 from jloguercio/7181-1.10x

Upgrade to WebcamJS from JPEGCam in Document Tools - Refs #7181 to 1.10.x
1.10.x
Yannick Warnier 9 years ago
commit 87ffdf664e
  1. 7
      app/Resources/public/css/base.css
  2. 1
      composer.json
  3. 167
      main/document/webcam_clip.php
  4. 28
      main/document/webcam_receiver.php
  5. 165
      main/inc/lib/jpegcam/LICENSE.txt
  6. 8
      main/inc/lib/jpegcam/index.html
  7. BIN
      main/inc/lib/jpegcam/shutter.mp3
  8. 197
      main/inc/lib/jpegcam/webcam.js
  9. BIN
      main/inc/lib/jpegcam/webcam.swf

@ -6330,6 +6330,13 @@ a.sessionView {
#prev.disabled {
opacity: 0.2;
}
.webcamclip_bg{
width:340px;
height:260px;
border:10px solid;
border-radius: 25px;
border-color: #00677C;
}
/* CSS NEW TOP ******************************************************************************/
/* CSS Responsive */
@media (min-width: 1025px) and (max-width: 1200px) {

@ -76,6 +76,7 @@
"bower-asset/simplewebrtc": "1.15.*",
"bower-asset/select2": "4.*",
"bower-asset/MathJax": "2.5.*",
"bower-asset/webcamjs": "1.0.*",
"clue/graph": "~0.9.0",
"graphp/graphviz": "~0.2.0",
"graphp/algorithms": "~0.8.0",

@ -8,6 +8,7 @@
*
* @author Juan Carlos Raña Trabado herodoto@telefonica.net
* @since 7/jun/2012
* @Updated 04/09/2015 Upgrade to WebCamJS
*/
require_once '../inc/global.inc.php';
@ -127,78 +128,77 @@ echo '</div>';
<div align="center">
<h2><?php echo get_lang('TakeYourPhotos'); ?></h2>
</div>
<div align="center" style="padding-left:50px;">
<table><tr><td valign=top>
<h3><?php echo get_lang('LocalInputImage'); ?></h3>
<!-- First, include the JPEGCam JavaScript Library -->
<script type="text/javascript" src="<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/webcam.js"></script>
<!-- Configure a few settings -->
<script language="JavaScript">
var clip_filename='video_clip.jpg';
//var clip_filename='<?php //echo date('YmdHis') . '.jpg'; ?>';
webcam.set_swf_url ( '<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam//webcam.swf?blackboard.png' );
webcam.set_shutter_sound( true,'<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/shutter.mp3' ); // true play shutter click sound
webcam.set_quality( 90 ); // JPEG quality (1 - 100)
webcam.set_api_url( '<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/webcam_receiver.php?webcamname='+escape(clip_filename)+'&webcamdir=<?php echo $webcamdir; ?>&webcamuserid=<?php echo $webcamuserid; ?>' );
</script>
<!-- Next, write the movie to the page at 320x240 -->
<div align="center">
<table><tr><td valign='top' align='center'>
<h3 align='center'><?php echo get_lang('LocalInputImage'); ?></h3>
<!-- Including New Lib WebCamJS upgrading from JPEGCam -->
<script type="text/javascript" src="<?php echo api_get_path(WEB_PATH); ?>web/assets/webcamjs/webcam.js"></script>
<!-- Adding a div container for the new live camera with some cool style options-->
<div class="webcamclip_bg">
<div id="chamilo-camera"></div>
</div>
<!-- Configure a few settings and attach the camera to the div container -->
<script language="JavaScript">
document.write( webcam.get_html(320, 240) );
Webcam.set({
width: 320,
height: 240,
image_format: 'jpeg',
jpeg_quality: 90
});
Webcam.attach( '#chamilo-camera' );
//This line Fix a minor bug that made a conflict with a videochat feature in another module file
$('video').addClass('skip');
</script>
<!-- Some buttons for controlling things -->
<br/>
<form>
<br/>
<input type=button value="<?php echo get_lang('Snapshot'); ?>" onClick="webcam.freeze()">
<input type=button value="<?php echo get_lang('Clean'); ?>" onClick="webcam.reset()">
<input type=button value="<?php echo get_lang('Send'); ?>" onClick="do_upload()">
&nbsp;&nbsp;||&nbsp;&nbsp;
<input type=button value="<?php echo get_lang('Auto'); ?>" onClick="start_video();">
<input type=button value="<?php echo get_lang('Stop'); ?>" onClick="stop_video()">
<br/>
<input type=button value="<?php echo get_lang('Configure'); ?>" onClick="webcam.configure()">
</form>
<!-- Code to handle the server response (see webcam_receiver.php) -->
<!-- Using now Jquery to do the webcamJS Functions and handle the server response (see webcam_receiver.php now in webcamJS directory) -->
<script language="JavaScript">
webcam.set_hook( 'onComplete', 'my_completion_handler' );
function do_upload() {
// upload to server
if (this.loaded){
document.getElementById('upload_results').innerHTML = '<h3><?php echo get_lang('Uploading'); ?></h3>';
}
webcam.upload();
}
function my_completion_handler(msg) {
// extract URL out of PHP output
if (msg.match(/(http\:\/\/\S+)/)) {
var image_url = RegExp.$1;
image_url=image_url.replace(/\\/g,'/').replace( /.*\//, '' );// extract basename
image_url='<?php echo api_get_path(WEB_COURSE_PATH).$_course['path'].'/document/'.$dir;?>'+image_url+'<?php echo '?'.api_get_cidreq(); ?>';
// show JPEG image in page
document.getElementById('upload_results').innerHTML =
'<div style="width: 320px;">' +
'<h3><?php echo get_lang('ClipSent'); ?></h3>' +
'<img src="' + image_url + '">' +
'</div>';
// reset camera for another shot
webcam.reset();
}
else alert("PHP Error: " + msg);
}
$(document).ready(function() {
$('#btnCapture').click(function() {
Webcam.freeze();
return false;
});
$('#btnClean').click(function() {
Webcam.unfreeze();
return false;
});
$('#btnSave').click(function() {
snap();
return false;
});
$('#btnAuto').click(function() {
start_video();
return false;
});
$('#btnStop').click(function() {
stop_video();
return false;
});
});
function snap() {
Webcam.snap( function(data_uri) {
var clip_filename='video_clip.jpg';
var url = 'webcam_receiver.php?webcamname='+escape(clip_filename)+'&webcamdir=<?php echo $webcamdir; ?>&webcamuserid=<?php echo $webcamuserid; ?>';
Webcam.upload(data_uri, url, function(code, response){
$('#upload_results').html(
'<h3>'+response+'</h3>' +
'<div>'+
'<img src="' + data_uri + '" class="webcamclip_bg">' +
'</div>'+
'</div>'+
'<p hidden="true">'+code+'</p>'
);
});
});
}
</script>
<script language=javascript>
var internaval=null;
var interval=null;
var timeout=null;
var counter=0;
var fps=1000;//one frame per second
@ -207,18 +207,18 @@ echo '</div>';
function stop_video() {
interval=window.clearInterval(interval);
return false;
}
function start_video() {
webcam.set_stealth( true ); // do not freeze image upon capture
interval=window.setInterval("clip_send_video()",fps);
}
function clip_send_video() {
counter++
counter++;
timeout=setTimeout('stop_video()',maxtime);
if(maxclip>=counter){
webcam.snap();// clip and upload
snap();// clip and upload
}
else {
interval=window.clearInterval(interval);
@ -227,9 +227,38 @@ echo '</div>';
</script>
</td><td width=50>&nbsp;</td><td valign=top>
</td><td width=50></td><td valign='top' align='center'>
<div id="upload_results" style="background-color:#ffffff;"></div>
</td></tr></table>
<!-- Implementing Button html5 Tags instead Inputs and some cool bootstrap button styles -->
<div>
<br/>
<form>
<br/>
<button id="btnCapture" class="btn btn-danger">
<i class="fa fa-camera"></i>
<?php echo get_lang('Snapshot'); ?>
</button>
<button id="btnClean" class="btn btn-success">
<i class="fa fa-refresh"></i>
<?php echo get_lang('Clean'); ?>
</button>
<button id="btnSave" class="btn btn-primary">
<i class="fa fa-save"></i>
<?php echo get_lang('Save'); ?>
</button>
&nbsp;&nbsp;||&nbsp;&nbsp;
<button id="btnAuto" class="btn btn-default">
<?php echo get_lang('Auto'); ?>
</button>
<button id="btnStop" class="btn btn-default">
<?php echo get_lang('Stop'); ?>
</button>
<br/>
</form>
<br/>
</div>
</div>
<?php

@ -1,9 +1,11 @@
<?php
/* JPEGCam Script */
/* JPEGCam Script *****UPDATED to lib webcamJS 2015-09-04***** */
/* Receives JPEG webcam submission and saves to local file. */
/* Make sure your directory has permission to write files as your web server user! */
require_once '../../../inc/global.inc.php';
//Changes on directory because move the proper script to the new lib upgrade directory
require_once '../inc/global.inc.php';
////Add security from Chamilo
api_protect_course_script();
api_block_anonymous_users();
@ -46,11 +48,11 @@ if($ext!= 'jpg'){
//Do not use here check Fileinfo method because return: text/plain //CHECK THIS BEFORE COMMIT
$dirBaseDocuments = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document';
$saveDir=$dirBaseDocuments.$webcamdir;
$saveDir = $dirBaseDocuments.$webcamdir;
$current_session_id = api_get_session_id();
$groupId = api_get_group_id();
//avoid duplicates
//Avoid duplicates
$webcamname_to_save=$webcamname;
$title_to_save=str_replace('_',' ',$webcamname);
$webcamname_noex=basename($webcamname, ".jpg");
@ -62,29 +64,19 @@ if (file_exists($saveDir.'/'.$webcamname_noex.'.'.$ext)){
$title_to_save = str_replace('_',' ',$title_to_save);
}
$documentPath = $saveDir.'/'.$webcamname_to_save;
//read content
$content = file_get_contents('php://input');
//Change to move_uploaded_file() function instead file_get_contents() to adapt the new lib
$content = move_uploaded_file($_FILES['webcam']['tmp_name'], $documentPath);
if (!$content) {
print "ERROR: Failed to read data\n";
print "PHP ERROR: Failed to read data\n";
exit();
}
//add to disk
$fh = fopen($documentPath, 'w') or die("can't open file");
fwrite($fh, $content);
fclose($fh);
//
//add document to database
$doc_id = add_document($_course, $webcamdir.'/'.$webcamname_to_save, 'file', filesize($documentPath), $title_to_save);
api_item_property_update($_course, TOOL_DOCUMENT, $doc_id, 'DocumentAdded', $_user['user_id'], $groupId, null, null, null, $current_session_id);
///
$url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']) . '/' . $documentPath;
print "$url\n";
?>
print get_lang('ClipSent');

@ -1,165 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

@ -1,8 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
<br />
</body>
</html>

Binary file not shown.

@ -1,197 +0,0 @@
/* JPEGCam v1.0.9 */
/* Webcam library for capturing JPEG images and submitting to a server */
/* Copyright (c) 2008 - 2009 Joseph Huckaby <jhuckaby@goldcartridge.com> */
/* Licensed under the GNU Lesser Public License */
/* http://www.gnu.org/licenses/lgpl.html */
/* Usage:
<script language="JavaScript">
document.write( webcam.get_html(320, 240) );
webcam.set_api_url( 'test.php' );
webcam.set_hook( 'onComplete', 'my_callback_function' );
function my_callback_function(response) {
alert("Success! PHP returned: " + response);
}
</script>
<a href="javascript:void(webcam.snap())">Take Snapshot</a>
*/
// Everything is under a 'webcam' Namespace
window.webcam = {
version: '1.0.9',
// globals
ie: !!navigator.userAgent.match(/MSIE/),
protocol: location.protocol.match(/https/i) ? 'https' : 'http',
callback: null, // user callback for completed uploads
swf_url: 'webcam.swf', // URI to webcam.swf movie (defaults to cwd)
shutter_url: 'shutter.mp3', // URI to shutter.mp3 sound
api_url: '', // URL to upload script
loaded: false, // true when webcam movie finishes loading
quality: 90, // JPEG quality (1 - 100)
shutter_sound: true, // shutter sound effect on/off
stealth: false, // stealth mode (do not freeze image upon capture)
hooks: {
onLoad: null,
onComplete: null,
onError: null
}, // callback hook functions
set_hook: function(name, callback) {
// set callback hook
// supported hooks: onLoad, onComplete, onError
if (typeof(this.hooks[name]) == 'undefined')
return alert("Hook type not supported: " + name);
this.hooks[name] = callback;
},
fire_hook: function(name, value) {
// fire hook callback, passing optional value to it
if (this.hooks[name]) {
if (typeof(this.hooks[name]) == 'function') {
// callback is function reference, call directly
this.hooks[name](value);
}
else if (typeof(this.hooks[name]) == 'array') {
// callback is PHP-style object instance method
this.hooks[name][0][this.hooks[name][1]](value);
}
else if (window[this.hooks[name]]) {
// callback is global function name
window[ this.hooks[name] ](value);
}
return true;
}
return false; // no hook defined
},
set_api_url: function(url) {
// set location of upload API script
this.api_url = url;
},
set_swf_url: function(url) {
// set location of SWF movie (defaults to webcam.swf in cwd)
this.swf_url = url;
},
get_html: function(width, height, server_width, server_height) {
// Return HTML for embedding webcam capture movie
// Specify pixel width and height (640x480, 320x240, etc.)
// Server width and height are optional, and default to movie width/height
if (!server_width) server_width = width;
if (!server_height) server_height = height;
var html = '';
var flashvars = 'shutter_enabled=' + (this.shutter_sound ? 1 : 0) +
'&shutter_url=' + escape(this.shutter_url) +
'&width=' + width +
'&height=' + height +
'&server_width=' + server_width +
'&server_height=' + server_height;
if (this.ie) {
html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="webcam_movie" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swf_url+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/></object>';
}
else {
html += '<embed id="webcam_movie" src="'+this.swf_url+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="webcam_movie" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" />';
}
this.loaded = false;
return html;
},
get_movie: function() {
// get reference to movie object/embed in DOM
if (!this.loaded) return alert("ERROR: Movie is not loaded yet");
var movie = document.getElementById('webcam_movie');
if (!movie) alert("ERROR: Cannot locate movie 'webcam_movie' in DOM");
return movie;
},
set_stealth: function(stealth) {
// set or disable stealth mode
this.stealth = stealth;
},
snap: function(url, callback, stealth) {
// take snapshot and send to server
// specify fully-qualified URL to server API script
// and callback function (string or function object)
if (callback) this.set_hook('onComplete', callback);
if (url) this.set_api_url(url);
if (typeof(stealth) != 'undefined') this.set_stealth( stealth );
this.get_movie()._snap( this.api_url, this.quality, this.shutter_sound ? 1 : 0, this.stealth ? 1 : 0 );
},
freeze: function() {
// freeze webcam image (capture but do not upload)
this.get_movie()._snap('', this.quality, this.shutter_sound ? 1 : 0, 0 );
},
upload: function(url, callback) {
// upload image to server after taking snapshot
// specify fully-qualified URL to server API script
// and callback function (string or function object)
if (callback) this.set_hook('onComplete', callback);
if (url) this.set_api_url(url);
this.get_movie()._upload( this.api_url );
},
reset: function() {
// reset movie after taking snapshot
this.get_movie()._reset();
},
configure: function(panel) {
// open flash configuration panel -- specify tab name:
// "camera", "privacy", "default", "localStorage", "microphone", "settingsManager"
if (!panel) panel = "camera";
this.get_movie()._configure(panel);
},
set_quality: function(new_quality) {
// set the JPEG quality (1 - 100)
// default is 90
this.quality = new_quality;
},
set_shutter_sound: function(enabled, url) {
// enable or disable the shutter sound effect
// defaults to enabled
this.shutter_sound = enabled;
this.shutter_url = url ? url : 'shutter.mp3';
},
flash_notify: function(type, msg) {
// receive notification from flash about event
switch (type) {
case 'flashLoadComplete':
// movie loaded successfully
this.loaded = true;
this.fire_hook('onLoad');
break;
case 'error':
// HTTP POST error most likely
if (!this.fire_hook('onError', msg)) {
alert("JPEGCam Flash Error: " + msg);
}
break;
case 'success':
// upload complete, execute user callback function
// and pass raw API script results to function
this.fire_hook('onComplete', msg.toString());
break;
default:
// catch-all, just in case
alert("jpegcam flash_notify: " + type + ": " + msg);
break;
}
}
};

Binary file not shown.
Loading…
Cancel
Save