' . $img . '
';
}
function getRelativePath($path)
{
global $global;
$relativePath = '';
$parts = explode('view/img/', $path);
if (!empty($parts[1])) {
$relativePath = 'view/img/' . $parts[1];
}
if (empty($relativePath)) {
$parts = explode('videos/', $path);
if (!empty($parts[1])) {
$relativePath = 'videos/' . $parts[1];
}
}
if (empty($relativePath)) {
$relativePath = $path;
}
$parts2 = explode('?', $relativePath);
$relativePath = str_replace('\\', '/', $relativePath);
//var_dump($path, $relativePath, $parts);
return $parts2[0];
}
function local_get_contents($path)
{
if (function_exists('fopen')) {
$myfile = fopen($path, "r") or die("Unable to open file! [{$path}]");
$text = fread($myfile, filesize($path));
fclose($myfile);
return $text;
}
}
function getSelfUserAgent()
{
global $global, $AVideoStreamer_UA;
$agent = $AVideoStreamer_UA . "_";
$agent .= md5($global['salt']);
return $agent;
}
function isValidM3U8Link($url, $timeout = 3)
{
if (!isValidURL($url)) {
return false;
}
$content = url_get_contents($url, '', $timeout);
if (!empty($content)) {
if (preg_match('/EXTM3U/', $content)) {
return true;
}
}
return false;
}
function copy_remotefile_if_local_is_smaller($url, $destination)
{
if (file_exists($destination)) {
$size = filesize($destination);
$remote_size = getUsageFromURL($url);
if ($size >= $remote_size) {
_error_log('copy_remotefile_if_local_is_smaller same size ' . $url);
return $remote_size;
}
}
$content = url_get_contents($url);
_error_log('copy_remotefile_if_local_is_smaller url_get_contents = ' . humanFileSize(strlen($content)));
return file_put_contents($destination, $content);
}
function try_get_contents_from_local($url)
{
if (substr($url, 0, 1) === '/') {
// it is not a URL
return file_get_contents($url);
}
global $global;
$parts = explode('/videos/', $url);
if (!empty($parts[1])) {
if (preg_match('/cache\//', $parts[1])) {
$encoder = '';
} else {
$encoder = 'Encoder/';
}
$tryFile = "{$global['systemRootPath']}{$encoder}videos/{$parts[1]}";
//_error_log("try_get_contents_from_local {$url} => {$tryFile}");
if (file_exists($tryFile)) {
return file_get_contents($tryFile);
}
}
return false;
}
function url_get_contents_with_cache($url, $lifeTime = 60, $ctx = "", $timeout = 0, $debug = false, $mantainSession = false)
{
$url = removeQueryStringParameter($url, 'pass');
$cacheName = str_replace('/', '-', $url);
$cache = ObjectYPT::getCacheGlobal($cacheName, $lifeTime); // 24 hours
if (!empty($cache)) {
//_error_log('url_get_contents_with_cache cache');
return $cache;
}
_error_log("url_get_contents_with_cache no cache [$url] " . json_encode(debug_backtrace()));
$return = url_get_contents($url, $ctx, $timeout, $debug, $mantainSession);
$response = ObjectYPT::setCacheGlobal($cacheName, $return);
_error_log("url_get_contents_with_cache setCache {$url} " . json_encode($response));
return $return;
}
function url_get_contents($url, $ctx = "", $timeout = 0, $debug = false, $mantainSession = false)
{
global $global, $mysqlHost, $mysqlUser, $mysqlPass, $mysqlDatabase, $mysqlPort;
if (!isValidURLOrPath($url)) {
_error_log('url_get_contents Cannot download ' . $url);
return false;
}
if ($debug) {
_error_log("url_get_contents: Start $url, $ctx, $timeout " . getSelfURI() . " " . getRealIpAddr() . " " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
}
$response = try_get_contents_from_local($url);
if (!empty($response)) {
return $response;
}
$agent = getSelfUserAgent();
if (isSameDomainAsMyAVideo($url) || $mantainSession) {
$session_cookie = session_name() . '=' . session_id();
_session_write_close();
}
if (empty($ctx)) {
$opts = [
'http' => ['header' => "User-Agent: {$agent}\r\n"],
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
],
];
if (!empty($timeout)) {
ini_set('default_socket_timeout', $timeout);
$opts['http']['timeout'] = $timeout;
}
if (!empty($session_cookie)) {
$opts['http']['header'] .= "Cookie: {$session_cookie}\r\n";
}
$context = stream_context_create($opts);
} else {
$context = $ctx;
}
if (ini_get('allow_url_fopen')) {
if ($debug) {
_error_log("url_get_contents: allow_url_fopen {$url}");
}
try {
if ($debug) {
$tmp = file_get_contents($url, false, $context);
}else{
$tmp = @file_get_contents($url, false, $context);
}
if ($tmp !== false) {
$response = remove_utf8_bom($tmp);
if ($debug) {
//_error_log("url_get_contents: SUCCESS file_get_contents($url) {$response}");
_error_log("url_get_contents: SUCCESS file_get_contents($url)");
}
return $response;
}
if ($debug) {
$error = error_get_last();
_error_log("url_get_contents: ERROR file_get_contents($url) ".json_encode($error));
}
} catch (ErrorException $e) {
if ($debug) {
_error_log("url_get_contents: allow_url_fopen ERROR " . $e->getMessage() . " {$url}");
}
return "url_get_contents: " . $e->getMessage();
}
}
if (function_exists('curl_init')) {
if ($debug) {
_error_log("url_get_contents: CURL {$url} ");
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
if (!empty($session_cookie)) {
curl_setopt($ch, CURLOPT_COOKIE, $session_cookie);
}
if (!empty($timeout)) {
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout + 10);
}
$output = curl_exec($ch);
curl_close($ch);
if ($debug) {
_error_log("url_get_contents: CURL SUCCESS {$url}");
}
return remove_utf8_bom($output);
}
if ($debug) {
_error_log("url_get_contents: Nothing yet {$url}");
}
// try wget
$filename = getTmpDir("YPTurl_get_contents") . md5($url);
if ($debug) {
_error_log("url_get_contents: try wget $filename {$url}");
}
if (wget($url, $filename, $debug)) {
if ($debug) {
_error_log("url_get_contents: wget success {$url} ");
}
$result = file_get_contents($filename);
unlink($filename);
if (!empty($result)) {
return remove_utf8_bom($result);
}
} elseif ($debug) {
_error_log("url_get_contents: try wget fail {$url}");
}
return false;
}
function getUpdatesFilesArray()
{
global $config, $global;
if (!class_exists('User') || !User::isAdmin()) {
return [];
}
$files1 = scandir($global['systemRootPath'] . "updatedb");
$updateFiles = [];
foreach ($files1 as $value) {
preg_match("/updateDb.v([0-9.]*).sql/", $value, $match);
if (!empty($match)) {
if ($config->currentVersionLowerThen($match[1])) {
$updateFiles[] = ['filename' => $match[0], 'version' => $match[1]];
}
}
}
usort($updateFiles, function ($a, $b) {
return version_compare($a['version'], $b['version']);
});
return $updateFiles;
}
function thereIsAnyUpdate()
{
if (!User::isAdmin()) {
return false;
}
$name = 'thereIsAnyUpdate';
if (!isset($_SESSION['sessionCache'][$name])) {
$files = getUpdatesFilesArray();
if (!empty($files)) {
_session_start();
$_SESSION['sessionCache'][$name] = $files;
}
}
return @$_SESSION['sessionCache'][$name];
}
function thereIsAnyRemoteUpdate()
{
if (!User::isAdmin()) {
return false;
}
global $config;
$cacheName = '_thereIsAnyRemoteUpdate';
$cache = ObjectYPT::getCacheGlobal($cacheName, 86400); // 24 hours
if (!empty($cache)) {
return $cache;
}
$version = _json_decode(url_get_contents("https://tutorials.wwbn.net/version"));
//$version = _json_decode(url_get_contents("https://tutorialsavideo.b-cdn.net/version", "", 4));
if (empty($version)) {
return false;
}
$name = 'thereIsAnyRemoteUpdate';
if (!isset($_SESSION['sessionCache'][$name])) {
if (!empty($version)) {
_session_start();
if (version_compare($config->getVersion(), $version->version) === -1) {
$_SESSION['sessionCache'][$name] = $version;
} else {
$_SESSION['sessionCache'][$name] = false;
}
}
}
ObjectYPT::setCacheGlobal($cacheName, $_SESSION['sessionCache'][$name]);
return $_SESSION['sessionCache'][$name];
}
function UTF8encode($data)
{
if (emptyHTML($data)) {
return $data;
}
global $advancedCustom;
if (function_exists('mb_convert_encoding')) {
if (!empty($advancedCustom->utf8Encode)) {
return mb_convert_encoding($data, 'UTF-8', mb_detect_encoding($data));
}
if (!empty($advancedCustom->utf8Decode)) {
return mb_convert_encoding($data, mb_detect_encoding($data), 'UTF-8');
}
} else {
_error_log('UTF8encode: mbstring extension is not installed');
}
return $data;
}
//detect search engine bots
function isBot()
{
global $_isBot;
if (empty($_SERVER['HTTP_USER_AGENT'])) {
return true;
}
if (isAVideoEncoder()) {
return false;
}
if (isset($_isBot)) {
return $_isBot;
}
$_isBot = false;
// User lowercase string for comparison.
$user_agent = mb_strtolower($_SERVER['HTTP_USER_AGENT']);
// A list of some common words used only for bots and crawlers.
$bot_identifiers = [
'bot',
'yahoo', // Yahoo bot has "yahoo" in user agent
'baidu',
'duckduckgo',
'slurp',
'crawler',
'spider',
'curl', // Curl, although commonly used for many benign purposes, is often not a real user
'facebo', // Facebook bot
'embedly', // Embedly bot
'quora',
'outbrain',
'pinterest',
'vkshare', // VK Share button user agent
'w3c_validator',
'whatsapp', // Whatsapp link preview
'fetch',
'loader',
'lighthouse', // Google Lighthouse
'pingdom', // Pingdom bot
'gtmetrix', // GTMetrix bot
'dmbrowser',
'dareboost',
'http-client',
'hello',
'google',
'Expanse'
];
// See if one of the identifiers is in the UA string.
foreach ($bot_identifiers as $identifier) {
if (stripos($user_agent, $identifier) !== false) {
$_isBot = true;
break;
}
}
return $_isBot;
}
/**
* A function that could get me the last N lines of a log file.
* @param string $filepath
* @param string $lines
* @param string $adaptive
* @return boolean
*/
function tail($filepath, $lines = 1, $adaptive = true, $returnArray = false)
{
if (!function_exists('mb_strlen')) {
$msg = "AVideoLog::ERROR you need to install the mb_strlen function to make it work, please the command 'sudo apt install php-mbstring'";
if ($returnArray) {
return [[$msg]];
} else {
return $msg;
}
}
// Open file
$f = @fopen($filepath, "rb");
if ($f === false) {
return false;
}
// Sets buffer size, according to the number of lines to retrieve.
// This gives a performance boost when reading a few lines from the file.
if (!$adaptive) {
$buffer = 4096;
} else {
$buffer = ($lines < 2 ? 64 : ($lines < 10 ? 512 : 4096));
}
// Jump to last character
fseek($f, -1, SEEK_END);
// Read it and adjust line number if necessary
// (Otherwise the result would be wrong if file doesn't end with a blank line)
if (fread($f, 1) !== "\n") {
$lines -= 1;
}
// Start reading
$output = '';
$chunk = '';
// While we would like more
while (ftell($f) > 0 && $lines >= 0) {
// Figure out how far back we should jump
$seek = min(ftell($f), $buffer);
// Do the jump (backwards, relative to where we are)
fseek($f, -$seek, SEEK_CUR);
// Read a chunk and prepend it to our output
$output = ($chunk = fread($f, $seek)) . $output;
// Jump back to where we started reading
fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);
// Decrease our line counter
$lines -= substr_count($chunk, "\n");
}
// While we have too many lines
// (Because of buffer size we might have read too many)
while ($lines++ < 0) {
// Find first newline and remove all text before that
$output = substr($output, strpos($output, "\n") + 1);
}
// Close file and return
fclose($f);
$output = trim($output);
if ($returnArray) {
$array = explode("\n", $output);
$newArray = [];
foreach ($array as $value) {
$newArray[] = [$value];
}
return $newArray;
} else {
return $output;
}
}
function encryptPassword($password, $noSalt = false)
{
global $advancedCustom, $global, $advancedCustomUser;
if (!empty($advancedCustomUser->encryptPasswordsWithSalt) && !empty($global['salt']) && empty($noSalt)) {
$password .= $global['salt'];
}
return md5(hash("whirlpool", sha1($password)));
}
function encryptPasswordVerify($password, $hash, $encodedPass = false)
{
global $advancedCustom, $global;
if (!$encodedPass || $encodedPass === 'false') {
//_error_log("encryptPasswordVerify: encrypt");
$passwordSalted = encryptPassword($password);
// in case you enable the salt later
$passwordUnSalted = encryptPassword($password, true);
} else {
//_error_log("encryptPasswordVerify: do not encrypt");
$passwordSalted = $password;
// in case you enable the salt later
$passwordUnSalted = $password;
}
//_error_log("passwordSalted = $passwordSalted, hash=$hash, passwordUnSalted=$passwordUnSalted");
$isValid = $passwordSalted === $hash || $passwordUnSalted === $hash;
if (!$isValid) {
$passwordFromHash = User::getPasswordFromUserHashIfTheItIsValid($password);
$isValid = $passwordFromHash === $hash;
}
if (!$isValid) {
if ($password === $hash) {
_error_log('encryptPasswordVerify: this is a deprecated password, this will stop to work soon ' . json_encode(debug_backtrace()), AVideoLog::$SECURITY);
return true;
}
}
return $isValid;
}
function isMobile($userAgent = null, $httpHeaders = null)
{
if (empty($userAgent) && empty($_SERVER["HTTP_USER_AGENT"])) {
return false;
}
global $global;
require_once $global['systemRootPath'] . 'objects/Mobile_Detect.php';
$detect = new Mobile_Detect();
return $detect->isMobile($userAgent, $httpHeaders);
}
function isAndroid()
{
global $global;
require_once $global['systemRootPath'] . 'objects/Mobile_Detect.php';
$detect = new Mobile_Detect();
return $detect->is('AndroidOS');
}
function isChannelPage()
{
return strpos($_SERVER["SCRIPT_NAME"], 'view/channel.php') !== false;
}
function isAVideoMobileApp($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
if (empty($user_agent)) {
return false;
}
global $AVideoMobileAPP_UA;
if (preg_match("/{$AVideoMobileAPP_UA}(.*)/", $_SERVER["HTTP_USER_AGENT"], $match)) {
$url = trim($match[1]);
if (!empty($url)) {
return $url;
}
return true;
}
return false;
}
function isAVideoEncoder($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
if (empty($user_agent)) {
return false;
}
global $AVideoEncoder_UA;
if (preg_match("/{$AVideoEncoder_UA}(.*)/", $user_agent, $match)) {
$url = trim($match[1]);
if (!empty($url)) {
return $url;
}
return true;
}
return false;
}
function isCDN()
{
if (empty($_SERVER['HTTP_CDN_HOST'])) {
return false;
}
return isFromCDN($_SERVER['HTTP_CDN_HOST']);
}
function isFromCDN($url)
{
if (preg_match('/cdn.ypt.me/i', $url)) {
return true;
}
return false;
}
function isAVideo($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
if (empty($user_agent)) {
return false;
}
global $AVideoEncoder_UA;
if (preg_match("/AVideo(.*)/", $_SERVER["HTTP_USER_AGENT"], $match)) {
$url = trim($match[1]);
if (!empty($url)) {
return $url;
}
return true;
}
return false;
}
function isAVideoEncoderOnSameDomain()
{
$url = isAVideoEncoder();
if (empty($url)) {
return false;
}
$url = "http://{$url}";
return isSameDomainAsMyAVideo($url);
}
function isSameDomainAsMyAVideo($url)
{
global $global;
if (empty($url)) {
return false;
}
return isSameDomain($url, $global['webSiteRootURL']) || isSameDomain($url, getCDN());
}
function getRefferOrOrigin()
{
$url = '';
if (!empty($_SERVER['HTTP_REFERER'])) {
$url = $_SERVER['HTTP_REFERER'];
} elseif (!empty($_SERVER['HTTP_ORIGIN'])) {
$url = $_SERVER['HTTP_ORIGIN'];
}
return $url;
}
function requestComesFromSameDomainAsMyAVideo()
{
global $global;
$url = getRefferOrOrigin();
//var_dump($_SERVER);exit;
//_error_log("requestComesFromSameDomainAsMyAVideo: ({$url}) == ({$global['webSiteRootURL']})");
return isSameDomain($url, $global['webSiteRootURL']) || isSameDomain($url, getCDN()) || isFromCDN($url);
}
function forbidIfIsUntrustedRequest($logMsg = '', $approveAVideoUserAgent = true)
{
global $global;
if (isUntrustedRequest($logMsg, $approveAVideoUserAgent)) {
forbiddenPage('Invalid Request ' . getRealIpAddr(), true);
}
}
function isUntrustedRequest($logMsg = '', $approveAVideoUserAgent = true)
{
global $global;
if (!empty($global['bypassSameDomainCheck']) || isCommandLineInterface()) {
return false;
}
if (!requestComesFromSameDomainAsMyAVideo()) {
if ($approveAVideoUserAgent && isAVideoUserAgent()) {
return false;
} else {
_error_log('isUntrustedRequest: ' . json_encode($logMsg), AVideoLog::$SECURITY);
return true;
}
}
return false;
}
function forbidIfItIsNotMyUsersId($users_id, $logMsg = '')
{
if (itIsNotMyUsersId($users_id)) {
_error_log("forbidIfItIsNotMyUsersId: [{$users_id}]!=[" . User::getId() . "] {$logMsg}");
forbiddenPage('It is not your user ' . getRealIpAddr(), true);
}
}
function itIsNotMyUsersId($users_id)
{
$users_id = intval($users_id);
if (empty($users_id)) {
return false;
}
if (!User::isLogged()) {
return true;
}
return User::getId() != $users_id;
}
function requestComesFromSafePlace()
{
return (requestComesFromSameDomainAsMyAVideo() || isAVideo());
}
function addGlobalTokenIfSameDomain($url)
{
if (!filter_var($url, FILTER_VALIDATE_URL) || (empty($_GET['livelink']) || !preg_match("/^http.*/i", $_GET['livelink']))) {
return $url;
}
if (!isSameDomainAsMyAVideo($url)) {
return $url;
}
return addQueryStringParameter($url, 'globalToken', getToken(60));
}
function isGlobalTokenValid()
{
if (empty($_REQUEST['globalToken'])) {
return false;
}
return verifyToken($_REQUEST['globalToken']);
}
/**
* Remove a query string parameter from an URL.
*
* @param string $url
* @param string $varname
*
* @return string
*/
function removeQueryStringParameter($url, $varname)
{
$parsedUrl = parse_url($url);
if (empty($parsedUrl) || empty($parsedUrl['host'])) {
return $url;
}
$query = [];
if (isset($parsedUrl['query'])) {
parse_str($parsedUrl['query'], $query);
unset($query[$varname]);
}
$path = $parsedUrl['path'] ?? '';
$query = !empty($query) ? '?' . http_build_query($query) : '';
if (empty($parsedUrl['scheme'])) {
$scheme = '';
} else {
$scheme = "{$parsedUrl['scheme']}:";
}
return $scheme . '//' . $parsedUrl['host'] . $path . $query;
}
/**
* Add a query string parameter from an URL.
*
* @param string $url
* @param string $varname
*
* @return string
*/
function addQueryStringParameter($url, $varname, $value)
{
if ($value === null || $value === '') {
return removeQueryStringParameter($url, $varname);
}
$parsedUrl = parse_url($url);
if (empty($parsedUrl['host'])) {
return "";
}
$query = [];
if (isset($parsedUrl['query'])) {
parse_str($parsedUrl['query'], $query);
}
$query[$varname] = $value;
$path = $parsedUrl['path'] ?? '';
$query = !empty($query) ? '?' . http_build_query($query) : '';
$port = '';
if (!empty($parsedUrl['port']) && $parsedUrl['port'] != '80') {
$port = ":{$parsedUrl['port']}";
}
if (empty($parsedUrl['scheme'])) {
$scheme = '';
} else {
$scheme = "{$parsedUrl['scheme']}:";
}
return $scheme . '//' . $parsedUrl['host'] . $port . $path . $query;
}
function isSameDomain($url1, $url2)
{
if (empty($url1) || empty($url2)) {
return false;
}
return (get_domain($url1) === get_domain($url2));
}
function isAVideoStreamer($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
if (empty($user_agent)) {
return false;
}
global $AVideoStreamer_UA, $global;
$md5 = md5($global['salt']);
if (preg_match("/{$AVideoStreamer_UA}_{$md5}/", $_SERVER["HTTP_USER_AGENT"])) {
return true;
}
return false;
}
function isAVideoUserAgent($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
if (empty($user_agent)) {
return false;
}
global $AVideoMobileAPP_UA, $AVideoEncoder_UA, $AVideoEncoderNetwork_UA, $AVideoStreamer_UA, $AVideoStorage_UA, $global;
// Lavf = ffmpeg
//$agents = [$AVideoMobileAPP_UA, $AVideoEncoder_UA, $AVideoEncoderNetwork_UA, $AVideoStreamer_UA, $AVideoStorage_UA, 'Lavf'];
$agents = [$AVideoMobileAPP_UA, $AVideoEncoder_UA, $AVideoEncoderNetwork_UA, $AVideoStreamer_UA, $AVideoStorage_UA];
foreach ($agents as $value) {
if (preg_match("/{$value}/", $user_agent)) {
return true;
}
}
return false;
}
function isAVideoStorage($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
if (empty($user_agent)) {
return false;
}
global $AVideoStorage_UA;
if (preg_match("/{$AVideoStorage_UA}(.*)/", $_SERVER["HTTP_USER_AGENT"], $match)) {
$url = trim($match[1]);
if (!empty($url)) {
return $url;
}
return true;
}
return false;
}
function get_domain($url, $ifEmptyReturnSameString = false)
{
$pieces = parse_url($url);
$domain = $pieces['host'] ?? '';
if (empty($domain)) {
return $ifEmptyReturnSameString ? $url : false;
}
if (preg_match('/(?P[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
return $regs['domain'];
} else {
$isIp = (bool) ip2long($pieces['host']);
if ($isIp) {
return $pieces['host'];
}
}
return false;
}
function verify($url)
{
global $global;
ini_set('default_socket_timeout', 5);
$cacheFile = sys_get_temp_dir() . '/' . md5($url) . "_verify.log";
$lifetime = 86400; //24 hours
_error_log("Verification Start {$url} cacheFile={$cacheFile}");
$verifyURL = "https://search.ypt.me/verify.php";
$verifyURL = addQueryStringParameter($verifyURL, 'url', $url);
$verifyURL = addQueryStringParameter($verifyURL, 'screenshot', 1);
if (!file_exists($cacheFile) || (time() > (filemtime($cacheFile) + $lifetime))) {
_error_log("Verification Creating the Cache {$url}");
$result = url_get_contents($verifyURL, '', 5);
if ($result !== 'Invalid URL') {
file_put_contents($cacheFile, $result);
}
} else {
if (!file_exists($cacheFile)) {
_error_log("Verification GetFrom Cache !file_exists($cacheFile)");
}
$filemtime = filemtime($cacheFile);
$time = time();
if ($time > ($filemtime + $lifetime)) {
_error_log("Verification GetFrom Cache $time > ($filemtime + $lifetime)");
}
_error_log("Verification GetFrom Cache $cacheFile");
$result = file_get_contents($cacheFile);
if ($result === 'Invalid URL') {
unlink($cacheFile);
}
}
_error_log("Verification Response ($verifyURL): {$result}");
return json_decode($result);
}
function getPorts()
{
$ports = array();
$ports[80] = 'Apache http';
$ports[443] = 'Apache https';
if(AVideoPlugin::isEnabled('Live')){
$ports[8080] = 'NGINX http';
$ports[8443] = 'NGINX https';
$ports[1935] = 'RTMP';
}
if($obj = AVideoPlugin::getDataObjectIfEnabled('YPTSocket')){
$ports[$obj->port] = 'Socket';
}
return $ports;
}
function checkPorts()
{
$variable = getPorts();
$ports = array();
foreach ($variable as $key => $value) {
$ports[] = $key;
}
//postVariables($url, $array, $httpcodeOnly = true, $timeout = 10)
$response = postVariables('https://search.ypt.me/checkPorts.json.php', $ports, false, count($ports)*4);
return $response;
}
function isVerified($url)
{
$resultV = verify($url);
if (!empty($resultV) && !$resultV->verified) {
error_log("Error on Login not verified");
return false;
}
return true;
}
function siteMap()
{
_error_log("siteMap: start");
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 0);
@_session_write_close();
global $global, $advancedCustom;
$totalCategories = 0;
$totalChannels = 0;
$totalVideos = 0;
$global['disableVideoTags'] = 1;
$date = date('Y-m-d\TH:i:s') . "+00:00";
$xml = '
' . $global['webSiteRootURL'] . '
' . $date . '
always
1.00
' . $global['webSiteRootURL'] . 'help
' . $date . '
monthly
0.50
' . $global['webSiteRootURL'] . 'about
' . $date . '
monthly
0.50
' . $global['webSiteRootURL'] . 'contact
' . $date . '
monthly
0.50
' . $global['webSiteRootURL'] . 'channels
' . $date . '
daily
0.80
';
if (empty($_REQUEST['catName'])) {
setRowCount($advancedCustom->siteMapRowsLimit);
_error_log("siteMap: rowCount {$_REQUEST['rowCount']} ");
$_POST['sort']['modified'] = "DESC";
TimeLogStart("siteMap getAllUsersThatHasVideos");
$users = User::getAllUsersThatHasVideos(true);
_error_log("siteMap: getAllUsers " . count($users));
foreach ($users as $value) {
$totalChannels++;
$xml .= '
' . User::getChannelLink($value['id']) . '
' . $date . '
daily
0.90
';
}
$xml .= PHP_EOL . '' . PHP_EOL;
TimeLogEnd("siteMap getAllUsersThatHasVideos", __LINE__, 0.5);
TimeLogStart("siteMap getAllCategories");
$xml .= PHP_EOL . '' . PHP_EOL;
setRowCount($advancedCustom->siteMapRowsLimit);
$_POST['sort']['modified'] = "DESC";
$rows = Category::getAllCategories();
_error_log("siteMap: getAllCategories " . count($rows));
foreach ($rows as $value) {
$totalCategories++;
$xml .= '
' . $global['webSiteRootURL'] . 'cat/' . $value['clean_name'] . '
' . $date . '
weekly
0.80
';
}
$xml .= PHP_EOL . '' . PHP_EOL;
TimeLogEnd("siteMap getAllCategories", __LINE__, 0.5);
}
TimeLogStart("siteMap getAllVideos");
$xml .= '';
setRowCount($advancedCustom->siteMapRowsLimit * 10);
$_POST['sort']['created'] = "DESC";
$rows = Video::getAllVideosLight(!empty($advancedCustom->showPrivateVideosOnSitemap) ? "viewableNotUnlisted" : "publicOnly");
if (empty($rows) || !is_array($rows)) {
$rows = [];
}
$total = count($rows);
_error_log("siteMap: getAllVideos total={$total}");
$descriptionLimit = 2048;
if($total>2000){
$descriptionLimit = 128;
}else if($total>1000){
$descriptionLimit = 256;
}else if($total>500){
$descriptionLimit = 512;
}else if($total>200){
$descriptionLimit = 1024;
}
foreach ($rows as $video) {
$totalVideos++;
$videos_id = $video['id'];
TimeLogStart("siteMap Video::getPoster $videos_id");
$img = Video::getPoster($videos_id);
TimeLogEnd("siteMap Video::getPoster $videos_id", __LINE__, 0.5);
if (empty($advancedCustom->disableSiteMapVideoDescription)) {
$description = str_ireplace(['"', "\n", "\r", ' '], ['', ' ', ' ', ' '], empty(trim($video['description'])) ? $video['title'] : $video['description']);
$description = _substr(strip_tags(br2nl($description)), 0, $descriptionLimit);
} else {
$description = false;
}
$duration = parseDurationToSeconds($video['duration']);
if ($duration > 28800) {
// this is because this issue https://github.com/WWBN/AVideo/issues/3338 remove in the future if is not necessary anymore
$duration = 28800;
}
TimeLogStart("siteMap Video::getLink $videos_id");
//$loc = Video::getLink($video['id'], $video['clean_title']);
$loc = Video::getLinkToVideo($video['id'], $video['clean_title'], false, Video::$urlTypeFriendly, [], true);
TimeLogEnd("siteMap Video::getLink $videos_id", __LINE__, 0.5);
$title = strip_tags($video['title']);
TimeLogStart("siteMap Video::getLinkToVideo $videos_id");
$player_loc = Video::getLinkToVideo($video['id'], $video['clean_title'], true, Video::$urlTypeCanonical);
//$player_loc = $loc;
TimeLogEnd("siteMap Video::getLinkToVideo $videos_id", __LINE__, 0.5);
TimeLogStart("siteMap Video::isPublic $videos_id");
$requires_subscription = Video::isPublic($video['id']) ? "no" : "yes";
TimeLogEnd("siteMap Video::isPublic $videos_id", __LINE__, 0.5);
TimeLogStart("siteMap Video::getChannelLink $videos_id");
$uploader_info = User::getChannelLink($video['users_id']);
TimeLogEnd("siteMap Video::getChannelLink $videos_id", __LINE__, 0.5);
TimeLogStart("siteMap Video::getNameIdentificationById $videos_id");
$uploader = htmlentities(User::getNameIdentificationById($video['users_id']));
TimeLogEnd("siteMap Video::getNameIdentificationById $videos_id", __LINE__, 0.5);
$xml .= '
' . $loc . '
' . $img . '
' . $duration . '
' . $video['views_count'] . '
' . date("Y-m-d\TH:i:s", strtotime($video['created'])) . '+00:00
yes
' . $requires_subscription . '
no
';
}
TimeLogEnd("siteMap getAllVideos", __LINE__, 0.5);
$xml .= PHP_EOL . '' . PHP_EOL;
$xml .= ' ';
_error_log("siteMap: done ");
$newXML1 = preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', '', $xml);
if (empty($newXML1)) {
_error_log("siteMap: pregreplace1 fail ");
$newXML1 = $xml;
}
if (!empty($advancedCustom->siteMapUTF8Fix)) {
$newXML2 = preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $newXML1);
if (empty($newXML2)) {
_error_log("siteMap: pregreplace2 fail ");
$newXML2 = $newXML1;
}
$newXML3 = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $newXML2);
if (empty($newXML3)) {
_error_log("siteMap: pregreplace3 fail ");
$newXML3 = $newXML2;
}
$newXML4 = preg_replace('/[\x00-\x1F\x7F]/', '', $newXML3);
if (empty($newXML4)) {
_error_log("siteMap: pregreplace4 fail ");
$newXML4 = $newXML3;
}
$newXML5 = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $newXML4);
if (empty($newXML5)) {
_error_log("siteMap: pregreplace5 fail ");
$newXML5 = $newXML4;
}
} else {
$newXML5 = $newXML1;
}
return $newXML5;
}
function object_to_array($obj, $level = 0)
{
//only process if it's an object or array being passed to the function
if (is_object($obj) || is_array($obj)) {
$ret = (array) $obj;
foreach ($ret as &$item) {
//recursively process EACH element regardless of type
$item = object_to_array($item, $level +1);
}
return $ret;
}
//otherwise (i.e. for scalar values) return without modification
else {
if(empty($level) && empty($obj)){
$obj = array();
}
return $obj;
}
}
function allowOrigin()
{
global $global;
cleanUpAccessControlHeader();
$HTTP_ORIGIN = empty($_SERVER['HTTP_ORIGIN']) ? @$_SERVER['HTTP_REFERER'] : $_SERVER['HTTP_ORIGIN'];
if (empty($HTTP_ORIGIN)) {
$server = parse_url($global['webSiteRootURL']);
header('Access-Control-Allow-Origin: ' . $server["scheme"] . '://imasdk.googleapis.com');
} else {
header("Access-Control-Allow-Origin: " . $HTTP_ORIGIN);
}
header('Access-Control-Allow-Private-Network: true');
header('Access-Control-Request-Private-Network: true');
//header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Methods: GET,HEAD,OPTIONS,POST,PUT");
header("Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
}
function cleanUpAccessControlHeader()
{
if (!headers_sent()) {
foreach (headers_list() as $header) {
if (preg_match('/Access-Control-Allow-Origin/i', $header)) {
$parts = explode(':', $header);
header_remove($parts[0]);
}
}
}
}
function rrmdir($dir)
{
//if(preg_match('/cache/i', $dir)){_error_log("rrmdir($dir) ". json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));exit;}
$dir = str_replace(['//', '\\\\'], DIRECTORY_SEPARATOR, $dir);
//_error_log('rrmdir: ' . $dir);
if (empty($dir)) {
_error_log('rrmdir: the dir was empty');
return false;
}
global $global;
$dir = fixPath($dir);
$pattern = '/' . addcslashes($dir, DIRECTORY_SEPARATOR) . 'videos[\/\\\]?$/i';
if ($dir == getVideosDir() || $dir == "{$global['systemRootPath']}videos" . DIRECTORY_SEPARATOR || preg_match($pattern, $dir)) {
_error_log('rrmdir: A script ties to delete the videos Directory [' . $dir . '] ' . json_encode([$dir == getVideosDir(), $dir == "{$global['systemRootPath']}videos" . DIRECTORY_SEPARATOR, preg_match($pattern, $dir)]));
return false;
}
rrmdirCommandLine($dir);
if (is_dir($dir)) {
//_error_log('rrmdir: The Directory was not deleted, trying again ' . $dir);
$objects = @scandir($dir);
if (!empty($objects)) {
//_error_log('rrmdir: scandir ' . $dir . ' '. json_encode($objects));
foreach ($objects as $object) {
if ($object !== '.' && $object !== '..') {
if (is_dir($dir . DIRECTORY_SEPARATOR . $object)) {
rrmdir($dir . DIRECTORY_SEPARATOR . $object);
} else {
unlink($dir . DIRECTORY_SEPARATOR . $object);
}
}
}
}
if (preg_match('/(\/|^)videos(\/cache)?\/?$/i', $dir)) {
_error_log('rrmdir: do not delete videos or cache folder ' . $dir);
// do not delete videos or cache folder
return false;
}
if (is_dir($dir)) {
if (@rmdir($dir)) {
return true;
} elseif (is_dir($dir)) {
_error_log('rrmdir: could not delete folder ' . $dir);
return false;
}
}
} else {
//_error_log('rrmdir: The Directory does not exists '.$dir);
return true;
}
}
function rrmdirCommandLine($dir, $async = false)
{
if (is_dir($dir)) {
$dir = escapeshellarg($dir);
if (isWindows()) {
$command = ('rd /s /q ' . $dir);
} else {
$command = ('rm -fR ' . $dir);
}
if ($async) {
return execAsync($command);
} else {
return exec($command);
}
}
}
/**
* You can now configure it on the configuration.php
* @return boolean
*/
function ddosProtection()
{
global $global;
$maxCon = empty($global['ddosMaxConnections']) ? 40 : $global['ddosMaxConnections'];
$secondTimeout = empty($global['ddosSecondTimeout']) ? 5 : $global['ddosSecondTimeout'];
$whitelistedFiles = [
'playlists.json.php',
'playlistsFromUserVideos.json.php',
'image404.php',
'downloadProtection.php',
];
if (in_array(basename($_SERVER["SCRIPT_FILENAME"]), $whitelistedFiles)) {
return true;
}
$time = time();
if (!isset($_SESSION['bruteForceBlock']) || empty($_SESSION['bruteForceBlock'])) {
$_SESSION['bruteForceBlock'] = [];
$_SESSION['bruteForceBlock'][] = $time;
return true;
}
$_SESSION['bruteForceBlock'][] = $time;
//remove requests that are older than secondTimeout
foreach ($_SESSION['bruteForceBlock'] as $key => $request_time) {
if ($request_time < $time - $secondTimeout) {
unset($_SESSION['bruteForceBlock'][$key]);
}
}
//progressive timeout-> more requests, longer timeout
$active_connections = count($_SESSION['bruteForceBlock']);
$timeoutReal = ($active_connections / $maxCon) < 1 ? 0 : ($active_connections / $maxCon) * $secondTimeout;
if ($timeoutReal) {
_error_log("ddosProtection:: progressive timeout timeoutReal = ($timeoutReal) active_connections = ($active_connections) maxCon = ($maxCon) ", AVideoLog::$SECURITY);
}
sleep($timeoutReal);
//with strict mode, penalize "attacker" with sleep() above, log and then die
if ($global['strictDDOSprotection'] && $timeoutReal > 0) {
$str = "bruteForceBlock: maxCon: $maxCon => secondTimeout: $secondTimeout | IP: " . getRealIpAddr() . " | count:" . count($_SESSION['bruteForceBlock']);
_error_log($str);
die($str);
}
return true;
}
function getAdsLeaderBoardBigVideo()
{
$ad = AVideoPlugin::getObjectDataIfEnabled('ADs');
$adCode = '';
if (!empty($ad)) {
$adCode = ADs::getAdsCode('leaderBoardBigVideo');
}
return $adCode;
}
function getAdsLeaderBoardTop()
{
$ad = AVideoPlugin::getObjectDataIfEnabled('ADs');
$adCode = '';
if (!empty($ad)) {
$adCode = ADs::getAdsCode('leaderBoardTop');
}
return $adCode;
}
function getAdsChannelLeaderBoardTop()
{
$ad = AVideoPlugin::getObjectDataIfEnabled('ADs');
$adCode = '';
if (!empty($ad)) {
$adCode = ADs::getAdsCode('channelLeaderBoardTop');
}
return $adCode;
}
function getAdsLeaderBoardTop2()
{
$ad = AVideoPlugin::getObjectDataIfEnabled('ADs');
$adCode = '';
if (!empty($ad)) {
$adCode = ADs::getAdsCode('leaderBoardTop2');
}
return $adCode;
}
function getAdsLeaderBoardMiddle()
{
$ad = AVideoPlugin::getObjectDataIfEnabled('ADs');
$adCode = '';
if (!empty($ad)) {
$adCode = ADs::getAdsCode('leaderBoardMiddle');
}
return $adCode;
}
function getAdsLeaderBoardFooter()
{
$ad = AVideoPlugin::getObjectDataIfEnabled('ADs');
$adCode = '';
if (!empty($ad)) {
$adCode = ADs::getAdsCode('leaderBoardFooter');
}
return $adCode;
}
function getAdsSideRectangle()
{
$ad = AVideoPlugin::getObjectDataIfEnabled('ADs');
$adCode = '';
if (!empty($ad)) {
$adCode = ADs::getAdsCode('sideRectangle');
}
return $adCode;
}
function isToHidePrivateVideos()
{
$obj = AVideoPlugin::getObjectDataIfEnabled("Gallery");
if (!empty($obj)) {
return $obj->hidePrivateVideos;
}
$obj = AVideoPlugin::getObjectDataIfEnabled("YouPHPFlix2");
if (!empty($obj)) {
return $obj->hidePrivateVideos;
}
$obj = AVideoPlugin::getObjectDataIfEnabled("YouTube");
if (!empty($obj)) {
return $obj->hidePrivateVideos;
}
return false;
}
function convertImageToOG($source, $destination)
{
if (!file_exists($destination)) {
$w = 200;
$h = 200;
$sizes = getimagesize($source);
if ($sizes[0] < $w || $sizes[1] < $h) {
$tmpDir = getTmpDir();
$fileConverted = $tmpDir . "_jpg_" . uniqid() . ".jpg";
convertImage($source, $fileConverted, 100);
im_resize($fileConverted, $destination, $w, $h, 100);
//_error_log("convertImageToOG ($destination) unlink line=".__LINE__);
@unlink($fileConverted);
}
}
return $destination;
}
function convertImageToRoku($source, $destination)
{
return convertImageIfNotExists($source, $destination, 1280, 720, true);
}
function convertImageIfNotExists($source, $destination, $width, $height, $scaleUp = true)
{
if (empty($source)) {
_error_log("convertImageIfNotExists: source image is empty");
return false;
}
$source = str_replace(['_thumbsSmallV2'], [''], $source);
if (!file_exists($source)) {
//_error_log("convertImageIfNotExists: source does not exists {$source}");
return false;
}
if (empty(filesize($source))) {
_error_log("convertImageIfNotExists: source has filesize 0");
return false;
}
$mime = mime_content_type($source);
if ($mime == 'text/plain') {
_error_log("convertImageIfNotExists error, image in wrong format/mime type {$source} " . file_get_contents($source));
unlink($source);
return false;
}
if (file_exists($destination) && filesize($destination) > 1024) {
$sizes = getimagesize($destination);
if ($sizes[0] < $width && $sizes[1] < $height) {
_error_log("convertImageIfNotExists: $destination, w=$width, h=$height file is smaller unlink " . json_encode($sizes));
unlink($destination);
return false;
}
}
if (!file_exists($destination)) {
//_error_log("convertImageIfNotExists($source, $destination, $width, $height)");
try {
$tmpDir = getTmpDir();
$fileConverted = $tmpDir . "_jpg_" . uniqid() . ".jpg";
convertImage($source, $fileConverted, 100);
if (file_exists($fileConverted)) {
if ($scaleUp) {
scaleUpImage($fileConverted, $fileConverted, $width, $height);
}
if (file_exists($fileConverted)) {
im_resize($fileConverted, $destination, $width, $height, 100);
if (!file_exists($destination)) {
_error_log("convertImageIfNotExists: [$fileConverted] [$source] [$destination]");
}else{
_error_log("convertImageIfNotExists: ($source, $destination) line=".__LINE__);
}
} else {
_error_log("convertImageIfNotExists: convertImage error 1 $source, $fileConverted");
}
} else {
_error_log("convertImageIfNotExists: convertImage error 2 $source, $fileConverted");
}
@unlink($fileConverted);
} catch (Exception $exc) {
_error_log("convertImageIfNotExists: " . $exc->getMessage());
return false;
}
}
return $destination;
}
function ogSite()
{
global $global, $config, $advancedCustom;
$videos_id = getVideos_id();
if(empty($videos_id)){
include $global['systemRootPath'] . 'objects/functionogSite.php';
}else{
getOpenGraph($videos_id);
}
}
function getOpenGraph($videos_id)
{
global $global, $config, $advancedCustom;
include $global['systemRootPath'] . 'objects/functiongetOpenGraph.php';
}
function getLdJson($videos_id)
{
$cache = ObjectYPT::getCacheGlobal("getLdJson{$videos_id}", 0);
if (empty($cache)) {
echo $cache;
}
global $global, $config;
echo "";
if (empty($videos_id)) {
echo "";
if (!empty($_GET['videoName'])) {
echo "";
$video = Video::getVideoFromCleanTitle($_GET['videoName']);
}
} else {
echo "";
$video = Video::getVideoLight($videos_id);
}
if (empty($video)) {
echo "";
return false;
}
$videos_id = $video['id'];
$img = Video::getPoster($videos_id);
$description = getSEODescription(_empty($video['description']) ? $video['title'] : $video['description']);
$duration = Video::getItemPropDuration($video['duration']);
if ($duration == "PT0H0M0S") {
$duration = "PT0H0M1S";
}
$data = array(
"@context" => "http://schema.org/",
"@type" => "VideoObject",
"name" => getSEOTitle($video['title']),
"description" => $description,
"thumbnailUrl" => array($img),
"uploadDate" => date("Y-m-d\Th:i:s", strtotime($video['created'])),
"duration" => $duration,
"contentUrl" => Video::getLinkToVideo($videos_id, '', false, false),
"embedUrl" => Video::getLinkToVideo($videos_id, '', true, false),
"interactionCount" => $video['views_count'],
"@id" => Video::getPermaLink($videos_id),
"datePublished" => date("Y-m-d", strtotime($video['created'])),
"interactionStatistic" => array(
array(
"@type" => "InteractionCounter",
"interactionService" => array(
"@type" => "WebSite",
"name" => str_replace('"', '', $config->getWebSiteTitle()),
"@id" => $global['webSiteRootURL']
),
"interactionType" => "http://schema.org/LikeAction",
"userInteractionCount" => $video['views_count']
),
array(
"@type" => "InteractionCounter",
"interactionType" => "http://schema.org/WatchAction",
"userInteractionCount" => $video['views_count']
)
)
);
if(AVideoPlugin::isEnabledByName('Bookmark')){
$chapters = Bookmark::generateChaptersJSONLD($videos_id);
if(!empty($chapters)){
$data['videoChapter'] = $chapters;
}
}
$output = '';
ObjectYPT::setCacheGlobal("getLdJson{$videos_id}", $output);
echo $output;
}
function getItemprop($videos_id)
{
$cache = ObjectYPT::getCacheGlobal("getItemprop{$videos_id}", 0);
if (empty($cache)) {
echo $cache;
}
global $global, $config;
echo "";
if (empty($videos_id)) {
echo "";
if (!empty($_GET['videoName'])) {
echo "";
$video = Video::getVideoFromCleanTitle($_GET['videoName']);
}
} else {
echo "";
$video = Video::getVideoLight($videos_id);
}
if (empty($video)) {
echo "";
return false;
}
$videos_id = $video['id'];
$img = Video::getPoster($videos_id);
$description = getSEODescription(emptyHTML($video['description']) ? $video['title'] : $video['description']);
$duration = Video::getItemPropDuration($video['duration']);
if ($duration == "PT0H0M0S") {
$duration = "PT0H0M1S";
}
$output = '
';
ObjectYPT::setCacheGlobal("getItemprop{$videos_id}", $output);
echo $output;
}
function getOS($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
$os_platform = "Unknown OS Platform";
if (!empty($user_agent)) {
$os_array = [
'/windows nt 10/i' => 'Windows 10',
'/windows nt 6.3/i' => 'Windows 8.1',
'/windows nt 6.2/i' => 'Windows 8',
'/windows nt 6.1/i' => 'Windows 7',
'/windows nt 6.0/i' => 'Windows Vista',
'/windows nt 5.2/i' => 'Windows Server 2003/XP x64',
'/windows nt 5.1/i' => 'Windows XP',
'/windows xp/i' => 'Windows XP',
'/windows nt 5.0/i' => 'Windows 2000',
'/windows me/i' => 'Windows ME',
'/win98/i' => 'Windows 98',
'/win95/i' => 'Windows 95',
'/win16/i' => 'Windows 3.11',
'/macintosh|mac os x/i' => 'Mac OS X',
'/mac_powerpc/i' => 'Mac OS 9',
'/linux/i' => 'Linux',
'/ubuntu/i' => 'Ubuntu',
'/iphone/i' => 'iPhone',
'/ipod/i' => 'iPod',
'/ipad/i' => 'iPad',
'/android/i' => 'Android',
'/blackberry/i' => 'BlackBerry',
'/webos/i' => 'Mobile',
// Additional TV devices and mobile devices
'/roku/i' => 'Roku',
'/android tv/i' => 'Android TV',
'/apple tv/i' => 'Apple TV',
'/fire tv|firestick|fire stick/i' => 'Amazon Fire TV',
'/windows phone/i' => 'Windows Phone',
'/symbian/i' => 'Symbian',
'/tizen/i' => 'Tizen',
'/webos tv/i' => 'WebOS TV'
];
foreach ($os_array as $regex => $value) {
if (preg_match($regex, $user_agent)) {
$os_platform = $value;
break;
}
}
}
return $os_platform;
}
function get_browser_name($user_agent = "")
{
if (empty($user_agent)) {
$user_agent = @$_SERVER['HTTP_USER_AGENT'];
}
if (empty($user_agent)) {
return 'Unknow';
}
// Make case insensitive.
$t = mb_strtolower($user_agent);
// If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
// "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
// http://php.net/manual/en/function.strpos.php
$t = " " . $t;
// Humans / Regular Users
if (isAVideoStreamer($t)) {
return 'AVideo Mobile App';
} elseif ($url = isAVideoEncoder($t)) {
return 'AVideo Encoder ' . $url;
} elseif ($url = isAVideoStreamer($t)) {
return 'AVideo Streamer ' . $url;
} elseif (strpos($t, 'crkey')) {
return 'Chromecast';
} elseif (strpos($t, 'opera') || strpos($t, 'opr/')) {
return 'Opera';
} elseif (strpos($t, 'edge')) {
return 'Edge';
} elseif (strpos($t, 'chrome')) {
return 'Chrome';
} elseif (strpos($t, 'safari')) {
return 'Safari';
} elseif (strpos($t, 'firefox')) {
return 'Firefox';
} elseif (strpos($t, 'msie') || strpos($t, 'trident/7')) {
return 'Internet Explorer';
} elseif (strpos($t, 'applecoremedia')) {
return 'Native Apple Player';
}
// Search Engines
elseif (strpos($t, 'google')) {
return '[Bot] Googlebot';
} elseif (strpos($t, 'bing')) {
return '[Bot] Bingbot';
} elseif (strpos($t, 'slurp')) {
return '[Bot] Yahoo! Slurp';
} elseif (strpos($t, 'duckduckgo')) {
return '[Bot] DuckDuckBot';
} elseif (strpos($t, 'baidu')) {
return '[Bot] Baidu';
} elseif (strpos($t, 'yandex')) {
return '[Bot] Yandex';
} elseif (strpos($t, 'sogou')) {
return '[Bot] Sogou';
} elseif (strpos($t, 'exabot')) {
return '[Bot] Exabot';
} elseif (strpos($t, 'msn')) {
return '[Bot] MSN';
}
// Common Tools and Bots
elseif (strpos($t, 'mj12bot')) {
return '[Bot] Majestic';
} elseif (strpos($t, 'ahrefs')) {
return '[Bot] Ahrefs';
} elseif (strpos($t, 'semrush')) {
return '[Bot] SEMRush';
} elseif (strpos($t, 'rogerbot') || strpos($t, 'dotbot')) {
return '[Bot] Moz or OpenSiteExplorer';
} elseif (strpos($t, 'frog') || strpos($t, 'screaming')) {
return '[Bot] Screaming Frog';
}
// Miscellaneous
elseif (strpos($t, 'facebook')) {
return '[Bot] Facebook';
} elseif (strpos($t, 'pinterest')) {
return '[Bot] Pinterest';
}
// Check for strings commonly used in bot user agents
elseif (
strpos($t, 'crawler') || strpos($t, 'api') ||
strpos($t, 'spider') || strpos($t, 'http') ||
strpos($t, 'bot') || strpos($t, 'archive') ||
strpos($t, 'info') || strpos($t, 'data')
) {
return '[Bot] Other';
}
//_error_log("Unknow user agent ($t) IP=" . getRealIpAddr() . " URI=" . getRequestURI());
return 'Other (Unknown)';
}
/**
* Due some error on old chrome browsers (version < 70) on decrypt HLS keys with the videojs versions greater then 7.9.7
* we need to detect the chrome browser and load an older version
*
*/
function isOldChromeVersion()
{
global $global;
if (empty($_SERVER['HTTP_USER_AGENT'])) {
return false;
}
if (!empty($global['forceOldChrome'])) {
return true;
}
if (preg_match('/Chrome\/([0-9.]+)/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
return version_compare($matches[1], '80', '<=');
}
return false;
}
function TimeLogStart($name)
{
global $global;
if (!empty($global['noDebug'])) {
return false;
}
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
if (empty($global['start']) || !is_array($global['start'])) {
$global['start'] = [];
}
$global['start'][$name] = $time;
return $name;
}
function TimeLogEnd($name, $line, $TimeLogLimit = 0.7) {
global $global;
if (!empty($global['noDebug']) || empty($global['start'][$name])) {
return false;
}
if (!empty($global['TimeLogLimit'])) {
$TimeLogLimit = $global['TimeLogLimit'];
}
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $global['start'][$name]), 4);
$type = AVideoLog::$DEBUG;
$backtrace = '';
$ua = '';
if (empty($global['noDebugSlowProcess']) && $total_time > $TimeLogLimit) {
if ($total_time > 1) {
$type = AVideoLog::$WARNING;
}
if ($total_time > 2) {
$type = AVideoLog::$ERROR;
$backtrace = ' backtrace=' . json_encode(debug_backtrace());
}
$ua = ' IP='.getRealIpAddr();
if (!empty($_SERVER['HTTP_USER_AGENT'])) {
if(isBot()){
$ua .= " BOT ";
$ua .= " USER_AGENT={$_SERVER['HTTP_USER_AGENT']}";
}
}else{
$ua .= " USER_AGENT=Undefined server=".json_encode($_SERVER);
}
_error_log("Time: ". str_pad(number_format($total_time,3) . "s", 8) . " | Limit: {$TimeLogLimit}s | Location: {$_SERVER["SCRIPT_FILENAME"]} Line {$line} [{$name}]{$ua}{$backtrace}", $type);
}
TimeLogStart($name);
}
class AVideoLog
{
public static $DEBUG = 0;
public static $WARNING = 1;
public static $ERROR = 2;
public static $SECURITY = 3;
public static $SOCKET = 4;
}
function _error_log_debug($message, $show_args = false)
{
$array = debug_backtrace();
$message .= PHP_EOL;
foreach ($array as $value) {
$message .= "function: {$value['function']} Line: {{$value['line']}} File: {{$value['file']}}" . PHP_EOL;
if ($show_args) {
$message .= print_r($value['args'], true) . PHP_EOL;
}
}
_error_log(PHP_EOL . '***' . PHP_EOL . $message . '***');
}
function _error_log($message, $type = 0, $doNotRepeat = false)
{
if (empty($doNotRepeat)) {
// do not log it too many times when you are using HLS format, other wise it will fill the log file with the same error
$doNotRepeat = preg_match("/hls.php$/", $_SERVER['SCRIPT_NAME']);
}
if ($doNotRepeat) {
return false;
}
global $global;
if (!empty($global['noDebug']) && $type == 0) {
return false;
}
if (!is_string($message)) {
$message = json_encode($message);
}
$prefix = "AVideoLog::";
switch ($type) {
case AVideoLog::$DEBUG:
$prefix .= "DEBUG: ";
break;
case AVideoLog::$WARNING:
$prefix .= "WARNING: ";
break;
case AVideoLog::$ERROR:
$prefix .= "ERROR: ";
break;
case AVideoLog::$SECURITY:
$prefix .= "SECURITY: ";
break;
case AVideoLog::$SOCKET:
$prefix .= "SOCKET: ";
break;
}
$str = $prefix . $message . " SCRIPT_NAME: {$_SERVER['SCRIPT_NAME']}";
if (isCommandLineInterface() && empty($global['doNotPrintLogs'])) {
echo '[' . date('Y-m-d H:i:s') . '] ' . $str . PHP_EOL;
}
error_log($str);
}
function postVariables($url, $array, $httpcodeOnly = true, $timeout = 10)
{
if (!$url || !is_string($url) || !preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url)) {
return false;
}
$array = object_to_array($array);
$ch = curl_init($url);
if ($httpcodeOnly) {
@curl_setopt($ch, CURLOPT_HEADER, true); // we want headers
@curl_setopt($ch, CURLOPT_NOBODY, true); // we don't need body
} else {
curl_setopt($ch, CURLOPT_USERAGENT, getSelfUserAgent());
}
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout + 1); //The maximum number of seconds to allow cURL functions to execute.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// execute!
$response = curl_exec($ch);
if(!$response){
$error_msg = curl_error($ch);
$error_num = curl_errno($ch);
_error_log("postVariables: {$url} [$error_num] - $error_msg");
}
if ($httpcodeOnly) {
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// close the connection, release resources used
curl_close($ch);
if ($httpcode == 200) {
return true;
}
return $httpcode;
} else {
curl_close($ch);
return $response;
}
}
function _session_write_close(){
if (session_status() === PHP_SESSION_ACTIVE) {
includeConfigLog(__LINE__, 'session_write_close '.basename(__FILE__));
_error_log(json_encode(debug_backtrace()));
@session_write_close();
}
}
function _session_start(array $options = [])
{
try {
if (isset($_GET['PHPSESSID']) && !_empty($_GET['PHPSESSID'])) {
$PHPSESSID = $_GET['PHPSESSID'];
unset($_GET['PHPSESSID']);
if (!User::isLogged()) {
if ($PHPSESSID !== session_id()) {
_session_write_close();
session_id($PHPSESSID);
//_error_log("captcha: session_id changed to {$PHPSESSID}");
}
includeConfigLog(__LINE__, 'session_start '.basename(__FILE__));
$session = @session_start($options);
if (preg_match('/objects\/getCaptcha\.php/i', $_SERVER['SCRIPT_NAME'])) {
$regenerateSessionId = false;
}
if (!blackListRegenerateSession()) {
_error_log("captcha: session_id regenerated new session_id=" . session_id());
_session_regenerate_id();
}
return $session;
} else {
//_error_log("captcha: user logged we will not change the session ID PHPSESSID={$PHPSESSID} session_id=" . session_id());
}
} elseif (session_status() == PHP_SESSION_NONE) {
includeConfigLog(__LINE__, 'session_start '.basename(__FILE__));
//_error_log(json_encode(debug_backtrace()));
return @session_start($options);
}
} catch (Exception $exc) {
_error_log("_session_start: " . $exc->getTraceAsString());
return false;
}
}
function _session_regenerate_id()
{
session_regenerate_id(true);
_resetcookie('PHPSESSID', session_id());
_resetcookie(session_name(), session_id());
}
function debugMemmory($line)
{
global $lastDebugMemory, $lastDebugMemoryLine, $global;
if (empty($global['debugMemmory'])) {
return false;
}
$memory = memory_get_usage();
if (!isset($lastDebugMemory)) {
$lastDebugMemory = $memory;
$lastDebugMemoryLine = $line;
} else {
$increaseB = ($memory - $lastDebugMemory);
$increase = humanFileSize($increaseB);
$total = humanFileSize($memory);
_error_log("debugMemmory increase: {$increase} from line $lastDebugMemoryLine to line $line total now {$total} [$increaseB]");
}
}
/**
* we will not regenerate the session on this page
* this is necessary because of the signup from the iframe pages
* @return boolean
*/
function blackListRegenerateSession()
{
if (!requestComesFromSafePlace()) {
return false;
}
$list = [
'objects/getCaptcha.php',
'objects/userCreate.json.php',
'objects/videoAddViewCount.json.php',
];
foreach ($list as $needle) {
if (str_ends_with($_SERVER['SCRIPT_NAME'], $needle)) {
return true;
}
}
return false;
}
function _mysql_connect($persistent = false, $try = 0)
{
global $global, $mysqlHost, $mysqlUser, $mysqlPass, $mysqlDatabase, $mysqlPort, $mysql_connect_was_closed, $mysql_connect_is_persistent;
$checkValues = ['mysqlHost', 'mysqlUser', 'mysqlPass', 'mysqlDatabase'];
foreach ($checkValues as $value) {
if (!isset($$value)) {
_error_log("_mysql_connect Variable NOT set $value");
}
}
try {
if (!_mysql_is_open()) {
//_error_log('MySQL Connect '. json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
$mysql_connect_was_closed = 0;
$mysql_connect_is_persistent = $persistent;
$global['mysqli'] = new mysqli(($persistent ? 'p:' : '') . $mysqlHost, $mysqlUser, $mysqlPass, '', @$mysqlPort);
if (isCommandLineInterface() && !empty($global['createDatabase'])) {
$createSQL = "CREATE DATABASE IF NOT EXISTS {$mysqlDatabase};";
_error_log($createSQL);
$global['mysqli']->query($createSQL);
}
$global['mysqli']->select_db($mysqlDatabase);
if (!empty($global['mysqli_charset'])) {
$global['mysqli']->set_charset($global['mysqli_charset']);
}
if (isCommandLineInterface()) {
//_error_log("_mysql_connect HOST=$mysqlHost,DB=$mysqlDatabase");
}
}
} catch (Exception $exc) {
if (empty($try)) {
_error_log('Error on connect, trying again [' . mysqli_connect_error() . ']');
_mysql_close();
sleep(5);
return _mysql_connect($persistent, $try + 1);
} else {
_error_log($exc->getTraceAsString());
include $global['systemRootPath'] . 'view/include/offlinePage.php';
exit;
return false;
}
}
return true;
}
function _mysql_commit()
{
global $global;
if (_mysql_is_open()) {
try {
/**
*
* @var array $global
* @var object $global['mysqli']
*/
@$global['mysqli']->commit();
} catch (Exception $exc) {
}
//$global['mysqli'] = false;
}
}
function _mysql_close()
{
global $global, $mysql_connect_was_closed, $mysql_connect_is_persistent;
if (!$mysql_connect_is_persistent && _mysql_is_open()) {
//_error_log('MySQL Closed '. json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
$mysql_connect_was_closed = 1;
try {
/**
*
* @var array $global
* @var object $global['mysqli']
*/
@$global['mysqli']->close();
} catch (Exception $exc) {
}
//$global['mysqli'] = false;
}
}
function _mysql_is_open()
{
global $global, $mysql_connect_was_closed;
try {
/**
*
* @var array $global
* @var object $global['mysqli']
*/
//if (is_object($global['mysqli']) && (empty($mysql_connect_was_closed) || !empty(@$global['mysqli']->ping()))) {
if (!empty($global['mysqli']) && is_object($global['mysqli']) && empty($mysql_connect_was_closed) && isset($global['mysqli']->server_info) && is_resource($global['mysqli']) && get_resource_type($global['mysqli']) === 'mysql link') {
return true;
}
} catch (Exception $exc) {
return false;
}
return false;
}
function remove_utf8_bom($text)
{
if (strlen($text) > 1000000) {
return $text;
}
$bom = pack('H*', 'EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
function getCacheDir()
{
$p = AVideoPlugin::loadPlugin("Cache");
if (empty($p)) {
return addLastSlash(sys_get_temp_dir());
}
return $p->getCacheDir();
}
function clearCache($firstPageOnly = false)
{
global $global;
$lockFile = getVideosDir() . '.clearCache.lock';
if (file_exists($lockFile) && filectime($lockFile) > strtotime('-5 minutes')) {
_error_log('clearCache is in progress ' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
return false;
}
$start = microtime(true);
_error_log('clearCache starts ');
file_put_contents($lockFile, time());
$dir = getVideosDir() . "cache" . DIRECTORY_SEPARATOR;
$tmpDir = ObjectYPT::getCacheDir('firstPage');
$parts = explode('firstpage', $tmpDir);
if ($firstPageOnly || !empty($_REQUEST['FirstPage'])) {
$tmpDir = $parts[0] . 'firstpage' . DIRECTORY_SEPARATOR;
//var_dump($tmpDir);exit;
$dir .= "firstPage" . DIRECTORY_SEPARATOR;
} else {
$tmpDir = $parts[0];
}
//_error_log('clearCache 1: '.$dir);
rrmdir($dir);
rrmdir($tmpDir);
$obj = AVideoPlugin::getDataObjectIfEnabled('Cache');
if ($obj) {
$tmpDir = $obj->cacheDir;
rrmdir($tmpDir);
}
ObjectYPT::deleteCache("getEncoderURL");
ObjectYPT::deleteAllSessionCache();
unlink($lockFile);
$end = microtime(true) - $start;
_error_log("clearCache end in {$end} seconds");
return true;
}
function clearAllUsersSessionCache()
{
sendSocketMessageToAll(time(), 'socketClearSessionCache');
}
function clearFirstPageCache()
{
return clearCache(true);
}
function getUsageFromFilename($filename, $dir = "")
{
global $global;
if (!empty($global['getUsageFromFilename'])) { // manually add this variable in your configuration.php file to not scan your video usage
return 0;
}
if (empty($dir)) {
$paths = Video::getPaths($filename);
$dir = $paths['path'];
}
$dir = addLastSlash($dir);
$totalSize = 0;
//_error_log("getUsageFromFilename: start {$dir}{$filename} " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
//$files = glob("{$dir}{$filename}*");
$paths = Video::getPaths($filename);
if (is_dir($paths['path'])) {
$files = [$paths['path']];
} else {
$files = globVideosDir($filename);
}
//var_dump($paths, $files, $filename);exit;
_session_write_close();
$filesProcessed = [];
if (empty($files)) {
_error_log("getUsageFromFilename: we did not find any file for {$dir}{$filename}, we will create a fake one " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
make_path($dir);
file_put_contents("{$dir}{$filename}.notfound", time());
$totalSize = 10;
} else {
foreach ($files as $f) {
if (strpos($f, '.size.lock') !== false) {
continue;
}
if (is_dir($f)) {
$dirSize = getDirSize($f, true);
//_error_log("getUsageFromFilename: is Dir dirSize={$dirSize} " . humanFileSize($dirSize) . " {$f}");
$totalSize += $dirSize;
$minDirSize = 4000000;
$isEnabled = AVideoPlugin::isEnabledByName('YPTStorage');
$isEnabledCDN = AVideoPlugin::getObjectDataIfEnabled('CDN');
$isEnabledS3 = AVideoPlugin::loadPluginIfEnabled('AWS_S3');
$isEnabledB2 = AVideoPlugin::loadPluginIfEnabled('Blackblaze_B2');
if (!empty($isEnabledCDN) && $isEnabledCDN->enable_storage) {
$v = Video::getVideoFromFileName($filename);
if (!empty($v)) {
$size = CDNStorage::getRemoteDirectorySize($v['id']);
//_error_log("getUsageFromFilename: CDNStorage found $size " . humanFileSize($size));
$totalSize += $size;
}
}
if ($dirSize < $minDirSize && $isEnabled) {
// probably the HLS file is hosted on the YPTStorage
$info = YPTStorage::getFileInfo($filename);
if (!empty($info->size)) {
//_error_log("getUsageFromFilename: found info on the YPTStorage " . print_r($info, true));
$totalSize += $info->size;
} else {
//_error_log("getUsageFromFilename: there is no info on the YPTStorage " . print_r($info, true));
}
} elseif ($dirSize < $minDirSize && $isEnabledS3) {
// probably the HLS file is hosted on the S3
$size = $isEnabledS3->getFilesize($filename);
if (!empty($size)) {
//_error_log("getUsageFromFilename: found info on the AWS_S3 {$filename} {$size}");
$totalSize += $size;
} else {
//_error_log("getUsageFromFilename: there is no info on the AWS_S3 {$filename} {$size}");
}
} elseif ($dirSize < $minDirSize && $isEnabledB2) {
// probably the HLS file is hosted on the S3
$size = $isEnabledB2->getFilesize($filename);
if (!empty($size)) {
_error_log("getUsageFromFilename: found info on the B2 {$filename} {$size}");
$totalSize += $size;
} else {
_error_log("getUsageFromFilename: there is no info on the B2 {$filename} {$size}");
}
} else {
if (!($dirSize < $minDirSize)) {
//_error_log("getUsageFromFilename: does not have the size to process $dirSize < $minDirSize");
}
if (!$isEnabled) {
//_error_log("getUsageFromFilename: YPTStorage is disabled");
}
if (!$isEnabledCDN) {
//_error_log("getUsageFromFilename: CDN Storage is disabled");
}
if (!$isEnabledS3) {
//_error_log("getUsageFromFilename: S3 Storage is disabled");
}
if (!$isEnabledB2) {
//_error_log("getUsageFromFilename: B2 Storage is disabled");
}
}
} elseif (is_file($f)) {
$filesize = filesize($f);
if ($filesize < 20) { // that means it is a dummy file
$lockFile = $f . ".size.lock";
if (!file_exists($lockFile) || (time() - 600) > filemtime($lockFile)) {
file_put_contents($lockFile, time());
//_error_log("getUsageFromFilename: {$f} is Dummy file ({$filesize})");
$aws_s3 = AVideoPlugin::loadPluginIfEnabled('AWS_S3');
$bb_b2 = AVideoPlugin::loadPluginIfEnabled('Blackblaze_B2');
if (!empty($aws_s3)) {
//_error_log("getUsageFromFilename: Get from S3");
$filesize += $aws_s3->getFilesize($filename);
} elseif (!empty($bb_b2)) {
$filesize += $bb_b2->getFilesize($filename);
} else {
$urls = Video::getVideosPaths($filename, true);
//_error_log("getUsageFromFilename: Paths " . json_encode($urls));
if (!empty($urls["m3u8"]['url'])) {
$filesize += getUsageFromURL($urls["m3u8"]['url']);
}
if (!empty($urls['mp4'])) {
foreach ($urls['mp4'] as $mp4) {
if (in_array($mp4, $filesProcessed)) {
continue;
}
$filesProcessed[] = $mp4;
$filesize += getUsageFromURL($mp4);
}
}
if (!empty($urls['webm'])) {
foreach ($urls['webm'] as $mp4) {
if (in_array($mp4, $filesProcessed)) {
continue;
}
$filesProcessed[] = $mp4;
$filesize += getUsageFromURL($mp4);
}
}
if (!empty($urls["pdf"]['url'])) {
$filesize += getUsageFromURL($urls["pdf"]['url']);
}
if (!empty($urls["image"]['url'])) {
$filesize += getUsageFromURL($urls["image"]['url']);
}
if (!empty($urls["zip"]['url'])) {
$filesize += getUsageFromURL($urls["zip"]['url']);
}
if (!empty($urls["mp3"]['url'])) {
$filesize += getUsageFromURL($urls["mp3"]['url']);
}
}
unlink($lockFile);
}
} else {
//_error_log("getUsageFromFilename: {$f} is File ({$filesize})");
}
$totalSize += $filesize;
}
}
}
return $totalSize;
}
/**
* Returns the size of a file without downloading it, or -1 if the file
* size could not be determined.
*
* @param $url - The location of the remote file to download. Cannot
* be null or empty.
*
* @return int
* return The size of the file referenced by $url, or false if the size
* could not be determined.
*/
function getUsageFromURL($url)
{
global $global;
if (!empty($global['doNotGetUsageFromURL'])) { // manually add this variable in your configuration.php file to not scan your video usage
return 0;
}
_error_log("getUsageFromURL: start ({$url})");
// Assume failure.
$result = false;
$curl = curl_init($url);
_error_log("getUsageFromURL: curl_init ");
try {
// Issue a HEAD request and follow any redirects.
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
//curl_setopt($curl, CURLOPT_USERAGENT, get_user_agent_string());
$data = curl_exec($curl);
} catch (Exception $exc) {
echo $exc->getTraceAsString();
_error_log("getUsageFromURL: ERROR " . $exc->getMessage());
_error_log("getUsageFromURL: ERROR " . curl_errno($curl));
_error_log("getUsageFromURL: ERROR " . curl_error($curl));
}
if ($data) {
//_error_log("getUsageFromURL: response header " . $data);
$content_length = "unknown";
$status = "unknown";
if (preg_match("/^HTTP\/1\.[01] (\d\d\d)/", $data, $matches)) {
$status = (int) $matches[1];
}
if (preg_match("/Content-Length: (\d+)/", $data, $matches)) {
$content_length = (int) $matches[1];
}
// http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
if ($status == 200 || ($status > 300 && $status <= 308)) {
$result = $content_length;
}
} else {
_error_log("getUsageFromURL: ERROR no response data " . curl_error($curl));
}
curl_close($curl);
return (int) $result;
}
function getDirSize($dir, $forceNew = false)
{
global $_getDirSize;
if (!isset($_getDirSize)) {
$_getDirSize = [];
}
if (empty($forceNew) && isset($_getDirSize[$dir])) {
return $_getDirSize[$dir];
}
_error_log("getDirSize: start {$dir}");
if (isWindows()) {
$return = foldersize($dir);
$_getDirSize[$dir] = $return;
return $return;
} else {
$command = "du -sb {$dir}";
exec($command . " < /dev/null 2>&1", $output, $return_val);
if ($return_val !== 0) {
_error_log("getDirSize: ERROR ON Command {$command}");
$return = 0;
$_getDirSize[$dir] = $return;
return $return;
} else {
if (!empty($output[0])) {
preg_match("/^([0-9]+).*/", $output[0], $matches);
}
if (!empty($matches[1])) {
_error_log("getDirSize: found {$matches[1]} from - {$output[0]}");
$return = intval($matches[1]);
$_getDirSize[$dir] = $return;
return $return;
}
_error_log("getDirSize: ERROR on pregmatch {$output[0]}");
$return = 0;
$_getDirSize[$dir] = $return;
return $return;
}
}
}
function foldersize($path)
{
$total_size = 0;
$files = scandir($path);
$cleanPath = rtrim($path, '/') . '/';
foreach ($files as $t) {
if ($t <> "." && $t <> "..") {
$currentFile = $cleanPath . $t;
if (is_dir($currentFile)) {
$size = foldersize($currentFile);
$total_size += $size;
} else {
$size = filesize($currentFile);
$total_size += $size;
}
}
}
return $total_size;
}
function getDiskUsage()
{
global $global;
$dir = getVideosDir() . "";
$obj = new stdClass();
$obj->disk_free_space = disk_free_space($dir);
$obj->disk_total_space = disk_total_space($dir);
$obj->videos_dir = getDirSize($dir);
$obj->disk_used = $obj->disk_total_space - $obj->disk_free_space;
$obj->disk_used_by_other = $obj->disk_used - $obj->videos_dir;
$obj->disk_free_space_human = humanFileSize($obj->disk_free_space);
$obj->disk_total_space_human = humanFileSize($obj->disk_total_space);
$obj->videos_dir_human = humanFileSize($obj->videos_dir);
$obj->disk_used_human = humanFileSize($obj->disk_used);
$obj->disk_used_by_other_human = humanFileSize($obj->disk_used_by_other);
// percentage of disk used
$obj->disk_used_percentage = sprintf('%.2f', ($obj->disk_used / $obj->disk_total_space) * 100);
$obj->videos_dir_used_percentage = sprintf('%.2f', ($obj->videos_dir / $obj->disk_total_space) * 100);
$obj->disk_free_space_percentage = sprintf('%.2f', ($obj->disk_free_space / $obj->disk_total_space) * 100);
return $obj;
}
function unsetSearch()
{
unset($_GET['searchPhrase'], $_POST['searchPhrase'], $_GET['search'], $_GET['q']);
}
function encrypt_decrypt($string, $action)
{
global $global;
$output = false;
if (empty($string)) {
return false;
}
$encrypt_method = "AES-256-CBC";
$secret_key = 'This is my secret key';
$secret_iv = $global['systemRootPath'];
while (strlen($secret_iv) < 16) {
$secret_iv .= $global['systemRootPath'];
}
if (empty($secret_iv)) {
$secret_iv = '1234567890abcdef';
}
// hash
$key = hash('sha256', $global['salt']);
// iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
$iv = substr(hash('sha256', $secret_iv), 0, 16);
if ($action == 'encrypt') {
$output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
$output = base64_encode($output);
} elseif ($action == 'decrypt') {
$output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
}
return $output;
}
function compressString($string)
{
if (function_exists("gzdeflate")) {
$string = gzdeflate($string, 9);
}
return $string;
}
function decompressString($string)
{
if (function_exists("gzinflate")) {
$string = gzinflate($string);
}
return $string;
}
function encryptString($string)
{
if (is_object($string) || is_array($string)) {
$string = json_encode($string);
}
return encrypt_decrypt($string, 'encrypt');
}
function decryptString($string)
{
return encrypt_decrypt($string, 'decrypt');
}
function getToken($timeout = 0, $salt = "")
{
global $global;
$obj = new stdClass();
$obj->salt = $global['salt'] . $salt;
$obj->timezone = date_default_timezone_get();
if (!empty($timeout)) {
$obj->time = time();
$obj->timeout = $obj->time + $timeout;
} else {
$obj->time = strtotime("Today 00:00:00");
$obj->timeout = strtotime("Today 23:59:59");
$obj->timeout += cacheExpirationTime();
}
$strObj = json_encode($obj);
//_error_log("Token created: {$strObj}");
return encryptString($strObj);
}
function isTokenValid($token, $salt = "")
{
return verifyToken($token, $salt);
}
function verifyToken($token, $salt = "")
{
global $global;
$obj = _json_decode(decryptString($token));
if (empty($obj)) {
_error_log("verifyToken invalid token");
return false;
}
if ($obj->salt !== $global['salt'] . $salt) {
_error_log("verifyToken salt fail");
return false;
}
$old_timezone = date_default_timezone_get();
date_default_timezone_set($obj->timezone);
$time = time();
date_default_timezone_set($old_timezone);
if (!($time >= $obj->time && $time <= $obj->timeout)) {
_error_log("verifyToken token timout time = $time; obj->time = $obj->time; obj->timeout = $obj->timeout");
return false;
}
return true;
}
class YPTvideoObject
{
public $id;
public $title;
public $description;
public $thumbnails;
public $channelTitle;
public $videoLink;
public function __construct($id, $title, $description, $thumbnails, $channelTitle, $videoLink)
{
$this->id = $id;
$this->title = $title;
$this->description = $description;
$this->thumbnails = $thumbnails;
$this->channelTitle = $channelTitle;
$this->videoLink = $videoLink;
}
}
function isToShowDuration($type)
{
$notShowTo = ['pdf', 'article', 'serie', 'zip', 'image', 'live', 'livelinks'];
if (in_array($type, $notShowTo)) {
return false;
} else {
return true;
}
}
function _dieAndLogObject($obj, $prefix = "")
{
$objString = json_encode($obj);
_error_log($prefix . $objString);
die($objString);
}
function isAVideoPlayer()
{
global $global;
if (!empty($global['doNotLoadPlayer'])) {
return false;
}
if (isVideo() || isSerie()) {
return true;
}
return false;
}
function isFirstPage()
{
global $isFirstPage, $global;
return !empty($isFirstPage) || getSelfURI() === "{$global['webSiteRootURL']}view/";
}
function isVideo()
{
global $isModeYouTube, $global;
if (!empty($global['doNotLoadPlayer'])) {
return false;
}
return !empty($isModeYouTube) || isPlayList() || isEmbed() || isLive();
}
function isOffline()
{
global $_isOffline;
return !empty($_isOffline);
}
function isVideoTypeEmbed()
{
global $isVideoTypeEmbed;
if (isVideo() && !empty($isVideoTypeEmbed) && $videos_id = getVideos_id()) {
return $videos_id;
}
return false;
}
function isAudio()
{
global $isAudio;
return !empty($isAudio) || Video::forceAudio();
}
function isSerie()
{
return isPlayList();
}
function isPlayList()
{
global $isPlayList, $isSerie;
return !empty($isSerie) || !empty($isPlayList);
}
function isChannel()
{
global $isChannel;
if (!empty($isChannel) && !isVideo()) {
$user_id = 0;
if (empty($_GET['channelName'])) {
if (User::isLogged()) {
$user_id = User::getId();
} else {
return false;
}
} else {
$_GET['channelName'] = xss_esc($_GET['channelName']);
$user = User::getChannelOwner($_GET['channelName']);
if (!empty($user)) {
$user_id = $user['id'];
} else {
$user_id = $_GET['channelName'];
}
}
return $user_id;
}
return false;
}
function isEmbed()
{
global $isEmbed, $global;
if (!empty($global['doNotLoadPlayer'])) {
return false;
}
return !empty($isEmbed);
}
function isWebRTC()
{
global $isWebRTC, $global;
if (!empty($global['doNotLoadPlayer'])) {
return false;
}
return !empty($isWebRTC);
}
function isLive()
{
global $isLive, $global;
if (!empty($global['doNotLoadPlayer'])) {
return false;
}
if (class_exists('LiveTransmition') && class_exists('Live')) {
$livet = LiveTransmition::getFromRequest();
if (!empty($livet)) {
setLiveKey($livet['key'], Live::getLiveServersIdRequest(), @$_REQUEST['live_index']);
$isLive = 1;
}
}
if (!empty($isLive)) {
$live = getLiveKey();
if (empty($live)) {
$live = ['key' => false, 'live_servers_id' => false, 'live_index' => false, 'live_schedule' => false, 'users_id' => false];
}
$live['liveLink'] = isLiveLink();
return $live;
} else {
return false;
}
}
function isLiveLink()
{
global $isLiveLink;
if (!empty($isLiveLink)) {
return $isLiveLink;
} else {
return false;
}
}
function getLiveKey()
{
global $getLiveKey;
if (empty($getLiveKey)) {
return false;
}
return $getLiveKey;
}
function setLiveKey($key, $live_servers_id, $live_index = '')
{
global $getLiveKey;
$parameters = Live::getLiveParametersFromKey($key);
$key = $parameters['key'];
$cleanKey = $parameters['cleanKey'];
if (empty($live_index)) {
$live_index = $parameters['live_index'];
}
$key = Live::getLiveKeyFromRequest($key, $live_index, $parameters['playlists_id_live']);
$lt = LiveTransmition::getFromKey($key);
$live_schedule = 0;
$users_id = 0;
if (!empty($lt['live_schedule_id'])) {
$live_schedule = $lt['live_schedule_id'];
$live_servers_id = $lt['live_servers_id'];
$users_id = $lt['users_id'];
}
$getLiveKey = ['key' => $key, 'live_servers_id' => intval($live_servers_id), 'live_index' => $live_index, 'cleanKey' => $cleanKey, 'live_schedule' => $live_schedule, 'users_id' => $users_id];
return $getLiveKey;
}
function isVideoPlayerHasProgressBar()
{
if (isWebRTC()) {
return false;
}
if (isLive()) {
$obj = AVideoPlugin::getObjectData('Live');
if (empty($obj->disableDVR)) {
return true;
}
} elseif (isAVideoPlayer()) {
return true;
}
return false;
}
function isHLS()
{
global $video, $global;
if (isLive()) {
return true;
} elseif (!empty($video) && is_array($video) && $video['type'] == 'video' && file_exists(Video::getPathToFile("{$video['filename']}/index.m3u8"))) {
return true;
}
return false;
}
function getRedirectUri($returnThisIfRedirectUriIsNotSet = false)
{
if (isValidURL(@$_GET['redirectUri'])) {
return $_GET['redirectUri'];
}
if (isValidURL(@$_SESSION['redirectUri'])) {
return $_SESSION['redirectUri'];
}
if (isValidURL(@$_REQUEST["redirectUri"])) {
return $_REQUEST["redirectUri"];
}
if (isValidURL(@$_SERVER["HTTP_REFERER"])) {
return $_SERVER["HTTP_REFERER"];
}
if (isValidURL($returnThisIfRedirectUriIsNotSet)) {
return $returnThisIfRedirectUriIsNotSet;
} else {
return getRequestURI();
}
}
function setRedirectUri($redirectUri)
{
_session_start();
$_SESSION['redirectUri'] = $redirectUri;
}
function redirectIfRedirectUriIsSet()
{
$redirectUri = false;
if (!empty($_GET['redirectUri'])) {
if (isSameDomainAsMyAVideo($_GET['redirectUri'])) {
$redirectUri = $_GET['redirectUri'];
}
}
if (!empty($_SESSION['redirectUri'])) {
if (isSameDomainAsMyAVideo($_SESSION['redirectUri'])) {
$redirectUri = $_SESSION['redirectUri'];
}
_session_start();
unset($_SESSION['redirectUri']);
}
if (!empty($redirectUri)) {
header("Location: {$_SESSION['redirectUri']}");
exit;
}
}
function getRedirectToVideo($videos_id)
{
$redirectUri = getRedirectUri();
$isEmbed = 0;
if (stripos($redirectUri, "embed") !== false) {
$isEmbed = 1;
}
$video = Video::getVideoLight($videos_id);
if (empty($video)) {
return false;
}
return Video::getLink($videos_id, $video['clean_title'], $isEmbed);
}
function getRequestURI()
{
if (empty($_SERVER['REQUEST_URI'])) {
return "";
}
return (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
}
function getSelfURI()
{
if (empty($_SERVER['PHP_SELF']) || empty($_SERVER['HTTP_HOST'])) {
return "";
}
global $global;
$http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http");
if (preg_match('/^https:/i', $global['webSiteRootURL'])) {
$http = 'https';
}
$queryString = preg_replace("/error=[^&]*/", "", @$_SERVER['QUERY_STRING']);
$queryString = preg_replace("/inMainIframe=[^&]*/", "", $queryString);
$phpselfWithoutIndex = preg_replace("/index.php/", "", @$_SERVER['PHP_SELF']);
$url = $http . "://$_SERVER[HTTP_HOST]$phpselfWithoutIndex?$queryString";
$url = rtrim($url, '?');
return fixTestURL($url);
}
function isSameVideoAsSelfURI($url)
{
return URLsAreSameVideo($url, getSelfURI());
}
function URLsAreSameVideo($url1, $url2)
{
$videos_id1 = getVideoIDFromURL($url1);
$videos_id2 = getVideoIDFromURL($url2);
if (empty($videos_id1) || empty($videos_id2)) {
return false;
}
return $videos_id1 === $videos_id2;
}
function getVideos_id($returnPlaylistVideosIDIfIsSerie = false)
{
global $_getVideos_id;
$videos_id = false;
if (isset($_getVideos_id) && is_int($_getVideos_id)) {
$videos_id = $_getVideos_id;
} else {
if (isVideo()) {
$videos_id = getVideoIDFromURL(getSelfURI());
if (empty($videos_id) && !empty($_REQUEST['videoName'])) {
$video = Video::getVideoFromCleanTitle($_REQUEST['videoName']);
if (!empty($video)) {
$videos_id = $video['id'];
}
}
setVideos_id($videos_id);
}
if (empty($videos_id) && !empty($_REQUEST['playlists_id'])) {
AVideoPlugin::loadPlugin('PlayLists');
$video = PlayLists::isPlayListASerie($_REQUEST['playlists_id']);
if (!empty($video)) {
$videos_id = $video['id'];
}
}
if (empty($videos_id) && !empty($_REQUEST['v'])) {
$videos_id = $_REQUEST['v'];
}
if (empty($videos_id) && !empty($_REQUEST['videos_id'])) {
$videos_id = $_REQUEST['videos_id'];
}
if (empty($videos_id) && (!empty($_REQUEST['playlists_id']) || (!empty($_REQUEST['tags_id']) && isset($_REQUEST['playlist_index'])))) {
AVideoPlugin::loadPlugin('PlayLists');
$plp = new PlayListPlayer(@$_REQUEST['playlists_id'], @$_REQUEST['tags_id'], true);
$video = $plp->getCurrentVideo();
if(!empty($video)){
$videos_id = $video['id'];
}
}
$videos_id = videosHashToID($videos_id);
}
if ($returnPlaylistVideosIDIfIsSerie && !empty($videos_id)) {
if (isPlayList()) {
$videos_id = getPlayListCurrentVideosId();
//var_dump($videos_id);exit;
}
}
return $videos_id;
}
function getUsers_idOwnerFromRequest()
{
global $isChannel;
$videos_id = getVideos_id();
if(!empty($videos_id)){
$video = new Video('', '', $videos_id);
return $video->getUsers_id();
}
$live = isLive();
if(!empty($live)){
if(!empty($live['users_id'])){
return $live['users_id'];
}
if(!empty($live['live_schedule'])){
return Live_schedule::getUsers_idOrCompany($live['live_schedule']);
}
if(!empty($live['key'])){
$row = LiveTransmition::keyExists($live['key']);
return $row['users_id'];
}
}
if(!empty($isChannel) && !isVideo()) {
if (!empty($_GET['channelName'])) {
$_GET['channelName'] = xss_esc($_GET['channelName']);
$user = User::getChannelOwner($_GET['channelName']);
if (!empty($user)) {
$users_id = $user['id'];
} else {
$users_id = intval($_GET['channelName']);
}
return $users_id;
}
}
return 0;
}
function getPlayListIndex()
{
global $__playlistIndex;
if (empty($__playlistIndex) && !empty($_REQUEST['playlist_index'])) {
$__playlistIndex = intval($_REQUEST['playlist_index']);
}
return intval($__playlistIndex);
}
function getPlayListData()
{
global $playListData;
if (empty($playListData)) {
$playListData = [];
}
return $playListData;
}
function getPlayListDataVideosId()
{
$playListData_videos_id = [];
foreach (getPlayListData() as $value) {
$playListData_videos_id[] = $value->getVideos_id();
}
return $playListData_videos_id;
}
function getPlayListCurrentVideo($setVideos_id = true)
{
$videos_id = getPlayListCurrentVideosId($setVideos_id);
if (empty($videos_id)) {
return false;
}
$video = Video::getVideo($videos_id);
return $video;
}
function getPlayListCurrentVideosId($setVideos_id = true)
{
$playListData = getPlayListData();
$playlist_index = getPlayListIndex();
if (empty($playListData[$playlist_index])) {
//var_dump($playlist_index, $playListData);
return false;
}
$videos_id = $playListData[$playlist_index]->getVideos_id();
if ($setVideos_id) {
setVideos_id($videos_id);
}
return $videos_id;
}
function setPlayListIndex($index)
{
global $__playlistIndex;
$__playlistIndex = intval($index);
}
function setVideos_id($videos_id)
{
global $_getVideos_id;
$_getVideos_id = $videos_id;
}
function getPlaylists_id()
{
global $_isPlayList;
if (!isset($_isPlayList)) {
$_isPlayList = false;
if (isPlayList()) {
$_isPlayList = intval(@$_GET['playlists_id']);
if (empty($_isPlayList)) {
$videos_id = getVideos_id();
if (empty($videos_id)) {
$_isPlayList = false;
} else {
$v = Video::getVideoLight($videos_id);
if (empty($v) || empty($v['serie_playlists_id'])) {
$_isPlayList = false;
} else {
$_isPlayList = $v['serie_playlists_id'];
}
}
}
}
}
return $_isPlayList;
}
function isVideoOrAudioNotEmbed()
{
if (!isVideo()) {
return false;
}
$videos_id = getVideos_id();
if (empty($videos_id)) {
return false;
}
$v = Video::getVideoLight($videos_id);
if (empty($v)) {
return false;
}
$types = ['audio', 'video'];
if (in_array($v['type'], $types)) {
return true;
}
return false;
}
function getVideoIDFromURL($url)
{
if (preg_match("/v=([0-9]+)/", $url, $matches)) {
return intval($matches[1]);
}
if (preg_match('/\/(video|videoEmbed|v|vEmbed|article|articleEmbed)\/([0-9]+)/', $url, $matches)) {
if (is_numeric($matches[1])) {
return intval($matches[1]);
} elseif (is_numeric($matches[2])) {
return intval($matches[2]);
}
}
if (AVideoPlugin::isEnabledByName('PlayLists')) {
if (preg_match('/player.php\?playlists_id=([0-9]+)/', $url, $matches)) {
$serie_playlists_id = intval($matches[1]);
$video = PlayLists::isPlayListASerie($serie_playlists_id);
if ($video) {
return $video['id'];
}
}
}
if (preg_match("/v=(\.[0-9a-zA-Z_-]+)/", $url, $matches)) {
return hashToID($matches[1]);
}
if (preg_match('/\/(video|videoEmbed|v|vEmbed|article|articleEmbed)\/(\.[0-9a-zA-Z_-]+)/', $url, $matches)) {
return hashToID($matches[2]);
}
return false;
}
function getBackURL()
{
global $global;
$backURL = getRedirectUri();
if (empty($backURL)) {
$backURL = getRequestURI();
}
if (isSameVideoAsSelfURI($backURL)) {
$backURL = getHomeURL();
}
return $backURL;
}
function getHomeURL()
{
global $global, $advancedCustomUser, $advancedCustom;
if (isValidURL($advancedCustomUser->afterLoginGoToURL)) {
return $advancedCustomUser->afterLoginGoToURL;
} elseif (isValidURL($advancedCustom->logoMenuBarURL) && isSameDomainAsMyAVideo($advancedCustom->logoMenuBarURL)) {
return $advancedCustom->logoMenuBarURL;
}
return $global['webSiteRootURL'];
}
function isValidURL($url)
{
//var_dump(empty($url), !is_string($url), preg_match("/^http.*/", $url), filter_var($url, FILTER_VALIDATE_URL));
if (empty($url) || !is_string($url)) {
return false;
}
if (preg_match("/^http.*/", $url) && filter_var($url, FILTER_VALIDATE_URL)) {
return true;
}
return false;
}
function isValidEmail($email)
{
global $_email_hosts_checked;
if (empty($email)) {
return false;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
if (!isset($_email_hosts_checked)) {
$_email_hosts_checked = [];
}
//Get host name from email and check if it is valid
$email_host = array_slice(explode("@", $email), -1)[0];
if (isset($_email_hosts_checked[$email_host])) {
return $_email_hosts_checked[$email_host];
}
$_email_hosts_checked[$email_host] = true;
// Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
if (!filter_var($email_host, FILTER_VALIDATE_IP, [
'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
])) {
//Add a dot to the end of the host name to make a fully qualified domain name
// and get last array element because an escaped @ is allowed in the local part (RFC 5322)
// Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
$email_host = idn_to_ascii($email_host . '.');
//Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
if (!checkdnsrr($email_host, "MX")) {
$_email_hosts_checked[$email_host] = false;
}
}
return $_email_hosts_checked[$email_host];
}
function isValidURLOrPath($str, $insideCacheOrTmpDirOnly = true)
{
global $global;
//var_dump(empty($url), !is_string($url), preg_match("/^http.*/", $url), filter_var($url, FILTER_VALIDATE_URL));
if (empty($str) || !is_string($str)) {
return false;
}
if (mb_strtolower(trim($str)) === 'php://input') {
return true;
}
if (isValidURL($str)) {
return true;
}
if (str_starts_with($str, '/') || str_starts_with($str, '../') || preg_match("/^[a-z]:.*/i", $str)) {
if ($insideCacheOrTmpDirOnly) {
$absolutePath = realpath($str);
$absolutePathTmp = realpath(getTmpDir());
$absolutePathCache = realpath(getCacheDir());
$ext = mb_strtolower(pathinfo($absolutePath, PATHINFO_EXTENSION));
if ($ext == 'php') {
_error_log('isValidURLOrPath return false (is php file) ' . $str);
return false;
}
$pathsToCheck = [$absolutePath, $str];
foreach ($pathsToCheck as $value) {
if (
str_starts_with($value, $absolutePathTmp) ||
str_starts_with($value, '/var/www/') ||
str_starts_with($value, $absolutePathCache) ||
str_starts_with($value, $global['systemRootPath']) ||
str_starts_with($value, getVideosDir())
) {
return true;
}
}
} else {
return true;
}
//_error_log('isValidURLOrPath return false not valid absolute path 1 ' . $absolutePath);
//_error_log('isValidURLOrPath return false not valid absolute path 2 ' . $absolutePathTmp);
//_error_log('isValidURLOrPath return false not valid absolute path 3 ' . $absolutePathCache);
}
//_error_log('isValidURLOrPath return false '.$str);
return false;
}
function hasLastSlash($word)
{
$word = trim($word);
return substr($word, -1) === '/';
}
function addLastSlash($word)
{
$word = trim($word);
return $word . (hasLastSlash($word) ? "" : "/");
}
function URLHasLastSlash()
{
return hasLastSlash($_SERVER["REQUEST_URI"]);
}
function ucname($str)
{
$str = ucwords(mb_strtolower($str));
foreach (['\'', '-'] as $delim) {
if (strpos($str, $delim) !== false) {
$str = implode($delim, array_map('ucfirst', explode($delim, $str)));
}
}
return $str;
}
function sanitize_input($input)
{
return htmlentities(strip_tags($input));
}
function sanitize_array_item(&$item, $key)
{
$item = sanitize_input($item);
}
function getSEOComplement($parameters = [])
{
global $config;
$allowedTypes = $parameters["allowedTypes"] ?? null;
$addAutoPrefix = $parameters["addAutoPrefix"] ?? true;
$addCategory = $parameters["addCategory"] ?? true;
$parts = [];
if (!empty($_GET['error'])) {
array_push($parts, __("Error"));
}
if ($addCategory && !empty($_REQUEST['catName'])) {
array_push($parts, $_REQUEST['catName']);
}
if (!empty($_GET['channelName'])) {
array_push($parts, $_GET['channelName']);
}
if (!empty($_GET['type'])) {
$type = $_GET['type'];
if (empty($allowedTypes) || in_array(mb_strtolower($type), $allowedTypes)) {
array_push($parts, __(ucname($type)));
}
}
if (!empty($_GET['showOnly'])) {
array_push($parts, $_GET['showOnly']);
}
if (!empty($_GET['page'])) {
$page = intval($_GET['page']);
if ($page > 1) {
array_push($parts, sprintf(__("Page %d"), $page));
}
}
// Cleaning all entries in the $parts array
array_walk($parts, 'sanitize_array_item');
$txt = implode($config->getPageTitleSeparator(), $parts);
$txt = (!empty($txt) && $addAutoPrefix ? $config->getPageTitleSeparator() : "") . $txt;
return $txt;
}
function doNOTOrganizeHTMLIfIsPagination()
{
global $global;
$page = getCurrentPage();
if ($page > 1) {
$global['doNOTOrganizeHTML'] = 1;
}
}
function getCurrentPage()
{
global $lastCurrent;
$current = 1;
if (!empty($_REQUEST['current'])) {
$current = intval($_REQUEST['current']);
} elseif (!empty($_POST['current'])) {
$current = intval($_POST['current']);
} elseif (!empty($_GET['current'])) {
$current = intval($_GET['current']);
} elseif (isset($_GET['start']) && isset($_GET['length'])) { // for the bootgrid
$start = intval($_GET['start']);
$length = intval($_GET['length']);
if (!empty($start) && !empty($length)) {
$current = floor($start / $length) + 1;
}
} elseif (!empty($_GET['page'])) {
$current = intval($_GET['page']);
}
if ($current > 1000 && !User::isLogged()) {
_error_log("getCurrentPage current>1000 ERROR [{$current}] " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
_error_log("getCurrentPage current>1000 ERROR NOT LOGGED die [{$current}] " . getSelfURI() . ' ' . json_encode($_SERVER));
exit;
} else if ($current > 100 && isBot()) {
_error_log("getCurrentPage current>100 ERROR [{$current}] " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
_error_log("getCurrentPage current>100 ERROR bot die [{$current}] " . getSelfURI() . ' ' . json_encode($_SERVER));
exit;
}
$lastCurrent = $current;
return $current;
}
function getTrendingLimit()
{
global $advancedCustom;
if (empty($advancedCustom)) {
$advancedCustom = AVideoPlugin::getObjectData("CustomizeAdvanced");
}
$daysLimit = intval($advancedCustom->trendingOnLastDays->value);
return $daysLimit;
}
function getTrendingLimitDate()
{
$daysLimit = getTrendingLimit();
$dateDaysLimit = date('Y-m-d H:i:s', strtotime("-{$daysLimit} days"));
return $dateDaysLimit;
}
function setCurrentPage($current)
{
$_REQUEST['current'] = intval($current);
}
function getRowCount($default = 1000)
{
global $global;
if (!empty($_REQUEST['rowCount'])) {
$defaultN = intval($_REQUEST['rowCount']);
} elseif (!empty($_POST['rowCount'])) {
$defaultN = intval($_POST['rowCount']);
} elseif (!empty($_GET['rowCount'])) {
$defaultN = intval($_GET['rowCount']);
} elseif (!empty($_REQUEST['length'])) {
$defaultN = intval($_REQUEST['length']);
} elseif (!empty($_POST['length'])) {
$defaultN = intval($_POST['length']);
} elseif (!empty($_GET['length'])) {
$defaultN = intval($_GET['length']);
} elseif (!empty($global['rowCount'])) {
$defaultN = intval($global['rowCount']);
}
return (!empty($defaultN) && $defaultN > 0) ? $defaultN : $default;
}
function setRowCount($rowCount)
{
global $global;
$_REQUEST['rowCount'] = intval($rowCount);
$global['rowCount'] = $_REQUEST['rowCount'];
}
function getSearchVar()
{
$search = '';
if (!empty($_REQUEST['search'])) {
$search = $_REQUEST['search'];
} elseif (!empty($_REQUEST['q'])) {
$search = $_REQUEST['q'];
} elseif (!empty($_REQUEST['searchPhrase'])) {
$search = $_REQUEST['searchPhrase'];
} elseif (!empty($_REQUEST['search']['value'])) {
$search = $_REQUEST['search']['value'];
}
return mb_strtolower($search);
}
function isSearch()
{
return !empty(getSearchVar());
}
$cleanSearchHistory = '';
function cleanSearchVar()
{
global $cleanSearchHistory;
$search = getSearchVar();
if (!empty($search)) {
$cleanSearchHistory = $search;
}
$searchIdex = ['q', 'searchPhrase', 'search'];
foreach ($searchIdex as $value) {
unset($_REQUEST[$value], $_POST[$value], $_GET[$value]);
}
}
function reloadSearchVar()
{
global $cleanSearchHistory;
$_REQUEST['search'] = $cleanSearchHistory;
if (empty($_GET['search'])) {
$_GET['search'] = $cleanSearchHistory;
}
if (empty($_POST['search'])) {
$_POST['search'] = $cleanSearchHistory;
}
}
function wget($url, $filename, $debug = false)
{
if (empty($url) || $url == "php://input" || !isValidURL($url)) {
return false;
}
if ($lockfilename = wgetIsLocked($url)) {
if ($debug) {
_error_log("wget: ERROR the url is already downloading {$lockfilename} $url, $filename");
}
return false;
}
wgetLock($url);
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
$content = @file_get_contents($url);
if (!empty($content) && file_put_contents($filename, $content) > 100) {
wgetRemoveLock($url);
return true;
}
wgetRemoveLock($url);
return false;
}
$filename = escapeshellarg($filename);
$url = escapeshellarg($url);
$cmd = "wget --tries=1 {$url} -O {$filename} --no-check-certificate";
if ($debug) {
_error_log("wget Start ({$cmd}) ");
}
//echo $cmd;
exec($cmd);
wgetRemoveLock($url);
if (!file_exists($filename)) {
_error_log("wget: ERROR the url does not download $url, $filename");
return false;
}
if ($_SERVER['SCRIPT_NAME'] !== '/plugin/Live/m3u8.php' && empty(filesize($filename))) {
_error_log("wget: ERROR the url download but is empty $url, $filename");
return true;
}
return false;
}
/**
* Copy remote file over HTTP one small chunk at a time.
*
* @param $infile The full URL to the remote file
* @param $outfile The path where to save the file
*/
function copyfile_chunked($infile, $outfile)
{
$chunksize = 10 * (1024 * 1024); // 10 Megs
/**
* parse_url breaks a part a URL into it's parts, i.e. host, path,
* query string, etc.
*/
$parts = parse_url($infile);
$i_handle = fsockopen($parts['host'], 80, $errstr, $errcode, 5);
$o_handle = fopen($outfile, 'wb');
if ($i_handle == false || $o_handle == false) {
return false;
}
if (!empty($parts['query'])) {
$parts['path'] .= '?' . $parts['query'];
}
/**
* Send the request to the server for the file
*/
$request = "GET {$parts['path']} HTTP/1.1\r\n";
$request .= "Host: {$parts['host']}\r\n";
$request .= "User-Agent: Mozilla/5.0\r\n";
$request .= "Keep-Alive: 115\r\n";
$request .= "Connection: keep-alive\r\n\r\n";
fwrite($i_handle, $request);
/**
* Now read the headers from the remote server. We'll need
* to get the content length.
*/
$headers = [];
while (!feof($i_handle)) {
$line = fgets($i_handle);
if ($line == "\r\n") {
break;
}
$headers[] = $line;
}
/**
* Look for the Content-Length header, and get the size
* of the remote file.
*/
$length = 0;
foreach ($headers as $header) {
if (stripos($header, 'Content-Length:') === 0) {
$length = (int) str_replace('Content-Length: ', '', $header);
break;
}
}
/**
* Start reading in the remote file, and writing it to the
* local file one chunk at a time.
*/
$cnt = 0;
while (!feof($i_handle)) {
$buf = '';
$buf = fread($i_handle, $chunksize);
$bytes = fwrite($o_handle, $buf);
if ($bytes == false) {
return false;
}
$cnt += $bytes;
/**
* We're done reading when we've reached the conent length
*/
if ($cnt >= $length) {
break;
}
}
fclose($i_handle);
fclose($o_handle);
return $cnt;
}
function wgetLockFile($url)
{
return getTmpDir("YPTWget") . md5($url) . ".lock";
}
function wgetLock($url)
{
$file = wgetLockFile($url);
return file_put_contents($file, time() . PHP_EOL, FILE_APPEND | LOCK_EX);
}
function wgetRemoveLock($url)
{
$filename = wgetLockFile($url);
if (!file_exists($filename)) {
return false;
}
return unlink($filename);
}
function getLockFile($name)
{
return getTmpDir("YPTLockFile") . md5($name) . ".lock";
}
function setLock($name)
{
$file = getLockFile($name);
return file_put_contents($file, time());
}
function isLock($name, $timeout = 60)
{
$file = getLockFile($name);
if (file_exists($file)) {
$time = intval(file_get_contents($file));
if ($time + $timeout < time()) {
return false;
}
}
}
function removeLock($name)
{
$filename = getLockFile($name);
if (!file_exists($filename)) {
return false;
}
return unlink($filename);
}
function wgetIsLocked($url)
{
$filename = wgetLockFile($url);
if (!file_exists($filename)) {
return false;
}
$time = intval(file_get_contents($filename));
if (time() - $time > 36000) { // more then 10 hours
unlink($filename);
return false;
}
return $filename;
}
// due the some OS gives a fake is_writable response
function isWritable($dir)
{
$dir = rtrim($dir, '/') . '/';
$file = $dir . uniqid();
$result = false;
$time = time();
if (@file_put_contents($file, $time)) {
if ($fileTime = @file_get_contents($file)) {
if ($fileTime == $time) {
$result = true;
}
}
}
@unlink($file);
return $result;
}
function _isWritable($dir)
{
if (!isWritable($dir)) {
return false;
}
$tmpFile = "{$dir}" . uniqid();
$bytes = @file_put_contents($tmpFile, time());
@unlink($tmpFile);
return !empty($bytes);
}
function getTmpDir($subdir = "")
{
global $global;
if (empty($_SESSION['getTmpDir'])) {
$_SESSION['getTmpDir'] = [];
}
if (empty($_SESSION['getTmpDir'][$subdir . "_"])) {
if (empty($global['tmpDir'])) {
$tmpDir = sys_get_temp_dir();
if (empty($tmpDir) || !_isWritable($tmpDir)) {
$obj = AVideoPlugin::getDataObjectIfEnabled('Cache');
$tmpDir = $obj->cacheDir;
if (empty($tmpDir) || !_isWritable($tmpDir)) {
$tmpDir = getVideosDir() . "cache" . DIRECTORY_SEPARATOR;
}
}
$tmpDir = addLastSlash($tmpDir);
$tmpDir = "{$tmpDir}{$subdir}";
} else {
$tmpDir = $global['tmpDir'];
}
$tmpDir = addLastSlash($tmpDir);
if (!is_dir($tmpDir)) {
mkdir($tmpDir, 0777, true);
}
_session_start();
$_SESSION['getTmpDir'][$subdir . "_"] = $tmpDir;
} else {
$tmpDir = $_SESSION['getTmpDir'][$subdir . "_"];
}
make_path($tmpDir);
return $tmpDir;
}
function getTmpFile()
{
return getTmpDir("tmpFiles") . uniqid();
}
function getMySQLDate()
{
global $global;
$sql = "SELECT now() as time FROM configurations LIMIT 1";
// I had to add this because the about from customize plugin was not loading on the about page http://127.0.0.1/AVideo/about
$res = sqlDAL::readSql($sql);
$data = sqlDAL::fetchAssoc($res);
sqlDAL::close($res);
if ($res) {
$row = $data['time'];
} else {
$row = false;
}
return $row;
}
function _file_put_contents($filename, $data, $flags = 0, $context = null)
{
make_path($filename);
if (!is_string($data)) {
$data = _json_encode($data);
}
return file_put_contents($filename, $data, $flags, $context);
}
function html2plainText($html)
{
if (!is_string($html)) {
return '';
}
$text = strip_tags($html);
$text = str_replace(['\\', "\n", "\r", '"'], ['', ' ', ' ', ''], trim($text));
return $text;
}
function getInputPassword($id, $attributes = 'class="form-control"', $placeholder = '')
{
if (empty($placeholder)) {
$placeholder = __("Password");
}
?>
>
>
data-toggle="tooltip" data-placement="left" title="">
" . PHP_EOL;
} else {
return __LINE__;
}
$object = object_to_array($object);
$json = json_encode($object);
if (json_last_error()) {
echo "Error 1 Found after array conversion: " . json_last_error_msg() . " " . PHP_EOL;
} else {
return __LINE__;
}
$json = json_encode($object, JSON_UNESCAPED_UNICODE);
if (json_last_error()) {
echo "Error 1 Found with JSON_UNESCAPED_UNICODE: " . json_last_error_msg() . " " . PHP_EOL;
} else {
return __LINE__;
}
$objectEncoded = $object;
array_walk_recursive($objectEncoded, function (&$item) {
if (is_string($item)) {
$item = mb_convert_encoding($item, 'UTF-8', mb_detect_encoding($item, 'UTF-8, ISO-8859-1', true));
}
});
$json = json_encode($objectEncoded);
if (json_last_error()) {
echo "Error 2 Found after array conversion: " . json_last_error_msg() . " " . PHP_EOL;
} else {
return __LINE__;
}
$json = json_encode($objectEncoded, JSON_UNESCAPED_UNICODE);
if (json_last_error()) {
echo "Error 2 Found with JSON_UNESCAPED_UNICODE: " . json_last_error_msg() . " " . PHP_EOL;
} else {
return __LINE__;
}
$objectDecoded = $object;
array_walk_recursive($objectDecoded, function (&$item) {
if (is_string($item)) {
$item = mb_convert_encoding($item, mb_detect_encoding($item, 'UTF-8, ISO-8859-1', true), 'UTF-8');
}
});
$json = json_encode($objectDecoded);
if (json_last_error()) {
echo "Error 2 Found after array conversion: " . json_last_error_msg() . " " . PHP_EOL;
} else {
return __LINE__;
}
$json = json_encode($objectDecoded, JSON_UNESCAPED_UNICODE);
if (json_last_error()) {
echo "Error 2 Found with JSON_UNESCAPED_UNICODE: " . json_last_error_msg() . " " . PHP_EOL;
} else {
return __LINE__;
}
return false;
}
function is_utf8($string)
{
return preg_match('//u', $string);
}
function _utf8_encode_recursive($object)
{
if (is_string($object)) {
return is_utf8($object) ? $object : utf8_encode($object);
}
if (is_array($object)) {
foreach ($object as $key => $value) {
$object[$key] = _utf8_encode_recursive($value);
}
} elseif (is_object($object)) {
foreach ($object as $key => $value) {
$object->$key = _utf8_encode_recursive($value);
}
}
return $object;
}
function _json_encode($object)
{
if (is_string($object)) {
return $object;
}
if (empty($object)) {
return json_encode($object);
}
// Ensure that all strings within the object are UTF-8 encoded
$utf8_encoded_object = _utf8_encode_recursive($object);
// Encode the object as JSON
$json = json_encode($utf8_encoded_object);
// If there's a JSON encoding error, log the error message and debug backtrace
if (empty($json) && json_last_error()) {
$errors[] = "_json_encode: Error Found: " . json_last_error_msg();
foreach ($errors as $value) {
_error_log($value);
}
_error_log(json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
}
return $json;
}
function _json_decode($object)
{
global $global;
if (empty($object)) {
return $object;
}
if (!is_string($object)) {
return $object;
}
if (isValidURLOrPath($object)) {
$content = file_get_contents($object);
if (!empty($content)) {
$object = $content;
}
}
$json = json_decode($object);
if ($json === null) {
$object = str_replace(["\r", "\n"], ['\r', '\n'], $object);
return json_decode($object);
} else {
return $json;
}
}
// this will make sure the strring will fits in the database field
function _substr($string, $start, $length = null)
{
// make sure the name is not chunked in case of multibyte string
if (function_exists("mb_strcut")) {
return mb_strcut($string, $start, $length, "UTF-8");
} else {
return substr($string, $start, $length);
}
}
function _strlen($string)
{
// make sure the name is not chunked in case of multibyte string
if (function_exists("mb_strlen")) {
return mb_strlen($string, "UTF-8");
} else {
return strlen($string);
}
}
function getSEODescription($text, $maxChars = 320)
{
$removeChars = ['|', '"'];
$replaceChars = ['-', ''];
$newText = trim(str_replace($removeChars, $replaceChars, html2plainText($text)));
if (_strlen($newText) <= $maxChars) {
return $newText;
} else {
return _substr($newText, 0, $maxChars - 3) . '...';
}
}
function getSEOTitle($text, $maxChars = 120)
{
$removeChars = ['|', '"'];
$replaceChars = ['-', ''];
$newText = trim(str_replace($removeChars, $replaceChars, safeString($text)));
if (_strlen($newText) <= $maxChars) {
return $newText;
} else {
return _substr($newText, 0, $maxChars - 3) . '...';
}
}
function getPagination($total, $page = 0, $link = "", $maxVisible = 10, $infinityScrollGetFromSelector = "", $infinityScrollAppendIntoSelector = "")
{
global $global, $advancedCustom;
if ($total < 2) {
return '';
}
if (empty($page)) {
$page = getCurrentPage();
}
$isInfiniteScroll = !empty($infinityScrollGetFromSelector) && !empty($infinityScrollAppendIntoSelector);
$uid = md5($link);
if ($total < $maxVisible) {
$maxVisible = $total;
}
if (empty($link)) {
$link = getSelfURI();
if (preg_match("/(current=[0-9]+)/i", $link, $match)) {
$link = str_replace($match[1], "current={page}", $link);
} else {
//$link = addQueryStringParameter($link, 'current', '{page}');
$link .= (parse_url($link, PHP_URL_QUERY) ? '&' : '?') . 'current={page}';
}
}
$class = '';
if (!empty($infinityScrollGetFromSelector) && !empty($infinityScrollAppendIntoSelector)) {
$class = "infiniteScrollPagination{$uid} hidden";
}
if ($isInfiniteScroll && $page > 1) {
if (preg_match("/\{page\}/", $link, $match)) {
$pageForwardLink = str_replace("{page}", $page + 1, $link);
} else {
$pageForwardLink = addQueryStringParameter($link, 'current', $page + 1);
}
return ""
. " ";
}
$pag = ' ';
if ($isInfiniteScroll) {
$content = file_get_contents($global['systemRootPath'] . 'objects/functiongetPagination.php');
$pag .= str_replace(
['$uid', '$webSiteRootURL', '$infinityScrollGetFromSelector', '$infinityScrollAppendIntoSelector'],
[$uid, $global['webSiteRootURL'], $infinityScrollGetFromSelector, $infinityScrollAppendIntoSelector],
$content
);
}
return $pag;
}
function getShareMenu($title, $permaLink, $URLFriendly, $embedURL, $img, $class = "row bgWhite list-group-item menusDiv", $videoLengthInSeconds = 0, $bitLyLink = '')
{
global $global, $advancedCustom;
include $global['systemRootPath'] . 'objects/functiongetShareMenu.php';
}
function getCaptcha($uid = "", $forceCaptcha = false)
{
global $global;
if (empty($uid)) {
$uid = "capcha_" . uniqid();
}
$contents = getIncludeFileContent($global['systemRootPath'] . 'objects/functiongetCaptcha.php', ['uid' => $uid, 'forceCaptcha' => $forceCaptcha]);
$parts = explode('', '', $parts[1])
];
}
function isShareEnabled()
{
global $global, $advancedCustom;
return empty($advancedCustom->disableShareOnly) && empty($advancedCustom->disableShareAndPlaylist);
}
function getSharePopupButton($videos_id, $url = '', $title = '', $class='')
{
global $global, $advancedCustom;
if (!isShareEnabled()) {
return false;
}
$video['id'] = $videos_id;
include $global['systemRootPath'] . 'view/include/socialModal.php';
}
function getContentType()
{
$contentType = '';
$headers = headers_list(); // get list of headers
foreach ($headers as $header) { // iterate over that list of headers
if (stripos($header, 'Content-Type:') !== false) { // if the current header has the string "Content-Type" in it
$headerParts = explode(':', $header); // split the string, getting an array
$headerValue = trim($headerParts[1]); // take second part as value
$contentType = $headerValue;
break;
}
}
return $contentType;
}
function isContentTypeJson()
{
$contentType = getContentType();
return preg_match('/json/i', $contentType);
}
function isContentTypeXML()
{
$contentType = getContentType();
return preg_match('/xml/i', $contentType);
}
function forbiddenPage($message = '', $logMessage = false, $unlockPassword = '', $namespace = '', $pageCode = '403 Forbidden')
{
global $global;
if (!empty($unlockPassword)) {
if (empty($namespace)) {
$namespace = $_SERVER["SCRIPT_FILENAME"];
}
if (!empty($_REQUEST['unlockPassword'])) {
if ($_REQUEST['unlockPassword'] == $unlockPassword) {
_session_start();
if (!isset($_SESSION['user']['forbiddenPage'])) {
$_SESSION['user']['forbiddenPage'] = [];
}
$_SESSION['user']['forbiddenPage'][$namespace] = $_REQUEST['unlockPassword'];
}
}
if (!empty($_SESSION['user']['forbiddenPage'][$namespace]) && $unlockPassword === $_SESSION['user']['forbiddenPage'][$namespace]) {
return true;
}
}
$_REQUEST['403ErrorMsg'] = $message;
if ($logMessage) {
_error_log($message);
}
header('HTTP/1.0 ' . $pageCode);
if (empty($unlockPassword) && isContentTypeJson()) {
header("Content-Type: application/json");
$obj = new stdClass();
$obj->error = true;
$obj->msg = $message;
$obj->forbiddenPage = true;
die(json_encode($obj));
} else {
if (empty($unlockPassword) && !User::isLogged()) {
$message .= ', ' . __('please login');
gotToLoginAndComeBackHere($message);
} else {
header("Content-Type: text/html");
include $global['systemRootPath'] . 'view/forbiddenPage.php';
}
}
exit;
}
define('E_FATAL', E_ERROR | E_USER_ERROR | E_PARSE | E_CORE_ERROR |
E_COMPILE_ERROR | E_RECOVERABLE_ERROR);
if (!isCommandLineInterface() && !isAVideoEncoder()) {
register_shutdown_function('avideoShutdown');
}
function avideoShutdown()
{
global $global;
$error = error_get_last();
if ($error && ($error['type'] & E_FATAL)) {
var_dump($error);
_error_log($error, AVideoLog::$ERROR);
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
if (!User::isAdmin()) {
if (!preg_match('/json\.php$/i', $_SERVER['PHP_SELF'])) {
echo '' . PHP_EOL;
include $global['systemRootPath'] . 'view/maintanance.html';
} else {
$o = new stdClass();
$o->error = true;
$o->msg = ('Under Maintanance');
echo json_encode($o);
}
} else {
echo '';
var_dump($error);
var_dump(debug_backtrace());
echo ' ';
}
exit;
}
}
function videoNotFound($message, $logMessage = false)
{
//var_dump(debug_backtrace());exit;
global $global;
$_REQUEST['404ErrorMsg'] = $message;
if ($logMessage) {
_error_log($message);
}
include $global['systemRootPath'] . 'view/videoNotFound.php';
exit;
}
function isForbidden()
{
global $global;
if (!empty($global['isForbidden'])) {
return true;
}
return false;
}
function diskUsageBars()
{
return ''; //TODO check why it is slowing down
global $global;
include $global['systemRootPath'] . 'objects/functiondiskUsageBars.php';
$contents = getIncludeFileContent($global['systemRootPath'] . 'objects/functiondiskUsageBars.php');
return $contents;
}
function getDomain()
{
global $global, $_getDomain;
if (isset($_getDomain)) {
return $_getDomain;
}
if (empty($_SERVER['HTTP_HOST'])) {
$parse = parse_url($global['webSiteRootURL']);
$domain = $parse['host'];
} else {
$domain = $_SERVER['HTTP_HOST'];
}
$domain = str_replace("www.", "", $domain);
$domain = preg_match("/^\..+/", $domain) ? ltrim($domain, '.') : $domain;
$domain = preg_replace('/:[0-9]+$/', '', $domain);
$_getDomain = $domain;
return $domain;
}
function getHostOnlyFromURL($url)
{
$parse = parse_url($url);
$domain = $parse['host'];
$domain = str_replace("www.", "", $domain);
$domain = preg_match("/^\..+/", $domain) ? ltrim($domain, '.') : $domain;
$domain = preg_replace('/:[0-9]+$/', '', $domain);
return $domain;
}
/**
* It's separated by time, version, clock_seq_hi, clock_seq_lo, node, as indicated in the followoing rfc.
*
* From the IETF RFC4122:
* 8-4-4-4-12
* @return string
*/
function getDeviceID($useRandomString = true)
{
$ip = md5(getRealIpAddr());
$pattern = "/[^0-9a-z_.-]/i";
if (empty($_SERVER['HTTP_USER_AGENT'])) {
$device = "unknowDevice-{$ip}";
$device .= '-' . intval(User::getId());
return preg_replace($pattern, '-', $device);
}
if (empty($useRandomString)) {
$device = 'ypt-' . get_browser_name() . '-' . getOS() . '-' . $ip . '-' . md5($_SERVER['HTTP_USER_AGENT']);
$device = str_replace(
['[', ']', ' '],
['', '', '_'],
$device
);
$device .= '-' . intval(User::getId());
return preg_replace($pattern, '-', $device);
}
$cookieName = "yptDeviceID";
if (empty($_COOKIE[$cookieName])) {
if (empty($_GET[$cookieName])) {
$id = uniqidV4();
$_GET[$cookieName] = $id;
}
if (empty($_SESSION[$cookieName])) {
_session_start();
$_SESSION[$cookieName] = $_GET[$cookieName];
} else {
$_GET[$cookieName] = $_SESSION[$cookieName];
}
if (!_setcookie($cookieName, $_GET[$cookieName], strtotime("+ 1 year"))) {
return "getDeviceIDError";
}
$_COOKIE[$cookieName] = $_GET[$cookieName];
}
return preg_replace($pattern, '-', $_COOKIE[$cookieName]);
}
function deviceIdToObject($deviceID)
{
$parts = explode('-', $deviceID);
$obj = new stdClass();
$obj->browser = '';
$obj->os = '';
$obj->ip = '';
$obj->user_agent = '';
$obj->users_id = 0;
foreach ($parts as $key => $value) {
$parts[$key] = str_replace('_', ' ', $value);
}
switch ($parts[0]) {
case 'ypt':
$obj->browser = $parts[1];
$obj->os = $parts[2];
$obj->ip = $parts[3];
$obj->user_agent = $parts[4];
$obj->users_id = $parts[5];
break;
case 'unknowDevice':
$obj->browser = $parts[0];
$obj->os = 'unknow OS';
$obj->ip = $parts[1];
$obj->user_agent = 'unknow UA';
$obj->users_id = $parts[2];
break;
default:
break;
}
return $obj;
}
function uniqidV4()
{
$randomString = openssl_random_pseudo_bytes(16);
$time_low = bin2hex(substr($randomString, 0, 4));
$time_mid = bin2hex(substr($randomString, 4, 2));
$time_hi_and_version = bin2hex(substr($randomString, 6, 2));
$clock_seq_hi_and_reserved = bin2hex(substr($randomString, 8, 2));
$node = bin2hex(substr($randomString, 10, 6));
/**
* Set the four most significant bits (bits 12 through 15) of the
* time_hi_and_version field to the 4-bit version number from
* Section 4.1.3.
* @see http://tools.ietf.org/html/rfc4122#section-4.1.3
*/
$time_hi_and_version = hexdec($time_hi_and_version);
$time_hi_and_version = $time_hi_and_version >> 4;
$time_hi_and_version = $time_hi_and_version | 0x4000;
/**
* Set the two most significant bits (bits 6 and 7) of the
* clock_seq_hi_and_reserved to zero and one, respectively.
*/
$clock_seq_hi_and_reserved = hexdec($clock_seq_hi_and_reserved);
$clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved >> 2;
$clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved | 0x8000;
return sprintf('%08s-%04s-%04x-%04x-%012s', $time_low, $time_mid, $time_hi_and_version, $clock_seq_hi_and_reserved, $node);
}
// guid
function _setcookie($cookieName, $value, $expires = 0)
{
global $config, $global;
if (empty($expires)) {
if (empty($config) || !is_object($config)) {
require_once $global['systemRootPath'] . 'objects/configuration.php';
if (class_exists('Configuration')) {
$config = new Configuration();
}
}
if (!empty($config) && is_object($config)) {
$expires = time() + $config->getSession_timeout();
}
}
$domain = getDomain();
if (version_compare(phpversion(), '7.3', '>=')) {
$cookie_options = [
'expires' => $expires,
'path' => '/',
'domain' => $domain,
'secure' => true,
'httponly' => true,
'samesite' => 'None'
];
setcookie($cookieName, $value, $cookie_options);
$cookie_options['domain'] = 'www.' . $domain;
setcookie($cookieName, $value, $cookie_options);
} else {
setcookie($cookieName, $value, (int) $expires, "/", $domain);
setcookie($cookieName, $value, (int) $expires, "/", 'www.' . $domain);
}
}
function _unsetcookie($cookieName)
{
$domain = getDomain();
$expires = strtotime("-10 years");
$value = '';
_setcookie($cookieName, $value, $expires);
setcookie($cookieName, $value, (int) $expires, "/") && setcookie($cookieName, $value, (int) $expires);
setcookie($cookieName, $value, (int) $expires, "/", str_replace("www", "", $domain));
setcookie($cookieName, $value, (int) $expires, "/", "www." . $domain);
setcookie($cookieName, $value, (int) $expires, "/", ".www." . $domain);
setcookie($cookieName, $value, (int) $expires, "/", "." . $domain);
setcookie($cookieName, $value, (int) $expires, "/", $domain);
setcookie($cookieName, $value, (int) $expires, "/");
setcookie($cookieName, $value, (int) $expires);
unset($_COOKIE[$cookieName]);
}
function _resetcookie($cookieName, $value)
{
_unsetcookie($cookieName);
_setcookie($cookieName, $value);
}
/**
* This function is not 100% but try to tell if the site is in an iFrame
* @global array $global
* @return boolean
*/
function isIframeInDifferentDomain()
{
global $global;
if (!isIframe()) {
return false;
}
return isSameDomainAsMyAVideo($_SERVER['HTTP_REFERER']);
}
function isIframe()
{
global $global;
if (!empty($global['isIframe'])) {
return true;
}
if (isset($_SERVER['HTTP_SEC_FETCH_DEST']) && $_SERVER['HTTP_SEC_FETCH_DEST'] === 'iframe') {
return true;
}
$pattern = '/' . str_replace('/', '\\/', $global['webSiteRootURL']) . '((view|site)\/?)?/';
if (empty($_SERVER['HTTP_REFERER']) || preg_match($pattern, $_SERVER['HTTP_REFERER'])) {
return false;
}
return true;
}
function inIframe()
{
return isIframe();
}
function getCredentialsURL()
{
global $global;
return "webSiteRootURL=" . urlencode($global['webSiteRootURL']) . "&user=" . urlencode(User::getUserName()) . "&pass=" . urlencode(User::getUserPass()) . "&encodedPass=1";
}
function gotToLoginAndComeBackHere($msg = '')
{
global $global;
if (User::isLogged()) {
forbiddenPage($msg);
exit;
}
if (!empty($_GET['comebackhere'])) {
return false;
}
setAlertMessage($msg, $type = "msg");
header("Location: {$global['webSiteRootURL']}user?redirectUri=" . urlencode(getSelfURI()) . "&comebackhere=1");
exit;
}
function setAlertMessage($msg, $type = "msg")
{
_session_start();
$_SESSION['YPTalertMessage'][] = [$msg, $type];
}
function setToastMessage($msg)
{
setAlertMessage($msg, "toast");
}
function showAlertMessage()
{
$check = ['error', 'msg', 'success', 'toast'];
$newAlerts = [];
if (!empty($_SESSION['YPTalertMessage'])) {
foreach ($check as $value) {
$newAlerts[$value] = [];
}
foreach ($_SESSION['YPTalertMessage'] as $value) {
if (!empty($value[0])) {
if (empty($newAlerts[$value[1]])) {
$newAlerts[$value[1]] = [];
}
$newAlerts[$value[1]][] = $value[0];
}
}
_session_start();
unset($_SESSION['YPTalertMessage']);
} else {
if (!requestComesFromSafePlace()) {
echo PHP_EOL, "/** showAlertMessage !requestComesFromSafePlace [" . getRefferOrOrigin() . "] **/";
return false;
}
}
$joinString = $check;
foreach ($joinString as $value) {
if (!empty($newAlerts[$value])) {
if (is_array($newAlerts[$value])) {
$newAlerts[$value] = array_unique($newAlerts[$value]);
$newStr = [];
foreach ($newAlerts[$value] as $value2) {
if (!empty($value2)) {
$newStr[] = $value2;
}
}
$newAlerts[$value] = implode(" ", $newStr);
} else {
$newAlerts[$value] = $newAlerts[$value];
}
}
}
foreach ($check as $value) {
if (!empty($newAlerts[$value])) {
if (is_array($newAlerts[$value])) {
$newStr = [];
foreach ($newAlerts[$value] as $key => $value2) {
$value2 = str_replace('"', "''", $value2);
if (!empty($value2)) {
$newStr[] = $value2;
}
}
$newAlerts[$value] = $newStr;
} else {
$newAlerts[$value] = str_replace('"', "''", $newAlerts[$value]);
}
}
}
echo "/** showAlertMessage **/", PHP_EOL;
if (!empty($newAlerts['error'])) {
echo 'avideoAlertError("' . $newAlerts['error'] . '");';
echo 'window.history.pushState({}, document.title, "' . getSelfURI() . '");';
}
if (!empty($newAlerts['msg'])) {
echo 'avideoAlertInfo("' . $newAlerts['msg'] . '");';
echo 'window.history.pushState({}, document.title, "' . getSelfURI() . '");';
}
if (!empty($newAlerts['success'])) {
echo 'avideoAlertSuccess("' . $newAlerts['success'] . '");';
echo 'window.history.pushState({}, document.title, "' . getSelfURI() . '");';
}
if (!empty($newAlerts['toast'])) {
if (!is_array($newAlerts['toast'])) {
$newAlerts['toast'] = [$newAlerts['toast']];
} else {
$newAlerts['toast'] = array_unique($newAlerts['toast']);
}
foreach ($newAlerts['toast'] as $key => $value) {
$hideAfter = strlen(strip_tags($value)) * 150;
if ($hideAfter < 3000) {
$hideAfter = 3000;
}
if ($hideAfter > 15000) {
$hideAfter = 15000;
}
echo '$.toast({
text: "' . strip_tags($value) . '",
hideAfter: ' . $hideAfter . ' // in milli seconds
});console.log("Toast Hide after ' . $hideAfter . '");';
}
echo 'window.history.pushState({}, document.title, "' . getSelfURI() . '");';
}
echo PHP_EOL, "/** showAlertMessage END **/";
}
function getResolutionLabel($res)
{
if ($res == 720) {
return "" . getResolutionText($res) . " ";
} elseif ($res == 1080) {
return "" . getResolutionText($res) . " ";
} elseif ($res == 1440) {
return "" . getResolutionText($res) . " ";
} elseif ($res == 2160) {
return "" . getResolutionText($res) . " ";
} elseif ($res == 4320) {
return "" . getResolutionText($res) . " ";
} else {
return '';
}
}
function getResolutionText($res)
{
$res = intval($res);
if ($res >= 720 && $res < 1080) {
return "HD";
} elseif ($res >= 1080 && $res < 1440) {
return "FHD";
} elseif ($res >= 1440 && $res < 2160) {
return "FHD+";
} elseif ($res >= 2160 && $res < 4320) {
return "4K";
} elseif ($res >= 4320) {
return "8K";
} else {
return '';
}
}
function getResolutionTextRoku($res)
{
$res = intval($res);
if ($res >= 720 && $res < 1080) {
return "HD";
} elseif ($res >= 1080 && $res < 2160) {
return "FHD";
} elseif ($res >= 2160) {
return "UHD";
} else {
return 'SD';
}
}
// just realize the readdir is a lot faster then glob
function _glob($dir, $pattern, $recreateCache = false)
{
global $_glob;
if (empty($dir)) {
return [];
}
if (empty($_glob)) {
$_glob = [];
}
$name = md5($dir . $pattern);
if (!$recreateCache && isset($_glob[$name])) {
//_error_log("_glob cache found: {$dir}[$pattern]");
return $_glob[$name];
}
$dir = rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
$array = [];
if (is_dir($dir) && $handle = opendir($dir)) {
$count = 0;
while (false !== ($file_name = readdir($handle))) {
if ($file_name == '.' || $file_name == '..') {
continue;
}
//_error_log("_glob: {$dir}{$file_name} [$pattern]");
//var_dump($pattern, $file_name, preg_match($pattern, $file_name));
if (preg_match($pattern, $file_name)) {
//_error_log("_glob Success: {$dir}{$file_name} [$pattern]");
$array[] = "{$dir}{$file_name}";
}
}
closedir($handle);
}
$_glob[$name] = $array;
return $array;
}
function globVideosDir($filename, $filesOnly = false, $recreateCache = false)
{
global $global;
if (empty($filename)) {
return [];
}
$cleanfilename = Video::getCleanFilenameFromFile($filename);
$paths = Video::getPaths($filename);
$dir = $paths['path'];
if (is_dir($dir . $filename)) {
$dir = $dir . $filename;
$cleanfilename = '';
}
$pattern = "/{$cleanfilename}.*";
if (!empty($filesOnly)) {
$formats = getValidFormats();
$pattern .= ".(" . implode("|", $formats) . ")";
}
$pattern .= "/";
//_error_log("_glob($dir, $pattern)");
//var_dump($dir, $pattern);
return _glob($dir, $pattern, $recreateCache);
}
function getValidFormats()
{
$video = ['webm', 'mp4', 'm3u8'];
$audio = ['mp3', 'ogg'];
$image = ['jpg', 'gif', 'webp'];
return array_merge($video, $audio, $image);
}
function isValidFormats($format)
{
$format = str_replace(".", "", $format);
return in_array($format, getValidFormats());
}
function getTimerFromDates($startTime, $endTime = 0)
{
if (!is_int($startTime)) {
$startTime = strtotime($startTime);
}
if (!is_int($endTime)) {
$endTime = strtotime($endTime);
}
if (empty($endTime)) {
$endTime = time();
}
$timer = abs($endTime - $startTime);
$uid = uniqid();
return " ";
}
function getServerClock()
{
$id = uniqid();
$today = getdate();
$html = '00:00:00 ';
$html .= "";
return $html;
}
/**
* Xsendfile and FFMPEG are required for this feature
* @global array $global
* @param string $filepath
* @return boolean
*/
function downloadHLS($filepath)
{
global $global;
if (!CustomizeUser::canDownloadVideos()) {
_error_log("downloadHLS: CustomizeUser::canDownloadVideos said NO");
return false;
}
if (!file_exists($filepath)) {
_error_log("downloadHLS: file NOT found: {$filepath}");
return false;
}
_error_log("downloadHLS: m3u8ToMP4($filepath) start");
$output = m3u8ToMP4($filepath);
if (!empty($output['error'])) {
$msg = 'downloadHLS was not possible';
if (User::isAdmin()) {
$msg .= ' ' . "m3u8ToMP4($filepath) return empty " . nl2br($output['msg']);
}
_error_log("downloadHLS: m3u8ToMP4($filepath) return empty");
die($msg);
}
$outputpath = $output['path'];
$outputfilename = $output['filename'];
if (!empty($_REQUEST['title'])) {
$quoted = sprintf('"%s"', addcslashes(basename($_REQUEST['title']), '"\\'));
} elseif (!empty($_REQUEST['file'])) {
$quoted = sprintf('"%s"', addcslashes(basename($_REQUEST['file']), '"\\')) . ".mp4";
} else {
$quoted = $outputfilename;
}
_error_log("downloadHLS: filepath=($filepath) outputpath={$outputpath}");
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=' . $quoted);
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("X-Sendfile: {$outputpath}");
exit;
}
function playHLSasMP4($filepath)
{
global $global;
if (!CustomizeUser::canDownloadVideos()) {
_error_log("playHLSasMP4: CustomizeUser::canDownloadVideos said NO");
return false;
}
if (!file_exists($filepath)) {
_error_log("playHLSasMP4: file NOT found: {$filepath}");
return false;
}
$output = m3u8ToMP4($filepath);
if (!empty($output['error'])) {
$msg = 'playHLSasMP4 was not possible';
if (User::isAdmin()) {
$msg .= ' ' . "m3u8ToMP4($filepath) return empty " . nl2br($output['msg']);
}
die($msg);
}
$outputpath = $output['path'];
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Content-type: video/mp4');
header('Content-Length: ' . filesize($outputpath));
header("X-Sendfile: {$outputpath}");
exit;
}
function getSocialModal($videos_id, $url = "", $title = "")
{
global $global;
$video['id'] = $videos_id;
$sharingUid = uniqid();
$filePath = $global['systemRootPath'] . 'objects/functionGetSocialModal.php';
$contents = getIncludeFileContent(
$filePath,
[
'videos_id' => $videos_id,
'url' => $url,
'title' => $title,
'video' => $video,
'sharingUid' => $sharingUid
]
);
return ['html' => $contents, 'id' => $sharingUid];
}
function getCroppie(
$buttonTitle,
$callBackJSFunction,
$resultWidth = 0,
$resultHeight = 0,
$viewportWidth = 0,
$boundary = 25,
$viewportHeight = 0,
$enforceBoundary = true
) {
global $global;
if (empty($resultWidth) && empty($resultHeight)) {
if (isMobile()) {
$viewportWidth = 250;
} else {
$viewportWidth = 800;
}
if (defaultIsPortrait()) {
$resultWidth = 540;
$resultHeight = 800;
} else {
$resultWidth = 1280;
$resultHeight = 720;
}
}
if (empty($viewportWidth)) {
$viewportWidth = $resultWidth;
}
$zoom = 0;
if (empty($viewportHeight)) {
$zoom = ($viewportWidth / $resultWidth);
$viewportHeight = $zoom * $resultHeight;
}
if (empty($enforceBoundary)) {
$boundary = 0;
}
$boundaryWidth = $viewportWidth + $boundary;
$boundaryHeight = $viewportHeight + $boundary;
$uid = uniqid();
$varsArray = [
'buttonTitle' => $buttonTitle,
'callBackJSFunction' => $callBackJSFunction,
'resultWidth' => $resultWidth,
'resultHeight' => $resultHeight,
'viewportWidth' => $viewportWidth,
'boundary' => $boundary,
'viewportHeight' => $viewportHeight,
'enforceBoundary' => $enforceBoundary,
'zoom' => $zoom,
'boundaryWidth' => $boundaryWidth,
'boundaryHeight' => $boundaryHeight,
'uid' => $uid,
];
$contents = getIncludeFileContent($global['systemRootPath'] . 'objects/functionCroppie.php', $varsArray);
$callBackJSFunction = addcslashes($callBackJSFunction, "'");
return [
"html" => $contents,
"id" => "croppie{$uid}",
"uploadCropObject" => "uploadCrop{$uid}",
"getCroppieFunction" => "getCroppie(uploadCrop{$uid}, '{$callBackJSFunction}', {$resultWidth}, {$resultHeight});",
"createCroppie" => "createCroppie{$uid}",
"restartCroppie" => "restartCroppie{$uid}",
];
}
function saveCroppieImage($destination, $postIndex = "imgBase64")
{
if (empty($destination) || empty($_POST[$postIndex])) {
return false;
}
$fileData = base64DataToImage($_POST[$postIndex]);
$path_parts = pathinfo($destination);
$tmpDestination = $destination;
$extension = mb_strtolower($path_parts['extension']);
if ($extension !== 'png') {
$tmpDestination = $destination . '.png';
}
$saved = _file_put_contents($tmpDestination, $fileData);
if ($saved) {
if ($extension !== 'png') {
convertImage($tmpDestination, $destination, 100);
unlink($tmpDestination);
}
}
//var_dump($saved, $tmpDestination, $destination, $extension);exit;
return $saved;
}
function get_ffmpeg($ignoreGPU = false)
{
global $global;
$complement = ' -user_agent "' . getSelfUserAgent() . '" ';
//return 'ffmpeg -headers "User-Agent: '.getSelfUserAgent("FFMPEG").'" ';
$ffmpeg = 'ffmpeg ';
if (empty($ignoreGPU) && !empty($global['ffmpegGPU'])) {
$ffmpeg .= ' --enable-nvenc ';
}
if (!empty($global['ffmpeg'])) {
_error_log('get_ffmpeg $global[ffmpeg] detected ' . $global['ffmpeg']);
$ffmpeg = "{$global['ffmpeg']}{$ffmpeg}";
} else {
_error_log('get_ffmpeg default ' . $ffmpeg . $complement);
}
return $ffmpeg . $complement;
}
function removeUserAgentIfNotURL($cmd)
{
if (!preg_match('/ -i [\'"]?https?:/', $cmd)) {
$cmd = preg_replace('/-user_agent "[^"]+"/', '', $cmd);
}
return $cmd;
}
function convertVideoToMP3FileIfNotExists($videos_id)
{
global $global;
if (!empty($global['disableMP3'])) {
return false;
}
$video = Video::getVideoLight($videos_id);
if (empty($video)) {
return false;
}
$types = ['video', 'audio'];
if (!in_array($video['type'], $types)) {
return false;
}
$paths = Video::getPaths($video['filename']);
$mp3File = "{$paths['path']}{$video['filename']}.mp3";
if (!file_exists($mp3File)) {
$sources = getVideosURLOnly($video['filename'], false);
if (!empty($sources)) {
$source = end($sources);
convertVideoFileWithFFMPEG($source['url_noCDN'], $mp3File);
if (file_exists($mp3File)) {
return Video::getSourceFile($video['filename'], ".mp3", true);
}
}
return false;
} else {
return Video::getSourceFile($video['filename'], ".mp3", true);
}
}
function convertVideoFileWithFFMPEG($fromFileLocation, $toFileLocation, $try = 0)
{
$parts = explode('?', $fromFileLocation);
$localFileLock = getCacheDir() . 'convertVideoFileWithFFMPEG_' . md5($parts[0]) . ".lock";
$ageInSeconds = time() - @filemtime($localFileLock);
if ($ageInSeconds > 60) {
_error_log("convertVideoFileWithFFMPEG: age: {$ageInSeconds} too long without change, unlock it " . $fromFileLocation);
@unlink($localFileLock);
} elseif (file_exists($localFileLock)) {
_error_log("convertVideoFileWithFFMPEG: age: {$ageInSeconds} download from CDN There is a process running for " . $fromFileLocation);
return false;
} else {
_error_log("convertVideoFileWithFFMPEG: creating file: localFileLock: {$localFileLock} toFileLocation: {$toFileLocation}");
}
make_path($toFileLocation);
file_put_contents($localFileLock, time());
$fromFileLocationEscaped = escapeshellarg($fromFileLocation);
$toFileLocationEscaped = escapeshellarg($toFileLocation);
$format = pathinfo($toFileLocation, PATHINFO_EXTENSION);
if ($format == 'mp3') {
switch ($try) {
case 0:
$command = get_ffmpeg() . " -i \"{$fromFileLocation}\" -c:a libmp3lame \"{$toFileLocation}\"";
break;
default:
return false;
break;
}
} else {
if ($try === 0 && preg_match('/_offline\.mp4/', $toFileLocation)) {
$try = 'offline';
$fromFileLocationEscaped = "\"$fromFileLocation\"";
$command = get_ffmpeg() . " -i {$fromFileLocationEscaped} -crf 30 {$toFileLocationEscaped}";
} else {
switch ($try) {
case 0:
$command = get_ffmpeg() . " -i {$fromFileLocationEscaped} -c copy {$toFileLocationEscaped}";
break;
case 1:
$command = get_ffmpeg() . " -allowed_extensions ALL -y -i {$fromFileLocationEscaped} -c:v copy -c:a copy -bsf:a aac_adtstoasc -strict -2 {$toFileLocationEscaped}";
break;
case 2:
$command = get_ffmpeg() . " -y -i {$fromFileLocationEscaped} -c:v copy -c:a copy -bsf:a aac_adtstoasc -strict -2 {$toFileLocationEscaped}";
break;
default:
return false;
break;
}
}
}
$progressFile = getConvertVideoFileWithFFMPEGProgressFilename($toFileLocation);
$progressFileEscaped = escapeshellarg($progressFile);
$command .= " 1> {$progressFileEscaped} 2>&1";
$command = removeUserAgentIfNotURL($command);
_error_log("convertVideoFileWithFFMPEG try[{$try}]: " . $command);
_session_write_close();
_mysql_close();
exec($command, $output, $return);
_session_start();
_mysql_connect();
_error_log("convertVideoFileWithFFMPEG try[{$try}] output: " . json_encode($output));
unlink($localFileLock);
return ['return' => $return, 'output' => $output, 'command' => $command, 'fromFileLocation' => $fromFileLocation, 'toFileLocation' => $toFileLocation, 'progressFile' => $progressFile];
}
function m3u8ToMP4($input)
{
$videosDir = getVideosDir();
$outputfilename = str_replace($videosDir, "", $input);
$parts = explode("/", $outputfilename);
$resolution = Video::getResolutionFromFilename($input);
$outputfilename = $parts[0] . "_{$resolution}_.mp4";
$outputpath = "{$videosDir}cache/downloads/{$outputfilename}";
$msg = '';
$error = true;
if (empty($outputfilename)) {
$msg = "downloadHLS: empty outputfilename {$outputfilename}";
_error_log($msg);
return ['error' => $error, 'msg' => $msg];
}
_error_log("downloadHLS: m3u8ToMP4($input)");
//var_dump(!preg_match('/^http/i', $input), filesize($input), preg_match('/.m3u8$/i', $input));
$ism3u8 = preg_match('/.m3u8$/i', $input);
if (!preg_match('/^http/i', $input) && (filesize($input) <= 10 || $ism3u8)) { // dummy file
$filepath = pathToRemoteURL($input, true, true);
if ($ism3u8 && !preg_match('/.m3u8$/i', $filepath)) {
$filepath = addLastSlash($filepath) . 'index.m3u8';
}
$token = getToken(60);
$filepath = addQueryStringParameter($filepath, 'globalToken', $token);
} else {
$filepath = escapeshellcmd($input);
}
if (is_dir($filepath)) {
$filepath = addLastSlash($filepath) . 'index.m3u8';
}
if (!file_exists($outputpath)) {
//var_dump('m3u8ToMP4 !file_exists', $filepath, $outputpath);
//exit;
$return = convertVideoFileWithFFMPEG($filepath, $outputpath);
//var_dump($return);
//exit;
if (empty($return)) {
$msg3 = "downloadHLS: ERROR 2 ";
$finalMsg = $msg . PHP_EOL . $msg3;
_error_log($msg3);
return ['error' => $error, 'msg' => $finalMsg];
} else {
return $return;
}
} else {
$msg = "downloadHLS: outputpath already exists ({$outputpath})";
_error_log($msg);
}
$error = false;
return ['error' => $error, 'msg' => $msg, 'path' => $outputpath, 'filename' => $outputfilename];
}
function getConvertVideoFileWithFFMPEGProgressFilename($toFileLocation)
{
$progressFile = $toFileLocation . '.log';
return $progressFile;
}
function convertVideoToDownlaodProgress($toFileLocation)
{
$progressFile = getConvertVideoFileWithFFMPEGProgressFilename($toFileLocation);
return parseFFMPEGProgress($progressFile);
}
function getPHP()
{
global $global;
if (!empty($global['php'])) {
$php = $global['php'];
if (file_exists($php)) {
return $php;
}
}
$php = PHP_BINDIR . "/php";
if (file_exists($php)) {
return $php;
}
return get_php();
}
function get_php()
{
return getPHP();
}
function isHTMLPage($url)
{
if (preg_match('/https?:\/\/(www\.)?(youtu.be|youtube.com|vimeo.com|bitchute.com)\//i', $url)) {
return true;
} elseif ($type = getHeaderContentTypeFromURL($url)) {
if (preg_match('/text\/html/i', $type)) {
return true;
}
}
return false;
}
function url_exists($url)
{
global $global;
if (preg_match('/^https?:\/\//i', $url)) {
$parts = explode('/videos/', $url);
if (!empty($parts[1])) {
$tryFile = "{$global['systemRootPath']}videos/{$parts[1]}";
//_error_log("try_get_contents_from_local {$url} => {$tryFile}");
if (file_exists($tryFile)) {
return $tryFile;
}
}
$file_headers = get_headers($url);
if (empty($file_headers)) {
_error_log("url_exists($url) empty headers");
return false;
} else {
foreach ($file_headers as $value) {
if (preg_match('/404 Not Found/i', $value)) {
_error_log("url_exists($url) 404 {$value}");
return false;
}
}
return true;
}
} else {
$exists = file_exists($url);
if ($exists == false) {
_error_log("url_exists($url) local file do not exists");
}
return $exists;
}
}
function getHeaderContentTypeFromURL($url)
{
if (isValidURL($url) && $type = get_headers($url, 1)["Content-Type"]) {
return $type;
}
return false;
}
function canFullScreen()
{
global $doNotFullScreen;
if (!empty($doNotFullScreen) || isSerie() || !isVideo()) {
return false;
}
return true;
}
function getTinyMCE($id, $simpleMode = false)
{
global $global;
$contents = getIncludeFileContent($global['systemRootPath'] . 'objects/functionsGetTinyMCE.php', ['id' => $id, 'simpleMode' => $simpleMode]);
return $contents;
}
function pathToRemoteURL($filename, $forceHTTP = false, $ignoreCDN = false)
{
global $pathToRemoteURL, $global;
if (!isset($pathToRemoteURL)) {
$pathToRemoteURL = [];
}
if (isset($pathToRemoteURL[$filename])) {
return $pathToRemoteURL[$filename];
}
if (!file_exists($filename) || filesize($filename) < 1000) {
$fileName = getFilenameFromPath($filename);
//var_dump($fileName);exit;
if ($yptStorage = AVideoPlugin::loadPluginIfEnabled("YPTStorage")) {
$source = $yptStorage->getAddress("{$fileName}");
$url = $source['url'];
} elseif (!preg_match('/index.m3u8$/', $filename)) {
if ($aws_s3 = AVideoPlugin::loadPluginIfEnabled("AWS_S3")) {
$source = $aws_s3->getAddress("{$fileName}");
$url = $source['url'];
if (empty($ignoreCDN)) {
$url = replaceCDNIfNeed($url, 'CDN_S3');
} elseif (!empty($source['url_noCDN'])) {
$url = $source['url_noCDN'];
}
} elseif ($bb_b2 = AVideoPlugin::loadPluginIfEnabled("Blackblaze_B2")) {
$source = $bb_b2->getAddress("{$fileName}");
$url = $source['url'];
if (empty($ignoreCDN)) {
$url = replaceCDNIfNeed($url, 'CDN_B2');
} elseif (!empty($source['url_noCDN'])) {
$url = $source['url_noCDN'];
}
} elseif ($ftp = AVideoPlugin::loadPluginIfEnabled("FTP_Storage")) {
$source = $ftp->getAddress("{$fileName}");
$url = $source['url'];
//var_dump($source,$fileName, $filename);exit;
if (empty($ignoreCDN)) {
$url = replaceCDNIfNeed($url, 'CDN_FTP');
} elseif (!empty($source['url_noCDN'])) {
$url = $source['url_noCDN'];
}
}
}
}
if (empty($url)) {
if ($forceHTTP) {
$paths = Video::getPaths($filename);
//$url = str_replace(getVideosDir(), getCDN() . "videos/", $filename);
if (empty($ignoreCDN)) {
$url = getCDN() . "{$paths['relative']}";
} else {
$url = "{$global['webSiteRootURL']}{$paths['relative']}";
}
if (preg_match('/index.m3u8$/', $filename) && !preg_match('/index.m3u8$/', $url)) {
$url .= 'index.m3u8';
}
} else {
$url = $filename;
}
}
//$url = str_replace(array($global['systemRootPath'], '/videos/videos/'), array("", '/videos/'), $url);
$pathToRemoteURL[$filename] = $url;
return $url;
}
function getFilenameFromPath($path)
{
global $global;
$fileName = Video::getCleanFilenameFromFile($path);
return $fileName;
}
function showCloseButton()
{
global $global, $showCloseButtonIncluded;
if (!empty($showCloseButtonIncluded)) {
return '';
}
if (isSerie()) {
return '';
}
if (!isLive() && $obj = AVideoPlugin::getDataObjectIfEnabled("Gallery")) {
if (!empty($obj->playVideoOnFullscreen)) {
$_REQUEST['showCloseButton'] = 1;
}
}
if (isLive() && $obj = AVideoPlugin::getDataObjectIfEnabled("Live")) {
if (!empty($obj->playLiveInFullScreen)) {
$_REQUEST['showCloseButton'] = 1;
}
}
if (!empty($_REQUEST['showCloseButton'])) {
$showCloseButtonIncluded = 1;
include $global['systemRootPath'] . 'view/include/youtubeModeOnFullscreenCloseButton.php';
}
return '';
}
function getThemes()
{
global $_getThemes, $global;
if (isset($_getThemes)) {
return $_getThemes;
}
$_getThemes = [];
foreach (glob("{$global['systemRootPath']}view/css/custom/*.css") as $filename) {
$fileEx = basename($filename, ".css");
$_getThemes[] = $fileEx;
}
return $_getThemes;
}
function getCurrentTheme()
{
global $config;
if (!empty($_REQUEST['customCSS'])) {
_setcookie('customCSS', $_REQUEST['customCSS']);
return $_REQUEST['customCSS'];
}
if (!empty($_COOKIE['customCSS'])) {
return $_COOKIE['customCSS'];
}
return $config->getTheme();
}
/*
* $users_id="" or 0 means send messages to all users
* $users_id="-1" means send to no one
*/
function sendSocketMessage($msg, $callbackJSFunction = "", $users_id = "-1", $send_to_uri_pattern = "", $try = 0)
{
if (AVideoPlugin::isEnabledByName('YPTSocket')) {
if (!is_string($msg)) {
$msg = json_encode($msg);
}
try {
$obj = YPTSocket::send($msg, $callbackJSFunction, $users_id, $send_to_uri_pattern);
} catch (Exception $exc) {
if ($try < 3) {
sleep(1);
_error_log("sendSocketMessage try agaion [$try]" . $exc->getMessage());
$obj = sendSocketMessage($msg, $callbackJSFunction, $users_id, $send_to_uri_pattern, $try + 1);
} else {
$obj = new stdClass();
$obj->error = true;
$obj->msg = $exc->getMessage();
}
}
if ($obj->error && !empty($obj->msg)) {
_error_log("sendSocketMessage " . $obj->msg);
}
return $obj;
}
return false;
}
function sendSocketMessageToUsers_id($msg, $users_id, $callbackJSFunction = "")
{
if (empty($users_id)) {
return false;
}
_error_log("sendSocketMessageToUsers_id start " . json_encode($users_id));
if (!is_array($users_id)) {
$users_id = [$users_id];
}
$resp = [];
foreach ($users_id as $value) {
$resp[] = sendSocketMessage($msg, $callbackJSFunction, $value);
}
return $resp;
}
function sendSocketErrorMessageToUsers_id($msg, $users_id, $callbackJSFunction = "avideoResponse")
{
$newMessage = new stdClass();
$newMessage->error = true;
$newMessage->msg = $msg;
return sendSocketMessageToUsers_id($newMessage, $users_id, $callbackJSFunction);
}
function sendSocketSuccessMessageToUsers_id($msg, $users_id, $callbackJSFunction = "avideoResponse")
{
$newMessage = new stdClass();
$newMessage->error = false;
$newMessage->msg = $msg;
return sendSocketMessageToUsers_id($newMessage, $users_id, $callbackJSFunction);
}
function sendSocketMessageToAll($msg, $callbackJSFunction = "", $send_to_uri_pattern = "")
{
return sendSocketMessage($msg, $callbackJSFunction, "", $send_to_uri_pattern);
}
function sendSocketMessageToNone($msg, $callbackJSFunction = "")
{
return sendSocketMessage($msg, $callbackJSFunction, -1);
}
function execAsync($command)
{
//$command = escapeshellarg($command);
// If windows, else
if (isWindows()) {
//echo $command;
//$pid = system("start /min ".$command. " > NUL");
//$commandString = "start /B " . $command;
//pclose($pid = popen($commandString, "r"));
_error_log($command);
$pid = exec($command, $output, $retval);
_error_log('execAsync Win: ' . json_encode($output) . ' ' . $retval);
} else {
$newCommand = $command . " > /dev/null 2>&1 & echo $!; ";
_error_log('execAsync Linux: ' . $newCommand);
$pid = exec($newCommand);
}
return $pid;
}
function killProcess($pid)
{
$pid = intval($pid);
if (empty($pid)) {
return false;
}
if (isWindows()) {
exec("taskkill /F /PID $pid");
} else {
exec("kill -9 $pid");
}
return true;
}
function isWindows()
{
return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
}
function getPIDUsingPort($port)
{
$port = intval($port);
if (empty($port)) {
return false;
}
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
$command = 'netstat -ano | findstr ' . $port;
exec($command, $output, $retval);
$pid = 0;
foreach ($output as $value) {
if (preg_match('/LISTENING[^0-9]+([0-9]+)/i', $value, $matches)) {
if (!empty($matches[1])) {
$pid = intval($matches[1]);
return $pid;
}
}
}
} else {
$command = 'lsof -n -i :' . $port . ' | grep LISTEN';
exec($command, $output, $retval);
$pid = 0;
foreach ($output as $value) {
if (preg_match('/[^ ] +([0-9]+).*/i', $value, $matches)) {
if (!empty($matches[1])) {
$pid = intval($matches[1]);
return $pid;
}
} elseif (preg_match('/lsof: not found/i', $value)) {
die('Please install lsof running this command: "sudo apt-get install lsof"');
}
}
}
return false;
}
function isURL200($url, $forceRecheck = false)
{
global $_isURL200;
$name = "isURL200" . DIRECTORY_SEPARATOR . md5($url);
if (empty($forceRecheck)) {
$result = ObjectYPT::getCacheGlobal($name, 30);
if (!empty($result)) {
$object = _json_decode($result);
return $object->result;
}
}
$object = new stdClass();
$object->url = $url;
$object->forceRecheck = $forceRecheck;
//error_log("isURL200 checking URL {$url}");
$headers = @get_headers($url);
if (!is_array($headers)) {
$headers = [$headers];
}
$object->result = false;
foreach ($headers as $value) {
if (
strpos($value, '200') ||
strpos($value, '302') ||
strpos($value, '304')
) {
$object->result = true;
break;
} else {
//_error_log('isURL200: '.$value);
}
}
ObjectYPT::setCacheGlobal($name, json_encode($object));
return $object->result;
}
function isURL200Clear()
{
$tmpDir = ObjectYPT::getCacheDir();
$cacheDir = $tmpDir . "isURL200" . DIRECTORY_SEPARATOR;
_error_log('isURL200Clear: ' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
rrmdir($cacheDir);
}
function deleteStatsNotifications($clearFirstPage = false)
{
Live::deleteStatsCache($clearFirstPage);
$cacheName = "getStats" . DIRECTORY_SEPARATOR . "getStatsNotifications";
ObjectYPT::deleteCache($cacheName);
}
function getLiveVideosFromUsers_id($users_id)
{
$videos = [];
if (!empty($users_id)) {
$stats = getStatsNotifications();
foreach ($stats["applications"] as $key => $value) {
if (empty($value['users_id']) || $users_id != $value['users_id']) {
if (!empty($_REQUEST['debug'])) {
_error_log("getLiveVideosFromUsers_id($users_id) != {$value['users_id']}");
}
continue;
}
$videos[] = getLiveVideosObject($value);
}
}
//var_dump($videos);exit;
return $videos;
}
function getLiveVideosObject($application)
{
foreach ($application as $key => $application2) {
if (preg_match('/^html/i', $key)) {
unset($application[$key]);
}
}
$description = '';
if (!empty($application['liveLinks_id'])) {
$ll = new LiveLinksTable($application['liveLinks_id']);
$m3u8 = $ll->getLink();
$description = $ll->getDescription();
} elseif (!empty($application['key'])) {
$m3u8 = Live::getM3U8File($application['key']);
$lt = LiveTransmition::getFromKey($application['key']);
$description = $lt['description'];
} else {
$m3u8 = '';
}
$user = new User($application['users_id']);
$cat = new Category($application['categories_id']);
$video = [
'id' => intval(rand(999999, 9999999)),
'isLive' => 1,
'categories_id' => $application['categories_id'],
'description' => $description,
'user' => $user->getUser(),
'name' => $user->getName(),
'email' => $user->getEmail(),
'isAdmin' => $user->getIsAdmin(),
'photoURL' => $user->getPhotoURL(),
'canStream' => $user->getCanStream(),
'canUpload' => $user->getCanUpload(),
'channelName' => $user->getChannelName(),
'emailVerified' => $user->getEmailVerified(),
'views_count' => 0,
'rrating' => "",
'users_id' => $application['users_id'],
'type' => 'ready',
'title' => $application['title'],
'clean_title' => cleanURLName($application['title']),
'poster' => @$application['poster'],
'thumbsJpgSmall' => @$application['poster'],
'href' => @$application['href'],
'link' => @$application['link'],
'imgGif' => @$application['imgGif'],
'className' => @$application['className'],
'galleryCallback' => @$application['callback'],
'stats' => $application,
'embedlink' => addQueryStringParameter($application['href'], 'embed', 1),
'images' => [
"poster" => @$application['poster'],
"posterPortrait" => @$application['poster'],
"posterPortraitPath" => @$application['poster'],
"posterPortraitThumbs" => @$application['poster'],
"posterPortraitThumbsSmall" => @$application['poster'],
"thumbsGif" => @$application['imgGif'],
"gifPortrait" => @$application['imgGif'],
"thumbsJpg" => @$application['poster'],
"thumbsJpgSmall" => @$application['poster'],
"spectrumSource" => false,
"posterLandscape" => @$application['poster'],
"posterLandscapePath" => @$application['poster'],
"posterLandscapeThumbs" => @$application['poster'],
"posterLandscapeThumbsSmall" => @$application['poster']
],
'videos' => [
"m3u8" => [
"url" => $m3u8,
"url_noCDN" => $m3u8,
"type" => "video",
"format" => "m3u8",
"resolution" => "auto"
]
],
'Poster' => @$application['poster'],
'Thumbnail' => @$application['poster'],
'createdHumanTiming' => 'Live',
"videoLink" => "",
"next_videos_id" => null,
"isSuggested" => 0,
"trailer1" => "",
"trailer2" => "",
"trailer3" => "",
"total_seconds_watching" => 0,
"duration" => 'Live',
"type" => 'Live',
"duration_in_seconds" => 0,
"likes" => 0,
"dislikes" => 0,
"users_id_company" => null,
"iconClass" => $cat->getIconClass(),
"category" => $cat->getName(),
"clean_category" => $cat->getClean_name(),
"category_description" => $cat->getDescription(),
"videoCreation" => date('Y-m-d H:i:s'),
"videoModified" => date('Y-m-d H:i:s'),
"groups" => [],
"tags" => [],
"videoTags" => [
[
"type_name" => "Starring",
"name" => ""
],
[
"type_name" => "Language",
"name" => "English"
],
[
"type_name" => "Release_Date",
"name" => date('Y')
],
[
"type_name" => "Running_Time",
"name" => ""
],
[
"type_name" => "Genres",
"name" => $cat->getName()
]
],
"videoTagsObject" => ['Starring' => [], 'Language' => ["English"], 'Release_Date' => [date('Y')], 'Running_Time' => ['0'], 'Genres' => [$cat->getName()]],
'descriptionHTML' => '',
"progress" => [
"percent" => 0,
"lastVideoTime" => 0
],
"isFavorite" => null,
"isWatchLater" => null,
"favoriteId" => null,
"watchLaterId" => null,
"total_seconds_watching_human" => "",
"views_count_short" => "",
"identification" => $user->getNameIdentificationBd(),
"UserPhoto" => $user->getPhotoURL(),
"isSubscribed" => true,
"subtitles" => [],
"subtitlesSRT" => [],
"comments" => [],
"commentsTotal" => 0,
"subscribers" => 1,
'relatedVideos' => [],
"wwbnURL" => @$application['href'],
"wwbnEmbedURL" => addQueryStringParameter($application['href'], 'embed', 1),
"wwbnImgThumbnail" => @$application['poster'],
"wwbnImgPoster" => @$application['poster'],
"wwbnTitle" => $application['title'],
"wwbnDescription" => '',
"wwbnChannelURL" => $user->getChannelLink(),
"wwbnImgChannel" => $user->getPhoto(),
"wwbnType" => "live",
];
//var_dump($videos);exit;
return $video;
}
function getLiveVideosFromCategory($categories_id)
{
$stats = getStatsNotifications();
$videos = [];
if (!empty($categories_id)) {
foreach ($stats["applications"] as $key => $value) {
if (empty($value['categories_id']) || $categories_id != $value['categories_id']) {
continue;
}
$videos[] = getLiveVideosObject($value);
}
}
//var_dump($videos);exit;
return $videos;
}
function getStatsNotifications($force_recreate = false, $listItIfIsAdminOrOwner = true)
{
$timeName = "stats.json.php getStatsNotifications";
TimeLogStart($timeName);
global $__getStatsNotifications__;
$isLiveEnabled = AVideoPlugin::isEnabledByName('Live');
$cacheName = "getStats" . DIRECTORY_SEPARATOR . "getStatsNotifications";
unset($_POST['sort']);
if ($force_recreate) {
if ($isLiveEnabled) {
deleteStatsNotifications();
TimeLogEnd($timeName, __LINE__);
}
} else {
if (!empty($__getStatsNotifications__)) {
return $__getStatsNotifications__;
}
TimeLogEnd($timeName, __LINE__);
$json = ObjectYPT::getCache($cacheName, 0, true);
TimeLogEnd($timeName, __LINE__);
/*
$cachefile = ObjectYPT::getCacheFileName($cacheName, false, $addSubDirs);
$cache = Cache::getCache($cacheName, $lifetime, $ignoreMetadata);
$c = @url_get_contents($cachefile);
var_dump($cachefile, $cache, $c);exit;
*/
}
TimeLogEnd($timeName, __LINE__);
if ($isLiveEnabled && (empty($json) || !empty($json->error) || !isset($json->error))) {
//_error_log('getStatsNotifications: 1 ' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)));
$json = Live::getStats();
TimeLogEnd($timeName, __LINE__);
$json = object_to_array($json);
TimeLogEnd($timeName, __LINE__);
// make sure all the applications are listed on the same array, even from different live servers
if (empty($json['applications']) && is_array($json)) {
$oldjson = $json;
$json = [];
$json['applications'] = [];
$json['hidden_applications'] = [];
foreach ($oldjson as $key => $value) {
if (!empty($value['applications'])) {
$json['applications'] = array_merge($json['applications'], $value['applications']);
}
if (!empty($value['hidden_applications'])) {
$json['hidden_applications'] = array_merge($json['hidden_applications'], $value['hidden_applications']);
}
unset($json[$key]);
}
TimeLogEnd($timeName, __LINE__);
}
TimeLogEnd($timeName, __LINE__);
$appArray = AVideoPlugin::getLiveApplicationArray();
TimeLogEnd($timeName, __LINE__);
if (!empty($appArray)) {
if (empty($json)) {
$json = [];
}
$json['error'] = false;
if (empty($json['msg'])) {
$json['msg'] = "OFFLINE";
}
$json['nclients'] = count($appArray);
if (empty($json['applications'])) {
$json['applications'] = [];
}
$json['applications'] = array_merge($json['applications'], $appArray);
}
TimeLogEnd($timeName, __LINE__);
$count = 0;
if (!isset($json['total'])) {
$json['total'] = 0;
}
if (!empty($json['applications'])) {
$json['total'] += count($json['applications']);
}
while (!empty($json[$count])) {
$json['total'] += count($json[$count]['applications']);
$count++;
}
if (!empty($json['applications'])) {
$applications = [];
foreach ($json['applications'] as $key => $value) {
// remove duplicated
if (!is_array($value) || empty($value['href']) || in_array($value['href'], $applications)) {
unset($json['applications'][$key]);
continue;
}
$applications[] = $value['href'];
if (empty($value['users_id']) && !empty($value['user'])) {
$u = User::getFromUsername($value['user']);
$json['applications'][$key]['users_id'] = $u['id'];
}
}
}
TimeLogEnd($timeName, __LINE__);
$cache = ObjectYPT::setCache($cacheName, $json);
TimeLogEnd($timeName, __LINE__);
Live::unfinishAllFromStats();
TimeLogEnd($timeName, __LINE__);
//_error_log('Live::createStatsCache ' . json_encode($cache));
} else {
//_error_log('getStatsNotifications: 2 cached result');
$json = object_to_array($json);
}
TimeLogEnd($timeName, __LINE__);
if (empty($json['applications'])) {
$json['applications'] = [];
}
TimeLogEnd($timeName, __LINE__);
foreach ($json['applications'] as $key => $value) {
if (!Live::isApplicationListed(@$value['key'], $listItIfIsAdminOrOwner)) {
$json['hidden_applications'][] = $value;
unset($json['applications'][$key]);
}
}
TimeLogEnd($timeName, __LINE__);
if (!empty($json['applications']) && is_array($json['applications'])) {
$json['countLiveStream'] = count($json['applications']);
} else {
$json['countLiveStream'] = 0;
}
TimeLogEnd($timeName, __LINE__);
$json['timezone'] = date_default_timezone_get();
$__getStatsNotifications__ = $json;
TimeLogEnd($timeName, __LINE__);
return $json;
}
function getSocketConnectionLabel()
{
$html = '
' . __('Disconnected') . '
' . __('Connected') . '
';
return $html;
}
function getSocketVideoClassName($videos_id)
{
return 'total_on_videos_id_' . $videos_id;
}
function getSocketLiveClassName($key, $live_servers_id)
{
return 'total_on_live_' . $key . '_' . intval($live_servers_id);
}
function getSocketLiveLinksClassName($live_links_id)
{
return 'total_on_live_links_id_' . $live_links_id;
}
function getLiveUsersLabelVideo($videos_id, $totalViews = null, $viewsClass = "label label-default", $counterClass = "label label-primary")
{
global $global;
$label = '';
if (AVideoPlugin::isEnabledByName('LiveUsers') && method_exists("LiveUsers", "getLabels")) {
$label .= LiveUsers::getLabels(getSocketVideoClassName($videos_id), $totalViews, $viewsClass, $counterClass, 'video');
}
return $label;
}
function getLiveUsersLabelLive($key, $live_servers_id, $viewsClass = "label label-default", $counterClass = "label label-primary")
{
if (AVideoPlugin::isEnabledByName('LiveUsers') && method_exists("LiveUsers", "getLabels")) {
$totalViews = LiveUsers::getTotalUsers($key, $live_servers_id);
return LiveUsers::getLabels(getSocketLiveClassName($key, $live_servers_id), $totalViews, $viewsClass, $counterClass, 'live');
}
}
function getLiveUsersLabelLiveLinks($liveLinks_id, $totalViews = null, $viewsClass = "label label-default", $counterClass = "label label-primary")
{
if (AVideoPlugin::isEnabledByName('LiveUsers') && method_exists("LiveUsers", "getWatchingNowLabel")) {
return LiveUsers::getWatchingNowLabel(getSocketLiveLinksClassName($liveLinks_id), "label label-primary", '', $viewsClass, 'livelinks');
}
}
function getLiveUsersLabel($viewsClass = "label label-default", $counterClass = "label label-primary")
{
if (empty($_REQUEST['disableLiveUsers']) && AVideoPlugin::isEnabledByName('LiveUsers')) {
$live = isLive();
if (!empty($live)) {
if (!empty($live['key'])) {
return getLiveUsersLabelLive($live['key'], $live['live_servers_id'], $viewsClass, $counterClass);
} elseif (!empty($live['liveLinks_id'])) {
return getLiveUsersLabelLiveLinks($live['liveLinks_id'], null, $viewsClass, $counterClass);
}
} else {
$videos_id = getVideos_id();
if (!empty($videos_id)) {
$v = new Video("", "", $videos_id);
$totalViews = $v->getViews_count();
return getLiveUsersLabelVideo($videos_id, $totalViews, $viewsClass, $counterClass);
}
}
}
return "";
}
function getLiveUsersLabelHTML($viewsClass = "label label-default", $counterClass = "label label-primary")
{
global $global, $_getLiveUsersLabelHTML;
if (!empty($_getLiveUsersLabelHTML)) {
return '';
}
$_getLiveUsersLabelHTML = 1;
$htmlMediaTag = '';
$htmlMediaTag .= '';
$htmlMediaTag .= getIncludeFileContent($global['systemRootPath'] . 'plugin/Live/view/onlineLabel.php', ['viewsClass' => $viewsClass, 'counterClass' => $counterClass]);
$htmlMediaTag .= getLiveUsersLabel($viewsClass, $counterClass);
$htmlMediaTag .= '
';
return $htmlMediaTag;
}
function getHTMLTitle($titleArray)
{
global $config, $global;
if (!is_array($titleArray)) {
$titleArray = [];
}
$titleArray[] = $config->getWebSiteTitle();
$title = implode($config->getPageTitleSeparator(), $titleArray);
$global['pageTitle'] = $title;
return "{$title} ";
}
function getButtonSignInAndUp()
{
$signIn = getButtonSignIn();
$signUp = getButtonSignUp();
$html = $signIn . $signUp;
if (!empty($signIn) && !empty($signIn)) {
return '' . $html . '
';
} else {
return $html;
}
}
function getButtonSignUp()
{
global $global;
$obj = AVideoPlugin::getDataObject('CustomizeUser');
if (!empty($obj->disableNativeSignUp)) {
return '';
}
$url = $global['webSiteRootURL'] . 'signUp';
$url = addQueryStringParameter($url, 'redirectUri', getRedirectUri());
$html = ' ' . __("Sign Up") . ' ';
return $html;
}
function getButtonSignIn()
{
global $global;
$obj = AVideoPlugin::getDataObject('CustomizeUser');
if (!empty($obj->disableNativeSignIn)) {
return '';
}
$url = $global['webSiteRootURL'] . 'user';
$url = addQueryStringParameter($url, 'redirectUri', getRedirectUri());
$html = ' ' . __("Sign In") . ' ';
return $html;
}
function getTitle()
{
global $global;
if (empty($global['pageTitle'])) {
$url = getSelfURI();
$global['pageTitle'] = str_replace($global['webSiteRootURL'], '', $url);
if (preg_match('/\/plugin\/([^\/])/i', $url, $matches)) {
$global['pageTitle'] = __('Plugin') . ' ' . __($matches[1]);
}
$title = $global['pageTitle'];
}
return $global['pageTitle'];
}
function outputAndContinueInBackground($msg = '')
{
global $outputAndContinueInBackground;
if (!empty($outputAndContinueInBackground)) {
return false;
}
$outputAndContinueInBackground = 1;
@_session_write_close();
//_mysql_close();
// Instruct PHP to continue execution
ignore_user_abort(true);
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
_ob_start();
echo $msg;
@header("Connection: close");
@header("Content-Length: " . ob_get_length());
@header("HTTP/1.1 200 OK");
ob_end_flush();
flush();
}
function cleanUpRowFromDatabase($row)
{
if (is_array($row)) {
foreach ($row as $key => $value) {
if (preg_match('/pass/i', $key)) {
unset($row[$key]);
}
}
}
return $row;
}
function getImageTransparent1pxURL()
{
global $global;
return getURL("view/img/transparent1px.png");
}
function getDatabaseTime()
{
global $global, $_getDatabaseTime;
if (isset($_getDatabaseTime)) {
return $_getDatabaseTime;
}
$sql = "SELECT CURRENT_TIMESTAMP";
$res = sqlDAL::readSql($sql);
$data = sqlDAL::fetchAssoc($res);
sqlDAL::close($res);
if ($res) {
$row = $data;
} else {
$row = false;
}
$_getDatabaseTime = strtotime($row['CURRENT_TIMESTAMP']);
return $_getDatabaseTime;
}
function fixTimezone($timezone)
{
$known_abbreviations = [
'PDT' => 'America/Los_Angeles',
'PST' => 'America/Los_Angeles',
'EDT' => 'America/New_York',
'EST' => 'America/New_York',
'CDT' => 'America/Chicago',
'CST' => 'America/Chicago',
'CEST' => 'Europe/Madrid',
'Etc/UTC' => 'America/Los_Angeles',
//'UTC' => 'America/Los_Angeles'
];
// If the timezone is a known abbreviation, replace it
if (array_key_exists($timezone, $known_abbreviations)) {
$timezone = $known_abbreviations[$timezone];
}
// If the timezone is not a valid identifier, default to 'UTC'
if (!in_array($timezone, timezone_identifiers_list())) {
$timezone = 'America/Los_Angeles';
}
return $timezone;
}
function getSystemTimezone()
{
global $global, $_getSystemTimezoneName;
if (isset($_getSystemTimezoneName)) {
return $_getSystemTimezoneName;
}
if (isWindows()) {
$cmd = 'tzutil /g';
} else {
$cmd = 'cat /etc/timezone';
}
$_getDatabaseTimezoneName = trim(preg_replace('/[^a-z0-9_ \/-]+/si', '', shell_exec($cmd)));
$_getDatabaseTimezoneName = fixTimezone($_getDatabaseTimezoneName);
return $_getDatabaseTimezoneName;
}
function getDatabaseTimezoneName()
{
global $global, $_getDatabaseTimezoneName;
if (isset($_getDatabaseTimezoneName)) {
return $_getDatabaseTimezoneName;
}
$sql = "SELECT @@system_time_zone as time_zone";
$res = sqlDAL::readSql($sql);
$data = sqlDAL::fetchAssoc($res);
sqlDAL::close($res);
if ($res) {
$_getDatabaseTimezoneName = $data['time_zone'];
} else {
$_getDatabaseTimezoneName = false;
}
$_getDatabaseTimezoneName = fixTimezone($_getDatabaseTimezoneName);
return $_getDatabaseTimezoneName;
}
function get_js_availableLangs()
{
global $global;
if (empty($global['js_availableLangs'])) {
include_once $global['systemRootPath'] . 'objects/bcp47.php';
}
return $global['js_availableLangs'];
}
function listAllWordsToTranslate()
{
global $global;
$cacheName = 'listAllWordsToTranslate';
$cache = ObjectYPT::getCache($cacheName, 0);
if (!empty($cache)) {
return object_to_array($cache);
}
ini_set('max_execution_time', 300);
function listAll($dir)
{
$vars = [];
if (preg_match('/vendor.*$/', $dir)) {
return $vars;
}
//echo $dir.' ';
if ($handle = opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry !== '.' && $entry !== '..') {
$filename = ($dir) . DIRECTORY_SEPARATOR . $entry;
if (is_dir($filename)) {
$vars_dir = listAll($filename);
$vars = array_merge($vars, $vars_dir);
} elseif (preg_match("/\.php$/", $entry)) {
//echo $entry.PHP_EOL;
$data = file_get_contents($filename);
$regex = '/__\(["\']{1}(.*)["\']{1}\)/U';
preg_match_all(
$regex,
$data,
$matches
);
foreach ($matches[0] as $key => $value) {
$vars[$matches[1][$key]] = $matches[1][$key];
}
}
}
}
closedir($handle);
}
return $vars;
}
$vars1 = listAll($global['systemRootPath'] . 'plugin');
//var_dump($vars1);exit;
$vars2 = listAll($global['systemRootPath'] . 'view');
//var_dump($vars2);exit;
$vars3 = listAll($global['systemRootPath'] . 'objects');
$vars = array_merge($vars1, $vars2, $vars3);
sort($vars);
ObjectYPT::setCache($cacheName, $vars);
return $vars;
}
function secondsInterval($time1, $time2)
{
if (!isset($time1) || !isset($time2)) {
return 0;
}
if (!is_numeric($time1)) {
$time1 = strtotime($time1);
}
if (!is_numeric($time2)) {
$time2 = strtotime($time2);
}
return $time1 - $time2;
}
function secondsIntervalHuman($time, $useDatabaseTime = true)
{
$dif = secondsIntervalFromNow($time, $useDatabaseTime);
if ($dif < 0) {
return humanTimingAfterwards($time, 0, $useDatabaseTime);
} else {
return humanTimingAgo($time, 0, $useDatabaseTime);
}
}
function isTimeForFuture($time, $useDatabaseTime = true)
{
$dif = secondsIntervalFromNow($time, $useDatabaseTime);
if ($dif < 0) {
return true;
} else {
return false;
}
}
function secondsIntervalFromNow($time, $useDatabaseTimeOrTimezoneString = true)
{
$timeNow = time();
//var_dump($time, $useDatabaseTimeOrTimezoneString);
if (!empty($useDatabaseTimeOrTimezoneString)) {
if (is_numeric($useDatabaseTimeOrTimezoneString) || is_bool($useDatabaseTimeOrTimezoneString)) {
//echo $time . '-' . __LINE__ . '=>';
$timeNow = getDatabaseTime();
} elseif (is_string($useDatabaseTimeOrTimezoneString)) {
//echo '-' . __LINE__ . PHP_EOL . PHP_EOL;
$timeNow = getTimeInTimezone($timeNow, $useDatabaseTimeOrTimezoneString);
}
}
return secondsInterval($timeNow, $time);
}
function getScriptRunMicrotimeInSeconds()
{
global $global;
$time_now = microtime(true);
return ($time_now - $global['avideoStartMicrotime']);
}
function fixSystemPath()
{
global $global;
$global['systemRootPath'] = fixPath($global['systemRootPath']);
}
function fixPath($path, $addLastSlash = false)
{
if (empty($path)) {
return false;
}
if (isWindows()) {
$path = str_replace('/', DIRECTORY_SEPARATOR, $path);
$path = str_replace('\\\\\\', DIRECTORY_SEPARATOR, $path);
} else {
$path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
}
if ($addLastSlash) {
$path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
}
return $path;
}
if (false) {
function openssl_cipher_key_length()
{
return 0;
}
}
function getHashMethodsAndInfo()
{
global $global, $_getHashMethod;
if (empty($_getHashMethod)) {
if (empty($global['salt'])) {
$global['salt'] = '11234567890abcdef';
}
$saltMD5 = md5($global['salt']);
if (!empty($global['useLongHash'])) {
$base = 2;
$cipher_algo = 'des';
} else {
$base = 32;
$cipher_algo = 'rc4';
}
$cipher_methods = openssl_get_cipher_methods();
if (!in_array($cipher_algo, $cipher_methods)) {
$base = 32;
$cipher_algo = $cipher_methods[0];
}
$ivlen = openssl_cipher_iv_length($cipher_algo);
if (function_exists('openssl_cipher_key_length')) {
$keylen = openssl_cipher_key_length($cipher_algo);
} else {
$keylen = $ivlen;
}
$iv = substr($saltMD5, 0, $ivlen);
$key = substr($saltMD5, 0, $keylen);
$_getHashMethod = ['cipher_algo' => $cipher_algo, 'iv' => $iv, 'key' => $key, 'base' => $base, 'salt' => $global['salt']];
}
return $_getHashMethod;
}
function idToHash($id)
{
global $global, $_idToHash;
if (!isset($_idToHash)) {
$_idToHash = [];
}
if (!empty($_idToHash[$id])) {
return $_idToHash[$id];
}
$MethodsAndInfo = getHashMethodsAndInfo();
$cipher_algo = $MethodsAndInfo['cipher_algo'];
$iv = $MethodsAndInfo['iv'];
$key = $MethodsAndInfo['key'];
$base = $MethodsAndInfo['base'];
$idConverted = base_convert($id, 10, $base);
$hash = (@openssl_encrypt($idConverted, $cipher_algo, $key, 0, $iv));
//$hash = preg_replace('/^([+]+)/', '', $hash);
$hash = preg_replace('/(=+)$/', '', $hash);
$hash = str_replace(['/', '+', '='], ['_', '-', '.'], $hash);
if (empty($hash)) {
_error_log('idToHash error: ' . openssl_error_string() . PHP_EOL . json_encode(['id' => $id, 'cipher_algo' => $cipher_algo, 'base' => $base, 'idConverted' => $idConverted, 'hash' => $hash, 'iv' => $iv]));
if (!empty($global['useLongHash'])) {
$global['useLongHash'] = 0;
return idToHash($id);
}
}
//return base64_encode($hash);
$_idToHash[$id] = $hash;
return $hash;
}
function hashToID($hash)
{
//return hashToID_old($hash);
global $global;
$hash = str_replace(['_', '-', '.'], ['/', '+', '='], $hash);
//var_dump($_GET, $hash);
$MethodsAndInfo = getHashMethodsAndInfo();
$cipher_algo = $MethodsAndInfo['cipher_algo'];
$iv = $MethodsAndInfo['iv'];
$key = $MethodsAndInfo['key'];
$base = $MethodsAndInfo['base'];
//$hash = base64_decode($hash);
$decrypt = @openssl_decrypt($hash, $cipher_algo, $key, 0, $iv);
$decrypt = base_convert($decrypt, $base, 10);
//var_dump($decrypt);exit;
if (empty($decrypt) || !is_numeric($decrypt)) {
return hashToID_old($hash);
}
return intval($decrypt);
}
/**
* Deprecated function
* @global type $global
* @param type $hash
* @return type
*/
function hashToID_old($hash)
{
global $global;
if (!empty($global['useLongHash'])) {
$base = 2;
$cipher_algo = 'des';
} else {
$base = 32;
$cipher_algo = 'rc4';
}
//$hash = str_pad($hash, 4, "=");
$hash = str_replace(['_', '-', '.'], ['/', '+', '='], $hash);
//$hash = base64_decode($hash);
$decrypt = openssl_decrypt(($hash), $cipher_algo, $global['salt']);
$decrypt = base_convert($decrypt, $base, 10);
return intval($decrypt);
}
function videosHashToID($hash_of_videos_id)
{
if (is_int($hash_of_videos_id)) {
return $hash_of_videos_id;
}
if (!is_string($hash_of_videos_id) && !is_numeric($hash_of_videos_id)) {
if (is_array($hash_of_videos_id)) {
return $hash_of_videos_id;
} else {
return 0;
}
}
if (preg_match('/^\.([0-9a-z._-]+)/i', $hash_of_videos_id, $matches)) {
$hash_of_videos_id = hashToID($matches[1]);
}
return $hash_of_videos_id;
}
/**
*
* @global type $advancedCustom
* @global array $global
* @global type $_getCDNURL
* @param string $type enum(CDN, CDN_S3,CDN_B2,CDN_FTP,CDN_YPTStorage,CDN_Live,CDN_LiveServers)
* @param string $id the ID of the URL in case the CDN is an array
* @return \type
*/
function getCDN($type = 'CDN', $id = 0)
{
global $advancedCustom, $global, $_getCDNURL;
$index = $type . $id;
if (!isset($_getCDNURL)) {
$_getCDNURL = [];
}
if (empty($_getCDNURL[$index])) {
if (!empty($type) && class_exists('AVideoPlugin') && AVideoPlugin::isEnabledByName('CDN')) {
$_getCDNURL[$index] = CDN::getURL($type, $id);
}
}
if ($type == 'CDN') {
if (!empty($global['ignoreCDN'])) {
return $global['webSiteRootURL'];
} elseif (!empty($advancedCustom) && isValidURL($advancedCustom->videosCDN)) {
$_getCDNURL[$index] = addLastSlash($advancedCustom->videosCDN);
} elseif (empty($_getCDNURL[$index])) {
$_getCDNURL[$index] = $global['webSiteRootURL'];
}
}
//var_dump($type, $id, $_getCDNURL[$index]);
return empty($_getCDNURL[$index]) ? false : $_getCDNURL[$index];
}
function getURL($relativePath, $ignoreCDN = false)
{
global $global;
$relativePath = str_replace('\\', '/', $relativePath);
$relativePath = getRelativePath($relativePath);
if (!isset($_SESSION['user']['sessionCache']['getURL'])) {
$_SESSION['user']['sessionCache']['getURL'] = [];
}
if (!empty($_SESSION['user']['sessionCache']['getURL'][$relativePath])) {
$_SESSION['user']['sessionCache']['getURL'][$relativePath] = fixTestURL($_SESSION['user']['sessionCache']['getURL'][$relativePath]);
return $_SESSION['user']['sessionCache']['getURL'][$relativePath];
}
$file = "{$global['systemRootPath']}{$relativePath}";
if (empty($ignoreCDN)) {
$url = getCDN() . $relativePath;
} else {
$url = $global['webSiteRootURL'] . $relativePath;
}
$url = fixTestURL($url);
if (file_exists($file)) {
$cache = @filemtime($file) . '_' . @filectime($file);
$url = addQueryStringParameter($url, 'cache', $cache);
$_SESSION['user']['sessionCache']['getURL'][$relativePath] = $url;
} else {
$url = addQueryStringParameter($url, 'cache', 'not_found');
}
return $url;
}
function fixTestURL($text)
{
if (isAVideoMobileApp() || !empty($_REQUEST['isAVideoMobileApp'])) {
$text = str_replace(array('https://vlu.me', 'https://www.vlu.me', 'vlu.me'), array('http://192.168.0.2', 'http://192.168.0.2', '192.168.0.2'), $text);
}
$text = str_replace(array('https://192.168.0.2'), array('http://192.168.0.2'), $text);
return $text;
}
function getCDNOrURL($url, $type = 'CDN', $id = 0)
{
if (!preg_match('/^http/i', $url)) {
return $url;
}
$cdn = getCDN($type, $id);
if (!empty($cdn)) {
return $cdn;
}
return addLastSlash($url);
}
function replaceCDNIfNeed($url, $type = 'CDN', $id = 0)
{
$cdn = getCDN($type, $id);
if (!empty($_GET['debug'])) {
$obj = AVideoPlugin::getDataObject('Blackblaze_B2');
var_dump($url, $type, $id, $cdn, $obj->CDN_Link);
exit;
}
if (empty($cdn)) {
if ($type === 'CDN_B2') {
$obj = AVideoPlugin::getDataObject('Blackblaze_B2');
if (isValidURL($obj->CDN_Link)) {
$basename = basename($url);
return addLastSlash($obj->CDN_Link) . $basename;
}
} elseif ($type === 'CDN_S3') {
$obj = AVideoPlugin::getDataObject('AWS_S3');
if (isValidURL($obj->CDN_Link)) {
$cdn = $obj->CDN_Link;
}
}
if (empty($cdn)) {
return $url;
}
}
return str_replace(parse_url($url, PHP_URL_HOST), parse_url($cdn, PHP_URL_HOST), $url);
}
function isIPPrivate($ip)
{
if ($ip == '192.168.0.2') {
return false;
}
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
return false;
}
$result = filter_var(
$ip,
FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
);
if (empty($result)) {
return true;
}
return false;
}
function countDownPage($toTime, $message, $image, $bgImage, $title)
{
global $global;
include $global['systemRootPath'] . 'objects/functionCountDownPage.php';
exit;
}
function inputToRequest()
{
$content = file_get_contents("php://input");
if (!empty($content)) {
$json = json_decode($content);
if (empty($json)) {
return false;
}
foreach ($json as $key => $value) {
if (!isset($_REQUEST[$key])) {
$_REQUEST[$key] = $value;
}
}
}
}
function useVideoHashOrLogin()
{
if (!empty($_REQUEST['video_id_hash'])) {
$videos_id = Video::getVideoIdFromHash($_REQUEST['video_id_hash']);
if (!empty($videos_id)) {
$users_id = Video::getOwner($videos_id);
$user = new User($users_id);
_error_log("useVideoHashOrLogin: $users_id, $videos_id");
return $user->login(true);
}
}
return User::loginFromRequest();
}
function strip_specific_tags($string, $tags_to_strip = ['script', 'style', 'iframe', 'object', 'applet', 'link'], $removeContent=true)
{
if (empty($string)) {
return '';
}
foreach ($tags_to_strip as $tag) {
$replacement = '$1';
if($removeContent){
$replacement = '';
}
$string = preg_replace('/<' . $tag . '[^>]*>(.*?)<\/' . $tag . '>/s', $replacement, $string);
}
return $string;
}
function strip_render_blocking_resources($string)
{
$tags_to_strip = ['link', 'style'];
$head = preg_match('/(.*)<\/head>/s', $string, $matches);
if (empty($matches[0])) {
$matches[0] = '';
}
$string = str_replace($matches[0], '{_head_}', $string);
foreach ($tags_to_strip as $tag) {
$string = preg_replace('/<' . $tag . '[^>]*>(.*?)<\/' . $tag . '>/s', '', $string);
$string = preg_replace('/<' . $tag . '[^>]*\/>/s', '', $string);
}
$string = str_replace('{_head_}', $matches[0], $string);
return $string;
}
function optimizeHTMLTags($html)
{
return $html;
//$html = optimizeCSS($html);
//$html = optimizeJS($html);
return $html . '<--! optimized -->';
}
function optimizeCSS($html)
{
global $global;
$css = '';
$cacheDir = getVideosDir() . 'cache/';
$cacheName = md5(getSelfURI() . User::getId()) . '.css';
$filename = "{$cacheDir}{$cacheName}";
$urlname = "{$global['webSiteRootURL']}videos/cache/{$cacheName}";
$HTMLTag = " ";
$fileExists = file_exists($filename);
//$fileExists = false;
// get link tags
$pattern = '/((<(link)[^>]*(stylesheet|css)[^>]*\/>)|(<(style)[^>]*>([^<]+)<\/style>))/i';
preg_match_all($pattern, $html, $matches);
foreach ($matches[3] as $key => $type) {
if (mb_strtolower($type) == 'link') {
$linkTag = $matches[0][$key];
$pattern = '/href=.(http[^"\']+)/i';
preg_match($pattern, $linkTag, $href);
if (empty($href)) {
continue;
}
if (!$fileExists) {
$content = url_get_contents($href[1]);
if (empty($content)) {
continue;
}
$css .= PHP_EOL . " /* link {$href[1]} */ " . $content;
}
$html = str_replace($linkTag, '', $html);
} else {
if (!$fileExists) {
$css .= PHP_EOL . ' /* style */ ' . $matches[7][$key];
}
$html = str_replace($matches[1][$key], '', $html);
}
}
if (!$fileExists) {
_file_put_contents($filename, $css);
}
return str_replace('', '' . PHP_EOL . $HTMLTag . PHP_EOL . '', $html);
}
function optimizeJS($html)
{
global $global;
$js = '';
$cacheDir = getVideosDir() . 'cache/';
$cacheName = md5(getSelfURI() . User::getId()) . '.js';
$filename = "{$cacheDir}{$cacheName}";
$urlname = "{$global['webSiteRootURL']}videos/cache/{$cacheName}";
$HTMLTag = "";
$fileExists = file_exists($filename);
$fileExists = false;
// get link tags
$pattern = '/((';
}
}
return $text;
}
function getMP3ANDMP4DownloadLinksFromHLS($videos_id, $video_type)
{
$downloadOptions = [];
if (empty($videos_id)) {
return [];
}
if (empty($video_type)) {
$video = Video::getVideoLight($videos_id);
$video_type = $video['type'];
}
if ($video_type == "video" || $video_type == "audio") {
$videoHLSObj = AVideoPlugin::getDataObjectIfEnabled('VideoHLS');
if (!empty($videoHLSObj) && method_exists('VideoHLS', 'getMP3ANDMP4DownloadLinks')) {
$downloadOptions = VideoHLS::getMP3ANDMP4DownloadLinks($videos_id);
} else {
//_error_log("getMP3ANDMP4DownloadLinksFromHLS($videos_id, $video_type): invalid plugin");
}
} else {
_error_log("getMP3ANDMP4DownloadLinksFromHLS($videos_id, $video_type): invalid vidreo type");
}
return $downloadOptions;
}
function isOnDeveloperMode()
{
global $global;
return (!empty($global['developer_mode']) || (!empty($global['developer_mode_admin_only']) && User::isAdmin()));
}
function setDefaultSort($defaultSortColumn, $defaultSortOrder)
{
if (empty($_REQUEST['sort']) && empty($_GET['sort']) && empty($_POST['sort']) && empty($_GET['order'][0]['dir'])) {
$_POST['sort'][$defaultSortColumn] = $defaultSortOrder;
}
}
function getWordOrIcon($word, $class = '')
{
$word = trim($word);
if (preg_match('/facebook/i', $word)) {
return ' ';
}
if (preg_match('/youtube|youtu.be/i', $word)) {
return ' ';
}
if (preg_match('/twitch/i', $word)) {
return ' ';
}
return $word;
}
function getHomePageURL()
{
global $global;
if (useIframe()) {
return "{$global['webSiteRootURL']}site/";
} else {
return "{$global['webSiteRootURL']}";
}
}
function useIframe()
{
return false && isOnDeveloperMode() && !isBot();
}
function getIframePaths()
{
global $global;
$modeYoutube = false;
if (!empty($_GET['videoName']) || !empty($_GET['v']) || !empty($_GET['playlist_id']) || !empty($_GET['liveVideoName']) || !empty($_GET['evideo'])) {
$modeYoutube = true;
$relativeSRC = 'view/modeYoutube.php';
} else {
$relativeSRC = 'view/index_firstPage.php';
}
$url = "{$global['webSiteRootURL']}{$relativeSRC}";
if ($modeYoutube && !empty($_GET['v'])) {
if (!empty($_GET['v'])) {
$url = "{$global['webSiteRootURL']}video/" . $_GET['v'] . '/';
unset($_GET['v']);
if (!empty($_GET['videoName'])) {
$url .= urlencode($_GET['videoName']) . '/';
unset($_GET['videoName']);
}
}
}
unset($_GET['inMainIframe']);
foreach ($_GET as $key => $value) {
$url = addQueryStringParameter($url, $key, $value);
}
return ['relative' => $relativeSRC, 'url' => $url, 'path' => "{$global['systemRootPath']}{$relativeSRC}", 'modeYoutube' => $modeYoutube];
}
function getFeedButton($rss, $mrss, $roku)
{
$buttons = '
' . __("Feed") . '
';
return $buttons;
}
function getPlatformId()
{
global $global;
return base_convert(md5(encryptString($global['salt'] . 'AVideo')), 16, 36);
}
function isSafari()
{
global $global, $_isSafari;
if (!isset($_isSafari)) {
$_isSafari = false;
$os = getOS();
if (preg_match('/Mac|iPhone|iPod|iPad/i', $os)) {
require_once $global['systemRootPath'] . 'objects/Mobile_Detect.php';
$detect = new Mobile_Detect();
$_isSafari = $detect->is('Safari');
}
}
return $_isSafari;
}
function fixQuotes($str)
{
if (!is_string($str)) {
return $str;
}
$chr_map = [
// Windows codepage 1252
"\xC2\x82" => "'", // U+0082⇒U+201A single low-9 quotation mark
"\xC2\x84" => '"', // U+0084⇒U+201E double low-9 quotation mark
"\xC2\x8B" => "'", // U+008B⇒U+2039 single left-pointing angle quotation mark
"\xC2\x91" => "'", // U+0091⇒U+2018 left single quotation mark
"\xC2\x92" => "'", // U+0092⇒U+2019 right single quotation mark
"\xC2\x93" => '"', // U+0093⇒U+201C left double quotation mark
"\xC2\x94" => '"', // U+0094⇒U+201D right double quotation mark
"\xC2\x9B" => "'", // U+009B⇒U+203A single right-pointing angle quotation mark
// Regular Unicode // U+0022 quotation mark (")
// U+0027 apostrophe (')
"\xC2\xAB" => '"', // U+00AB left-pointing double angle quotation mark
"\xC2\xBB" => '"', // U+00BB right-pointing double angle quotation mark
"\xE2\x80\x98" => "'", // U+2018 left single quotation mark
"\xE2\x80\x99" => "'", // U+2019 right single quotation mark
"\xE2\x80\x9A" => "'", // U+201A single low-9 quotation mark
"\xE2\x80\x9B" => "'", // U+201B single high-reversed-9 quotation mark
"\xE2\x80\x9C" => '"', // U+201C left double quotation mark
"\xE2\x80\x9D" => '"', // U+201D right double quotation mark
"\xE2\x80\x9E" => '"', // U+201E double low-9 quotation mark
"\xE2\x80\x9F" => '"', // U+201F double high-reversed-9 quotation mark
"\xE2\x80\xB9" => "'", // U+2039 single left-pointing angle quotation mark
"\xE2\x80\xBA" => "'", // U+203A single right-pointing angle quotation mark
];
$chr = array_keys($chr_map); // but: for efficiency you should
$rpl = array_values($chr_map); // pre-calculate these two arrays
$str = str_replace($chr, $rpl, html_entity_decode($str, ENT_QUOTES, "UTF-8"));
return $str;
}
function fixQuotesIfSafari($str)
{
if (!isSafari()) {
return $str;
}
return fixQuotes($str);
}
function setIsConfirmationPage()
{
global $_isConfirmationPage;
$_isConfirmationPage = 1;
}
function isConfirmationPage()
{
global $_isConfirmationPage;
return !empty($_isConfirmationPage);
}
function getDockerVarsFileName()
{
global $global;
return $global['docker_vars'];
}
function getDockerVars()
{
global $_getDockerVars;
if (!isset($_getDockerVars)) {
if (file_exists(getDockerVarsFileName())) {
$content = file_get_contents(getDockerVarsFileName());
$_getDockerVars = json_decode($content);
} else {
$_getDockerVars = false;
}
}
return $_getDockerVars;
}
function isDocker()
{
return !empty(getDockerVars());
}
function getDockerInternalURL()
{
return "http://live:8080/";
}
function getDockerStatsURL()
{
return getDockerInternalURL() . "stat";
}
function set_error_reporting()
{
global $global;
if (!empty($global['debug']) && empty($global['noDebug'])) {
error_reporting(E_ALL);
ini_set('display_errors', 1);
} else {
ini_set('error_reporting', E_ERROR);
ini_set('log_errors', 1);
error_reporting(E_ERROR);
ini_set('display_errors', 0);
}
}
/**
* Check whether an image is fully transparent.
*
* @param string $filename The path to the image file.
* @return bool True if the image is fully transparent, false otherwise.
*/
function is_image_fully_transparent($filename)
{
if(filesize($filename)>10000){
return false;
}
// Load the image
$image = imagecreatefrompng($filename);
// Get the number of colors in the image
$num_colors = imagecolorstotal($image);
// Loop through each color and check if it's fully transparent
$is_transparent = true;
for ($i = 0; $i < $num_colors; $i++) {
$color = imagecolorsforindex($image, $i);
if ($color['alpha'] != 127) { // 127 is the maximum value for a fully transparent color
$is_transparent = false;
break;
}
}
// Free up memory
imagedestroy($image);
// Return the result
return $is_transparent;
}
function getLanguageFromBrowser()
{
if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
return false;
}
$parts = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
return str_replace('-', '_', $parts[0]);
}
function addSearchOptions($url)
{
$url = addQueryStringParameter($url, 'tags_id', intval(@$_GET['tagsid']));
$url = addQueryStringParameter($url, 'search', getSearchVar());
$url = addQueryStringParameter($url, 'created', intval(@$_GET['created']));
$url = addQueryStringParameter($url, 'minViews', intval(@$_GET['minViews']));
return $url;
}
function is_port_open($port, $address = '127.0.0.1', $timeout = 5)
{
// Use localhost or 127.0.0.1 as the target address
$address = '127.0.0.1';
// Attempt to open a socket connection to the specified port
$socket = @fsockopen($address, $port, $errno, $errstr, $timeout);
// If the socket connection was successful, the port is open
if ($socket) {
fclose($socket);
return true;
}
_error_log("is_port_open($port, $address) error {$errstr}");
// If the socket connection failed, the port is closed
return false;
}
function is_ssl_certificate_valid($port = 443, $domain = '127.0.0.1', $timeout = 5)
{
// Create a stream context with SSL options
$stream_context = stream_context_create([
'ssl' => [
'verify_peer' => true,
'verify_peer_name' => true,
'allow_self_signed' => false,
'capture_peer_cert' => true,
],
]);
// Attempt to establish an SSL/TLS connection to the specified domain and port
$socket = @stream_socket_client(
"ssl://{$domain}:{$port}",
$errno,
$errstr,
$timeout,
STREAM_CLIENT_CONNECT,
$stream_context
);
// If the socket connection was successful, the SSL certificate is valid
if ($socket) {
fclose($socket);
return true;
}
_error_log("is_ssl_certificate_valid($domain, $port) error ");
// If the socket connection failed, the SSL certificate is not valid
return false;
}
function rowToRoku($row)
{
global $global;
if (!is_array($row)) {
$row = object_to_array($row);
}
if (empty($row)) {
return false;
}
$videoSource = Video::getSourceFileURL($row['filename'], false, 'video');
$videoResolution = Video::getResolutionFromFilename($videoSource);
//var_dump($videoSource);
if (empty($videoSource)) {
_error_log("Roku Empty video source {$row['id']}, {$row['clean_title']}, {$row['filename']}");
return false;
}
$movie = new stdClass();
$movie->id = 'video_' . $row['id'];
$movie->videos_id = $row['id'];
$movie->title = UTF8encode($row['title']);
$movie->longDescription = _substr(strip_tags(br2nl(UTF8encode($row['description']))), 0, 490);
if (empty($movie->longDescription)) {
$movie->longDescription = $movie->title;
}
$movie->shortDescription = _substr($movie->longDescription, 0, 200);
$movie->thumbnail = Video::getRokuImage($row['id']);
$movie->tags = [_substr(UTF8encode($row['category']), 0, 20)];
$movie->genres = ["special"];
$movie->releaseDate = date('c', strtotime($row['created']));
$movie->categories_id = $row['categories_id'];
$rrating = $row['rrating'];
$movie->rating = new stdClass();
if (!empty($rrating)) {
$movie->rating->rating = rokuRating($rrating);
$movie->rating->ratingSource = 'MPAA';
} else {
$movie->rating->rating = 'UNRATED'; // ROKU DIRECT PUBLISHER COMPLAINS IF NO RATING OR RATING SOURCE
$movie->rating->ratingSource = 'MPAA';
}
$content = new stdClass();
$content->dateAdded = date('c', strtotime($row['created']));
$content->captions = [];
$content->duration = durationToSeconds($row['duration']);
$content->language = "en";
$content->adBreaks = ["00:00:00"];
if (AVideoPlugin::isEnabledByName('GoogleAds_IMA')) {
$content->vmap_xml = "{$global['webSiteRootURL']}plugin/API/get.json.php?APIName=vmap&videos_id={$movie->videos_id}";
$content->vmap_json = "{$content->vmap_xml}&json=1";
$content->vast = "{$global['webSiteRootURL']}plugin/API/get.json.php?APIName=vast&videos_id={$movie->videos_id}";
} else {
$content->vmap_xml = "";
$content->vmap_json = "";
$content->vast = "";
}
$video = new stdClass();
$video->url = $videoSource;
$video->quality = getResolutionTextRoku($videoResolution);
$video->videoType = Video::getVideoTypeText($row['filename']);
$content->videos = [$video];
if (function_exists('getVTTTracks') || AVideoPlugin::isEnabled('SubtitleSwitcher')) {
$captions = getVTTTracks($row['filename'], true);
if (!empty($captions)) {
$content->captions = array();
foreach ($captions as $value) {
$value = object_to_array($value);
$content->captions[] = array(
'language' => $value['srclang'],
'captionType' => $value['label'],
'url' => $value['src']
);
}
}
}
$movie->content = $content;
return $movie;
}
function convertThumbsIfNotExists($source, $destination)
{
global $advancedCustom;
if (file_exists($destination)) {
_error_log("convertThumbsIfNotExists destination image exists ");
return true;
}
if (!file_exists($source)) {
_error_log("convertThumbsIfNotExists source image does not exists ");
return false;
}
if (empty($advancedCustom)) {
$advancedCustom = AVideoPlugin::loadPlugin("CustomizeAdvanced");
}
$width = 300;
$height = 300;
$orientation = getImageOrientation($source);
if ($orientation == "landscape") {
$width = $advancedCustom->thumbsWidthLandscape;
$height = $advancedCustom->thumbsHeightLandscape;
} else if ($orientation == "portrait") {
$width = $advancedCustom->thumbsWidthPortrait;
$height = $advancedCustom->thumbsHeightPortrait;
}
return convertImageIfNotExists($source, $destination, $width, $height, true);
}
function getImageOrientation($imagePath)
{
// Get the image dimensions
$imageSize = getimagesize($imagePath);
// Check the width and height
$width = $imageSize[0];
$height = $imageSize[1];
// Determine the orientation
if ($width > $height) {
return "landscape";
} else if ($width < $height) {
return "portrait";
} else {
return "square";
}
}
function canSearchUsers()
{
global $advancedCustomUser;
if (canAdminUsers()) {
return true;
}
if (AVideoPlugin::isEnabledByName('PlayLists')) {
if (PlayLists::canManageAllPlaylists()) {
return true;
}
}
if (empty($advancedCustomUser)) {
$advancedCustomUser = AVideoPlugin::getObjectDataIfEnabled('CustomizeUser');
}
if ($advancedCustomUser->userCanChangeVideoOwner) {
return true;
}
return false;
}
function canAdminUsers()
{
if (Permissions::canAdminUsers()) {
return true;
}
if (AVideoPlugin::isEnabledByName('PayPerView')) {
if (PayPerView::canSeePPVManagementInfo()) {
return true;
}
}
return false;
}
function getRandomCode()
{
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$max = strlen($characters) - 1;
$char1 = $characters[rand(0, $max)];
$char2 = $characters[rand(0, $max)];
$char3 = $characters[rand(0, $max)];
$uniqueId = uniqid();
$uniquePart1 = str_pad(base_convert(substr($uniqueId, -5), 16, 36), 4, $char1, STR_PAD_LEFT);
$uniquePart2 = str_pad(base_convert(substr($uniqueId, 4, 4), 16, 36), 4, $char2, STR_PAD_LEFT);
$uniquePart3 = str_pad(base_convert(substr($uniqueId, 0, 4), 16, 36), 4, $char3, STR_PAD_LEFT);
$code = strtoupper("{$uniquePart2}-{$uniquePart1}");
return $code;
}
function getActivationCode()
{
$code = getRandomCode();
$obj = array(
'username' => User::getUserName(),
'users_id' => User::getId(),
'code' => $code,
'expires' => strtotime('+10 minutes'),
);
$path = getTmpDir('loginCodes');
make_path($path);
$filename = "{$path}{$code}.log";
//$obj['filename'] = $filename;
$obj['bytes'] = file_put_contents($filename, encryptString(json_encode($obj)));
return $obj;
}
function modifyURL($url)
{
if (!isValidURL($url)) {
return $url;
}
$parameters = array(
'ads_app_bundle' => 'ads.app_bundle', //App Bundle from App Store ie. com.selecttvandroid
'ads_did' => 'ads.did', //Device ID uses session.uuid, App to replace with DID
'ads_w' => 'ads.w', //player width
'ads_h' => 'ads.h', //player height
'app_store_url' => 'ads.app_store_url',
'ads_app_store_url' => 'ads.app_store_url',
'app_name' => 'ads.app_name',
'ads_app_name' => 'ads.app_name',
'ads_cb' => 'ads.cb',
'ads_channel_name' => 'ads.channel_name',
'ads_content_genre' => 'ads.content_genre',
'ads_content_series' => 'ads.content_series',
'ads_pod_max_dur' => 'ads.pod_max_dur',
'ads_provider' => 'ads.provider',
'ads_rating' => 'ads.rating',
'ads_schain' => 'ads.schain',
'ads_ua' => 'ads.ua',
'ads_url' => 'ads.url',
'ads_vast_id' => 'ads.vast_id',
'ads_ic' => 'ads.ic',
'ads_ip' => 'ads.ip',
'us_privacy' => 'ads.us_privacy', //from Playout: (NP CCPA US field) 1N-N
'is_lat' => 'is_lat', //0: User has NOT opted out targeting advertising 1: User has opted out of targeting advertising
'gdpr' => 'ads.gdpr', // client decides (GDPR value)
'gdpr_consent' => 'ads.gdpr_consent', // client decides (GDPR Consent value)
'ads_gdpr_consent' => 'ads.gdpr_consent', // client decides (GDPR Consent value)
'url' => 'url', // client provides URL if Web option for content available
// GUMGUM
'publisher_app_bundle' => 'gg.ads.publisher_app_bundle', //APP bundle
'publisher_app_url' => 'gg.ads.publisher_app_url', //the publisher URL
'device_ifa' => 'gg.ads.device_ifa' //Device Identifier
);
$changed = false;
foreach ($parameters as $key => $value) {
if (!empty($_REQUEST[$key])) {
$changed = true;
//var_dump($url);
$url = addQueryStringParameter($url, $value, $_REQUEST[$key]);
//var_dump($url, $value, $key, $_REQUEST[$key]);
} else {
$url = removeQueryStringParameter($url, $value);
}
}
if($changed){
$url = addQueryStringParameter($url, 'ads.cb', time());
}
foreach ($parameters as $key => $value) {
$url = fix_parse_url($url, $value);
}
return $url;
}
function fix_parse_url($url, $parameter)
{
$cleanParameter = str_replace('.', '_', $parameter);
return str_replace("{$cleanParameter}=", "{$parameter}=", $url);
}
function generateHorizontalFlickity($items)
{
global $generateHorizontalFlickityLoaded;
if (empty($generateHorizontalFlickityLoaded)) {
?>
$item) {
$isActive = false;
if(!empty($item['isActive'])){
$isActive = true;
}
$class = 'btn-default';
if($isActive){
$class = 'btn-primary';
$initialIndex = $key;
}
?>
$htmlMediaTag] );
return $contents;
}
function getDeviceName() {
if(empty($_SERVER['HTTP_USER_AGENT'])){
return 'unknown';
}
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
if (strpos($userAgent, 'roku') !== false) {
return 'roku';
} elseif (strpos($userAgent, 'appletv') !== false) {
return 'appleTV';
} elseif (strpos($userAgent, 'iphone') !== false || strpos($userAgent, 'ipad') !== false || strpos($userAgent, 'ipod') !== false) {
return 'ios';
} elseif (strpos($userAgent, 'android') !== false) {
if (strpos($userAgent, 'mobile') !== false) {
return 'androidMobile';
} else {
return 'androidTV';
}
} elseif (strpos($userAgent, 'silk') !== false) {
return 'firestick';
} else {
return 'web';
}
}
function isImageNotFound($imgURL){
if(empty($imgURL)){
return true;
}
return ImagesPlaceHolders::isDefaultImage($imgURL);
}
function canExecutePgrep() {
// Check if we can successfully pgrep the init or systemd process
$test = shell_exec('pgrep -f init || pgrep -f systemd');
return !empty($test); // Return true if we can execute pgrep, false otherwise
}
function getProcessPids($processName) {
if (!canExecutePgrep()) {
return null; // If we can't execute pgrep, return null
}
// Using pgrep with -a to get both PID and the full command line
$output = shell_exec('pgrep -af ' . escapeshellarg($processName));
if (empty($output)) {
return array();
}
// Split the string into an array based on newline and filter out any empty values
$lines = array_filter(explode("\n", $output));
$pids = [];
foreach ($lines as $line) {
// Skip the line containing sh -c pgrep
if (strpos($line, 'pgrep') !== false) {
continue;
}
//_error_log("getProcessPids($processName) $line");
// Extract PID from the start of the line
list($pid, ) = explode(' ', trim($line), 2);
$pids[] = $pid;
}
return $pids;
}
function getCommandByPid($pid) {
$cmdlineFile = "/proc/{$pid}/cmdline";
// Check if the cmdline file exists for the given PID
if (!file_exists($cmdlineFile)) {
return false; // or return an error message or throw an exception
}
// Read the content and break it into an array using null characters as the delimiter
$cmd = file_get_contents($cmdlineFile);
$cmdArray = explode("\0", $cmd);
// Remove any empty elements from the array
$cmdArray = array_filter($cmdArray, function($value) {
return $value !== '';
});
return $cmdArray;
}