MDL-38158 core_media: Convert media players to new plugin type

AMOS BEGIN
  MOV [siteyoutube,core_media],[pluginname,media_youtube]
  MOV [siteyoutube_desc,core_media],[pluginname_help,media_youtube]
  MOV [sitevimeo,core_media],[pluginname,media_vimeo]
  MOV [sitevimeo_desc,core_media],[pluginname_help,media_vimeo]
  MOV [html5audio,core_media],[pluginname,media_html5audio]
  MOV [html5audio_desc,core_media],[pluginname_help,media_html5audio]
  MOV [html5video,core_media],[pluginname,media_html5video]
  MOV [html5video_desc,core_media],[pluginname_help,media_html5video]
  MOV [flashanimation,core_media],[pluginname,media_swf]
  MOV [flashanimation_desc,core_media],[pluginname_help,media_swf]
AMOS END
This commit is contained in:
Marina Glancy 2016-09-15 15:52:41 +08:00
parent 3c73b26c4b
commit fab11235d8
76 changed files with 3524 additions and 4406 deletions

View file

@ -454,7 +454,7 @@ $cache = '.var_export($cache, true).';
'langconfig' => null,
'license' => null,
'mathslib' => null,
'media' => null,
'media' => $CFG->dirroot.'/media',
'message' => $CFG->dirroot.'/message',
'mimetypes' => null,
'mnet' => $CFG->dirroot.'/mnet',
@ -502,6 +502,7 @@ $cache = '.var_export($cache, true).';
'enrol' => $CFG->dirroot.'/enrol',
'message' => $CFG->dirroot.'/message/output',
'block' => $CFG->dirroot.'/blocks',
'media' => $CFG->dirroot.'/media/player',
'filter' => $CFG->dirroot.'/filter',
'editor' => $CFG->dirroot.'/lib/editor',
'format' => $CFG->dirroot.'/course/format',

View file

