. /** * Base class for media players * * @package core_media * @copyright 2016 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Base class for media players. * * Media players return embed HTML for a particular way of playing back audio * or video (or another file type). * * @package core_media * @copyright 2016 Marina Glancy * @author 2011 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class core_media_player { /** * Placeholder text used to indicate where the fallback content is placed * within a result. */ const PLACEHOLDER = ''; /** * Placeholder text used to indicate where the link fallback is placed. * No other players will apply to it but it will be converted to the link in the * end (unless prevented by OPTION_NO_LINK). */ const LINKPLACEHOLDER = ''; /** * Generates code required to embed the player. * * The returned code contains a placeholder comment '' * (constant core_media_player::PLACEHOLDER) which indicates the location * where fallback content should be placed in the event that this type of * player is not supported by user browser. * * The $urls parameter includes one or more alternative media formats that * are supported by this player. It does not include formats that aren't * supported (see list_supported_urls). * * The $options array contains key-value pairs. See OPTION_xx constants * for documentation of standard option(s). * * @param array $urls URLs of media files * @param string $name Display name; '' to use default * @param int $width Optional width; 0 to use default * @param int $height Optional height; 0 to use default * @param array $options Options array * @return string HTML code for embed */ public abstract function embed($urls, $name, $width, $height, $options); /** * Gets the list of file extensions supported by this media player. * * Note: This is only required for the default implementations of * list_supported_urls(), get_embeddable_markers() and supports(). * If you override these functions to determine * supported URLs in some way other than by extension, then this function * is not necessary. * * @return array Array of strings (extension not including dot e.g. '.mp3') */ public function get_supported_extensions() { return array(); } /** * Lists keywords that must be included in a url that can be embedded with * this player. Any such keywords should be added to the array. * * For example if this player supports FLV and F4V files then it should add * '.flv' and '.f4v' to the array. (The check is not case-sensitive.) * * Default handling calls the get_supported_extensions function, so players * only need to override this if they don't implement get_supported_extensions. * * This is used to improve performance when matching links in the media filter. * * @return array Array of keywords to add to the embeddable markers list */ public function get_embeddable_markers() { return $this->get_supported_extensions(); } /** * Returns human-readable string of supported file/link types for the "Manage media players" page * @param array $usedextensions extensions that should NOT be highlighted * @return string */ public function supports($usedextensions = []) { $out = []; if ($extensions = $this->get_supported_extensions()) { $video = $audio = $other = []; foreach ($extensions as $key => $extension) { $displayextension = $extension; if (!in_array($extension, $usedextensions)) { $displayextension = ''.$extension.''; } if (file_extension_in_typegroup('file.'.$extension, 'audio')) { $audio[] = $displayextension; } else if (file_extension_in_typegroup('file.'.$extension, 'video')) { $video[] = $displayextension; } else { $other[] = $displayextension; } } if ($video) { $out[] = get_string('videoextensions', 'core_media', join(', ', $video)); } if ($audio) { $out[] = get_string('audioextensions', 'core_media', join(', ', $audio)); } if ($other) { $out[] = get_string('extensions', 'core_media', join(', ', $other)); } } return join('
', $out); } /** * Gets the ranking of this player. This is an integer used to decide which * player to use (after applying other considerations such as which ones * the user has disabled). * * This function returns the default rank that can be adjusted by the administrator * on the Manage media players page. * * @return int Rank (higher is better) */ public abstract function get_rank(); /** * @deprecated since Moodle 3.2 */ public function is_enabled() { throw new coding_exception('core_media_player::is_enabled() can not be used anymore.'); } /** * Given a list of URLs, returns a reduced array containing only those URLs * which are supported by this player. (Empty if none.) * @param array $urls Array of moodle_url * @param array $options Options (same as will be passed to embed) * @return array Array of supported moodle_url */ public function list_supported_urls(array $urls, array $options = array()) { $extensions = $this->get_supported_extensions(); $result = array(); foreach ($urls as $url) { $ext = core_media_manager::instance()->get_extension($url); if (in_array('.' . $ext, $extensions) || in_array($ext, $extensions)) { $result[] = $url; } } return $result; } /** * Obtains suitable name for media. Uses specified name if there is one, * otherwise makes one up. * @param string $name User-specified name ('' if none) * @param array $urls Array of moodle_url used to make up name * @return string Name */ protected function get_name($name, $urls) { // If there is a specified name, use that. if ($name) { return $name; } // Get filename of first URL. $url = reset($urls); $name = core_media_manager::instance()->get_filename($url); // If there is more than one url, strip the extension as we could be // referring to a different one or several at once. if (count($urls) > 1) { $name = preg_replace('~\.[^.]*$~', '', $name); } return $name; } /** * @deprecated since Moodle 3.2 */ public static function compare_by_rank() { throw new coding_exception('core_media_player::compare_by_rank() can not be used anymore.'); } /** * Utility function that sets width and height to defaults if not specified * as a parameter to the function (will be specified either if, (a) the calling * code passed it, or (b) the URL included it). * @param int $width Width passed to function (updated with final value) * @param int $height Height passed to function (updated with final value) */ protected static function pick_video_size(&$width, &$height) { global $CFG; if (!$width) { $width = $CFG->media_default_width; $height = $CFG->media_default_height; } } /** * Setup page requirements. * * The typical javascript requirements MUST not take action on the content * directly. They are meant to load the required libraries and listen * to events in order to know when to take action. The role of this method * is not to provide a way for plugins to look for content to embed on the * page. The {@link self::embed()} method is meant to be used for that. * * @param moodle_page $page The page we are going to add requirements to. * @since Moodle 3.2 */ public function setup($page) { // Override is need be. } }