Просмотр исходного кода

#2127 Basic player re-integration using objects

Alex Trofimov 7 лет назад
Родитель
Сommit
25b441a763

+ 209 - 0
inc/classes/BxDolPlayer.php

@@ -0,0 +1,209 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaCore UNA Core
+ * @{
+ */
+
+/**
+ * Standard Player view.
+ * @see BxDolPlayer::attachPlayer
+ */
+define('BX_PLAYER_STANDARD', 1);
+
+/**
+ * Mini Player view. If not supported by player, standard view is used.
+ * @see BxDolPlayer::attachPlayer
+ */
+define('BX_PLAYER_MINI', 3);
+
+/**
+ * Player view in embed. If not supported by player, standard view is used.
+ * @see BxDolPlayer::attachPlayer
+ */
+define('BX_PLAYER_EMBED', 2);
+
+/**
+ * Audio/Video player integration.
+ *
+ * Site owner can choose which audio/video can be user on the site.
+ *
+ * Default player is stored in 'sys_player_default' setting option.
+ *
+ * @section player_create Creating the Editor object:
+ *
+ *
+ * Add record to 'sys_objects_player' table:
+ *
+ * - object: name of the object, in the format: vendor prefix, underscore, module prefix, underscore, internal identifier or nothing; 
+ * - title: title of the player, displayed in the studio.
+ * - skin: player skin, if player suports custom/multiple skins.
+ * - override_class_name: user defined class name which is derived from one of base player classes.
+ * - override_class_file: the location of the user defined class, leave it empty if class is located in system folders.
+ *
+ *
+ * @section example Example of usage
+ *
+ * Display player
+ *
+ * @code
+ *
+ *  $oPlayer = BxDolPlayer::getObjectInstance(); // get default player object instance
+ *  if ($oPlayer) // check if player is available for using
+ *      echo $oPlayer->getCodeVideo (BX_PLAYER_STANDARD, array(
+ *          'poster' => $sUrlPoster, // optional, but very 
+ *          'mp4' => $sUrlMP4, // or array of files, 
+ *                   for example: array('standard' => $sUrl480, 'hd' => $sUrl720)
+ *          'webm' => $sUrlWebM, // optional, mp4 format is enough for all moders browsers
+ *          'attrs' => $aAttrs,  // optional, not supported by all player implementations
+ *          'styles' => 'width:100%; height:auto;', // optional, not supported by all 
+ *                                                     players implementations
+ *      )); // output HTML player implementation
+ * @endcode
+ *
+ */
+class BxDolPlayer extends BxDolFactory implements iBxDolFactoryObject
+{
+    protected $_sObject;
+    protected $_aObject;
+    protected $_sConfCustom = '';
+    protected $_sPluginsCustom = false;
+
+    protected $_sSkin;
+    protected $_aSkins;
+
+    protected function __construct($aObject)
+    {
+        parent::__construct();
+
+        $this->_sObject = $aObject['object'];
+        $this->_aObject = $aObject;
+        
+        $this->_sSkin = !empty($aObject['skin']) ? $aObject['skin']: '';
+        $this->_aSkins = array();
+    }
+
+    /**
+     * Get player object instance by object name
+     * @param $sObject object name
+     * @return object instance or false on error
+     */
+    static public function getObjectInstance($sObject = false, $oTemplate = false)
+    {
+        if (!$sObject)
+            $sObject = getParam('sys_player_default');
+
+        if (isset($GLOBALS['bxDolClasses']['BxDolPlayer!'.$sObject]))
+            return $GLOBALS['bxDolClasses']['BxDolPlayer!'.$sObject];
+
+        $aObject = BxDolPlayerQuery::getPlayerObject($sObject);
+        if (!$aObject || !is_array($aObject))
+            return false;
+
+        if (empty($aObject['override_class_name']))
+            return false;
+
+        $sClass = $aObject['override_class_name'];
+        if (!empty($aObject['override_class_file']))
+            require_once(BX_DIRECTORY_PATH_ROOT . $aObject['override_class_file']);
+
+        $o = new $sClass($aObject, $oTemplate);
+
+        return ($GLOBALS['bxDolClasses']['BxDolPlayer!'.$sObject] = $o);
+    }
+
+    /**
+     * Get object name
+     */
+    public function getObjectName ()
+    {
+        return $this->_sObject;
+    }
+
+    /**
+     * Set custom player configuration options
+     */
+    public function setCustomConf ($s)
+    {
+        $this->_sConfCustom = $s;
+    }
+
+    /**
+     * Set custom plugins
+     */
+    public function setCustomPlugins ($sPlugins)
+    {
+        $this->_sPluginsCustom = $sPlugins;
+    }
+
+    /**
+     * Get a list of available skins.
+     */
+    public function getSkins($bFullInfo = false)
+    {
+        if($bFullInfo)
+            return $this->_aSkins;
+
+        $aResults = array();
+        foreach($this->_aSkins as $aSkin)
+            $aResults[] = array('key' => $aSkin['name'], 'value' => _t($aSkin['title']));
+
+        return $aResults;
+    }
+
+    public function setSkin($sSkin)
+    {
+        if(!in_array($sSkin, array_keys($this->_aSkins)))
+            return;
+
+        $this->_sSkin = $sSkin;
+    }
+
+    /**
+     * Get player HTML code
+     * @param $iViewMode - player view mode: BX_PLAYER_STANDARD, BX_PLAYER_MINI, BX_PLAYER_EMBED
+     * @param $aParams - player params: mp3, ogg, attrs, styles - See usage example.
+     * @param $bDynamicMode - is AJAX mode or not, the HTML with player is loaded dynamically.
+     */
+    public function getCodeAudio ($iViewMode, $aParams, $bDynamicMode = false)
+    {
+        // override this function in particular player class
+    }
+    
+    /**
+     * Get player HTML code
+     * @param $iViewMode - player view mode: BX_PLAYER_STANDARD, BX_PLAYER_MINI, BX_PLAYER_EMBED
+     * @param $aParams - player params: poster, mp4, webm, attrs, styles - See usage example.
+     * @param $bDynamicMode - is AJAX mode or not, the HTML with player is loaded dynamically.
+     */
+    public function getCodeVideo ($iViewMode, $aParams, $bDynamicMode = false)
+    {
+        // override this function in particular player class
+    }
+
+    /**
+     * Add css/js files which are needed for player display and functionality.
+     */
+    protected function _addJsCss ($bDynamicMode = false)
+    {
+        // override this function in particular player class
+    }
+
+    /**
+     * Replace provided markers string.
+     * @param $s - string to replace markers in
+     * @param $a - markers array
+     * @return string with replaces markers
+     */
+    protected function _replaceMarkers ($s, $a)
+    {
+        if (empty($s) || empty($a) || !is_array($a))
+            return $s;
+        return bx_replace_markers($s, $a);
+    }
+
+}
+
+/** @} */

+ 37 - 0
inc/classes/BxDolPlayerQuery.php

@@ -0,0 +1,37 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaCore UNA Core
+ * @{
+ */
+
+/**
+ * Database queries for player objects.
+ * @see BxDolPlayer
+ */
+class BxDolPlayerQuery extends BxDolDb
+{
+    protected $_aObject;
+
+    public function __construct($aObject)
+    {
+        parent::__construct();
+        $this->_aObject = $aObject;
+    }
+
+    static public function getPlayerObject ($sObject)
+    {
+        $oDb = BxDolDb::getInstance();
+        $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_player` WHERE `object` = ?", $sObject);
+        $aObject = $oDb->getRow($sQuery);
+        if (!$aObject || !is_array($aObject))
+            return false;
+
+        return $aObject;
+    }
+
+}
+
+/** @} */

+ 20 - 0
install/sql/system.sql

@@ -40,6 +40,24 @@ INSERT INTO `sys_objects_editor` (`object`, `title`, `skin`, `override_class_nam
 ('sys_tinymce', 'TinyMCE', 'lightgray', 'BxTemplEditorTinyMCE', '');
 
 
+-- --------------------------------------------------------
+
+
+CREATE TABLE `sys_objects_player` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object` varchar(64) NOT NULL,
+  `title` varchar(255) NOT NULL,
+  `skin` varchar(255) NOT NULL,
+  `override_class_name` varchar(255) NOT NULL,
+  `override_class_file` varchar(255) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `object` (`object`)
+);
+
+
+INSERT INTO `sys_objects_player` (`object`, `title`, `skin`, `override_class_name`, `override_class_file`) VALUES
+('sys_html5', 'HTML5', '', 'BxTemplPlayerHTML5', '');
+
 
 -- --------------------------------------------------------
 
@@ -292,6 +310,8 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 
 (@iCategoryId, 'sys_editor_default', '_adm_stg_cpt_option_sys_editor_default', 'sys_tinymce', 'digit', '', '', '', 50),
 (@iCategoryId, 'sys_captcha_default', '_adm_stg_cpt_option_sys_captcha_default', 'sys_recaptcha_new', 'digit', '', '', '', 51),
+(@iCategoryId, 'sys_player_default', '_adm_stg_cpt_option_sys_player_default', 'sys_html5', 'digit', '', '', '', 55),
+(@iCategoryId, 'sys_player_default_format', '_adm_stg_cpt_option_sys_player_default_format', 'standard', 'select', 'standard,hd', '', '', 56),
 
 (@iCategoryId, 'sys_live_updates_interval', '_adm_stg_cpt_option_sys_live_updates_interval', '10000', 'digit', '', '', '', 60),
 

+ 4 - 2
modules/boonex/english/data/langs/system/en.xml

@@ -1313,12 +1313,14 @@
 	<string name="_adm_stg_cpt_option_sys_autoupdate"><![CDATA[Enable auto-update]]></string>
 	<string name="_adm_stg_cpt_option_sys_cache_memcache_host"><![CDATA[Memcached server host]]></string>
 	<string name="_adm_stg_cpt_option_sys_cache_memcache_port"><![CDATA[Memcached server port]]></string>
-	<string name="_adm_stg_cpt_option_sys_captcha_default"><![CDATA[Сaptcha object]]></string>
+	<string name="_adm_stg_cpt_option_sys_captcha_default"><![CDATA[Default Сaptcha]]></string>
 	<string name="_adm_stg_cpt_option_sys_email_attachable_email_templates"><![CDATA[Attachable email templates list]]></string>
 	<string name="_adm_stg_cpt_option_sys_db_cache_enable"><![CDATA[Enable DB cache]]></string>
 	<string name="_adm_stg_cpt_option_sys_db_cache_engine"><![CDATA[DB cache engine (other than File option may require custom server setup)]]></string>
 	<string name="_adm_stg_cpt_option_sys_default_payment"><![CDATA[Payment module]]></string>
-	<string name="_adm_stg_cpt_option_sys_editor_default"><![CDATA[HTML editor object]]></string>
+    <string name="_adm_stg_cpt_option_sys_editor_default"><![CDATA[Default HTML editor]]></string>
+	<string name="_adm_stg_cpt_option_sys_player_default"><![CDATA[Default Player]]></string>
+	<string name="_adm_stg_cpt_option_sys_player_default_format"><![CDATA[Default video format]]></string>
 	<string name="_adm_stg_cpt_option_sys_format_date"><![CDATA[Date Format]]></string>
 	<string name="_adm_stg_cpt_option_sys_format_datetime"><![CDATA[Datetime Format]]></string>
 	<string name="_adm_stg_cpt_option_sys_format_time"><![CDATA[Time Format]]></string>

+ 21 - 0
modules/boonex/lucid/data/template/system/scripts/BxTemplPlayerHtml5.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaTemplate UNA Template Classes
+ * @{
+ */
+
+/**
+ * @see BxDolEditor
+ */
+class BxTemplPlayerHtml5 extends BxBasePlayerHTML5
+{
+    public function __construct ($aObject, $oTemplate = false)
+    {
+        parent::__construct ($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 4 - 2
modules/boonex/russian/data/langs/system/ru.xml

@@ -1313,12 +1313,14 @@
 	<string name="_adm_stg_cpt_option_sys_autoupdate"><![CDATA[Включить автообновление]]></string>
 	<string name="_adm_stg_cpt_option_sys_cache_memcache_host"><![CDATA[Memcached - адрес сервера]]></string>
 	<string name="_adm_stg_cpt_option_sys_cache_memcache_port"><![CDATA[Memcached - порт сервера]]></string>
-	<string name="_adm_stg_cpt_option_sys_captcha_default"><![CDATA[Объект CAPTCHA]]></string>
+	<string name="_adm_stg_cpt_option_sys_captcha_default"><![CDATA[CAPTCHA по умолчанию]]></string>
 	<string name="_adm_stg_cpt_option_sys_email_attachable_email_templates"><![CDATA[Список присоединяемых email темплейтов]]></string>
 	<string name="_adm_stg_cpt_option_sys_db_cache_enable"><![CDATA[Задействовать кэш БД]]></string>
 	<string name="_adm_stg_cpt_option_sys_db_cache_engine"><![CDATA[Кэш-движок для БД (значение, отличное от File, может потребовать дополнительной настройки сервера)]]></string>
 	<string name="_adm_stg_cpt_option_sys_default_payment"><![CDATA[Модуль оплаты]]></string>
-	<string name="_adm_stg_cpt_option_sys_editor_default"><![CDATA[Объект HTML редактора]]></string>
+	<string name="_adm_stg_cpt_option_sys_editor_default"><![CDATA[HTML редактор по умолчанию]]></string>
+	<string name="_adm_stg_cpt_option_sys_player_default"><![CDATA[Плеер по умолчанию]]></string>
+	<string name="_adm_stg_cpt_option_sys_player_default_format"><![CDATA[Видео формат по умолчанию]]></string>
 	<string name="_adm_stg_cpt_option_sys_format_date"><![CDATA[Формат даты]]></string>
 	<string name="_adm_stg_cpt_option_sys_format_datetime"><![CDATA[Формат даты и времени]]></string>
 	<string name="_adm_stg_cpt_option_sys_format_time"><![CDATA[Формат времени]]></string>

+ 12 - 15
template/scripts/BxBaseFunctions.php

@@ -504,25 +504,22 @@ class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
      * Ouputs HTML5 video player.
      * @param $sUrlPoster video poster image
      * @param $sUrlMP4 .mp4 video
-     * @param $sUrlWebM .webm video
+     * @param $sUrlMP4Hd .mp4 video in better quality
      * @param $aAttrs custom attributes, defaults are: controls="" preload="none" autobuffer=""
      * @param $sStyles custom styles, defaults are: width:100%; height:auto;
      */
-    function videoPlayer ($sUrlPoster, $sUrlMP4, $sUrlWebM = '', $aAttrs = false, $sStyles = 'width:100%; height:auto;')
+    function videoPlayer ($sUrlPoster, $sUrlMP4, $sUrlMP4Hd = '', $aAttrs = false, $sStyles = 'width:100%; height:auto;')
     {
-        $aAttrsDefaults = array(
-            'controls' => '',
-            'controlsList' => 'nodownload',
-            'preload' => 'none',
-            'autobuffer' => '', 
-        );
-        $aAttrs = array_merge($aAttrsDefaults, is_array($aAttrs) ? $aAttrs : array());
-        $sAttrs = bx_convert_array2attrs($aAttrs, '', $sStyles);
-
-        return '<video ' . $sAttrs . ' poster="' . $sUrlPoster . '">
-                    ' . ($sUrlWebM ? '<source type="video/webm; codecs="vp8, vorbis" src="' . $sUrlWebM . '" />' : '') . '
-                    ' . ($sUrlMP4  ? '<source type="video/mp4" src="' . $sUrlMP4 . '" />' : '') . '
-                </video>';
+        $oPlayer = BxDolPlayer::getObjectInstance();
+        if (!$oPlayer)
+            return '';
+        return $oPlayer->getCodeVideo (BX_PLAYER_STANDARD, array(
+            'poster' => $sUrlPoster,
+            'mp4' => array('standard' => $sUrlMP4, 'hd' => $sUrlMP4Hd),
+            'webm' => '',
+            'attrs' => $aAttrs,
+            'styles' => $sStyles,
+        ));
     }
 
     protected function getInjection($sPrefix)

+ 111 - 0
template/scripts/BxBasePlayerHTML5.php

@@ -0,0 +1,111 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaBaseView UNA Base Representation Classes
+ * @{
+ */
+
+/**
+ * Basic HTML5 player representation.
+ * @see BxDolPlayer
+ */
+class BxBasePlayerHTML5 extends BxDolPlayer
+{
+    /**
+     * Standard view initialization params
+     */
+    protected static $CONF_STANDARD = "
+        <video {attrs}>
+            {webm}
+            {mp4}
+        </video>
+    ";
+
+    /**
+     * Minimal view initialization params
+     */
+    protected static $CONF_MINI = "";
+
+    /**
+     * Embed view initialization params
+     */
+    protected static $CONF_EMBED = "";
+
+    /**
+     * Available player languages
+     */
+    protected static $CONF_LANGS = array();
+
+    protected $_oTemplate;
+    protected $_bJsCssAdded = false;
+
+    public function __construct ($aObject, $oTemplate)
+    {
+        parent::__construct ($aObject);
+
+        if ($oTemplate)
+            $this->_oTemplate = $oTemplate;
+        else
+            $this->_oTemplate = BxDolTemplate::getInstance();
+    }
+
+    public function getCodeAudio ($iViewMode, $aParams, $bDynamicMode = false)
+    {
+        // TODO:
+    }
+
+    public function getCodeVideo ($iViewMode, $aParams, $bDynamicMode = false)
+    {
+        // set visual mode
+        switch ($iViewMode) {
+        case BX_PLAYER_STANDARD:
+        case BX_PLAYER_MINI:
+        case BX_PLAYER_EMBED:
+        default:
+                $sInit = self::$CONF_STANDARD;
+        }
+
+        // attrs
+        $aAttrsDefault = array(
+            'controls' => '',
+            'controlsList' => 'nodownload',
+            'preload' => 'none',
+            'autobuffer' => '', 
+        );
+        $aAttrs = isset($aParams['attrs']) && is_array($aParams['attrs']) ? $aParams['attrs'] : array();
+        $aAttrs = array_merge($aAttrsDefault, $aAttrs);
+        if (isset($aParams['poster']) && is_string($aParams['poster']))
+            $aAttrs['poster'] = $aParams['poster'];
+        $sAttrs = bx_convert_array2attrs($aAttrs, false, isset($aParams['styles']) && is_string($aParams['styles']) ? $aParams['styles'] : false);
+
+        // generate files list for HTML5 player
+        $sFormat = getParam('sys_player_default_format');
+        $aTypes = array(
+            'webm' => '<source type="video/webm; codecs=\'vp8, vorbis\'" src="{url}" />',
+            'mp4' => '<source type="video/mp4" src="{url}" />',
+        );
+        foreach ($aTypes as $s => $ss) {
+            if (is_array($aParams[$s]) && !empty($aParams[$s][$sFormat]))
+                $aParams[$s] = str_replace('{url}', $aParams[$s][$sFormat], $ss);
+            elseif (is_array($aParams[$s]) && !empty($aParams[$s]['standard']))
+                $aParams[$s] = str_replace('{url}', $aParams[$s]['standard'], $ss);
+            elseif (is_string($aParams[$s]) && !empty($aParams[$s]))
+                $aParams[$s] = str_replace('{url}', $aParams[$s], $ss);
+            else
+                $aParams[$s] = '';
+        }
+
+        // player code
+        $sCode = $this->_replaceMarkers($sInit, array(
+            'attrs' => $sAttrs,
+            'webm' => $aParams['webm'],
+            'mp4' => $aParams['mp4'],
+        ));
+
+        return $sCode;
+    }
+}
+
+/** @} */