00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 @require_once('config.inc.php');
00013 require_once('html.inc.php');
00014 require_once('html_parse.inc.php');
00015 require_once('modules.inc.php');
00016
00017 require_once('util.inc.php');
00018
00019
00020
00021
00022
00023
00024 function video_alter_save($args)
00025 {
00026 $elem = $args['elem'];
00027 $obj = &$args['obj'];
00028 if (!elem_has_class($elem, 'video')) {
00029 return false;
00030 }
00031
00032
00033 $childs = html_parse(elem_val($elem));
00034 $v = false;
00035 foreach ($childs as $c) {
00036 if (elem_tag($c) == 'video') {
00037 $v = $c;
00038 break;
00039 }
00040 }
00041 if (!$v) {
00042 log_msg('warn', 'video_alter_save: no video element found, inner html is '.var_dump_inl($childs));
00043 return false;
00044 }
00045
00046
00047 if (elem_attr($v, 'autoplay') !== NULL) {
00048 $obj['video-autoplay'] = 'autoplay';
00049 } else {
00050 $obj['video-autoplay'] = '';
00051 }
00052
00053 if (elem_attr($v, 'loop') !== NULL) {
00054 $obj['video-loop'] = 'loop';
00055 } else {
00056 unset($obj['video-loop']);
00057 }
00058
00059 if (elem_attr($v, 'controls') !== NULL) {
00060 $obj['video-controls'] = 'controls';
00061 } else {
00062 unset($obj['video-controls']);
00063 }
00064
00065 if (elem_attr($v, 'audio') == 'muted') {
00066 $obj['video-volume'] = '0';
00067 } else {
00068 unset($obj['video-volume']);
00069 }
00070 }
00071
00072
00073 function video_delete_object($args)
00074 {
00075 $obj = $args['obj'];
00076 if (!isset($obj['type']) || $obj['type'] != 'video') {
00077 return false;
00078 }
00079
00080 load_modules('glue');
00081 if (!empty($obj['video-file'])) {
00082 $pn = array_shift(expl('.', $obj['name']));
00083 delete_upload(array('pagename'=>$pn, 'file'=>$obj['video-file'], 'max_cnt'=>1));
00084 }
00085 }
00086
00087
00088 function video_has_reference($args)
00089 {
00090 $obj = $args['obj'];
00091 if (!isset($obj['type']) || $obj['type'] != 'video') {
00092 return false;
00093 }
00094
00095
00096 if (@is_link(CONTENT_DIR.'/'.str_replace('.', '/', $obj['name']))) {
00097 return false;
00098 }
00099
00100 if (!empty($obj['video-file']) && $obj['video-file'] == $args['file']) {
00101 return true;
00102 } else {
00103 return false;
00104 }
00105 }
00106
00107
00108 function video_alter_render_early($args)
00109 {
00110 $elem = &$args['elem'];
00111 $obj = $args['obj'];
00112 if (!elem_has_class($elem, 'video')) {
00113 return false;
00114 }
00115
00116
00117 html_add_css(base_url().'modules/video/video.css');
00118
00119 $v = elem('video');
00120 if (empty($obj['video-file'])) {
00121 elem_attr($v, 'src', '');
00122 } else {
00123
00124 if (SHORT_URLS) {
00125 elem_attr($v, 'src', base_url().urlencode($obj['name']));
00126 } else {
00127 elem_attr($v, 'src', base_url().'?'.urlencode($obj['name']));
00128 }
00129 }
00130 elem_css($v, 'width', '100%');
00131 elem_css($v, 'height', '100%');
00132
00133
00134
00135
00136 if (!empty($obj['video-file']) && !empty($obj['video-file-mime'])) {
00137 elem_val($v, '<div class="video-fallback">You are not seeing the video because your browser does not support '.htmlspecialchars($obj['video-file-mime'], ENT_NOQUOTES, 'UTF-8').'. Consider using a contemporary web browser.</div>');
00138 } else {
00139 elem_val($v, '<div class="video-fallback">You are not seeing the video because your browser does not support it. Consider using a contemporary web browser.</div>');
00140 }
00141
00142 if (!isset($obj['video-autoplay']) || $obj['video-autoplay'] == 'autoplay') {
00143
00144 elem_attr($v, 'autoplay', 'autoplay');
00145 } else {
00146 if (VIDEO_START_ON_CLICK) {
00147 elem_attr($v, 'onclick', 'this.play()');
00148 }
00149 }
00150
00151 if (!empty($obj['video-loop'])) {
00152 elem_attr($v, 'loop', 'loop');
00153 }
00154
00155 if (!empty($obj['video-controls'])) {
00156 elem_attr($v, 'controls', 'controls');
00157 }
00158
00159 if (isset($obj['video-volume']) && $obj['video-volume'] == '0') {
00160 elem_attr($v, 'audio', 'muted');
00161 }
00162 elem_append($elem, $v);
00163
00164 return true;
00165 }
00166
00167
00168 function video_render_object($args)
00169 {
00170 $obj = $args['obj'];
00171 if (!isset($obj['type']) || $obj['type'] != 'video') {
00172 return false;
00173 }
00174
00175 $e = elem('div');
00176 elem_attr($e, 'id', $obj['name']);
00177 elem_add_class($e, 'video');
00178 elem_add_class($e, 'resizable');
00179 elem_add_class($e, 'object');
00180
00181
00182 invoke_hook_first('alter_render_early', 'video', array('obj'=>$obj, 'elem'=>&$e, 'edit'=>$args['edit']));
00183 $html = elem_finalize($e);
00184 invoke_hook_last('alter_render_late', 'video', array('obj'=>$obj, 'html'=>&$html, 'elem'=>$e, 'edit'=>$args['edit']));
00185
00186 return $html;
00187 }
00188
00189
00190 function video_render_page_early($args)
00191 {
00192 if ($args['edit']) {
00193 if (USE_MIN_FILES) {
00194 html_add_js(base_url().'modules/video/video-edit.min.js');
00195 } else {
00196 html_add_js(base_url().'modules/video/video-edit.js');
00197 }
00198 html_add_css(base_url().'modules/video/video-edit.css');
00199 }
00200 }
00201
00202
00203 function video_save_state($args)
00204 {
00205 $elem = $args['elem'];
00206 $obj = $args['obj'];
00207 if (array_shift(elem_classes($elem)) != 'video') {
00208 return false;
00209 }
00210
00211
00212 $obj['type'] = 'video';
00213 $obj['module'] = 'video';
00214
00215
00216 invoke_hook('alter_save', array('obj'=>&$obj, 'elem'=>$elem));
00217
00218 load_modules('glue');
00219 $ret = save_object($obj);
00220 if ($ret['#error']) {
00221 log_msg('error', 'video_save_state: save_object returned '.quot($ret['#data']));
00222 return false;
00223 } else {
00224 return true;
00225 }
00226 }
00227
00228
00229 function video_serve_resource($args)
00230 {
00231 $obj = $args['obj'];
00232 if (!isset($obj['type']) || $obj['type'] != 'video') {
00233 return false;
00234 }
00235
00236 if (!empty($obj['video-file'])) {
00237 $pn = array_shift(expl('.', $obj['name']));
00238 if (empty($obj['video-file-mime'])) {
00239 $obj['video-file-mime'] = '';
00240 }
00241 serve_file(CONTENT_DIR.'/'.$pn.'/shared/'.$obj['video-file'], $args['dl'], $obj['video-file-mime']);
00242 }
00243
00244 return false;
00245 }
00246
00247
00248 function video_snapshot_symlink($args)
00249 {
00250 $obj = $args['obj'];
00251 if (!isset($obj['type']) || $obj['type'] != 'video') {
00252 return false;
00253 }
00254
00255 $dest_dir = CONTENT_DIR.'/'.array_shift(expl('.', $obj['name'])).'/shared';
00256 $src_file = CONTENT_DIR.'/'.array_shift(expl('.', $args['origin'])).'/shared/'.$obj['video-file'];
00257
00258 if (($f = dir_has_same_file($dest_dir, $src_file)) !== false) {
00259 $obj['video-file'] = $f;
00260 } else {
00261
00262 $dest_file = $dest_dir.'/'.unique_filename($dest_dir, $src_file);
00263 $m = umask(0111);
00264 if (!(@copy($src_file, $dest_file))) {
00265 umask($m);
00266 log_msg('error', 'video_snapshot_symlink: error copying referenced file '.quot($src_file).' to '.quot($dest_file));
00267 return false;
00268 }
00269 umask($m);
00270 $obj['video-file'] = basename($dest_file);
00271 log_msg('info', 'video_snapshot_symlink: copied referenced file to '.quot($dest_file));
00272 }
00273 $ret = save_object($obj);
00274 if ($ret['#error']) {
00275 log_msg('error', 'video_snapshot_symlink: error saving object '.quot($obj['name']));
00276 return false;
00277 } else {
00278 return true;
00279 }
00280 }
00281
00282
00283 function video_upload($args)
00284 {
00285 $ext = filext($args['file']);
00286 if ($args['mime'] == 'video/ogg' || $ext == 'ogv' || $ext == 'ogg') {
00287
00288
00289
00290 $mime = 'video/ogg';
00291 } elseif ($args['mime'] == 'video/h264' || $ext == 'h264') {
00292
00293 $mime = 'video/h264';
00294 } elseif ($args['mime'] == 'video/mp4' || $ext == 'mp4') {
00295
00296 $mime = 'video/mp4';
00297 } elseif ($args['mime'] == 'video/webm' || $ext == 'webm') {
00298
00299 $mime = 'video/webm';
00300 } else {
00301 return false;
00302 }
00303
00304 load_modules('glue');
00305 $obj = create_object($args);
00306 if ($obj['#error']) {
00307 return false;
00308 } else {
00309 $obj = $obj['#data'];
00310 }
00311 $obj['type'] = 'video';
00312 $obj['module'] = 'video';
00313 $obj['video-file'] = $args['file'];
00314 $obj['video-file-mime'] = $mime;
00315 save_object($obj);
00316
00317 $ret = render_object(array('name'=>$obj['name'], 'edit'=>true));
00318 if ($ret['#error']) {
00319 return false;
00320 } else {
00321 return $ret['#data'];
00322 }
00323 }