HEX
Server: Apache
System: Linux iad1-shared-e1-24 6.6.49-grsec-jammy+ #10 SMP Thu Sep 12 23:23:08 UTC 2024 x86_64
User: dh_ncpy7d (5150532)
PHP: 8.2.26
Disabled: NONE
Upload Files
File: /home/dh_ncpy7d/beitarbeersheva.com/photos/plugins/piwigo-videojs/main.inc.php
<?php
/*
Plugin Name: VideoJS
Version: 2.7.a
Description: videojs integration for piwigo
Plugin URI: http://piwigo.org/ext/extension_view.php?eid=610
Author: xbmgsharp
Author URI: https://github.com/xbgmsharp/piwigo-videojs
*/

// Check whether we are indeed included by Piwigo.
if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');

// Define the path to our plugin.
define('VIDEOJS_PATH', PHPWG_PLUGINS_PATH . basename(dirname(__FILE__)).'/');

global $conf;

// Prepare configuration
$conf['vjs_conf'] = unserialize($conf['vjs_conf']);

// Register the allowed extentions to the global conf in order
// to sync them with other contents
$vjs_extensions = array(
    'ogg',
    'ogv',
    'mp4',
    'm4v',
    'webm',
    'webmv',
);
$conf['file_ext'] = array_merge ($conf['file_ext'], $vjs_extensions, array_map('strtoupper', $vjs_extensions) );

// Hook on to an event to display videos as standard images
add_event_handler('render_element_content', 'vjs_render_media', 40, 2);

// Hook to display a fallback thumbnail if not defined
add_event_handler('get_mimetype_location', 'vjs_get_mimetype_icon', 60, 2);

// Hook to change the picture data to template
//add_event_handler('picture_pictures_data', 'vjs_pictures_data');

// Hook to sync geotag metadata on upload or sync
//add_event_handler('format_exif_data', 'vjs_format_exif_data', EVENT_HANDLER_PRIORITY_NEUTRAL, 3);

// Hook to display metadata on picture page
//add_event_handler('get_element_metadata_available', 'vjs_metadata_available');

// If admin do the init
if (defined('IN_ADMIN')) {
	include_once(VIDEOJS_PATH.'/admin/admin_boot.php');
}

function vjs_format_exif_data($exif, $filename, $map)
{
	//print $filename."\n";
	//print_r($exif)."\n<br/>\n";

	// If not a video, we skip
	if (isset($exif['MimeType']) and stristr($exif['MimeType'], "image"))
	{
		return $exif;
	}

	// If video, let's check
	include_once(dirname(__FILE__).'/include/mediainfo.php');
	if (isset($exif))
	{
		$exif['Make'] = "VideoJS";
		// replace some value by human readable string
		if (isset($general->Duration_String))
		{
			$exif['duration'] = (string)$general->Duration_String;
			array_push($map, 'duration');
		}
		if (isset($video->BitRate_String))
		{
			$exif['bitrate'] = (string)$video->BitRate_String;
			array_push($map, 'bitrate');
		}
		if (isset($audio->SamplingRate_String))
		{
			$exif['sampling_rate'] = (string)$audio->SamplingRate_String;
			array_push($map, 'sampling_rate');
		}
		ksort($exif);
	}
	return $exif;
}

function vjs_metadata_available($show_metadata)
{
	return 1;
}

