2013-10-01 13:26:39 +03:00
|
|
|
<?php
|
2014-10-08 08:20:29 +03:00
|
|
|
/*
|
2013-10-01 13:26:39 +03:00
|
|
|
* LiveStreet CMS
|
|
|
|
* Copyright © 2013 OOO "ЛС-СОФТ"
|
|
|
|
*
|
|
|
|
* ------------------------------------------------------
|
|
|
|
*
|
|
|
|
* Official site: www.livestreetcms.com
|
|
|
|
* Contact e-mail: office@livestreetcms.com
|
|
|
|
*
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
*
|
|
|
|
* ------------------------------------------------------
|
|
|
|
*
|
|
|
|
* @link http://www.livestreetcms.com
|
|
|
|
* @copyright 2013 OOO "ЛС-СОФТ"
|
|
|
|
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2014-10-08 08:20:29 +03:00
|
|
|
/**
|
|
|
|
* Объект управления типом video link
|
|
|
|
*
|
|
|
|
* @package application.modules.property
|
|
|
|
* @since 2.0
|
|
|
|
*/
|
2014-10-08 11:49:34 +03:00
|
|
|
class ModuleProperty_EntityValueTypeVideoLink extends ModuleProperty_EntityValueType
|
|
|
|
{
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
const VIDEO_PROVIDER_YOUTUBE = 'youtube';
|
|
|
|
const VIDEO_PROVIDER_VIMEO = 'vimeo';
|
|
|
|
const VIDEO_PROVIDER_RUTUBE = 'rutube';
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function getValueForDisplay()
|
|
|
|
{
|
|
|
|
return $this->getVideoCodeFrame();
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function validate()
|
|
|
|
{
|
|
|
|
$mRes = $this->validateStandart('url', array('defaultScheme' => 'http'));
|
|
|
|
if ($mRes === true) {
|
|
|
|
/**
|
|
|
|
* Теперь проверяем на принадлежность к разным видео-хостингам
|
|
|
|
*/
|
|
|
|
if ($this->getValueForValidate() and !$this->checkVideo($this->getValueForValidate())) {
|
|
|
|
return 'Необходимо указать корректную ссылку на видео: YouTube, Vimeo';
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return $mRes;
|
|
|
|
}
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function prepareValidateRulesRaw($aRulesRaw)
|
|
|
|
{
|
|
|
|
$aRules = array();
|
|
|
|
$aRules['allowEmpty'] = isset($aRulesRaw['allowEmpty']) ? false : true;
|
|
|
|
return $aRules;
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function setValue($mValue)
|
|
|
|
{
|
|
|
|
$this->resetAllValue();
|
|
|
|
$oValue = $this->getValueObject();
|
|
|
|
$oValue->setValueVarchar($mValue ? $mValue : null);
|
|
|
|
/**
|
|
|
|
* Получаем и сохраняем ссылку на превью
|
|
|
|
*/
|
|
|
|
$this->retrievePreview($oValue);
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
protected function retrievePreview($oValue)
|
|
|
|
{
|
|
|
|
$sLink = $oValue->getValueVarchar();
|
|
|
|
$sProvider = $this->getVideoProvider($sLink);
|
|
|
|
$sId = $this->getVideoId($sLink);
|
|
|
|
if ($sProvider == self::VIDEO_PROVIDER_YOUTUBE) {
|
|
|
|
$oValue->setDataOne('preview_small', "http://img.youtube.com/vi/{$sId}/default.jpg");
|
|
|
|
$oValue->setDataOne('preview_normal', "http://img.youtube.com/vi/{$sId}/0.jpg");
|
|
|
|
} elseif ($sProvider == self::VIDEO_PROVIDER_VIMEO) {
|
|
|
|
$aRetrieveData = @json_decode(file_get_contents("http://vimeo.com/api/v2/video/{$sId}.json"), true);
|
|
|
|
if (isset($aRetrieveData[0]['thumbnail_medium'])) {
|
|
|
|
$oValue->setDataOne('preview_small', $aRetrieveData[0]['thumbnail_medium']);
|
|
|
|
$oValue->setDataOne('preview_normal', $aRetrieveData[0]['thumbnail_large']);
|
|
|
|
}
|
|
|
|
} elseif ($sProvider == self::VIDEO_PROVIDER_RUTUBE) {
|
|
|
|
$aRetrieveData = @json_decode(file_get_contents("http://rutube.ru/api/video/{$sId}/?format=json"), true);
|
|
|
|
if (isset($aRetrieveData['thumbnail_url'])) {
|
|
|
|
$oValue->setDataOne('preview_small', $aRetrieveData['thumbnail_url'] . '?size=s');
|
|
|
|
$oValue->setDataOne('preview_normal', $aRetrieveData['thumbnail_url']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function checkVideo($sLink)
|
|
|
|
{
|
|
|
|
return $this->getVideoId($sLink) ? true : false;
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function getVideoId($sLink = null)
|
|
|
|
{
|
|
|
|
if (is_null($sLink)) {
|
|
|
|
$sLink = $this->getValueObject()->getValueVarchar();
|
|
|
|
}
|
|
|
|
$sProvider = $this->getVideoProvider($sLink);
|
|
|
|
/**
|
|
|
|
* youtube
|
|
|
|
* http://www.youtube.com/watch?v=LZaCb5Y9SyM
|
|
|
|
* http://youtu.be/LZaCb5Y9SyM
|
|
|
|
*/
|
|
|
|
if ($sProvider == self::VIDEO_PROVIDER_YOUTUBE) {
|
|
|
|
if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $sLink,
|
|
|
|
$aMatch)) {
|
|
|
|
return $aMatch[0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* vimeo
|
|
|
|
* http://vimeo.com/72359144
|
|
|
|
*/
|
|
|
|
if ($sProvider == self::VIDEO_PROVIDER_VIMEO) {
|
|
|
|
return substr(parse_url($sLink, PHP_URL_PATH), 1);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* rutube
|
|
|
|
* http://rutube.ru/video/ee523c9164c8f9fc8b267c66a0a3adae/
|
|
|
|
* http://rutube.ru/video/6fd81c1c212c002673280850a1c56415/#.UMQYln9yTWQ
|
|
|
|
* http://rutube.ru/tracks/6032725.html
|
|
|
|
* http://rutube.ru/video/embed/6032725
|
|
|
|
*/
|
|
|
|
if ($sProvider == self::VIDEO_PROVIDER_RUTUBE) {
|
|
|
|
if (preg_match('/(?:http|https)+:\/\/(?:www\.|)rutube\.ru\/video\/embed\/([a-zA-Z0-9_\-]+)/i', $sLink,
|
|
|
|
$aMatch) || preg_match('/(?:http|https)+:\/\/(?:www\.|)rutube\.ru\/(?:tracks|video)\/([a-zA-Z0-9_\-]+)(&.+)?/i',
|
|
|
|
$sLink, $aMatch)
|
|
|
|
) {
|
|
|
|
return $aMatch[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function getVideoProvider($sLink)
|
|
|
|
{
|
|
|
|
if (preg_match("#(youtube\.)|(youtu\.be)#i", $sLink)) {
|
|
|
|
return self::VIDEO_PROVIDER_YOUTUBE;
|
|
|
|
}
|
|
|
|
if (preg_match("#(vimeo\.)#i", $sLink)) {
|
|
|
|
return self::VIDEO_PROVIDER_VIMEO;
|
|
|
|
}
|
|
|
|
if (preg_match("#(rutube\.ru)#i", $sLink)) {
|
|
|
|
return self::VIDEO_PROVIDER_RUTUBE;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function getVideoCodeFrame()
|
|
|
|
{
|
|
|
|
$sLink = $this->getValueObject()->getValueVarchar();
|
|
|
|
$sProvider = $this->getVideoProvider($sLink);
|
|
|
|
$sId = $this->getVideoId($sLink);
|
|
|
|
if ($sProvider == self::VIDEO_PROVIDER_YOUTUBE) {
|
|
|
|
return '
|
|
|
|
<iframe style="max-width: 100%;width: 100%;height: 495px;" src="//www.youtube.com/embed/' . $sId . '" frameborder="0" allowfullscreen></iframe>
|
2013-10-01 13:26:39 +03:00
|
|
|
';
|
2014-10-08 11:49:34 +03:00
|
|
|
} elseif ($sProvider == self::VIDEO_PROVIDER_VIMEO) {
|
|
|
|
return '
|
|
|
|
<iframe src="http://player.vimeo.com/video/' . $sId . '?title=0&byline=0&portrait=0&badge=0&color=e6ae9e" style="max-width: 100%;width: 100%;height: 495px;" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
|
2013-10-01 13:26:39 +03:00
|
|
|
';
|
2014-10-08 11:49:34 +03:00
|
|
|
} elseif ($sProvider == self::VIDEO_PROVIDER_RUTUBE) {
|
|
|
|
return '
|
|
|
|
<iframe src="http://rutube.ru/video/embed/' . $sId . '" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowfullscreen style="max-width: 100%;width: 100%;height: 495px;"></iframe>
|
2013-10-01 13:26:39 +03:00
|
|
|
';
|
2014-10-08 11:49:34 +03:00
|
|
|
}
|
|
|
|
return '';
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function getPreview($sType = 'small')
|
|
|
|
{
|
|
|
|
$oValue = $this->getValueObject();
|
|
|
|
return $oValue->getDataOne("preview_{$sType}");
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
public function getCountView()
|
|
|
|
{
|
|
|
|
$oValue = $this->getValueObject();
|
|
|
|
$sLink = $oValue->getValueVarchar();
|
|
|
|
$sProvider = $this->getVideoProvider($sLink);
|
|
|
|
$sId = $this->getVideoId($sLink);
|
|
|
|
if ($sProvider == self::VIDEO_PROVIDER_YOUTUBE) {
|
|
|
|
$iCount = (int)$oValue->getDataOne("count_view");
|
|
|
|
$iCountViewLastTime = (int)$oValue->getDataOne("count_view_last_time");
|
|
|
|
if (time() - $iCountViewLastTime > 60 * 60 * 1) {
|
|
|
|
$aData = @json_decode(file_get_contents("https://gdata.youtube.com/feeds/api/videos/{$sId}?v=2&alt=json"),
|
|
|
|
true);
|
|
|
|
if (isset($aData['entry']['yt$statistics']['viewCount'])) {
|
|
|
|
$iCount = $aData['entry']['yt$statistics']['viewCount'];
|
|
|
|
}
|
|
|
|
$oValue->setDataOne("count_view", $iCount);
|
|
|
|
$oValue->setDataOne("count_view_last_time", time());
|
|
|
|
$oValue->Update();
|
|
|
|
}
|
|
|
|
return $iCount;
|
|
|
|
} elseif ($sProvider == self::VIDEO_PROVIDER_VIMEO) {
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
} elseif ($sProvider == self::VIDEO_PROVIDER_RUTUBE) {
|
2013-10-01 13:26:39 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2013-10-01 13:26:39 +03:00
|
|
|
}
|