MDL-26030 more mediaplugin fixes

Improved youtube id parsing, fixed url quoting and fixed unittests.
This commit is contained in:
Petr Skoda 2011-02-12 13:52:27 +01:00
parent 3f5192c088
commit a2ee26bf3e
2 changed files with 36 additions and 15 deletions

View file

@ -118,15 +118,13 @@ class filter_mediaplugin extends moodle_text_filter {
} }
if (!empty($CFG->filter_mediaplugin_enable_youtube)) { if (!empty($CFG->filter_mediaplugin_enable_youtube)) {
//see MDL-23903 for description of recent changes to this regex $search = '/<a(\s+[^>]+?)?\s+href="(([^"]+youtube\.com)\/watch\?v=([A-Za-z0-9\-_]+))[^>]*>(.*?)<\/a>/is';
//$search = '/<a.*?href="([^<]*)youtube.com\/watch\?v=([^"]*)"[^>]*>(.*?)<\/a>/is';
$search = '/<a(\s+[^>]+?)?\s+href="(([^"]+youtube\.com)\/watch\?v=([^"]*))"[^>]*>(.*?)<\/a>/is';
$newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_callback', $newtext); $newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_callback', $newtext);
$search = '/<a(\s+[^>]+?)?\s+href="(([^"]+youtube\.com)\/v\/([^"]*))"[^>]*>(.*?)<\/a>/is'; $search = '/<a(\s+[^>]+?)?\s+href="(([^"]+youtube\.com)\/v\/([A-Za-z0-9\-_]*))[^>]+>(.*?)<\/a>/is';
$newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_callback', $newtext); $newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_callback', $newtext);
$search = '/<a(\s+[^>]+?)?\s+href="((([^"]+)youtube\.com)\/view_play_list\?p=([^"]*))"[^>]*>(.*?)<\/a>/is'; $search = '/<a(\s+[^>]+?)?\s+href="((([^"]+)youtube\.com)\/view_play_list\?p=([A-Za-z0-9\-_]+))[^>]*>(.*?)<\/a>/is';
$newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_playlist_callback', $newtext); $newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_playlist_callback', $newtext);
} }
@ -168,7 +166,7 @@ function filter_mediaplugin_mp3_callback($link) {
$count++; $count++;
$id = 'filter_mp3_'.time().$count; //we need something unique because it might be stored in text cache $id = 'filter_mp3_'.time().$count; //we need something unique because it might be stored in text cache
$url = $link[2]; $url = addslashes_js($link[2]);
$playerpath = $CFG->wwwroot.'/filter/mediaplugin/mp3player.swf'; $playerpath = $CFG->wwwroot.'/filter/mediaplugin/mp3player.swf';
$audioplayerpath = $CFG->wwwroot .'/filter/mediaplugin/flowplayer.audio.swf'; $audioplayerpath = $CFG->wwwroot .'/filter/mediaplugin/flowplayer.audio.swf';
@ -281,16 +279,17 @@ function filter_mediaplugin_flv_callback($link) {
$count++; $count++;
$id = 'filter_flv_'.time().$count; //we need something unique because it might be stored in text cache $id = 'filter_flv_'.time().$count; //we need something unique because it might be stored in text cache
$width = empty($link[4]) ? '480' : $link[4]; // note: in 1.9.x this used to be 480x360
$height = empty($link[5]) ? '360' : $link[5]; $width = empty($link[4]) ? '800' : $link[4];
$url = $link[2]; $height = empty($link[5]) ? '600' : $link[5];
$url = addslashes_js($link[2]);
$playerpath = $CFG->wwwroot.'/filter/mediaplugin/flvplayer.swf'; $playerpath = $CFG->wwwroot.'/filter/mediaplugin/flvplayer.swf';
$output = <<<EOT $output = <<<EOT
<span class="mediaplugin mediaplugin_flv" id="$id"></span> <span class="mediaplugin mediaplugin_flv" id="$id"></span>
<noscript><div> <noscript><div>
<object width="800" height="600" id="undefined" name="undefined" data="$playerpath" type="application/x-shockwave-flash"> <object width="$width" height="$height" id="undefined" name="undefined" data="$playerpath" type="application/x-shockwave-flash">
<param name="movie" value="$playerpath" /> <param name="movie" value="$playerpath" />
<param name="allowfullscreen" value="true" /> <param name="allowfullscreen" value="true" />
<param name="allowscriptaccess" value="always" /> <param name="allowscriptaccess" value="always" />
@ -341,8 +340,8 @@ document.write(\'<object classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" wi
*/ */
function filter_mediaplugin_youtube_callback($link, $autostart=false) { function filter_mediaplugin_youtube_callback($link, $autostart=false) {
$site = s($link[3]); $site = s($link[3]);
$param = urlencode($link[4]); $param = $link[4]; // video id
$info = s($link[5]); $info = s(strip_tags($link[5]));
return '<object title="'.$info.'" return '<object title="'.$info.'"
@ -361,8 +360,8 @@ function filter_mediaplugin_youtube_callback($link, $autostart=false) {
function filter_mediaplugin_youtube_playlist_callback($link, $autostart=false) { function filter_mediaplugin_youtube_playlist_callback($link, $autostart=false) {
$site = s($link[4]); $site = s($link[4]);
$param = s($link[5]); $param = $link[5]; // playlist id
$info = s($link[6]); $info = s(strip_tags($link[6]));
return '<object title="'.$info.'" return '<object title="'.$info.'"
class="mediaplugin mediaplugin_youtube" type="application/x-shockwave-flash" class="mediaplugin mediaplugin_youtube" type="application/x-shockwave-flash"
@ -379,7 +378,7 @@ function filter_mediaplugin_youtube_playlist_callback($link, $autostart=false) {
*/ */
function filter_mediaplugin_img_callback($link, $autostart=false) { function filter_mediaplugin_img_callback($link, $autostart=false) {
$url = $link[2]; $url = $link[2];
$info = s($link[2]); $info = s(strip_tags($link[2]));
return '<img class="mediaplugin mediaplugin_img" alt="" title="'.$info.'" src="'.$url.'" />'; return '<img class="mediaplugin mediaplugin_img" alt="" title="'.$info.'" src="'.$url.'" />';
} }

View file

@ -34,6 +34,26 @@ require_once($CFG->dirroot . '/filter/mediaplugin/filter.php'); // Include the c
class filter_mediaplugin_test extends UnitTestCase { class filter_mediaplugin_test extends UnitTestCase {
function test_filter_mediaplugin_link() { function test_filter_mediaplugin_link() {
global $CFG;
// we need to enable the plugins somehow
$oldcfg = clone($CFG); // very, very ugly hack
$CFG->filter_mediaplugin_enable_mp3 = 1;
$CFG->filter_mediaplugin_enable_ogg = 1;
$CFG->filter_mediaplugin_enable_ogv = 1;
$CFG->filter_mediaplugin_enable_swf = 1;
$CFG->filter_mediaplugin_enable_flv = 1;
$CFG->filter_mediaplugin_enable_mov = 1;
$CFG->filter_mediaplugin_enable_wmv = 1;
$CFG->filter_mediaplugin_enable_mpg = 1;
$CFG->filter_mediaplugin_enable_avi = 1;
$CFG->filter_mediaplugin_enable_ram = 1;
$CFG->filter_mediaplugin_enable_rpm = 1;
$CFG->filter_mediaplugin_enable_rm = 1;
$CFG->filter_mediaplugin_enable_youtube = 1;
$CFG->filter_mediaplugin_enable_img = 1;
$filterplugin = new filter_mediaplugin(null, array()); $filterplugin = new filter_mediaplugin(null, array());
$validtexts = array ( $validtexts = array (
@ -98,5 +118,7 @@ class filter_mediaplugin_test extends UnitTestCase {
$filter = $filterplugin->filter($text); $filter = $filterplugin->filter($text);
$this->assertEqual($text, $filter, $msg); $this->assertEqual($text, $filter, $msg);
} }
$CFG = $oldcfg; // very, very ugly hack
} }
} }