| Server IP : 54.36.91.62 / Your IP : 216.73.217.111 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/coopiak/amisdesseniors-fr/components/com_community/libraries/ |
Upload File : |
<?php
/**
* @copyright (C) 2013 iJoomla, Inc. - All rights reserved.
* @license GNU General Public License, version 2 (http://www.gnu.org/licenses/gpl-2.0.html)
* @author iJoomla.com <webmaster@ijoomla.com>
* @url https://www.jomsocial.com/license-agreement
* The PHP code portions are distributed under the GPL license. If not otherwise stated, all images, manuals, cascading style sheets, and included JavaScript *are NOT GPL, and are released under the IJOOMLA Proprietary Use License v1.0
* More info at https://www.jomsocial.com/license-agreement
*/
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\Filesystem\File;
use Joomla\Filesystem\Path;
use Joomla\CMS\Uri\Uri;
use Joomla\Registry\Registry;
defined('_JEXEC') or die('Restricted access');
class CVideos extends cobject
{
var $errorMsg = null;
var $debug = null;
var $ffmpeg = null;
var $flvtool2 = null;
var $execFunction = null;
/**
* Constructor
*/
public function __construct()
{
jimport('joomla.filesystem.file');
$config = CFactory::getConfig();
$this->errorMsg = array();
$this->debug = $config->get('videodebug');
$this->ffmpeg = $config->get('ffmpegPath');
$this->flvtool2 = $config->get('flvtool2');
}
/**
*
* Cron job will run this function
* to do all the pending video conversion
*
* @since Jomsocial 1.2.0
*/
public function runConvert()
{
$config = CFactory::getConfig();
$videoFolder = $config->get('videofolder');
$deleteOriginal = $config->get('deleteoriginalvideos');
if (!$config->get('enablevideos')) {
$this->errorMsg[] = 'Video is disabled. Video conversion will not run. ';
return;
}
$zencoder = $config->get('enable_zencoder');
$model = CFactory::getModel('videos');
$videos = $model->getPendingVideos();
if (count($videos) < 1) {
$this->errorMsg[] = 'No videos pending for conversion. ';
return;
}
if (!$zencoder && !$this->hasFFmpegSupport()) {
$this->errorMsg[] = 'FFmpeg cannot be executed.';
return;
}
$table = Table::getInstance( 'Video' , 'CTable' );
// Process each video
$videoCounter = 0;
if ($zencoder) {
$s3BucketPath = $config->get('storages3bucket');
$s3Region = $config->get('storages3region');
$s3Region = ($s3Region) ? '+'.$s3Region : '' ;
$uri = Uri::getInstance();
$s3HttpPath = ($uri->isSSL() ? "https://" : "http://").$s3BucketPath. ".s3.amazonaws.com";
$s3outputBaseUrl = 's3'.$s3Region.'://' . $s3BucketPath;
$videoFolder = $config->get('videofolder') . '/' . VIDEO_FOLDER_NAME;
list($outputWidth, $outputHeight) = explode('x', $config->get('videosSize'), 2);
$outputThumbSize = $config->get('videosThumbSize');
$test = false;
$path = JPATH_ROOT.'/components/com_community/libraries/zencoder.php';
if (is_file($path)) {
include_once($path);
} else {
exit('Missing File'.JPATH_ROOT.'/components/com_community/libraries/zencoder.php');
}
$job = new CZencoderJob;
foreach ($videos as $video) {
// First, lock the video
$table->load($video->id);
$table->save( array('status' => 'locked') );
$table->reset();
$outputFilename = $videoFolder . '/' . $video->creator . '/' . CStringHelper::getRandom() . '.mp4';
$outputThumbUrl = $s3outputBaseUrl . '/' . $videoFolder . '/' . $video->creator . '/' . VIDEO_THUMB_FOLDER_NAME . '/';
//Error: "Filename should only be a file name. It should not include path information."
//zencoder restricted the filename, so we move the path from filename
$outputBaseUrl = $s3outputBaseUrl . '/' . $videoFolder . '/' . $video->creator;
$randomFilename = CStringHelper::getRandom();
$outputFilename = $randomFilename . '.mp4';
$input = Uri::root() . $video->path;
$oriPath = Path::clean(JPATH_ROOT.'/'.$video->path);
$videoName = explode('/', $video->path);
$outputObj = new CZencoderOutput();
$outputObj->setBaseUrl($outputBaseUrl);
$outputObj->setWidth($outputWidth);
$outputObj->setHeight($outputHeight);
$outputObj->setFilename($outputFilename);
$outputObj->setThumbnailsNumber(1);
$outputObj->setThumbnailsSize($outputThumbSize);
$outputObj->setThumbnailsBaseUrl($outputThumbUrl);
$outputObj->setThumbnailsPublic(1);
$outputObj->setPublic(1);
$outputObj->setNotifications(array(array('format'=>'xml', 'url' => CRoute::getExternalURL('index.php?option=com_community&view=videos&task=zencodercallback&videoid='.$video->id.'&videoname='.$videoName[count($videoName)-1]))));
//Thumbname need to be video specific now
$outputObj->setThumbnailsPrefix($randomFilename);
// we only need 1 output file
$output = array();
$output[] = $outputObj->build();
$result = $job->create($input, $output, $test);
if ($result) {
// save into db
//$video->path = $outputFilename;
$video->path = $videoFolder . '/' . $video->creator . '/' . $outputFilename;
$video->thumb = str_replace($s3outputBaseUrl, $s3HttpPath, $outputThumbUrl) . $randomFilename . '_0000.png';
$video->duration = 0;
$video->storage = 's3';
$video->status = 'ready';
$storageTable = Table::getInstance('StorageS3', 'CTable');
$storageTable->storageid = $video->path;
$storageTable->resource_path = $video->path;
$storageTable->store();
$table->reset();
$table->bind($video);
if ($table->store()) {
$this->errorMsg[] = $table->getError();
}
$this->addVideoActivity($table);
$videoCounter++;
} else {
$this->errorMsg[] = $job->getError();
}
}
} else {
$videoSize = CVideosHelper::getVideoSize();
$injectMetadata = is_file($this->flvtool2);
foreach ($videos as $video) {
// First, lock the video
$table->load($video->id);
$table->save( array('status' => 'locked') );
$table->reset();
$videoInFile = Path::clean(JPATH_ROOT.'/'.$video->path);
$videoOutFolder = Path::clean(JPATH_ROOT.'/'.$config->get('videofolder').'/'.VIDEO_FOLDER_NAME.'/'.$video->creator);
$videoFilename = $this->convertVideo($videoInFile , $videoOutFolder, $videoSize, $deleteOriginal);
if ($videoFilename) {
$videoFullPath = $videoOutFolder .'/'. $videoFilename;
if ($injectMetadata) {
$this->injectMetadata($videoFullPath);
}
// Read duration
$videoInfo = $this->getVideoInfo($videoFullPath);
if (!$videoInfo) {
$thumbName = null;
$this->errorMsg[] = 'Could not read video information. Video id: ' . $video->id;
} else {
$videoFrame = CVideosHelper::formatDuration( (int) ($videoInfo['duration']['sec'] / 2), 'HH:MM:SS' );
// Create thumbnail
$thumbFolder = Path::clean( JPATH_ROOT.'/'.$config->get('videofolder').'/'.VIDEO_FOLDER_NAME.'/'.$video->creator.'/'.VIDEO_THUMB_FOLDER_NAME );
$thumbSize = CVideos::thumbSize();
$thumbFileName = $this->createVideoThumb($videoFullPath, $thumbFolder, $videoFrame, $thumbSize);
}
if (!$thumbFileName) {
$this->errorMsg[] = 'Could not create thumbnail for video. Video id: ' . $video->id;
}
// Save into DB
$config = CFactory::getConfig();
$videoFolder = $config->get('videofolder');
$video->path = $config->get('videofolder') . '/'. VIDEO_FOLDER_NAME . '/'. $video->creator . '/'. $videoFilename;
$video->thumb = $config->get('videofolder') . '/'. VIDEO_FOLDER_NAME . '/'. $video->creator . '/'. VIDEO_THUMB_FOLDER_NAME . '/'. $thumbFileName;
$video->duration = $videoInfo['duration']['sec'];
$video->status = 'ready';
$table->reset();
$table->bind($video);
if (!$table->store()) {
$this->errorMsg[] = $table->getError();
}
// Add into activity streams
$this->addVideoActivity($table);
$videoCounter++;
$params = new CParameter('');
$params->set('url', Uri::root() . ltrim($table->getViewURI(), '/'));
$params->set('target', $video->creator);
CNotificationLibrary::add('videos_convert_success', NULL, $video->creator, Text::sprintf('COM_COMMUNITY_VIDEOS_CONVERT_SUCCESS_SUBJECT', $table->getViewURI(), $table->getTitle()), '', 'videos.convert.success', $params, true, '', '', false);
// end if video converted
} else {
$this->errorMsg[] = 'Could not convert video id: ' . $video->id;
}
$table->reset();
unset($video);
} // end foreach pending videos
}
// Lastly, unlock the videos
foreach ($videos as $video) {
$table->load($video->id);
if ($table->status == 'locked') {
$table->save(array('status' => 'pending'));
}
}
$this->errorMsg[] = $videoCounter ? $videoCounter . ' videos converted successfully...' : 'No videos was converted';
$returnMsg = '';
foreach ($this->errorMsg as $msg) {
$returnMsg .= "$msg\r\n";
}
return $returnMsg;
}
/**
* Convert a Video File into specified format according to the output file name
* If $videoOut is a path, a random file name will be generated
*
* @params string $videoIn video input path (including file name)
* @params string $videoOut video output path (file name optinal)
* @params string $videoSize in widthxheight format or any ffmpeg accepted format eg hd480
* @return string video file name or false if failed
* @since Jomsocial 1.2.0
*/
public function convertVideo($videoIn, $videoOut, $videoSize = '400x300', $deleteOriginal = false)
{
if (!is_file($videoIn))
return false;
if (is_file($videoOut)) {
$videoFullPath = File::makeSafe($videoOut);
$videoFileName = basename($videoFullPath);
} else {
// It is a directory, not a file. Assigns file name
//CFactory::load( 'helpers' , 'file' );
$videoFileName = CFileHelper::getRandomFilename($videoOut, '', 'mp4');
$videoFullPath = $videoOut .'/'. $videoFileName;
}
$ext = pathinfo($videoIn, PATHINFO_EXTENSION);
// Build the ffmpeg command
$config = CFactory::getConfig();
$cmd = array();
$cmd[] = $this->ffmpeg;
$cmd[] = '-y -i ' . $videoIn;
/**
* @uses Server must compiled with libx264
*/
$cmd[] = '-vcodec libx264';
if($ext != "3gp"){
$cmd[] = '-acodec aac -ab 64k'; /* Set a lower bitrate (for example "-ab 64k") */
}
$cmd[] = '-strict -2';
if (strpos($videoSize, 'x???') === FALSE) {
$cmd[] = '-s ' . $videoSize;
} else {
$videoSize = explode('x', $videoSize);
$cmd[] = '-vf "scale=' . $videoSize[0] . ':-2"';
}
$cmd[] = $config->get('customCommandForVideo');
$cmd[] = $videoFullPath;
$command = implode(' ', $cmd);
$cmdOut = $this->_runCommand($command);
if (is_file($videoFullPath) && filesize($videoFullPath) > 0)
{
if ($deleteOriginal)
{
File::delete($videoIn);
}
return $videoFileName;
}
else
{
if ($this->debug)
{
echo '<pre>FFmpeg could not convert videos</pre>';
echo '<pre>' . $command . '</pre>';
echo '<pre>' . $cmdOut . '</pre>';
}
return false;
}
}
/*
* Create Thumbnail for a video file
*
* @params string $videoFile existing video's path + file name
* @params string $thumbFile new thumbnail's folder or filename
* @params string $videoFrame decide which frame to be taken as thumbnail
* @params string $thumbsize height x width of the thumbnail
* @return thumbnail's filename or false if failed
* @since Jomsosial 1.2.0
*/
public function createVideoThumb($videoFile, $thumbFile, $videoFrame, $thumbSize='128x96')
{
if (!is_file($videoFile))
{
return false;
}
if (is_file($thumbFile))
{
$thumbFullPath = File::makeSafe($thumbFile);
$thumbFileName = basename($thumbFullPath);
} else {
//CFactory::load( 'helpers' , 'file' );
$thumbFileName = CFileHelper::getRandomFilename($thumbFile, '', 'jpg');
$thumbFullPath = Path::clean($thumbFile .'/'. $thumbFileName);
}
$cmd = $this->ffmpeg . ' -i ' . $videoFile . ' -ss ' . $videoFrame . ' -t 00:00:01 -s ' . $thumbSize . ' -r 1 -f mjpeg ' . $thumbFullPath;
$cmdOut = $this->_runCommand($cmd);
if (is_file($thumbFullPath) && (filesize($thumbFullPath) > 0))
{
return $thumbFileName;
}
$cmd = $this->ffmpeg . ' -i ' . $videoFile . ' -vcodec mjpeg -vframes 1 -an -f rawvideo ' . $thumbFullPath;
$cmdOut = $this->_runCommand($cmd);
if (is_file($thumbFullPath) && (filesize($thumbFullPath) > 0))
{
return $thumbFileName;
} else {
if ($this->debug)
{
echo '<pre>FFmpeg could not create video thumbs</pre>';
echo '<pre>' . $cmd . '</pre>';
echo '<pre>' . $cmdOut . '</pre>';
if (!$cmdOut) { echo '<pre>Check video thumb folder\'s permission.</pre>'; }
}
return false;
}
}
public function createVideoThumbFromRemote(&$videoObj)
{
$thumbData = CRemoteHelper::getContent($video->thumb);
if ($thumbData)
{
jimport('joomla.filesystem.file');
$thumbPath = CVideos::getPath($table->creator, 'thumb');
$thumbFileName = CFileHelper::getRandomFilename($thumbPath);
$tmpThumbPath = $thumbPath .'/'. $thumbFileName;
if (is_file($tmpThumbPath, $thumbData))
{
// Get the image type first so we can determine what extensions to use
$info = getimagesize( $tmpThumbPath );
$mime = image_type_to_mime_type( $info[2]);
$thumbExtension = CImageHelper::getExtension( $mime );
$thumbFilename = $thumbFileName . $thumbExtension;
$thumbPath = $thumbPath .'/'. $thumbFilename;
File::move($tmpThumbPath, $thumbPath);
// Resize the thumbnails
//CFactory::load( 'libraries', 'videos' );
CImageHelper::resizeProportional( $thumbPath , $thumbPath , $mime , CVideos::thumbSize('width') , CVideo::thumbSize('height') );
// Save
$config = CFactory::getConfig();
$thumb = $config->get('videofolder') . '/'
. VIDEO_FOLDER_NAME . '/'
. $table->creator . '/'
. VIDEO_THUMB_FOLDER_NAME . '/'
. $thumbFilename;
$table->set('thumb', $thumb);
$table->store();
}
}
}
/**
* Inject Flash Video Metadata
*
* @params string $flv flash video file
* @since Jomsocial 1.2.0
*/
public function injectMetadata($flv)
{
// $info = $this->getVideoInfo($flv);
$data = array();
// $data[] = '-duration:' . $info['duration']['sec'];
// $data[] = '-width:' . $info['video']['width'];
// $data[] = '-height:' . $info['video']['height'];
// $data[] = '-framerate:' . $info['video']['frame_rate'];
$data[] = '-canSeekToEnd:true';
// $data[] = '-metadatacreator:' . 'Jomsocial.com';
$metadata = implode(' ', $data);
$cmd = $this->flvtool2 . ' -UP ' . $metadata . ' ' . $flv . ' 2>&1';
$cmdOut = $this->_runCommand($cmd); // use -P to print out metadata to stdout
}
/*
* Return Video's information
* bitrate, duration, video and frame properties
*
* @params string $videoFilePath path to the Video
* @return array of video's info
* @since Jomsocial 1.2.0
*/
public function getVideoInfo($videoFile, $cmdOut = '')
{
$data = array();
if (!is_file($videoFile) && empty($cmdOut))
return $data;
if (!$cmdOut) {
//$cmd = $this->converter . ' -v 10 -i ' . $videoFile . ' 2>&1';
// Some FFmpeg version only accept -v value from -2 to 2
$cmd = $this->ffmpeg . ' -i ' . $videoFile . ' 2>&1';
$cmdOut = $this->_runCommand($cmd);
}
if (!$cmdOut) {
return $data;
}
preg_match_all('/Duration: (.*)/', $cmdOut , $matches);
if (count($matches) > 0 && isset($matches[1][0]))
{
//CFactory::load( 'helpers' , 'videos' );
$parts = explode(', ', trim($matches[1][0]));
$data['bitrate'] = intval(ltrim($parts[2], 'bitrate: '));
$data['duration']['hms'] = substr($parts[0], 0, 8);
$data['duration']['exact'] = $parts[0];
$data['duration']['sec'] = $videoFrame = CVideosHelper::formatDuration($data['duration']['hms'], 'seconds');
$data['duration']['excess'] = intval(substr($parts[0], 9));
}
else
{
if ($this->debug) {
echo '<pre>FFmpeg failed to read video\'s duration</pre>';
echo '<pre>' . $cmd . '<pre>';
echo '<pre>' . $cmdOut . '</pre>';
}
return false;
}
preg_match('/Stream(.*): Video: (.*)/', $cmdOut, $matches);
if (count($matches) > 0 && isset($matches[0]) && isset($matches[2]))
{
$data['video'] = array();
preg_match('/([0-9]{1,5})x([0-9]{1,5})/', $matches[2], $dimensions_matches);
$data['video']['width'] = floatval($dimensions_matches[1]);
$data['video']['height'] = floatval($dimensions_matches[2]);
preg_match('/([0-9\.]+) (fps|tb)/', $matches[0], $fps_matches);
if (isset($fps_matches[1]))
$data['video']['frame_rate']= floatval($fps_matches[1]);
preg_match('/\[PAR ([0-9\:\.]+) DAR ([0-9\:\.]+)\]/', $matches[0], $ratio_matches);
if(count($ratio_matches))
{
$data['video']['pixel_aspect_ratio'] = $ratio_matches[1];
$data['video']['display_aspect_ratio'] = $ratio_matches[2];
}
if (!empty($data['duration']) && !empty($data['video']))
{
$data['video']['frame_count'] = ceil($data['duration']['sec'] * $data['video']['frame_rate']);
$data['frames'] = array();
$data['frames']['total'] = $data['video']['frame_count'];
$data['frames']['excess'] = ceil($data['video']['frame_rate'] * ($data['duration']['excess']/10));
$data['frames']['exact'] = $data['duration']['hms'] . '.' . $data['frames']['excess'];
}
$parts = explode(',', $matches[2]);
$other_parts = array($dimensions_matches[0], $fps_matches[0]);
$formats = array();
foreach ($parts as $key => $part)
{
$part = trim($part);
if (!in_array($part, $other_parts))
array_push($formats, $part);
}
$data['video']['pixel_format'] = $formats[1];
$data['video']['codec'] = $formats[0];
}
return $data;
}
public function hasFFmpegSupport()
{
$cmd = $this->ffmpeg . ' -version 2>&1';
$output = $this->_runCommand($cmd);
$hasVersion = CStringHelper::strpos( $output, 'FFmpeg version' );
$hasCopyright = CStringHelper::strpos( $output, 'the FFmpeg developers' );
if($hasVersion === false)
$hasVersion = CStringHelper::strpos( $output, 'ffmpeg version' );
return ($hasVersion !== false || $hasCopyright !== false);
}
public function hasFLVTool2Support()
{
return is_file($this->flvtool2);
}
/*
* Deprecated
* Mirror to getVideoFromProvider()
*/
public function getProvider($videoLink)
{
$providerName = 'invalid';
if (!empty($videoLink)) {
$origvideolink = $videoLink;
//if it using https
$videoLink = CString::str_ireplace( 'https://' , 'http://' , $videoLink );
$videoLink = CString::str_ireplace( 'http://' , '' , $videoLink );
//CString::str_ireplace issue fix for J1.6
if($videoLink === $origvideolink) $videoLink = str_ireplace( 'http://' , '' , $videoLink );
$videoLink = 'http://'. $videoLink;
$parsedLink = parse_url( $videoLink );
//$videoLink = 'http://'.CString::str_ireplace( 'http://' , '' , $videoLink );
//$parsedLink = parse_url($videoLink);
preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $parsedLink['host'], $matches);
if (!empty($matches['domain'])) {
//$this->setError(Text::_('COM_COMMUNITY_VIDEOS_INVALID_VIDEO_URL_ERROR'));
//return false;
$domain = $matches['domain'];
$provider = explode('.', $domain);
$providerName = CStringHelper::strtolower($provider[0]);
// For youtube, they might be using youtu.be address
if( $domain == 'youtu.be') {
$providerName = 'youtube';
}
if ($parsedLink['host'] === 'new.myspace.com') {
$providerName = 'invalid';
}
}
}
$libraryPath = JPATH_ROOT .'/components/com_community/libraries/videos' .'/'. $providerName . '.php';
if (!is_file($libraryPath))
{
$providerName = 'invalid';
$libraryPath = JPATH_ROOT .'/components/com_community/libraries/videos/invalid.php';
}
require_once($libraryPath);
$className = 'CTableVideo' . CStringHelper::ucfirst($providerName);
$table = new $className();
$table->init($videoLink);
return $table;
}
/*
* Return a video provider object according to the video link
*
*/
public function getVideoFromProvider($videoLink)
{
return $this->getProvider($videoLink);
}
/**
* Return HTML formatted title header
*/
static public function getActivityTitleHTML($act)
{
$actor = CFactory::getUser($act->actor);
$html = '<a href="'.CUrlHelper::userLink($act->actor).'" class="joms-stream__user">'.$actor->getDisplayName(false, true).'</a>';
$param = new Registry( $act->params );
$config = CFactory::getConfig();
/**
* @todo Should we move this into CVideo object instead everything in CVideos class ?
* @todo If we are landing in group page do we need display "in ABC group"
* @todo Do load group table here is VERY BAD idea but have no choice for now
*/
$videoUrl = CRoute::_( $act->params->get('video_url') );
$isVideoModal = $config->get('video_mode') == 1;
if ( $isVideoModal ) {
$videoUrl = 'javascript:" onclick="joms.api.videoOpen(\'' . $act->cid . '\');';
}
// If we're using new stream style or has empty content
if ( $param->get('style') == COMMUNITY_STREAM_STYLE && empty($act->content) && $act->groupid ) {
$group = Table::getInstance('Group','CTable');
$groupExists = $group->load($act->groupid);
$groupTitle = ($groupExists) ? $group->name : Text::_('COM_COMMUNITY_CENSORED');
$groupUrl = CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id);
$html .= ' '.Text::sprintf('COM_COMMUNITY_ACTIVITY_GROUP_VIDEO_SHARE_TITLE',$videoUrl,$groupUrl, $groupTitle);
} elseif ( $param->get('style') == COMMUNITY_STREAM_STYLE && empty($act->content) && $act->pageid ) {
$page = Table::getInstance('Page','CTable');
$pageExists = $page->load($act->pageid);
$pageTitle = ($pageExists) ? $page->name : Text::_('COM_COMMUNITY_CENSORED');
$pageUrl = CRoute::_('index.php?option=com_community&view=pages&task=viewpage&pageid=' . $page->id);
$html .= ' '.Text::sprintf('COM_COMMUNITY_ACTIVITY_PAGE_VIDEO_SHARE_TITLE',$videoUrl,$pageUrl, $pageTitle);
} elseif($act->eventid){
//since 4.1 for event
$event = Table::getInstance('Event','CTable');
$event->load($act->eventid);
$eventUrl = CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);
switch($act->app){
case 'videos.linking' :
$html .= Text::sprintf('COM_COMMUNITY_ACTIVITY_EVENT_VIDEO_SHARE_TITLE', $videoUrl, $eventUrl, $event->title);
break;
case 'videos' :
// this is an uploaded event video
$html .= Text::sprintf('COM_COMMUNITY_ACTIVITY_EVENT_VIDEO_UPLOAD_TITLE', $videoUrl, $eventUrl, $event->title);
break;
}
} else if ( $act->app == "videos.linking" ) {
if($act->actor != $act->target && $act->target != 0){
$html .= Text::sprintf('COM_COMMUNITY_ACTIVITY_VIDEO_PROFILE_SHARE_SINGLE', CUrlHelper::userLink($act->target), CFactory::getUser($act->target)->getDisplayName(false, true));
}else{
$html .= Text::sprintf('COM_COMMUNITY_ACTIVITY_VIDEO_LINK_TITLE', $videoUrl);
}
} else if ( $param->get('action', 'upload') ) {
if($act->actor != $act->target && $act->target != 0){
$html .= Text::sprintf('COM_COMMUNITY_ACTIVITY_VIDEO_PROFILE_UPLOAD_SINGLE', CUrlHelper::userLink($act->target), CFactory::getUser($act->target)->getDisplayName(false, true));
}elseif($act->groupid){
$group = Table::getInstance('Group','CTable');
$groupExists = $group->load($act->groupid);
$groupTitle = ($groupExists) ? $group->name : Text::_('COM_COMMUNITY_CENSORED');
$groupUrl = CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id);
$html .= Text::sprintf('COM_COMMUNITY_ACTIVITY_VIDEO_GROUP_UPLOAD_TITLE', $videoUrl, $groupUrl, $groupTitle);
}else{
$html .= Text::sprintf('COM_COMMUNITY_ACTIVITY_VIDEO_UPLOAD_TITLE', $videoUrl);
}
}
return $html;
}
/**
* Return the content of acitivity stream
*/
static public function getActivityContentHTML($act)
{
$html = '';
$my = CFactory::getUser();
$config = CFactory::getConfig();
$param = new CParameter($act->params);
// Legacy issue. We could have either wall or video upload notice here
$action = $param->get('action', 'upload');
//CFactory::load( 'libraries' , 'wall' );
// wall activity have either empty content (old) or $param action = 'wall'
if($action == 'wall' )
{
// Only if the param wallid is specified that we could retrive the wall content
$wallid = $param->get('wallid', false);
if($wallid)
{
$html = CWallLibrary::getWallContentSummary($wallid);
}
}
elseif( $action == 'upload' )
{
$video = $act->video;
$url = $video->getViewUri();
$template = 'activity.videos.upload';
$tmpl = new CTemplate();
$html = $tmpl ->set( 'url' , $url )
->set( 'video' , $video )
->set( 'duration' , CVideosHelper::toNiceHMS(CVideosHelper::formatDuration($video->getDuration())) )
->fetch( 'videos.activity.upload' );
}
return $html;
}
/*
* Return the redirect url
*/
static public function getVideoReturnUrlFromRequest($videoType='default')
{
$mainframe = Factory::getApplication();
$jinput = $mainframe->input;
$creator_type = $jinput->get('creatortype' , VIDEO_USER_TYPE, 'NONE');
$groupId = $jinput->getInt( 'groupid' , 0 );
$my = CFactory::getUser();
// we use this if redirect url is defined
$redirectUrl = $jinput->post->get('redirectUrl' , '', 'STRING');
if (!empty($redirectUrl))
{
return urldecode($redirectUrl);
}
if ($creator_type == VIDEO_GROUP_TYPE || !empty($groupId))
{
$defaultUrl = CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $groupId , false );
$pendingUrl = CRoute::_('index.php?option=com_community&view=videos&task=mypendingvideos&userid='.$my->id.'&groupid='.$groupId, false);
return ($videoType == 'pending') ? $pendingUrl : $defaultUrl;
}
$defaultUrl = CRoute::_('index.php?option=com_community&view=videos&task=myvideos&userid=' . $my->id , false );
$pendingUrl = CRoute::_('index.php?option=com_community&view=videos&task=mypendingvideos&userid='.$my->id, false);
return ($videoType == 'pending') ? $pendingUrl : $defaultUrl;
}
public function videoSize($retunType='default', $displayType='display')
{
static $default;
static $width;
static $height;
if (!isset($thumbsize, $width, $height))
{
$config = CFactory::getConfig();
switch ($displayType)
{
case 'wall':
$default = $config->get('wallvideossize');
break;
case 'activities':
$default = $config->get('activitiesvideosize');
break;
case 'display':
default:
$default = $config->get('videosSize');
break;
}
$array = array();
$array = explode('x', $default, 2);
$width = $array[0];
$height = $array[1];
}
$retunType = strtolower($retunType);
return $$retunType;
}
/*
* Return video thumbnail size for the request
*/
static public function thumbSize($param='thumbsize')
{
static $thumbsize;
static $width;
static $height;
if (!isset($thumbsize, $width, $height))
{
$config = CFactory::getConfig();
$thumbsize = $config->get('videosThumbSize');
$array = explode('x', $thumbsize, 2);
$width = $array[0];
$height = $array[1];
}
$param = strtolower($param);
return $$param;
}
static public function getPath($userid=null, $folderType='user')
{
$config = CFactory::getConfig();
if (!$userid)
{
$my = CFactory::getUser();
$userid = $my->id;
}
$prefix = ($folderType=='original') ? ORIGINAL_VIDEO_FOLDER_NAME : VIDEO_FOLDER_NAME;
$isThumb = ($folderType=='thumb') ? '/' . VIDEO_THUMB_FOLDER_NAME : '';
$folder = JPATH_ROOT.'/'.$config->get('videofolder').'/'.$prefix.'/'.$userid.$isThumb;
$folder = Path::clean($folder);
return $folder;
}
public function _runCommand($command)
{
$output = null;
$return_var = null;
if ($this->execFunction == null)
{
$disableFunctions = explode(',', ini_get('disable_functions'));
$execFunctions = array('passthru', 'exec', 'shell_exec', 'system');
foreach ($execFunctions as $execFunction)
{
if (is_callable($execFunction) && function_exists($execFunction) && !in_array($execFunction, $disableFunctions))
{
$this->execFunction = $execFunction;
break;
}
}
}
switch ($this->execFunction)
{
case 'passthru':
ob_start();
@passthru($command, $return_var);
$output = ob_get_contents();
ob_end_clean();
break;
case 'exec':
@exec($command, $output, $return_var);
$output = implode("\r\n", $output);
break;
case 'shell_exec':
$output = @shell_exec($command);
break;
case 'system':
ob_start();
@system($command, $return_var);
$output = ob_get_contents();
ob_end_clean();
break;
default:
$output = false;
}
// for debug use
// print_r($disableFunctions);
// echo '<br />' . $this->execFunction;
// echo '<br />' . $output;
// exit;
return $output;
}
public function addVideoActivity($video){
if ($video->id)
{
$my = CFactory::getUser( $video->creator );
$act = new stdClass();
$act->cmd = 'videos.upload';
$act->actor = $my->id;
$act->target = 0;
$act->title = '';
$act->app = 'videos';
$act->cid = $video->id;
$act->content = '<img src="' . $video->getThumbnail() . '" style="border: 1px solid #eee;margin-right: 3px;" />';
$act->access = $video->permissions;
$act->comment_id = $video->id;
$act->comment_type = 'videos';
$act->like_id = $video->id;
$act->like_type = 'videos';
$act->groupid = $video->groupid;
$act->eventid = $video->eventid;
//we need to determine if the group is hidden or not
if($video->groupid){
$groupTable = Table::getInstance('Group', 'CTable');
$groupTable->load($video->groupid);
$act->group_access = $groupTable->approvals;
}elseif($video->eventid){
//same goes to event
$eventTable = Table::getInstance('Event', 'CTable');
$eventTable->load($video->eventid);
$act->event_access = $eventTable->permission;
}
$params = new CParameter('');
$params->set('video_url', $video->getViewURI(false));
$params->set('style', COMMUNITY_STREAM_STYLE);
//special case for posting video at other's profile
$videoParams = new CParameter($video->params);
if($targetid = $videoParams->get('target_id')){
$act->target = $targetid;
}
// set stream title if the video uploaded from sharebox
// temp title stored at video desc. Video desc should empty by default (sharebox only)
if ($videoParams->get('sharebox', 0)) {
// $act->title = $video->description;
// $video->save(array('description' => ''));
}
// Add activity logging
$act = CActivityStream::add($act, $params->toString());
//email and add notification if user are tagged
CUserHelper::parseTaggedUserNotification($act->title, $my, $act, array('type' => 'post-comment'));
if($targetid){
//update the video with activity id
$videoParams->set('activity_id', $act->id);
$video->params = $videoParams->toString();
$video->store();
}
}
}
}
/**
* Maintain classname compatibility with JomSocial 1.6 below
*/
class CVideoLibrary extends CVideos
{}