@ -140,7 +140,7 @@ abstract class core_filetypes {
'mht' => array('type' => 'message/rfc822', 'icon' => 'archive'),
'mhtml' => array('type' => 'message/rfc822', 'icon' => 'archive'),
'mov' => array('type' => 'video/quicktime', 'icon' => 'quicktime',
'groups' => array('video', 'web_video'), 'string' => 'video'),
'groups' => array('video', 'web_video', 'html_video'), 'string' => 'video'),
'movie' => array('type' => 'video/x-sgi-movie', 'icon' => 'quicktime', 'groups' => array('video'), 'string' => 'video'),
'mw' => array('type' => 'application/maple', 'icon' => 'math'),
'mws' => array('type' => 'application/maple', 'icon' => 'math'),
@ -260,7 +260,7 @@ abstract class core_filetypes {
'tsv' => array('type' => 'text/tab-separated-values', 'icon' => 'text'),
'txt' => array('type' => 'text/plain', 'icon' => 'text', 'defaulticon' => true),
'vtt' => array('type' => 'text/vtt', 'icon' => 'text', 'groups' => array('html_track')),
'wav' => array('type' => 'audio/wav', 'icon' => 'wav', 'groups' => array('audio'. 'html_audio', 'web_audio'),
'wav' => array('type' => 'audio/wav', 'icon' => 'wav', 'groups' => array('audio', 'html_audio', 'web_audio'),
'string' => 'audio'),
'webm' => array('type' => 'video/webm', 'icon' => 'video', 'groups' => array('html_video', 'video', 'web_video'),
'string' => 'video'),

View file

@ -1815,6 +1815,10 @@ class core_plugin_manager {
'memberships', 'profile', 'toolproxy', 'toolsettings'
),
'media' => array(
'html5audio', 'html5video', 'swf', 'videojs', 'vimeo', 'youtube'
),
'message' => array(
'airnotifier', 'email', 'jabber', 'popup'
),

View file

@ -0,0 +1,188 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Defines classes used for plugin info.
*
* @package core
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\plugininfo;
defined('MOODLE_INTERNAL') || die();
/**
* Class for media plugins
*
* @package core
* @copyright 2016 Marina Glancy
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class media extends base {
public function is_uninstall_allowed() {
return true;
}
/**
* Get the name for the settings section.
*
* @return string
*/
public function get_settings_section_name() {
return 'mediasetting' . $this->name;
}
/**
* Load the global settings for a particular availability plugin (if there are any)
*
* @param \part_of_admin_tree $adminroot
* @param string $parentnodename
* @param bool $hassiteconfig
*/
public function load_settings(\part_of_admin_tree $adminroot, $parentnodename, $hassiteconfig) {
global $CFG, $USER, $DB, $OUTPUT, $PAGE; // In case settings.php wants to refer to them.
$ADMIN = $adminroot; // May be used in settings.php.
$plugininfo = $this; // Also can be used inside settings.php
$availability = $this; // Also to be used inside settings.php.
if (!$this->is_installed_and_upgraded()) {
return;
}
if (!$hassiteconfig) {
return;
}
$section = $this->get_settings_section_name();
$settings = null;
if (file_exists($this->full_path('settings.php'))) {
$settings = new \admin_settingpage($section, $this->displayname, 'moodle/site:config', $this->is_enabled() === false);
include($this->full_path('settings.php')); // This may also set $settings to null.
}
if ($settings) {
$ADMIN->add($parentnodename, $settings);
}
}
/**
* Return URL used for management of plugins of this type.
* @return \moodle_url
*/
public static function get_manage_url() {
return new \moodle_url('/admin/settings.php', array('section' => 'managemediaplayers'));
}
public static function get_enabled_plugins() {
global $CFG;
$order = (!empty($CFG->media_plugins_sortorder)) ? explode(',', $CFG->media_plugins_sortorder) : [];
if ($order) {
$plugins = \core_plugin_manager::instance()->get_installed_plugins('media');
$order = array_intersect($order, array_keys($plugins));
}
return array_combine($order, $order);
}
/**
* Sets the current plugin as enabled or disabled
* When enabling tries to guess the sortorder based on default rank returned by the plugin.
* @param bool $newstate
*/
public function set_enabled($newstate = true) {
$enabled = self::get_enabled_plugins();
if (array_key_exists($this->name, $enabled) == $newstate) {
// Nothing to do.
return;
}
if ($newstate) {
// Enable media plugin.
$plugins = \core_plugin_manager::instance()->get_plugins_of_type('media');
if (!array_key_exists($this->name, $plugins)) {
// Can not be enabled.
return;
}
$rank = $this->get_rank();
$position = 0;
// Insert before the first enabled plugin which default rank is smaller than the default rank of this one.
foreach ($enabled as $playername) {
if (($player = $plugins[$playername]) && ($rank > $player->get_rank())) {
break;
}
$position++;
}
array_splice($enabled, $position, 0, [$this->name]);
self::set_enabled_plugins($enabled);
} else {
// Disable media plugin.
unset($enabled[$this->name]);
self::set_enabled_plugins($enabled);
}
}
/**
* Set the list of enabled media players in the specified sort order
* To be used when changing settings or in unit tests
* @param string|array $list list of plugin names without frankenstyle prefix - comma-separated string or an array
*/
public static function set_enabled_plugins($list) {
if (empty($list)) {
$list = [];
} else if (!is_array($list)) {
$list = explode(',', $list);
}
if ($list) {
$plugins = \core_plugin_manager::instance()->get_installed_plugins('media');
$list = array_intersect($list, array_keys($plugins));
}
set_config('media_plugins_sortorder', join(',', $list));
\core_plugin_manager::reset_caches();
\core_media_manager::reset_caches();
}
/**
* Returns the default rank of this plugin for default sort order
* @return int
*/
public function get_rank() {
$classname = '\media_'.$this->name.'_plugin';
if (class_exists($classname)) {
$object = new $classname();
return $object->get_rank();
}
return 0;
}
/**
* Returns human-readable string of supported file/link types for the "Manage media players" page
* @param array $extensions
* @return string
*/
public function supports(&$extensions) {
$classname = '\media_'.$this->name.'_plugin';
if (class_exists($classname)) {
$object = new $classname();
$result = $object->supports($extensions);
foreach ($object->get_supported_extensions() as $ext) {
$extensions[$ext] = $ext;
}
return $result;
}
return '';
}
}

View file

@ -316,6 +316,10 @@ class core_useragent {
// Internet Explorer.
return self::check_ie_version($version);
case 'Edge':
// Microsoft Edge.
return self::check_edge_version($version);
case 'Firefox':
// Mozilla Firefox browsers.
return self::check_firefox_version($version);
@ -1054,4 +1058,85 @@ class core_useragent {
}
return false;
}
/**
* Checks if current browser supports files with give extension as <video> or <audio> source
*
* Note, the check here is not 100% accurate!
*
* First, we do not know which codec is used in .mp4 or .webm files. Not all browsers support
* all codecs.
*
* Also we assume that users of Firefox/Chrome/Safari do not use the ancient versions of browsers.
*
* We check the exact version for IE/Edge though. We know that there are still users of very old
* versions that are afraid to upgrade or have slow IT department.
*
* Resources:
* https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats
* https://en.wikipedia.org/wiki/HTML5_video
* https://en.wikipedia.org/wiki/HTML5_Audio
*
* @param string $extension extension without leading .
* @return bool
*/
public static function supports_html5($extension) {
$extension = strtolower($extension);
$supportedvideo = array('m4v', 'webm', 'ogv', 'mp4');
$supportedaudio = array('ogg', 'oga', 'aac', 'm4a', 'mp3', 'wav', 'mov');
// TODO MDL-56549 Flac will be supported in Firefox 51 in January 2017.
// Basic extension support.
if (!in_array($extension, $supportedvideo) && !in_array($extension, $supportedaudio)) {
return false;
}
// MS IE support - version 9.0 or later.
if (self::is_ie() && !self::check_ie_version('9.0')) {
return false;
}
// MS Edge support - version 12.0 for desktop and 13.0 for mobile.
if (self::is_edge()) {
if (!self::check_edge_version('12.0')) {
return false;
}
if (self::instance()->is_useragent_mobile() && !self::check_edge_version('13.0')) {
return false;
}
}
// Different exceptions.
// Webm is not supported in IE, Edge and in Safari.
if ($extension === 'webm' &&
(self::is_ie() || self::is_edge() || self::is_safari() || self::is_safari_ios())) {
return false;
}
// Ogg is not supported in IE, Edge and Safari.
$isogg = in_array($extension, ['ogg', 'oga', 'ogv']);
if ($isogg && (self::is_ie() || self::is_edge() || self::is_safari() || self::is_safari_ios())) {
return false;
}
// Wave is not supported in IE.
if ($extension === 'wav' && self::is_ie()) {
return false;
}
// Aac is not supported in IE below 11.0.
if ($extension === 'aac' && (self::is_ie() && !self::check_ie_version('11.0'))) {
return false;
}
// Mpeg is not supported in IE below 10.0.
$ismpeg = in_array($extension, ['m4a', 'mp3', 'm4v', 'mp4']);
if ($ismpeg && (self::is_ie() && !self::check_ie_version('10.0'))) {
return false;
}
// Mov is not supported in IE.
if ($extension === 'mov' && self::is_ie()) {
return false;
}
return true;
}
}