-<?php // $id$
+<?php // $Id$
//////////////////////////////////////////////////////////////
// Media plugin filtering
-//
-// This filter will replace any links to a media file with
+//
+// This filter will replace any links to a media file with
// a media plugin that plays that media inline
//
// To activate this filter, add a line like this to your
//
//////////////////////////////////////////////////////////////
-/// This is the filtering function itself. It accepts the
+/// This is the filtering function itself. It accepts the
/// courseid and the text to be filtered (in HTML form).
+require_once($CFG->libdir.'/filelib.php');
+
function mediaplugin_filter($courseid, $text) {
- global $CFG, $THEME;
+ global $CFG;
- static $count = 0;
+ include 'defaultsettings.php';
- $count++;
-
- include "defaultsettings.php";
+ // We're using the UFO technique for flash to attain XHTML Strict 1.0
+ // See: http://www.bobbyvandersluis.com/ufo/
if ($CFG->filter_mediaplugin_enable_mp3) {
- static $c;
-
- if (empty($c)) {
- if (!empty($THEME->filter_mediaplugin_colors)) {
- $c = $THEME->filter_mediaplugin_colors; // You can set this up in your theme/xxx/config.php
- } else {
- $c = 'bgColour=000000&btnColour=ffffff&btnBorderColour=cccccc&iconColour=000000&iconOverColour=00cc00&trackColour=cccccc&handleColour=ffffff&loaderColour=ffffff&waitForPlay=yes&';
- }
- }
- $search = '/<a(.*?)href=\"([^<]+)\.mp3\"([^>]*)>(.*?)<\/a>/is';
-
- // We're using the UFO technique to attain XHTML Strict 1.0
- // See: http://www.bobbyvandersluis.com/ufo/
-
- $replace = '<script type="text/javascript">'."\n".
- '//<![CDATA['."\n".
- 'var FO'.$count.' = { movie:"'.$CFG->wwwroot.'/filter/mediaplugin/mp3player.swf?src=\\2.mp3",'.
- 'width:"90", height:"15", majorversion:"6", build:"40", flashvars:"'.$c.'", quality: "high" };'."\n".
- 'UFO.create(FO'.$count.', "filtermp3'.$count.'");'."\n".
- '//]]>'."\n".
- '</script>'."\n".
- '\\0 <span class="mediaplugin mp3" id="filtermp3'.$count.'">'.
- '('.get_string('mp3audio', 'mediaplugin').')'.
- '</span>'."\n";
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.mp3)"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_mp3_callback', $text);
}
if ($CFG->filter_mediaplugin_enable_swf) {
- $search = array(
- '/<a(.*?)href=\"([^<]+)\.swf\?d=([\d]{1,3}%?)x([\d]{1,3}%?)\"([^>]*)>(.*?)<\/a>/is',
- '/<a(.*?)href=\"([^<]+)\.swf\"([^>]*)>(.*?)<\/a>/is'
- );
-
- $replace = array();
-
- $replace[0] = '<script type="text/javascript">'."\n".
- '//<![CDATA['."\n".
- 'var FO'.$count.' = { movie:"\\2.swf", width:"\\3", height:"\\4", majorversion:"6", build:"40", '.
- 'allowscriptaccess:"never", quality: "high" };'."\n".
- 'UFO.create(FO'.$count.', "filterswf'.$count.'");'."\n".
- '//]]>'."\n".
- '</script>'."\n".
- '\\0 <span class="mediaplugin swf" id="filterswf'.$count.'">'.
- '('.get_string('flashanimation', 'mediaplugin').')'.
- '</span>'."\n";
-
- $replace[1] = '<script type="text/javascript">'."\n".
- '//<![CDATA['."\n".
- 'var FO'.$count.' = { movie:"\\2.swf", width:"400", height:"300", majorversion:"6", build:"40", '.
- 'allowscriptaccess:"never", quality: "high" };'."\n".
- 'UFO.create(FO'.$count.', "filterswf'.$count.'");'."\n".
- '//]]>'."\n".
- '</script>'."\n".
- '\\0 <span class="mediaplugin swf" id="filterswf'.$count.'">'.
- '('.get_string('flashanimation', 'mediaplugin').')'.
- '</span>'."\n";
-
- $text = preg_replace($search, $replace, $text);
-
+ $search = '/<a.*?href="([^<]+\.swf)(\?d=([\d]{1,3}%?)x([\d]{1,3}%?))?"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_swf_callback', $text);
}
if ($CFG->filter_mediaplugin_enable_flv) {
-
- $replace = array();
-
- $search = array(
- '/<a(.*?)href=\"([^<]+)\.flv\?d=([\d]{1,3}%?)x([\d]{1,3}%?)\"([^>]*)>(.*?)<\/a>/is',
- '/<a(.*?)href=\"([^<]+)\.flv\"([^>]*)>(.*?)<\/a>/is'
- );
-
- $replace[0] = '<script type="text/javascript">'."\n".
- '//<![CDATA['."\n".
- 'var FO'.$count.' = { movie:"'.$CFG->wwwroot.'/filter/mediaplugin/flvplayer.swf?file=\\2.flv", '.
- 'width:"\\3", height:"\\4", majorversion:"6", build:"40", '.
- 'allowscriptaccess:"never", quality: "high" };'."\n".
- 'UFO.create(FO'.$count.', "filterflv'.$count.'");'."\n".
- '//]]>'."\n".
- '</script>'."\n".
- '\\0 <span class="mediaplugin flv" id="filterflv'.$count.'">'.
- '('.get_string('flashvideo', 'mediaplugin').')'.
- '</span>'."\n";
-
- $replace[1] = '<script type="text/javascript">'."\n".
- '//<![CDATA['."\n".
- 'var FO'.$count.' = { movie:"'.$CFG->wwwroot.'/filter/mediaplugin/flvplayer.swf?file=\\2.flv", '.
- 'width:"480", height:"360", majorversion:"6", build:"40", '.
- 'allowscriptaccess:"never", quality: "high" };'."\n".
- 'UFO.create(FO'.$count.', "filterflv'.$count.'");'."\n".
- '//]]>'."\n".
- '</script>'."\n".
- '\\0 <span class="mediaplugin flv" id="filterflv'.$count.'">'.
- '('.get_string('flashvideo', 'mediaplugin').')'.
- '</span>'."\n";
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.flv)(\?d=([\d]{1,3}%?)x([\d]{1,3}%?))?"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_flv_callback', $text);
}
if ($CFG->filter_mediaplugin_enable_mov) {
- $search = '/<a(.*?)href=\"([^<]+)\.mov\"([^>]*)>(.*?)<\/a>/is';
-
- $replace = '\\0<p class="mediaplugin mov"><object classid="CLSID:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"';
- $replace .= ' codebase="http://www.apple.com/qtactivex/qtplugin.cab" ';
- $replace .= ' height="300" width="400"';
- $replace .= ' id="quicktime" type="application/x-oleobject">';
- $replace .= '<param name="src" value="\\2.mov" />';
- $replace .= '<param name="autoplay" value="false" />';
- $replace .= '<param name="loop" value="true" />';
- $replace .= '<param name="controller" value="true" />';
- $replace .= '<param name="scale" value="aspect" />';
- $replace .= '</object></p>';
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.mov)(\?d=([\d]{1,3}%?)x([\d]{1,3}%?))?"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_qt_callback', $text);
}
if ($CFG->filter_mediaplugin_enable_wmv) {
- $search = '/<a(.*?)href=\"([^<]+)\.wmv\"([^>]*)>(.*?)<\/a>/is';
-
- $replace = '\\0<p class="mediaplugin wmv"><object classid="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95"';
- $replace .= ' codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" ';
- $replace .= ' standby="Loading Microsoft� Windows� Media Player components..." ';
- $replace .= ' id="msplayer" type="application/x-oleobject">';
- $replace .= '<param name="Filename" value="\\2.wmv" />';
- $replace .= '<param name="ShowControls" value="true" />';
- $replace .= '<param name="AutoRewind" value="true" />';
- $replace .= '<param name="AutoStart" value="false" />';
- $replace .= '<param name="Autosize" value="true" />';
- $replace .= '<param name="EnableContextMenu" value="true" />';
- $replace .= '<param name="TransparentAtStart" value="false" />';
- $replace .= '<param name="AnimationAtStart" value="false" />';
- $replace .= '<param name="ShowGotoBar" value="false" />';
- $replace .= '<param name="EnableFullScreenControls" value="true" />';
- $replace .= '</object></p>';
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.wmv)(\?d=([\d]{1,3}%?)x([\d]{1,3}%?))?"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_wmp_callback', $text);
}
if ($CFG->filter_mediaplugin_enable_mpg) {
- $search = '/<a(.*?)href=\"([^<]+)\.(mpe?g)\"([^>]*)>(.*?)<\/a>/is';
-
- $replace = '\\0<p class="mediaplugin mpg"><object width="240" height="180">';
- $replace .= '<param name="src" value="\\2.\\3" />';
- $replace .= '<param name="controller" value="true" />';
- $replace .= '<param name="autoplay" value="false" />';
- $replace .= '</object></p>';
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.mpe?g)(\?d=([\d]{1,3}%?)x([\d]{1,3}%?))?"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_qt_callback', $text);
}
if ($CFG->filter_mediaplugin_enable_avi) {
- $search = '/<a(.*?)href=\"([^<]+)\.avi\"([^>]*)>(.*?)<\/a>/is';
-
- $replace = '\\0<p class="mediaplugin avi"><object width="240" height="180">';
- $replace .= '<param name="src" value="\\2.avi" />';
- $replace .= '<param name="controller" value="true" />';
- $replace .= '<param name="autoplay" value="false" />';
- $replace .= '</object></p>';
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.avi)(\?d=([\d]{1,3}%?)x([\d]{1,3}%?))?"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_wmp_callback', $text);
}
-
+
if ($CFG->filter_mediaplugin_enable_ram) {
- $search = '/<a(.*?)href=\"([^<]+)\.ram\"([^>]*)>(.*?)<\/a>/is';
-
- $replace = '\\0<p class="mediaplugin ram"><script type="text/javascript">//<![CDATA['."\n".
- 'document.write(\'<object width="240" height="180">';
- $replace .= '<param name="src" value="\\2.ram" />';
- $replace .= '<param name="autoStart" value="true" />';
- $replace .= '<param name="controls" value="imagewindow" />';
- $replace .= '<param name="console" value="video" />';
- $replace .= '<param name="loop" value="true" />';
- $replace .= '<embed src="\\2.ram" width=240" height="180" loop="true" type="audio/x-pn-realaudio-plugin" controls="imagewindow" console="video" autostart="true" />';
- $replace .= '<\/object><br />';
-
- $replace .= '<object width="240" height="30">';
- $replace .= '<param name="src" value="\\2.ram" />';
- $replace .= '<param name="autoStart" value="true" />';
- $replace .= '<param name="controls" value="ControlPanel" />';
- $replace .= '<param name="console" value="video" />';
- $replace .= '<embed src="\\2.ram" width="240" height="30" controls="ControlPanel" type="audio/x-pn-realaudio-plugin" console="video" autostart="true" />';
- $replace .= '<\/object>\')'."\n".'//]]>'."\n".'</script></p>';
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.ram)"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_real_callback', $text);
}
-
+
if ($CFG->filter_mediaplugin_enable_rpm) {
- $search = '/<a(.*?)href=\"([^<]+)\.rpm\"([^>]*)>(.*?)<\/a>/is';
-
- $replace = '\\0<p class="mediaplugin rpm"><script type="text/javascript">//<![CDATA['."\n".
- 'document.write(\'<object width="240" height="180">';
- $replace .= '<param name="src" value="\\2.rpm" />';
- $replace .= '<param name="autostart" value="true" />';
- $replace .= '<param name="controls" value="imagewindow" />';
- $replace .= '<param name="console" value="video" />';
- $replace .= '<param name="loop" value="true" />';
- $replace .= '<embed src="\\2.rpm" width=240" height="180" loop="true" type="audio/x-pn-realaudio-plugin" controls="imagewindow" console="video" autostart="true" />';
- $replace .= '</object><br />';
-
- $replace .= '<object width="240" height="30">';
- $replace .= '<param name="src" value="\\2.rpm" />';
- $replace .= '<param name="autostart" value="true" />';
- $replace .= '<param name="controls" value="ControlPanel" />';
- $replace .= '<param name="console" value="video" />';
- $replace .= '<embed src="\\2.rpm" width="240" height="30" controls="ControlPanel" type="audio/x-pn-realaudio-plugin" console="video" autostart="true" />';
- $replace .= '</object>\')'."\n".'//]]>'."\n".'</script></p>';
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.rpm)"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_real_callback', $text);
}
-
+
if ($CFG->filter_mediaplugin_enable_rm) {
- $search = '/<a(.*?)href=\"([^<]+)\.rm\"([^>]*)>(.*?)<\/a>/is';
-
- $replace = '\\0<p class="mediaplugin rm"><script type="text/javascript">//<![CDATA['."\n".
- 'document.write(\'<object width="240" height="180">';
- $replace .= '<param name="src" value="\\2.rm" />';
- $replace .= '<param name="autostart" value="true" />';
- $replace .= '<param name="controls" value="imagewindow" />';
- $replace .= '<param name="console" value="video" />';
- $replace .= '<param name="loop" value="true" />';
- $replace .= '<embed src="\\2.rm" width=240" height="180" loop="true" type="audio/x-pn-realaudio-plugin" controls="imagewindow" console="video" autostart="true" />';
- $replace .= '</object><br />';
-
- $replace .= '<object width="240" height="30">';
- $replace .= '<param name="src" value="\\2.rm" />';
- $replace .= '<param name="autostart" value="true" />';
- $replace .= '<param name="controls" value="ControlPanel" />';
- $replace .= '<param name="console" value="video" />';
- $replace .= '<embed src="\\2.rm" width="240" height="30" controls="ControlPanel" type="audio/x-pn-realaudio-plugin" console="video" autostart="true" />';
- $replace .= '</object>\')'."\n".'//]]>'."\n".'</script></p>';
-
- $text = preg_replace($search, $replace, $text);
+ $search = '/<a.*?href="([^<]+\.rm)"[^>]*>.*?<\/a>/is';
+ $text = preg_replace_callback($search, 'mediaplugin_filter_real_callback', $text);
}
return $text;
}
+///===========================
+/// callback filter functions
+
+function mediaplugin_filter_mp3_callback($link) {
+ global $CFG, $THEME;
+
+ if (!empty($THEME->filter_mediaplugin_colors)) {
+ $c = $THEME->filter_mediaplugin_colors; // You can set this up in your theme/xxx/config.php
+ } else {
+ $c = 'bgColour=000000&btnColour=ffffff&btnBorderColour=cccccc&iconColour=000000&'.
+ 'iconOverColour=00cc00&trackColour=cccccc&handleColour=ffffff&loaderColour=ffffff&'.
+ 'waitForPlay=yes';
+ }
+ $c = htmlentities($c);
+
+ static $count = 0;
+ $count++;
+ $id = 'filter_mp3_'.time().$count; //we need something unique because it might be stored in text cache
+
+ $url = addslashes_js($link[1]);
+
+ return $link[0].
+'<span class="mediaplugin mediaplugin_mp3" id="'.$id.'">('.get_string('mp3audio', 'mediaplugin').')</span>
+<script type="text/javascript">
+//<![CDATA[
+ var FO = { movie:"'.$CFG->wwwroot.'/filter/mediaplugin/mp3player.swf?src='.$url.'",
+ width:"90", height:"15", majorversion:"6", build:"40", flashvars:"'.$c.'", quality: "high" };
+ UFO.create(FO, "'.$id.'");
+//]]>
+</script>';
+}
+
+function mediaplugin_filter_swf_callback($link) {
+ static $count = 0;
+ $count++;
+ $id = 'filter_swf_'.time().$count; //we need something unique because it might be stored in text cache
+
+ $width = empty($link[3]) ? '400' : $link[3];
+ $height = empty($link[4]) ? '300' : $link[4];
+ $url = addslashes_js($link[1]);
+
+ return $link[0].
+'<span class="mediaplugin mediaplugin_swf" id="'.$id.'">('.get_string('flashanimation', 'mediaplugin').')</span>
+<script type="text/javascript">
+//<![CDATA[
+ var FO = { movie:"'.$url.'", width:"'.$width.'", height:"'.$height.'", majorversion:"6", build:"40",
+ allowscriptaccess:"never", quality: "high" };
+ UFO.create(FO, "'.$id.'");
+//]]>
+</script>';
+}
+
+function mediaplugin_filter_flv_callback($link) {
+ global $CFG;
+
+ static $count = 0;
+ $count++;
+ $id = 'filter_flv_'.time().$count; //we need something unique because it might be stored in text cache
+
+ $width = empty($link[3]) ? '480' : $link[3];
+ $height = empty($link[4]) ? '360' : $link[4];
+ $url = addslashes_js($link[1]);
+
+ return $link[0].
+'<span class="mediaplugin mediaplugin_flv" id="'.$id.'">('.get_string('flashvideo', 'mediaplugin').')</span>
+<script type="text/javascript">
+//<![CDATA[
+ var FO = { movie:"'.$CFG->wwwroot.'/filter/mediaplugin/flvplayer.swf?file='.$url.'",
+ width:"'.$width.'", height:"'.$height.'", majorversion:"6", build:"40",
+ allowscriptaccess:"never", quality: "high" };
+ UFO.create(FO, "'.$id.'");
+//]]>
+</script>';
+}
+
+function mediaplugin_filter_real_callback($link, $autostart=false) {
+ $url = addslashes_js($link[1]);
+ $mimetype = mimeinfo('type', $url);
+ $autostart = $autostart ? 'true' : 'false';
+
+// embed kept for now see MDL-8674
+ return $link[0].
+'<span class="mediaplugin mediaplugin_real">
+<script type="text/javascript">
+//<![CDATA[
+document.write(\'<object classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="240" height="180">\\
+ <param name="src" value="'.$url.'" />\\
+ <param name="autostart" value="'.$autostart.'" />\\
+ <param name="controls" value="imagewindow" />\\
+ <param name="console" value="video" />\\
+ <param name="loop" value="true" />\\
+ <embed src="'.$url.'" width=240" height="180" loop="true" type="'.$mimetype.'" controls="imagewindow" console="video" autostart="'.$autostart.'" />\\
+ </object><br />\\
+ <object classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="240" height="30">\\
+ <param name="src" value="'.$url.'" />\\
+ <param name="autostart" value="'.$autostart.'" />\\
+ <param name="controls" value="ControlPanel" />\\
+ <param name="console" value="video" />\\
+ <embed src="'.$url.'" width="240" height="30" controls="ControlPanel" type="'.$mimetype.'" console="video" autostart="'.$autostart.'" />\\
+ </object>\');
+//]]>
+</script></span>';
+}
+
+/**
+ * Embed video using window media player if available
+ */
+function mediaplugin_filter_wmp_callback($link, $autostart=false) {
+ $url = $link[1];
+ if (empty($link[3]) or empty($link[4])) {
+ $mpsize = '';
+ $size = 'width="300" height="260"';
+ $autosize = 'true';
+ } else {
+ $size = 'width="'.$link[3].'" height="'.$link[4].'"';
+ $mpsize = $size;
+ $autosize = 'false';
+ }
+ $mimetype = mimeinfo('type', $url);
+ $autostart = $autostart ? 'true' : 'false';
+
+ return $link[0].
+'<span class="mediaplugin mediaplugin_wmp">
+<object classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" '.$mpsize.'
+ standby="Loading Microsoft(R) Windows(R) Media Player components..."
+ type="application/x-oleobject">
+ <param name="Filename" value="'.$url.'" />
+ <param name="src" value="'.$url.'" />
+ <param name="url" value="'.$url.'" />
+ <param name="ShowControls" value="true" />
+ <param name="AutoRewind" value="true" />
+ <param name="AutoStart" value="'.$autostart.'" />
+ <param name="Autosize" value="'.$autosize.'" />
+ <param name="EnableContextMenu" value="true" />
+ <param name="TransparentAtStart" value="false" />
+ <param name="AnimationAtStart" value="false" />
+ <param name="ShowGotoBar" value="false" />
+ <param name="EnableFullScreenControls" value="true" />
+<!--[if !IE]>-->
+ <object data="'.$url.'" type="'.$mimetype.'" '.$size.'>
+ <param name="src" value="'.$url.'" />
+ <param name="controller" value="true" />
+ <param name="autoplay" value="'.$autostart.'" />
+ <param name="autostart" value="'.$autostart.'" />
+ <param name="resize" value="scale" />
+ </object>
+<!--<![endif]-->
+</object></span>';
+}
+
+function mediaplugin_filter_qt_callback($link, $autostart=false) {
+ $url = $link[1];
+ if (empty($link[3]) or empty($link[4])) {
+ $size = 'width="280" height="210"';
+ } else {
+ $size = 'width="'.$link[3].'" height="'.$link[4].'"';
+ }
+ $mimetype = mimeinfo('type', $url);
+ $autostart = $autostart ? 'true' : 'false';
+
+ return $link[0].
+'<span class="mediaplugin mediaplugin_qt">
+<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
+ codebase="http://www.apple.com/qtactivex/qtplugin.cab" '.$size.'>
+ <param name="pluginspage" value="http://www.apple.com/quicktime/download/" />
+ <param name="src" value="'.$url.'" />
+ <param name="coltroller" value="true" />
+ <param name="loop" value="true" />
+ <param name="autoplay" value="'.$autostart.'" />
+ <param name="autostart" value="'.$autostart.'" />
+ <param name="scale" value="aspect" />
+<!--[if !IE]>-->
+ <object data="'.$url.'" type="'.$mimetype.'" '.$size.'>
+ <param name="src" value="'.$url.'" />
+ <param name="pluginurl" value="http://www.apple.com/quicktime/download/" />
+ <param name="controller" value="true" />
+ <param name="loop" value="true" />
+ <param name="autoplay" value="'.$autostart.'" />
+ <param name="autostart" value="'.$autostart.'" />
+ <param name="scale" value="aspect" />
+ </object>
+<!--<![endif]-->
+</object></span>';
+}
?>