function vjs_render_media($content, $picture)
{
	global $template, $picture, $page, $conf, $user, $refresh;

	//print_r( $picture['current']);
	// do nothing if the current picture is actually an image !
	if ( (array_key_exists('src_image', @$picture['current'])
		&& @$picture['current']['src_image']->is_original()) )
	{
		return $content;
	}

	// In case it is not an image but not a supported video file by the plugin
	if (vjs_valid_extension(get_extension($picture['current']['path'])) === false)
	{
		return $content;
	}

	// In case, we handle a large video, we define a MAX_HEIGHT
	// variable to limit the display size.
	$MAX_HEIGHT = isset($conf['vjs_conf']['max_height']) ? $conf['vjs_conf']['max_height'] : '480';
	if (isset($user['maxheight']) and $user['maxheight']!='')
	{
		$MAX_HEIGHT = $user['maxwidth'];
	}
	//print "MAX_HEIGHT=" . $MAX_HEIGHT;
	//print_r($user);

	$extension = vjs_get_mimetype_from_ext(get_extension($picture['current']['path']));
	//print "extension\n";
	//print_r($extension);

	// Video file -- Guess resolution base on height
	if (isset($picture['current']['width']))
	{
		$width = $picture['current']['width'];
	}
	if (isset($picture['current']['height']))
	{
		$height = $picture['current']['height'];
	}
	if ( !isset($width) || !isset($height))
	{
		// If guess was unsuccessful, fallback to default 16/9 resolution 720x480
		// This is the case for ogv video for example.
		$height = 480;
		$width  = round(16 * 480 / 9, 0);
	}
	//print "Video height=" . $height . " width=". $width;

	// Resize if video is too height
	//print $height .">". $MAX_HEIGHT;
	if ( $height > $MAX_HEIGHT )
	{
		$height = $MAX_HEIGHT;
		$width  = round(16 * $MAX_HEIGHT / 9, 0);
		//print "MAX_HEIGHT height=" . $height . " width=". $width;
	}

	// Upscale if video is too small
	$upscale = isset($conf['vjs_conf']['upscale']) ? strbool($conf['vjs_conf']['upscale']) : false;
	if ( $upscale and $height < $MAX_HEIGHT )
	{
		$height = $MAX_HEIGHT;
		$width  = round(16 * $MAX_HEIGHT / 9, 0);
		//print "UPSCALE height=" . $height . " width=". $width;
	}

	// Load parameter, fallback to default if unset
	$skin = isset($conf['vjs_conf']['skin']) ? $conf['vjs_conf']['skin'] : 'vjs-default-skin';
	$customcss = isset($conf['vjs_customcss']) ? $conf['vjs_customcss'] : '';
	$preload = isset($conf['vjs_conf']['preload']) ? $conf['vjs_conf']['preload'] : 'none';
	$loop = isset($conf['vjs_conf']['loop']) ? strbool($conf['vjs_conf']['loop']) : false;
	$controls = isset($conf['vjs_conf']['controls']) ? strbool($conf['vjs_conf']['controls']) : false;
	$volume = isset($conf['vjs_conf']['volume']) ? $conf['vjs_conf']['volume'] : '1';

	// Slideshow : The video needs to be launch automatically in
	// slideshow mode. The refresh of the page is set to the
	// duration of the video.
	$autoplay = isset($conf['vjs_conf']['autoplay']) ? strbool($conf['vjs_conf']['autoplay']) : false;
	if ( $page['slideshow'] )
	{
		$refresh = 20; // TODO move to separate DB to actualy get this details information
		$autoplay = true;
		$loop = false;
	}

	// Assing the CSS file according to the skin
	$available_skins = array(
		'vjs-default-skin' => 'video-js.min.css',
		'vjs-redtube-skin' => 'redtube-skin.css',
	);
	$skincss = $available_skins[$skin];

	// Guess the poster extension
	$file_wo_ext = pathinfo($picture['current']['path']);
	$file_dir = dirname($picture['current']['path']);
	$poster = embellish_url( $picture['current']['src_image']->get_path() );
	//print $poster;

	// Try to find multiple video source
	$vjs_extensions = array('ogg', 'ogv', 'mp4', 'm4v', 'webm', 'webmv');
	$files_ext = array_merge(array(), $vjs_extensions, array_map('strtoupper', $vjs_extensions) );
	// Add the current file in array
	$videos[] = array(
				'src' => embellish_url(get_gallery_home_url() . $picture['current']['element_url']),
				'ext' => $extension,
			);
	foreach ($files_ext as $file_ext) {
		$file = $file_dir."/pwg_representative/".$file_wo_ext['filename'].".".$file_ext;
		if (file_exists($file)){
			array_push($videos,
				   array (
					'src' => embellish_url(
						      get_gallery_home_url() . $file_dir . "/pwg_representative/".$file_wo_ext['filename'].".".$file_ext
						     ),
					'ext' => vjs_get_mimetype_from_ext($file_ext)
					)
				  );
		}
	}
	//print_r($videos);
	// Sort array to have MP4 first in the source list for iOS support
	foreach ($videos as $key => $row) {
		$src[$key] = $row['src'];
		$ext[$key] = $row['ext'];
	}
	array_multisort($src, SORT_ASC, $ext, SORT_ASC, $videos);
	//print_r($videos);

	/* Thumbnail videojs plugin */
	$thumbnails_plugin = isset($conf['vjs_conf']['plugins']['thumbnails']) ? strbool($conf['vjs_conf']['plugins']['thumbnails']) : false;
	$thumbnails = array();
	if ($thumbnails_plugin)
	{
		$filematch = $file_dir."/pwg_representative/".$file_wo_ext['filename']."-th_*";
		$matches = glob($filematch);

		if ( is_array ( $matches ) ) {
			foreach ( $matches as $filename) {
			     $ext = explode("-th_", $filename);
			     $second = explode(".", $ext[1]);
			     // ./galleries/videos/pwg_representative/trailer_480p-th_0.jpg
			     //echo "$filename second " . $second[0]. "\n";
			     $thumbnails[] = array(
						   'second' => $second[0],
						   'source' => embellish_url(get_gallery_home_url() . $filename)
						);
			}
		}
		//$thumbnails = array( array('second' => 0, 'source' => $poster), array('second' => 5, 'source' => $poster));
		//print_r($thumbnails);
	}

	/* ZoomRotate videojs plugin */
	$zoomrotate_plugin = isset($conf['vjs_conf']['plugins']['zoomrotate']) ? strbool($conf['vjs_conf']['plugins']['zoomrotate']) : false;
	$zoomrotate = array();
	if ($zoomrotate_plugin)
	{
		// TODO Disable if playing on iOS, as it read the metadata itself
		if ($picture['current']['rotation'] != null)
		{
			include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
			include_once(PHPWG_ROOT_PATH.'admin/include/image.class.php');
			// rotation is $picture['current']['rotation']
			// zoom is witdh / height
			$rotate = pwg_image::get_rotation_angle_from_code($picture['current']['rotation']);
			$zoomrotate = array(
						'rotate'	=> $rotate,
						'zoom'		=> round($width / $height, 1, PHP_ROUND_HALF_DOWN)
					);
			// Change the video player size
			$tmp_width = $width;
			$tmp_height = $height;
			$width = $tmp_height;
			$height = $tmp_width;
		}
	}

	/* Watermark videojs plugin */
	$watermark_plugin = isset($conf['vjs_conf']['plugins']['watermark']) ? strbool($conf['vjs_conf']['plugins']['watermark']) : false;
	$watermark = array();
	if ($watermark_plugin)
	{
		$derivatives = unserialize($conf['derivatives']);
		if (is_array($derivatives) and !empty($derivatives) and $derivatives['w']->file != null)
		{
			$watermark = array(
						'file'		=> embellish_url(get_gallery_home_url() . $derivatives['w']->file),
						'xpos'		=> $derivatives['w']->xpos,
						'ypos'		=> $derivatives['w']->ypos,
						'xrepeat'	=> $derivatives['w']->xrepeat,
						'opacity'	=> $derivatives['w']->opacity,
					);
		}
	}

	// Generate HTML5 tags
	// Why the data-setup attribute does not work if only one video
	$options = "";
	if ($controls)
	{
		$options .= "controls";
	}
	if ($autoplay)
	{
		$options .= " autoplay ";
	}
	if ($loop)
	{
		$options .= " loop ";
	}
	$options .= ' preload="'. $preload .'"';

	// Select the template
	$template->set_filenames(
		array('vjs_content' => dirname(__FILE__)."/template/vjs-player.tpl")
	);

	// Assign the template variables
	// We use here the piwigo's get_gallery_home_url function to build
	// the full URL as suggested by videojs for flash fallback compatibility
	$template->assign(
		array(
			'VIDEOJS_POSTER_URL'	=> embellish_url(get_gallery_home_url().$poster),
			'VIDEOJS_PATH'		=> embellish_url(get_absolute_root_url().VIDEOJS_PATH),
			'WIDTH'				=> $width,
			'RATIO'				=> round($height/$width*100, 2),
			'OPTIONS'			=> $options,
			'VIDEOJS_SKIN'		=> $skin,
			'VIDEOJS_SKINCSS'	=> $skincss,
			'VIDEOJS_CUSTOMCSS'	=> $customcss,
			'volume'		=> $volume,
			'thumbnails'	=> $thumbnails,
			'zoomrotate'	=> $zoomrotate,
			'watermark'		=> $watermark,
			'videos'		=> $videos,
		)
	);

	// Return the rendered html
	$vjs_content = $template->parse('vjs_content', true);
	return $vjs_content;
}

