. /** * MoePlayer 播放器 media 插件 * * 把页面中的视频链接/嵌入媒体交给 MoePlayer 渲染。 * 播放器资源(js/css/语言包/解码库)随插件打包,无需额外部署。 * * @package media_moeplayer * @copyright MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * MoePlayer media 插件类 */ class media_moeplayer_plugin extends core_media_player { /** @var array 支持的扩展名 */ private static $extensions = ['mp4', 'm4v', 'mov', 'webm', 'ogv', 'm3u8', 'flv', 'ts']; /** * 支持的扩展名列表(core_media_manager 据此匹配视频链接) * * @return array */ public function get_supported_extensions() { return self::$extensions; } /** * 优先级,高于内置 html5video/videojs,使 MoePlayer 优先接管 * * @return int */ public function get_rank() { return 100; } /** * 生成嵌入代码 * * @param array $urls 媒体 URL 列表(moodle_url) * @param string $name 名称 * @param int $width 宽度 * @param int $height 高度 * @param array $options 选项 * @return string HTML */ public function embed($urls, $name, $width, $height, $options) { global $PAGE; // 页面只需加载一次播放器资源(多视频共存时去重) static $loaded = false; if (!$loaded) { $base = new moodle_url('/media/player/moeplayer/moeplayer'); $skin = get_config('media_moeplayer', 'skin'); if (!in_array($skin, ['moeplayer.css', 'moeplayer.red.css', 'moeplayer.ixigua.css'])) { $skin = 'moeplayer.css'; } $PAGE->requires->css($base . '/css/' . $skin); $PAGE->requires->js($base . '/js/moeplayer.min.js', true); $loaded = true; } $videourl = addslashes($urls[0]->out(false)); $id = html_writer::random_id('moeplayer_'); // 尺寸:优先使用管理器传入值,其次插件默认设置 $width = $width ?: get_config('media_moeplayer', 'width') ?: '100%'; $height = $height ?: get_config('media_moeplayer', 'height') ?: '480'; $container = html_writer::tag('div', '', [ 'id' => $id, 'class' => 'media-moeplayer', 'style' => 'width:' . (is_numeric($width) ? $width . 'px' : $width) . ';' . 'height:' . (is_numeric($height) ? $height . 'px' : $height) . ';max-width:100%;', ]); // 等播放器 js 就绪后初始化(handlebars/JS 过滤等场景下加载顺序不确定) $script = html_writer::script(" (function() { var init = function() { if (typeof MoePlayer === 'undefined') { return setTimeout(init, 50); } new MoePlayer({ container: '#{$id}', video: '{$videourl}' }); }; init(); })(); "); return $container . $script; } }