diff --git a/filter.php b/filter.php index 17971e4cd2bc848119e23bca4e5bb8b825b192fb..38213314d0e81e0d80151b6860ee2f5b33eaeb1b 100644 --- a/filter.php +++ b/filter.php @@ -56,105 +56,114 @@ class filter_opencast extends moodle_text_filter } foreach (\tool_opencast\local\settings_api::get_ocinstances() as $ocinstance) { - $episodeurl = get_config('filter_opencast', 'episodeurl_' . $ocinstance->id); - if (!$episodeurl) { + $episodeurls = get_config('filter_opencast', 'episodeurl_' . $ocinstance->id); + + if (!$episodeurls) { continue; } - $urlparts = parse_url($episodeurl); - $baseurl = $urlparts['scheme'] . '://' . $urlparts['host']; - if (isset($urlparts['port'])) { - $baseurl .= $urlparts['port']; - } + foreach (explode("\n", $episodeurls) as $episodeurl) { + $episodeurl = trim($episodeurl); - if (empty($episodeurl) || stripos($text, $baseurl) === false) { - continue; - } + $urlparts = parse_url($episodeurl); + $baseurl = $urlparts['scheme'] . '://' . $urlparts['host']; + if (isset($urlparts['port'])) { + $baseurl .= $urlparts['port']; + } - // Looking for tags. - $matches = preg_split('/(<[^>]*>)/i', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); - if ($matches) { - $renderer = $PAGE->get_renderer('filter_opencast'); - $video = false; - $width = false; - $height = false; - - foreach ($matches as $match) { - // Check if the match is a video tag. - if (substr($match, 0, 6) === "<video") { - $video = true; - preg_match('/width="([0-9]+)"/', $match, $width); - preg_match('/height="([0-9]+)"/', $match, $height); - $width = $width ? $width[1] : $width; - $height = $height ? $height[1] : $height; - } else if ($video) { - $video = false; - if (substr($match, 0, 7) === "<source") { - - // Check if video is from opencast. - if (strpos($match, $baseurl) === false) { - $width = $height = false; - continue; - } + if (empty($episodeurl) || stripos($text, $baseurl) === false) { + continue; + } - // Extract url. - preg_match_all('/<source[^>]+src=([\'"])(?<src>.+?)\1[^>]*>/i', $match, $result); + // Looking for tags. + $matches = preg_split('/(<[^>]*>)/i', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + if ($matches) { + $renderer = $PAGE->get_renderer('filter_opencast'); + $video = false; + $width = false; + $height = false; + + foreach ($matches as $match) { + // Check if the match is a video tag. + if (substr($match, 0, 6) === "<video") { + $video = true; + preg_match('/width="([0-9]+)"/', $match, $width); + preg_match('/height="([0-9]+)"/', $match, $height); + $width = $width ? $width[1] : $width; + $height = $height ? $height[1] : $height; + } else if ($video) { + $video = false; + if (substr($match, 0, 7) === "<source") { + + // Check if video is from opencast. + if (strpos($match, $baseurl) === false) { + $width = $height = false; + continue; + } - // Change url for loading the (Paella) Player. - $link = $result['src'][0]; + // Extract url. + preg_match_all('/<source[^>]+src=([\'"])(?<src>.+?)\1[^>]*>/i', $match, $result); - // Get episode id from link. - $episoderegex = "/" . preg_quote($episodeurl, "/") . "/"; - $episoderegex = preg_replace('/\\\\\[EPISODEID\\\]/', '([0-9a-zA-Z\-]+)', $episoderegex); - $nummatches = preg_match_all($episoderegex, $link, $episodeid); + // Change url for loading the (Paella) Player. + $link = $result['src'][0]; - if (!$nummatches) { - $width = $height = false; - continue; - } + // Get episode id from link. + $episoderegex = "/" . preg_quote($episodeurl, "/") . "/"; + $episoderegex = preg_replace('/\\\\\[EPISODEID\\\]/', '([0-9a-zA-Z\-]+)', $episoderegex); + $nummatches = preg_match_all($episoderegex, $link, $episodeid); - $data = paella_transform::get_paella_data_json($ocinstance->id, $episodeid[1][0]); + if (!$nummatches) { + $width = $height = false; + continue; + } - // Collect the needed data being submitted to the template. - $mustachedata = new stdClass(); - $mustachedata->playerid = 'ocplayer_' . $i++; - $mustachedata->configurl = get_config('filter_opencast', 'configurl_' . $ocinstance->id); - if (strpos($mustachedata->configurl, 'http') === false) { - $mustachedata->configurl = (new moodle_url($mustachedata->configurl))->out(); - } + $data = paella_transform::get_paella_data_json($ocinstance->id, $episodeid[1][0]); - $mustachedata->data = json_encode($data); - $mustachedata->width = $width; - $mustachedata->height = $height; - $mustachedata->modplayerpath = (new moodle_url('/mod/opencast/player.html'))->out(); - - if (count($data['streams']) === 1) { - $sources = $data['streams'][0]['sources']; - $res = $sources[array_key_first($sources)][0]['res']; - $resolution = $res['w'] . '/' . $res['h']; - $mustachedata->resolution = $resolution; - - if ($width xor $height) { - if ($width) { - $mustachedata->height = $width * ($res['h'] / $res['w']); - } else if ($height) { - $mustachedata->width = $height * ($res['w'] / $res['h']); - } + if (!$data) { + continue; } - } else { - if ($width && $height) { - $mustachedata->width = $width; - $mustachedata->height = $height; + + // Collect the needed data being submitted to the template. + $mustachedata = new stdClass(); + $mustachedata->playerid = 'ocplayer_' . $i++; + $mustachedata->configurl = get_config('filter_opencast', 'configurl_' . $ocinstance->id); + if (strpos($mustachedata->configurl, 'http') === false) { + $mustachedata->configurl = (new moodle_url($mustachedata->configurl))->out(); } - } - $newtext = $renderer->render_player($mustachedata); + $mustachedata->data = json_encode($data); + $mustachedata->width = $width; + $mustachedata->height = $height; + $mustachedata->modplayerpath = (new moodle_url('/mod/opencast/player.html'))->out(); + + if (count($data['streams']) === 1) { + $sources = $data['streams'][0]['sources']; + $res = $sources[array_key_first($sources)][0]['res']; + $resolution = $res['w'] . '/' . $res['h']; + $mustachedata->resolution = $resolution; + + if ($width xor $height) { + if ($width) { + $mustachedata->height = $width * ($res['h'] / $res['w']); + } else if ($height) { + $mustachedata->width = $height * ($res['w'] / $res['h']); + } + } + } else { + if ($width && $height) { + $mustachedata->width = $width; + $mustachedata->height = $height; + } + } - // Replace video tag. - $text = preg_replace('/<video(?:(?!<\/video>).)*?' . preg_quote($match, '/') . '.*?<\/video>/', - $newtext, $text, 1); + $newtext = $renderer->render_player($mustachedata); + + // Replace video tag. + $text = preg_replace('/<video(?:(?!<\/video>).)*?' . preg_quote($match, '/') . '.*?<\/video>/', + $newtext, $text, 1); + } + $width = $height = false; } - $width = $height = false; } } } diff --git a/lang/en/filter_opencast.php b/lang/en/filter_opencast.php index 7ce950d290360b8e2b981f461c459960c2b3634d..50da383ae40279383c474796e599da6b17de5ba6 100644 --- a/lang/en/filter_opencast.php +++ b/lang/en/filter_opencast.php @@ -26,7 +26,7 @@ defined('MOODLE_INTERNAL') || die(); $string['filtername'] = 'Opencast'; $string['pluginname'] = 'Opencast Filter'; $string['privacy:metadata'] = 'The Opencast filter plugin does not store any personal data.'; -$string['setting_episodeurl'] = 'URL template for filtering'; -$string['setting_episodeurl_desc'] = 'URLs matching this template are replaced with the Opencast player. You must use the placeholder [EPISODEID] to indicate where the episode ID is contained in the URL e.g. http://stable.opencast.de/play/[EPISODEID]'; +$string['setting_episodeurl'] = 'URL templates for filtering'; +$string['setting_episodeurl_desc'] = 'URLs matching this template are replaced with the Opencast player. You must use the placeholder [EPISODEID] to indicate where the episode ID is contained in the URL e.g. http://stable.opencast.de/play/[EPISODEID]. If you want to filter for multiple URLs, enter each URL in a new line.'; $string['setting_configurl'] = 'URL to Paella config.json'; $string['setting_configurl_desc'] = 'URL of the config.json used by Paella Player. Can either be a absolute URL or a URL relative to the wwwroot.'; diff --git a/settings.php b/settings.php index d61b975e7d20999fa8a035d5750cf9bd5cc42d12..2a703b40c51e5e887a441ebca6729e0f8213ca0c 100644 --- a/settings.php +++ b/settings.php @@ -27,9 +27,9 @@ if ($ADMIN->fulltree) { $ocinstances = \tool_opencast\local\settings_api::get_ocinstances(); foreach ($ocinstances as $instance) { - $settings->add(new admin_setting_configtext('filter_opencast/episodeurl_' . $instance->id, + $settings->add(new admin_setting_configtextarea('filter_opencast/episodeurl_' . $instance->id, get_string('setting_episodeurl', 'filter_opencast'), - get_string('setting_episodeurl_desc', 'filter_opencast'), '')); + get_string('setting_episodeurl_desc', 'filter_opencast'), '', PARAM_RAW_TRIMMED, '30', '4')); $settings->add(new admin_setting_configtext('filter_opencast/configurl_' . $instance->id, new lang_string('setting_configurl', 'filter_opencast'), diff --git a/version.php b/version.php index c2301f8a157d42104256c678bcc39d1dbb45483f..24dc816e9608bc3e4df61d4e0b355003bc2cfb58 100644 --- a/version.php +++ b/version.php @@ -26,7 +26,7 @@ defined('MOODLE_INTERNAL') || die(); $plugin->maturity = MATURITY_STABLE; $plugin->release = 'v3.11-r1'; -$plugin->version = 2021101900; // The current plugin version (Date: YYYYMMDDXX). +$plugin->version = 2021101901; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2020061500; // Requires this Moodle version. $plugin->component = 'filter_opencast'; // Full name of the plugin. $plugin->dependencies = array(