function vjs_get_mimetype_icon($location, $element_info)
{
	$location= 'plugins/'
		. basename(dirname(__FILE__))
		. '/mimetypes/' . $element_info . '.png';
	return $location;
}

function strbool($value)
{
	return $value ? true : false;
}

function vjs_get_poster_file($file_list)
{
	foreach ($file_list as $file=>$url) {
		//print $file."=>".$url."<br/>\n";
		if (file_exists($file)) return $url;
	}
	return '';
}

function vjs_get_mimetype_from_ext($file_ext)
{
	$vjs_types = array(
			   'ogg'   => 'video/ogg',
			   'ogv'   => 'video/ogg',
			   'mp4'   => 'video/mp4',
			   'm4v'   => 'video/mp4',
			   'webm'  => 'video/webm',
			   'webmv' => 'video/webm'
			);
	return $vjs_types[strtolower($file_ext)];
}

function vjs_valid_extension($file_ext)
{
	$vjs_types = array(
			   'ogg'   => 'video/ogg',
			   'ogv'   => 'video/ogg',
			   'mp4'   => 'video/mp4',
			   'm4v'   => 'video/mp4',
			   'webm'  => 'video/webm',
			   'webmv' => 'video/webm'
			);
	return array_key_exists(strtolower($file_ext), $vjs_types) ? true : false;
}

function vjs_dbSet($fields, $data = array())
{
    if (!$data) $data = &$_POST;
    $set='';
    foreach ($fields as $field)
    {
        if (isset($data[$field]))
        {
            $set.="`$field`='".pwg_db_real_escape_string($data[$field])."', ";
        }
    }
    return substr($set, 0, -2);
}

?>