diff --git a/filter/mediaplugin/filter.php b/filter/mediaplugin/filter.php index dfc92392eb8..d946cbea7be 100644 --- a/filter/mediaplugin/filter.php +++ b/filter/mediaplugin/filter.php @@ -84,21 +84,21 @@ class filter_mediaplugin extends moodle_text_filter { // YouTube and Vimeo are great because the files are not served by Moodle server if (!empty($CFG->filter_mediaplugin_enable_youtube)) { - $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/watch\?v=([a-z0-9\-_]+)[^>]*>([^>]*)<\/a>/is'; + $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/watch\?v=([a-z0-9\-_]+)[^"#]*(#d=([\d]{1,4})x([\d]{1,4}))?"[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_callback', $newtext); - $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/v\/([a-z0-9\-_]*)[^>]+>([^>]*)<\/a>/is'; + $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/v\/([a-z0-9\-_]+)[^"#]*(#d=([\d]{1,4})x([\d]{1,4}))?[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_callback', $newtext); - $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/view_play_list\?p=([a-z0-9\-_]+)[^>]*>([^>]*)<\/a>/is'; + $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/view_play_list\?p=([a-z0-9\-_]+)[^"#]*(#d=([\d]{1,4})x([\d]{1,4}))?[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_playlist_callback', $newtext); - $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/p\/([a-z0-9\-_]*)[^>]+>([^>]*)<\/a>/is'; + $search = '/]*href="(https?:\/\/www\.youtube(-nocookie)?\.com)\/p\/([a-z0-9\-_]+)[^"#]*(#d=([\d]{1,4})x([\d]{1,4}))?[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_youtube_playlist_callback', $newtext); } if (!empty($CFG->filter_mediaplugin_enable_vimeo)) { - $search = '/]*href="http:\/\/vimeo\.com\/([0-9]+)"[^>]*>([^>]*)<\/a>/is'; + $search = '/]*href="http:\/\/vimeo\.com\/([0-9]+)[^"#]*(#d=([\d]{1,4})x([\d]{1,4}))?[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_vimeo_callback', $newtext); } @@ -124,7 +124,7 @@ class filter_mediaplugin extends moodle_text_filter { } if ((!empty($options['noclean']) or !empty($CFG->allowobjectembed)) and !empty($CFG->filter_mediaplugin_enable_swf)) { - $search = '/]*href="([^"#\?]+\.swf)([#\?]d=([\d]{1,4}%?)x([\d]{1,4}%?))?"[^>]*>([^>]*)<\/a>/is'; + $search = '/]*href="([^"#\?]+\.swf)([#\?]d=([\d]{1,4})x([\d]{1,4}))?"[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_swf_callback', $newtext); } @@ -137,13 +137,13 @@ class filter_mediaplugin extends moodle_text_filter { // The rest of legacy formats - these should not be used if possible if (!empty($CFG->filter_mediaplugin_enable_wmp)) { - $search = '/]*href="([^"#\?]+\.(wmv|avi))(\?d=([\d]{1,4}%?)x([\d]{1,4}%?))?"[^>]*>([^>]*)<\/a>/is'; + $search = '/]*href="([^"#\?]+\.(wmv|avi))(\?d=([\d]{1,4})x([\d]{1,4}))?"[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_wmp_callback', $newtext); } if (!empty($CFG->filter_mediaplugin_enable_qt)) { // HTML5 filtering may steal mpeg 4 formats - $search = '/]*href="([^"#\?]+\.(mpg|mpeg|mov|mp4|m4v|m4a))(\?d=([\d]{1,4}%?)x([\d]{1,4}%?))?"[^>]*>([^>]*)<\/a>/is'; + $search = '/]*href="([^"#\?]+\.(mpg|mpeg|mov|mp4|m4v|m4a))(\?d=([\d]{1,4})x([\d]{1,4}))?"[^>]*>([^>]*)<\/a>/is'; $newtext = preg_replace_callback($search, 'filter_mediaplugin_qt_callback', $newtext); } @@ -186,12 +186,12 @@ function filter_mediaplugin_parse_alternatives($url, $defaultwidth = 0, $default foreach ($urls as $url) { $matches = null; - if (preg_match('/^d=([\d]{1,4}%?)x([\d]{1,4}%?)$/i', $url, $matches)) { // #d=640x480 + if (preg_match('/^d=([\d]{1,4})x([\d]{1,4})$/i', $url, $matches)) { // #d=640x480 $width = $matches[1]; $height = $matches[2]; continue; } - if (preg_match('/\?d=([\d]{1,4}%?)x([\d]{1,4}%?)$/i', $url, $matches)) { // old style file.ext?d=640x480 + if (preg_match('/\?d=([\d]{1,4})x([\d]{1,4})$/i', $url, $matches)) { // old style file.ext?d=640x480 $width = $matches[1]; $height = $matches[2]; $url = str_replace($matches[0], '', $url); @@ -663,14 +663,14 @@ function filter_mediaplugin_youtube_callback($link) { $site = $link[1]; $videoid = $link[3]; - $info = trim($link[4]); + $info = trim($link[7]); if (empty($info) or strpos($info, 'http') === 0) { $info = get_string('siteyoutube', 'filter_mediaplugin'); } $info = s($info); - $width = FILTER_MEDIAPLUGIN_VIDEO_WIDTH; - $height = FILTER_MEDIAPLUGIN_VIDEO_HEIGHT; + $width = empty($link[5]) ? FILTER_MEDIAPLUGIN_VIDEO_WIDTH : $link[5]; + $height = empty($link[6]) ? FILTER_MEDIAPLUGIN_VIDEO_HEIGHT : $link[6]; if (false and empty($CFG->xmlstrictheaders)) { // TODO: remove this once iframe playback starts to work properly in iPads @@ -712,15 +712,15 @@ function filter_mediaplugin_youtube_playlist_callback($link) { $site = $link[1]; $playlist = $link[3]; - $info = trim($link[4]); + $info = trim($link[7]); if (empty($info) or strpos($info, 'http') === 0) { $info = get_string('siteyoutube', 'filter_mediaplugin'); } $printlink = html_writer::link("$site/view_play_list\?p=$playlist", $info, array('class'=>'mediafallbacklink')); $info = s($info); - $width = FILTER_MEDIAPLUGIN_VIDEO_WIDTH; - $height = FILTER_MEDIAPLUGIN_VIDEO_HEIGHT; + $width = empty($link[5]) ? FILTER_MEDIAPLUGIN_VIDEO_WIDTH : $link[5]; + $height = empty($link[6]) ? FILTER_MEDIAPLUGIN_VIDEO_HEIGHT : $link[6]; // TODO: iframe HTML 5 video not implemented and object does work on iOS devices @@ -751,13 +751,13 @@ function filter_mediaplugin_vimeo_callback($link) { } $videoid = $link[1]; - $info = s(strip_tags($link[2])); + $info = s(strip_tags($link[5])); //Note: resizing via url is not supported, user can click the fullscreen button instead // iframe embedding is not xhtml strict but it is the only option that seems to work on most devices - $width = FILTER_MEDIAPLUGIN_VIDEO_WIDTH; - $height = FILTER_MEDIAPLUGIN_VIDEO_HEIGHT; + $width = empty($link[3]) ? FILTER_MEDIAPLUGIN_VIDEO_WIDTH : $link[3]; + $height = empty($link[4]) ? FILTER_MEDIAPLUGIN_VIDEO_HEIGHT : $link[4]; $output = <<