mirror of
https://github.com/moodle/moodle.git
synced 2025-08-06 17:36:38 +02:00
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:
parent
3c73b26c4b
commit
fab11235d8
76 changed files with 3524 additions and 4406 deletions
|
@ -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',
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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'
|
||||
),
|
||||
|
|
188
lib/classes/plugininfo/media.php
Normal file
188
lib/classes/plugininfo/media.php
Normal 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 '';
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue