feat: Add comprehensive documentation suite and reorganize project structure

- Created complete documentation in docs/ directory
- Added PROJECT_OVERVIEW.md with feature highlights and getting started guide
- Added ARCHITECTURE.md with system design and technical details
- Added SECURITY.md with comprehensive security implementation guide
- Added DEVELOPMENT.md with development workflows and best practices
- Added DEPLOYMENT.md with production deployment instructions
- Added API.md with complete REST API documentation
- Added CONTRIBUTING.md with contribution guidelines
- Added CHANGELOG.md with version history and migration notes
- Reorganized all documentation files into docs/ directory for better organization
- Updated README.md with proper documentation links and quick navigation
- Enhanced project structure with professional documentation standards
This commit is contained in:
SamiAhmed7777
2025-10-21 00:39:45 -07:00
commit 0b7e2d0a5b
6080 changed files with 1332936 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
<?php
/*******************************************************************************************************************
| Software Name : EasyStream
| Software Description : High End YouTube Clone Script with Videos, Shorts, Streams, Images, Audio, Documents, Blogs
| Software Author : (c) Sami Ahmed
|*******************************************************************************************************************
|
|*******************************************************************************************************************
| This source file is subject to the EasyStream Proprietary License Agreement.
|
| By using this software, you acknowledge having read this Agreement and agree to be bound thereby.
|*******************************************************************************************************************
| Copyright (c) 2025 Sami Ahmed. All rights reserved.
|*******************************************************************************************************************/
define('_ISVALID', true);
include_once 'f_core/config.core.php';
$ad_impr = $class_filter->clr_str($_GET["impression"]);
$ad_click = $class_filter->clr_str($_GET["click"]);
$ad_type = $class_filter->clr_str($_GET["t"]);
$ad_key = ($ad_impr != '' ? $ad_impr : $ad_click);
$ad_click_track = $class_database->singleFieldValue('db_' . $ad_type . 'adentries', 'ad_click_track', 'ad_key', $ad_key);
$db_field = $ad_impr != '' ? 'ad_impressions' : ($ad_click != '' ? 'ad_clicks' : null);
$u = ($db_field != '' and $ad_click_track == 1) ? $db->execute(sprintf("UPDATE `db_%sadentries` SET `%s`=`%s`+1 WHERE `ad_key`='%s' LIMIT 1;", $ad_type, $db_field, $db_field, $ad_key)) : null;

View File

@@ -0,0 +1,8 @@
<?php
define("_ISVALID", true);
include_once "f_core/config.core.php";
// Audio playlist player - basic implementation
echo "<h1>Audio Playlist Player</h1>";
echo "<p>Audio playlist functionality coming soon...</p>";
echo "<a href=\"/\">← Back to Home</a>";
?>

View File

@@ -0,0 +1,276 @@
<?php
/*******************************************************************************************************************
| Software Name : EasyStream
| Software Description : High End YouTube Clone Script with Videos, Shorts, Streams, Images, Audio, Documents, Blogs
| Software Author : (c) Sami Ahmed
|*******************************************************************************************************************
|
|*******************************************************************************************************************
| This source file is subject to the EasyStream Proprietary License Agreement.
|
| By using this software, you acknowledge having read this Agreement and agree to be bound thereby.
|*******************************************************************************************************************
| Copyright (c) 2025 Sami Ahmed. All rights reserved.
|*******************************************************************************************************************/
define('_ISVALID', true);
include_once 'f_core/config.core.php';
include_once 'f_core/f_classes/class.membership.php';
$type = isset($_GET["a"]) ? 'audio' : (isset($_GET["l"]) ? 'live' : (isset($_GET["s"]) ? 'short' : 'video'));
$file_key = $class_filter->clr_str($_GET[$type[0]]);
$pl_key = $class_filter->clr_str($_GET["p"]);
$cfg[] = $class_database->getConfigurations('video_player,audio_player,affiliate_tracking_id');
$_cfg = unserialize($class_database->singleFieldValue('db_fileplayers', 'db_config', 'db_name', $cfg["video_player"] . '_embed'));
if ($pl_key) {
$pl = unserialize($class_database->singleFieldValue('db_' . $type . 'playlists', 'pl_files', 'pl_key', $pl_key));
$file_key = $pl[0];
}
$u = $db->execute(sprintf("SELECT
A.`usr_key`, A.`usr_live`,
B.`usr_id`, B.`embed_src`,
B.`file_title`, B.`file_category`, B.`thumb_cache`
FROM
`db_accountuser` A, `db_%sfiles` B
WHERE
A.`usr_id`=B.`usr_id` AND
B.`file_key`='%s'
LIMIT 1;", $type, $file_key));
$usr_key = $u->fields["usr_key"];
$channel_id = (int) $u->fields["usr_id"];
$title = $u->fields["file_title"];
$embed_src = $u->fields["embed_src"];
$live = $u->fields["usr_live"];
$thumb_cache = $u->fields["thumb_cache"];
$thumb_cache = $thumb_cache > 1 ? $thumb_cache : null;
$mob = VHref::isMobile();
$tmb = $cfg["media_files_url"] . '/' . $usr_key . '/t/' . $file_key . '/0' . $thumb_cache . '.jpg';
// Membership gating (scaffold): if a tier is required and viewer lacks access, show upsell instead of player
if (VMembership::enabled()) {
$reqTier = VMembership::getRequiredTierForFile($type, $file_key);
if ($reqTier && !VMembership::hasAccess((int) $_SESSION['USER_ID'], $channel_id, $reqTier)) {
$join_url = $cfg['main_url'] . '/' . VHref::getKey('channel') . '/' . $usr_key . '#join';
echo '<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">'
. '<title>' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</title>'
. '<style>html,body{height:100%;margin:0} .gate{display:flex;align-items:center;justify-content:center;height:100%;background:#000;color:#fff;text-align:center} .btn{display:inline-block;margin-top:12px;padding:10px 16px;background:#ff4e45;color:#fff;text-decoration:none;border-radius:4px} img{max-width:100%;opacity:.35}</style>'
. '</head><body><div class="gate"><div><img src="' . htmlspecialchars($tmb, ENT_QUOTES, 'UTF-8') . '" alt=""/><div>Members-only video</div><a class="btn" href="' . $join_url . '" target="_top">Join to watch</a></div></div></body></html>';
exit;
}
}
switch ($cfg["video_player"]) {
case "vjs":
$tmb_url = VGenerate::thumbSigned($type, $file_key, array($usr_key, $thumb_cache));
if ($type == 'short') {
$_cfg["vjs_advertising"] = 0;
}
if ($_cfg["vjs_advertising"] == 1 and $embed_src == 'local') {
$t = $db->execute(sprintf("SELECT `vjs_ads` FROM `db_%sfiles` WHERE `file_key`='%s' LIMIT 1;", $type, $file_key));
$ads = $t->fields["vjs_ads"];
if ($ads != '') {
//found ads assigned to video
$ar = unserialize($ads);
$sql = sprintf("SELECT `ad_id`, `ad_key`, `ad_client`, `ad_tag`, `ad_skip`, `ad_comp_div`, `ad_comp_id`, `ad_comp_w`, `ad_comp_h` FROM `db_vjsadentries` WHERE `ad_type`='dedicated' AND `ad_active`='1'%s AND `ad_id` IN (%s) ORDER BY RAND() LIMIT 1;", ($mob ? " AND `ad_mobile`='1'" : null), ($ar[0] > 0 ? implode(',', $ar) : 0));
$t = $db->execute($sql);
} else {
//check for category ads
$t = $db->execute(sprintf("SELECT `ct_ads` FROM `db_categories` WHERE `ct_id`='%s' LIMIT 1;", $res->fields["file_category"]));
$ads = $t->fields["ct_ads"];
if ($ads != '') {
//found ads assigned to category
$ar = unserialize($ads);
$sql = sprintf("SELECT `ad_id`, `ad_key`, `ad_client`, `ad_tag`, `ad_skip`, `ad_comp_div`, `ad_comp_id`, `ad_comp_w`, `ad_comp_h` FROM `db_vjsadentries` WHERE `ad_type`='dedicated' AND `ad_active`='1'%s AND `ad_id` IN (%s) ORDER BY RAND() LIMIT 1;", ($mob ? " AND `ad_mobile`='1'" : null), ($ar[0] > 0 ? implode(',', $ar) : 0));
$t = $db->execute($sql);
} else {
//no video ads assigned/generate a random ad
$sql = sprintf("SELECT `ad_id`, `ad_key`, `ad_client`, `ad_tag`, `ad_skip`, `ad_comp_div`, `ad_comp_id`, `ad_comp_w`, `ad_comp_h` FROM `db_vjsadentries` WHERE `ad_type`='shared' AND `ad_active`='1'%s ORDER BY RAND() LIMIT 1;", ($mob ? " AND `ad_mobile`='1'" : null));
$t = $db->execute($sql);
}
}
if ($t->fields["ad_id"]) {
$ad_client = ($t->fields["ad_client"] == 'custom' ? 'vast' : $t->fields["ad_client"]);
$ad_tag_url = ($t->fields["ad_client"] == 'custom' ? $cfg['main_url'] . '/' . VHref::getKey('vast') . '?t=vjs&v=' . $t->fields["ad_key"] : $t->fields["ad_tag"]);
$ad_skip = ($t->fields["ad_client"] == 'custom' ? $t->fields["ad_skip"] : false);
$ad_tag_comp = $t->fields["ad_comp_div"];
$ad_tag_comp_id = $t->fields["ad_comp_id"];
$ad_tag_comp_w = $t->fields["ad_comp_w"];
$ad_tag_comp_h = $t->fields["ad_comp_h"];
$smarty->assign('ad_client', ($ad_client == 'custom' ? 'vast' : $t->fields["ad_client"]));
}
}
$css = '<link rel="stylesheet" type="text/css" href="https://vjs.zencdn.net/5.19/video-js.min.css" /><style>html, body { height: 100%; padding: 0; margin: 0; }</style>';
$css_extra = '<link rel="stylesheet" type="text/css" href="' . $cfg['scripts_url'] . '/shared/videojs/videojs-styles.min.css" />';
$css_extra .= '<link rel="stylesheet" type="text/css" href="' . $cfg['styles_url'] . '/theme/theme.min.css" />';
if ($_cfg["vjs_advertising"] == 1 and $embed_src == 'local') {
if ($ad_client == 'vast' or $ad_client == 'custom') {
$css_extra .= '<link rel="stylesheet" type="text/css" href="' . $cfg['scripts_url'] . '/shared/videojs/videojs.vast.vpaid.min.css" />';
$css_extra .= '<link rel="stylesheet" type="text/css" href="' . $cfg['scripts_url'] . '/shared/videojs/vast-button.css" />';
} elseif ($ad_client == 'ima') {
$css_extra .= '<link rel="stylesheet" type="text/css" href="' . $cfg['scripts_url'] . '/shared/videojs/videojs.ads.css" />';
$css_extra .= '<link rel="stylesheet" type="text/css" href="' . $cfg['scripts_url'] . '/shared/videojs/videojs.ima.css" />';
} elseif ($ad_client == 'vamp') {
$css_extra .= '<link rel="stylesheet" type="text/css" href="' . $cfg['scripts_url'] . '/shared/videojs/videojs.ads.css" />';
$css_extra .= '<link rel="stylesheet" type="text/css" href="' . $cfg['scripts_url'] . '/shared/videojs/vast-button.css" />';
}
if ($ad_tag_comp == 1) {
$css_extra .= '<script type="text/javascript">var googletag = googletag || {};googletag.cmd = googletag.cmd || [];(function() {var gads = document.createElement("script");gads.async = true;gads.type = "text/javascript";gads.src = "//www.googletagservices.com/tag/js/gpt.js";var node = document.getElementsByTagName("script")[0];node.parentNode.insertBefore(gads, node);})();</script>';
$css_extra .= '<script type="text/javascript">googletag.cmd.push(function() {googletag.defineSlot("' . $ad_tag_comp_id . '", [' . $ad_tag_comp_w . ', ' . $ad_tag_comp_h . '], "ima-companionDiv").addService(googletag.companionAds()).addService(googletag.pubads());googletag.companionAds().setRefreshUnfilledSlots(true);googletag.pubads().enableVideoAds();googletag.enableServices();});</script>';
}
}
$player_key = null;
$player_style = 'width: 100%; height: 100%;';
$player_br = null;
$player_cp = null;
$player_js = 'https://vjs.zencdn.net/5.19/video.min.js';
$player_js_extra = '<script type="text/javascript">var current_url = "' . $cfg["main_url"] . '/"; var logo="' . $_cfg["vjs_logo_file"] . '"; var logohref="' . $cfg["main_url"] . '/' . VGenerate::fileHref($type[0], $file_key, $title) . '"</script>';
if ($_cfg["vjs_advertising"] == 1) {
$player_js_extra .= '<script type="text/javascript">var fk="' . $file_key . '";var ad_skip="' . $ad_skip . '";var em=1;var ad_client="' . ($ad_client == 'custom' ? 'vast' : $ad_client) . '";var adTagUrl="' . $ad_tag_url . '";var compjs="' . ($mob ? 'ads.mob' : ($ad_tag_comp == 1 ? 'ads.comp' : 'ads')) . '";</script>';
if ($ad_client == 'ima' and $embed_src == 'local') {
$player_js_extra .= '<script type="text/javascript" src="https://imasdk.googleapis.com/js/sdkloader/ima3.js"></script>';
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/videojs.ads.js"></script>';
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/videojs.ima.js"></script>';
} elseif ($ad_client == 'vamp' and $embed_src == 'local') {
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/videojs.ads.js"></script>';
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/vast-client.js"></script>';
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/vmap-client.js"></script>';
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/videojs-ad-scheduler.js"></script>';
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/ads.vmap.js"></script>';
} elseif (($ad_client == 'vast' or $ad_client == 'custom') and $embed_src == 'local') {
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/videojs_5.vast.vpaid.min.js"></script>';
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/ads.vast.js"></script>';
}
}
$player_js_extra .= '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/videojs-scripts.min.js"></script>';
$player_js_extra .= $live == 1 ? '<script type="text/javascript" src="' . $cfg['scripts_url'] . '/shared/videojs/videojs-hlsjs-plugin.js"></script>' : null;
$player_js_extra .= $live == 1 ? '<script type="text/javascript">$(window).on("unload", function(){var fd = new FormData();fd.append("c", "' . $file_key . '");navigator.sendBeacon("' . $cfg["main_url"] . '/' . VHref::getKey("viewers") . '?c=' . $file_key . '", fd);});</script>' : null;
$css_extra .= '<style>
.vjs-has-started:not(.vjs-paused) #play,.vjs-big-play-button{display:none !important}.play-btn{width:40px;height:40px;background:radial-gradient(#06a2cb 50%,rgba(255,255,255,0.15) 52%);border-radius:50%;display:inline-block;margin:auto;position:absolute;overflow:hidden;top:0;right:0;bottom:0;left:0;z-index:2}.play-btn::after{content:\'\';position:absolute;left:50%;top:50%;-webkit-transform:translateX(-40%) translateY(-50%);transform:translateX(-40%) translateY(-50%);width:0;height:0;border-top:8px solid transparent;border-bottom:8px solid transparent;border-left:15px solid #fff;z-index:100;-webkit-transition:all 400ms cubic-bezier(0.55,0.055,0.675,0.19);transition:all 400ms cubic-bezier(0.55,0.055,0.675,0.19)}.play-btn:before{content:\'\';position:absolute;width:50px;height:50px;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation:pulsate1 2s;animation:pulsate1 2s;-webkit-animation-direction:forwards;animation-direction:forwards;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:steps;animation-timing-function:steps;opacity:9;border-radius:50%;border:2px solid #7abbec;top:-12%;left:-12%;background:solid #7abbec}.play-btn:hover::after{border-left:15px solid #333;-webkit-transform:scale(20);transform:scale(20)}.play-btn:hover::before{content:\'\';position:absolute;left:50%;top:50%;-webkit-transform:translateX(-40%) translateY(-50%);transform:translateX(-40%) translateY(-50%);width:0;height:0;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;border-left:20px solid #06a2cb;z-index:200;-webkit-animation:none;animation:none;border-radius:0}@-webkit-keyframes pulsate1{0%{-webkit-transform:scale(0.6,0.6);transform:scale(0.6,0.6);opacity:1}100%{-webkit-transform:scale(1,1);transform:scale(1,1);opacity:0}}@keyframes pulsate1{0%{-webkit-transform:scale(0.6,0.6);transform:scale(0.6,0.6);opacity:1}100%{-webkit-transform:scale(1,1);transform:scale(1,1);opacity:0}}@-webkit-keyframes pulsate2{0%{-webkit-transform:scale(0.1,0.1);transform:scale(0.1,0.1);opacity:1}100%{-webkit-transform:scale(1,1);transform:scale(1,1);opacity:0}}@-webkit-keyframes spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.stroke-dotted{opacity:0;stroke-dasharray:4,5;stroke-width:1px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:spin 4s infinite linear;animation:spin 4s infinite linear;-webkit-transition:opacity 1s ease,stroke-width 1s ease;transition:opacity 1s ease,stroke-width 1s ease}.stroke-solid{stroke-dashoffset:0;stroke-dashArray:300;stroke-width:4px;-webkit-transition:stroke-dashoffset 1s ease,opacity 1s ease;transition:stroke-dashoffset 1s ease,opacity 1s ease}.icon{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:-webkit-transform 200ms ease-out;transition:-webkit-transform 200ms ease-out;transition:transform 200ms ease-out;transition:transform 200ms ease-out,-webkit-transform 200ms ease-out}#play:hover .stroke-dotted{stroke-width:4px;opacity:1}#play:hover .stroke-solid{opacity:0;stroke-dashoffset:300}#play:hover .icon{-webkit-transform:scale(1.05);transform:scale(1.05)}#play{cursor:pointer;position:absolute;top:50%;left:50%;-webkit-transform:translateY(-50%) translateX(-50%);transform:translateY(-50%) translateX(-50%)}@font-face{font-family:\'icomoonmlm\';src:url(\'../fonts/icomoonmlm.eot\');src:url(\'../fonts/icomoonmlm.eot?#iefix\') format(\'embedded-opentype\'),url(\'../fonts/icomoonmlm.woff\') format(\'woff\'),url(\'../fonts/icomoonmlm.ttf\') format(\'truetype\'),url(\'../fonts/icomoonmlm.svg#icomoon\') format(\'svg\');font-weight:normal;font-style:normal}
.video-js .vjs-progress-control,.vjs-default-skin .vjs-progress-control{height:10px;bottom:36px;background-color:transparent}
.video-js .vjs-control-bar,.vjs-default-skin .vjs-control-bar{background-color:transparent}
.video-js .vjs-progress-control .vjs-slider,.vjs-default-skin .vjs-progress-control .vjs-slider{height:3px}
.video-js .vjs-progress-holder .vjs-play-progress,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.vjs-default-skin .vjs-progress-holder .vjs-play-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress div{height:3px}
.video-js .vjs-play-progress:before,.vjs-default-skin .vjs-play-progress:before{height:3px}
.vjs-progress-control:hover .vjs-play-progress:before{height:12px}
.video-js button, .video-js .vjs-menu-button{color:#ddd !important}
.video-js button:hover, .video-js .vjs-menu-button:hover{color:#fff !important}
.video-js .vjs-time-control{font-family:"Roboto", Arial;font-size:13px}
.video-js .vjs-fullscreen-control,.vjs-default-skin .vjs-fullscreen-control{margin-right:10px;margin-left:5px}
.vjs-resolution-button .vjs-resolution-button-label,.video-js .vjs-playback-rate .vjs-playback-rate-value,.vjs-default-skin .vjs-playback-rate .vjs-playback-rate-value{line-height:40px;font-family:"Roboto", Arial;font-size:13px;font-weight:500}
.vjs-resolution-button{margin-left:5px !important}
.video-js .vjs-menu, .vjs-default-skin .vjs-menu{bottom:10px;z-index:9999}
.vjs-resolution-button .vjs-menu li{font-family:"Roboto",Arial;font-size:12px}
.vjs-error .vjs-error-display:before,.vjs-menu .vjs-menu-content, .vjs-no-js{font-family:"Roboto",Arial}
.vjs-menu li{padding:0.5em 0}
.vjs-volume-menu-button:hover + .vjs-current-time{left:170px;transition:all .3s;-webkit-transition:all .3s}
.vjs-volume-menu-button:hover + .vjs-current-time + .vjs-time-divider{left:202px;transition:all .3s;-webkit-transition:all .3s}
.vjs-volume-menu-button:hover + .vjs-current-time + .vjs-time-divider + .vjs-duration{left:214px;transition:all .3s;-webkit-transition:all .3s}
.pv-text{position:absolute;width:100%;bottom:75px;text-align:center;display:none}
.pv-text span{position:relative;font-size:14px;padding:15px 25px;border-radius:5px;border:1px solid #666}
.pv-text i{position:absolute;font-size:8px;right:5px;top:7px;cursor:pointer}
.vjs-user-inactive .pv-text{display:none !important}
.vjs-paused.vjs-user-inactive .pv-text{display:block !important}
.vjs-hd{padding-top: 56.25%;width: 100%;position: relative;}
.live-embed{position:absolute;top:0}
</style>
';
break;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="robots" content="noindex, nofollow">
<title><?php echo $title; ?></title>
<?php
echo $css;
if (isset($css_extra)) {
echo $css_extra;
}
?>
<script type="text/javascript" src="<?php echo $cfg['javascript_url']; ?>/jquery.min.js"></script>
<script type="text/javascript">jQuery.migrateMute=true;</script>
<script type="text/javascript">if(navigator.platform==='iPad'||navigator.platform==='iPhone'||navigator.platform==='iPod'){WebFont.load({google:{families:['Roboto:300,400,500,600,700']}});}</script>
<script type="text/javascript" src="<?php echo $player_js; ?>"></script>
<script type="text/javascript"><?php echo $player_key; ?></script>
<?php
if (isset($player_js_extra)) {
echo $player_js_extra;
}
?>
</head>
<body style="overflow: hidden;" class="<?php echo ($mob ? 'touch' : ''); ?>">
<div style="<?php echo $player_style; ?>" id="embed-player-<?php echo $file_key; ?>"<?php echo $player_cp;
echo $divdata; ?>><?php echo $player_br; ?><?php echo $player_src; ?>
<?php
if (($_cfg["vjs_advertising"] == 1 and !VHref::isMobile()) or ($_cfg["vjs_advertising"] == 1 and VHref::isMobile() and $embed_src == 'local' and $ad_client == 'vast') or ($_cfg["vjs_advertising"] == 1 and VHref::isMobile() and $embed_src != 'local') or ($_cfg["vjs_advertising"] == 0 and (!VHref::isMobile() or (VHref::isMobile() and ($embed_src == 'local' or $embed_src == 'youtube'))))) {
$phtml = (($type[0] == 'v' or $type[0] == 'l' or $type[0] == 's') and $cfg["video_player"] == 'vjs') ? '<' . (($type == 'live' or $type == 'short') ? 'video' : $type) . ' id="view-player-' . $file_key . '" oncontextmenu="return false;" style="width: 100%; height: 100%;" preload="none" class="video-js vjs-default-skin vjs-big-play-centered" />' : null;
$phtml .= ($type[0] == 'a' and $cfg["audio_player"] == 'vjs') ? '<' . $type . ' id="view-player-' . $file_key . '" style="width: 100%; height: 100%;" oncontextmenu="return false;" preload="none" class="video-js vjs-default-skin vjs-big-play-centered" />' : null;
} else {
$phtml = '<div id="ima-placeholder" class="video-js vjs-big-play-centered" style="background: #000 url(' . $tmb_url . ') no-repeat center center; z-index: 100; background-size: contain; width: 100%; height: 100%"><button class="vjs-big-play-button" type="button" aria-live="polite" title="Play Video" aria-disabled="false"><span class="vjs-control-text">Play Video</span></button></div>';
}
if (($cfg["video_player"] == 'vjs' and ($type[0] == 'v' or $type[0] == 'l' or $type[0] == 's')) or ($cfg["audio_player"] == 'vjs' and $type[0] == 'a')) {
$first_sub = null;
$other_sub = null;
$thumb_file = $cfg["media_files_dir"] . '/' . $usr_key . '/t/' . $file_key . '/p/thumbnails.vtt';
if (file_exists($thumb_file)) {
$first_sub .= '<track kind="metadata" src="' . $cfg["media_files_url"] . '/' . $usr_key . '/t/' . $file_key . '/p/thumbnails.vtt"></track>';
}
$sub_file = $class_database->singleFieldValue('db_' . $type . 'subs', 'vjs_subs', 'file_key', $file_key);
if ($sub_file != '') {
$sub_arr = unserialize($sub_file);
foreach ($sub_arr as $sub_file => $sub_arr) {
if ($sub_arr['default'] == '1') {
$first_sub .= '<track kind="captions" default src="' . $cfg["main_url"] . '/f_data/data_subtitles/' . VPlayers::FPsubtitle($sub_file) . '" label="' . $sub_arr['label'] . '" />';
} else {
$other_sub .= '<track kind="captions" src="' . $cfg["main_url"] . '/f_data/data_subtitles/' . VPlayers::FPsubtitle($sub_file) . '" label="' . $sub_arr['label'] . '" />';
}
}
}
}
$phtml .= $first_sub . $other_sub;
if ($embed_src == 'local' and $_cfg["vjs_advertising"] == 1) {
if (($cfg["video_player"] == 'vjs' and ($type[0] == 'v' or $type[0] == 'l')) or ($cfg["audio_player"] == 'vjs' and $type[0] == 'a')) {
if ($_cfg["vjs_advertising"] == 1 and $ad_client == 'ima') {
$phtml .= '<div id="ima-companionDiv"><script type="text/javascript">$(document).ready(function(){if (typeof googletag != "undefined") {googletag.cmd.push(function() { googletag.display("ima-companionDiv"); });}});</script></div>';
$phtml .= '<script type="text/javascript">$(document).ready(function(){var script = document.createElement("script"); script.src = "' . $cfg["scripts_url"] . '/shared/videojs/"+compjs+".js"; script.onload = function () { if (compjs == "ads.comp" || compjs == "ads.mob") {var ads = new Ads();} }; document.head.appendChild(script); }); </script>';
}
}
}
echo $phtml;
$b = $cfg["main_url"] . '/' . VHref::getKey("viewers") . '?e=1&' . $type[0] . '=' . $file_key;
?>
</div>
<script type="text/javascript">
<?php
echo (($type == 'video' and (($cfg["video_player"] == 'vjs' and $_cfg["vjs_advertising"] == 0) or ($mob and $ad_client != 'vast') or (!$mob and $ad_client != 'vast') or (strpos($_SERVER["HTTP_REFERER"], $cfg["main_url"]) !== false))) ? '$(document).ready(function(){' : '');
echo ($cfg['video_player'] == 'vjs' ? VPlayers::VJSJS('embed', $usr_key, $file_key) : ($cfg["video_player"] == 'jw' ? VPlayers::JWJS('embed', $usr_key, $file_key) : VPlayers::FPJS('embed', $usr_key, $file_key)));
echo (($type == 'video' and (($cfg["video_player"] == 'vjs' and $_cfg["vjs_advertising"] == 0) or ($mob and $ad_client != 'vast') or (!$mob and $ad_client != 'vast') or (strpos($_SERVER["HTTP_REFERER"], $cfg["main_url"]) !== false))) ? '});' : '');
?>
</script>
</body>
<?php if ($cfg["google_analytics"] != ''): ?>
<script async src="https://www.googletagmanager.com/gtag/js?id=<?=$cfg["google_analytics"]?>"></script>
<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());gtag('config','<?=$cfg["google_analytics"]?>');</script>
<?php endif;?>
</html>

View File

@@ -0,0 +1,117 @@
<?php
/*******************************************************************************************************************
| Software Name : EasyStream
| Software Description : High End YouTube Clone Script with Videos, Shorts, Streams, Images, Audio, Documents, Blogs
| Software Author : (c) Sami Ahmed
|*******************************************************************************************************************
|
|*******************************************************************************************************************
| This source file is subject to the EasyStream Proprietary License Agreement.
|
| By using this software, you acknowledge having read this Agreement and agree to be bound thereby.
|*******************************************************************************************************************
| Copyright (c) 2025 Sami Ahmed. All rights reserved.
|*******************************************************************************************************************/
define('_ISVALID', true);
include_once 'f_core/config.core.php';
$type = 'blog';
$file_key = $class_filter->clr_str($_GET[$type[0]]);
$cfg[] = $class_database->getConfigurations('image_player,affiliate_tracking_id');
$u = $db->execute(sprintf("SELECT
A.`usr_key`,
B.`usr_id`,
B.`file_title`, B.`thumb_cache`
FROM
`db_accountuser` A, `db_%sfiles` B
WHERE
A.`usr_id`=B.`usr_id` AND
B.`file_key`='%s'
LIMIT 1;", $type, $file_key));
$usr_key = $u->fields["usr_key"];
$title = $u->fields["file_title"];
$thumb_cache = $u->fields["thumb_cache"];
$thumb_cache = $thumb_cache > 1 ? $thumb_cache : null;
$tmb = $cfg["media_files_url"] . '/' . $usr_key . '/t/' . $file_key . '/0' . $thumb_cache . '.jpg';
$href_key = 'blogs';
$blog_tpl = $cfg["media_files_dir"] . '/' . $usr_key . '/b/' . $file_key . '.tplb';
$blog_html = null;
if (file_exists($blog_tpl)) {
$blog_html = file_get_contents($blog_tpl);
$parse = preg_match_all("/\[([^]].*?)\]/", $blog_html, $matches);
$media = $matches[1];
if ($media[0]) {
foreach ($media as $media_entry) {
$a = explode("_", $media_entry);
$mtype = $a[1];
$mkey = $a[2];
/* embed code player sizes */
$ps = array();
$ps[0]["w"] = '100%';
$ps[0]["h"] = 500;
switch ($mtype[0]) {
case "l":
case "v": //embed code for video and audio is generated from within player cfg after initialization (class.players.php)
$vi = sprintf("SELECT A.`file_type`, A.`embed_src`, A.`embed_key`, A.`embed_url`, B.`usr_key` FROM `db_videofiles` A, `db_accountuser` B WHERE A.`usr_id`=B.`usr_id` AND A.`file_key`='%s' LIMIT 1;", $mkey);
$mrs = $db->execute($vi);
$msrc = $mrs->fields["file_type"];
$membed_src = $mrs->fields["embed_src"];
$membed_key = $mrs->fields["embed_key"];
$membed_url = $mrs->fields["embed_url"];
$mukey = $mrs->fields["usr_key"];
if ($msrc == 'embed') {
$mec = VPlayers::playerEmbedCodes($membed_src, array("key" => $membed_key, "url" => $membed_url), $ps[0]["w"], $ps[0]["h"]);
} else {
$mec = '<iframe id="file-embed-' . md5($mkey) . '" type="text/html" width="' . $ps[0]["w"] . '" height="' . $ps[0]["h"] . '" src="' . $cfg["main_url"] . '/embed?v=' . $mkey . '" frameborder="0" allowfullscreen></iframe>';
}
break;
case "a": //embed code for video and audio is generated from within player cfg after initialization (class.players.php)
$mec = '<iframe id="file-embed-' . md5($mkey) . '" type="text/html" width="' . $ps[0]["w"] . '" height="' . $ps[0]["h"] . '" src="' . $cfg["main_url"] . '/embed?a=' . $mkey . '" frameborder="0" allowfullscreen></iframe>';
break;
case "d": //embed code for documents is generated from within player cfg after page load (class.players.php)
$mdoc = VGenerate::thumbSigned(array("type" => "doc", "server" => "upload", "key" => '/' . $mukey . '/d/' . $mkey . '.pdf'), $mkey, $mukey, 0, 1);
$mec = '<embed src="' . $mdoc . '" width="' . $ps[0]["w"] . '" height="' . $ps[0]["h"] . '">';
break;
case "i":
switch ($cfg["image_player"]) {
case "jq":
$_js = null;
//$thumb_link = VGenerate::thumbSigned($mtype, $mkey, $mukey, 0, 1, 1);
$image_link = VGenerate::thumbSigned($mtype, $mkey, $mukey, 0, 1, 0);
//$mec = '[url=' . $image_link . '][img=320x240]' . $thumb_link . '[/img][/url]';
$mec = '<img src="' . $image_link . '">';
break;
}
break;
}
$blog_html = str_replace("[" . $media_entry . "]", $mec, $blog_html);
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title; ?></title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
</head>
<body style="">
<div id="view-player-<?php echo $file_key; ?>"><?php echo $blog_html; ?></div>
</body>
<?php if ($cfg["google_analytics"] != ''): ?>
<script async src="https://www.googletagmanager.com/gtag/js?id=<?=$cfg["google_analytics"]?>"></script>
<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());gtag('config','<?=$cfg["google_analytics"]?>');</script>
<?php endif;?>
</html>

View File

@@ -0,0 +1,149 @@
<?php
/*******************************************************************************************************************
| Software Name : EasyStream
| Software Description : High End YouTube Clone Script with Videos, Shorts, Streams, Images, Audio, Documents, Blogs
| Software Author : (c) Sami Ahmed
|*******************************************************************************************************************
|
|*******************************************************************************************************************
| This source file is subject to the EasyStream Proprietary License Agreement.
|
| By using this software, you acknowledge having read this Agreement and agree to be bound thereby.
|*******************************************************************************************************************
| Copyright (c) 2025 Sami Ahmed. All rights reserved.
|*******************************************************************************************************************/
define('_ISVALID', true);
include_once 'f_core/config.core.php';
include_once $class_language->setLanguageFile('frontend', 'language.view');
$type = 'doc';
$file_key = $class_filter->clr_str($_GET[$type[0]]);
$cfg[] = $class_database->getConfigurations('affiliate_tracking_id');
$mobile = VHref::isMobile();
$u = $db->execute(sprintf("SELECT
A.`usr_key`,
B.`usr_id`,
B.`file_title`, B.`thumb_cache`
FROM
`db_accountuser` A, `db_%sfiles` B
WHERE
A.`usr_id`=B.`usr_id` AND
B.`file_key`='%s'
LIMIT 1;", $type, $file_key));
$usr_key = $u->fields["usr_key"];
$title = $u->fields["file_title"];
$thumb_cache = $u->fields["thumb_cache"];
$thumb_cache = $thumb_cache > 1 ? $thumb_cache : null;
$tmb = $cfg["media_files_url"] . '/' . $usr_key . '/t/' . $file_key . '/0' . $thumb_cache . '.jpg';
$doc_src = $cfg["media_files_dir"] . '/' . $usr_key . '/d/' . md5($cfg["global_salt_key"] . $file_key) . '.pdf';
$src = VGenerate::thumbSigned(array("type" => "doc", "server" => "upload", "key" => '/' . $usr_key . '/d/' . md5($cfg["global_salt_key"] . $file_key) . '.pdf'), $file_key, $usr_key, 0, 1);
if (!file_exists($doc_src)) {
$doc_src = $cfg["media_files_dir"] . '/' . $usr_key . '/d/' . $file_key . '.pdf';
$src = VGenerate::thumbSigned(array("type" => "doc", "server" => "upload", "key" => '/' . $usr_key . '/d/' . $file_key . '.pdf'), $file_key, $usr_key, 0, 1);
}
if (!file_exists($doc_src)) {
exit;
}
?>
<!DOCTYPE html>
<html>
<head profile="http://www.w3.org/2005/10/profile">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="robots" content="noindex, nofollow">
<title><?php echo $title; ?></title>
<?php if ($mobile): ?>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/dealfonso/pdfjs-viewer@1.1/pdfjs-viewer.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined">
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.12.313/pdf.min.js"></script>
<?php endif;?>
<script type="text/javascript" src="<?php echo $cfg['javascript_url']; ?>/jquery.min.js"></script>
<script type="text/javascript">jQuery.migrateMute=true;</script>
<script type="text/javascript">if(navigator.platform==='iPad'||navigator.platform==='iPhone'||navigator.platform==='iPod'){WebFont.load({google:{families:['Roboto:300,400,500,600,700']}});}</script>
<?php if ($mobile): ?>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/dealfonso/pdfjs-viewer@1.1/pdfjs-viewer.min.js"></script>
<script defer>
var url = "<?php echo $src; ?>";
var container = document.getElementById('view-player-<?php echo $file_key; ?>');
$("document").ready(function(){
var pdfjsLib = window["pdfjs-dist/build/pdf"];
pdfjsLib.GlobalWorkerOptions.workerSrc = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.12.313/pdf.worker.min.js";
let pdfViewer = new PDFjsViewer($(".pdfjs-viewer"), {
onZoomChange: function (zoom) {
zoom = parseInt(zoom * 10000) / 100;
$(".zoomval").text(zoom + "%");
},
onActivePageChanged: function (page, pageno) {
$(".pageno").text(pageno + "/" + this.getPageCount());
}
});
pdfViewer.loadDocument(url).then(function () {pdfViewer.setZoom("fit")});
$("#pdfViewer-first").on("click", function() {pdfViewer.first()});
$("#pdfViewer-prev").on("click", function() {pdfViewer.prev();return false});
$("#pdfViewer-next").on("click", function() {pdfViewer.next();return false});
$("#pdfViewer-last").on("click", function() {pdfViewer.last()});
$("#pdfViewer-zoomOut").on("click", function() {pdfViewer.setZoom('out')});
$("#pdfViewer-zoomIn").on("click", function() {pdfViewer.setZoom('in')});
$("#pdfViewer-zoomWidth").on("click", function() {pdfViewer.setZoom('width')});
$("#pdfViewer-zoomHeight").on("click", function() {pdfViewer.setZoom('height')});
$("#pdfViewer-zoomFit").on("click", function() {pdfViewer.setZoom('fit')});
});
</script>
<?php endif;?>
<style>
html,body{width:100%;height:100%;margin:0;padding:0;overflow:hidden}#doc-pagination{display:flex;align-items:center;justify-content:center;margin-bottom:10px}#doc-pagination span#page_wrap{margin:0 15px}
#view-player-<?php echo $file_key; ?>{width:100%;height:100%}
<?php if ($mobile): ?>
#view-player-<?php echo $file_key; ?>{width:100%;height:100%;overflow:scroll !important;position:relative;/*padding-bottom:56.25%;padding-top:0;*/}
.pdftoolbar, .pdftoolbar i{font-size:16px;vertical-align:middle}
.pdftoolbar span{margin-right:0.5em;margin-left:0.5em;font-size:14px}
.pdftoolbar .btn-sm{}
.pdftoolbar{width:100%;height:auto;background:#ddd;z-index:100}
<?php endif;?>
</style>
</head>
<body>
<?php if ($mobile): ?>
<?php endif;?>
<div style="width:100%;height:100%;position:relative;"><div id="view-player-<?php echo $file_key; ?>" class="pdfViewer singlePageView" style="">
<?php if ($mobile): ?>
<div class="pdftoolbar text-center row m-0 p-0">
<div class="col-12 col-lg-6 my-1">
<button class="btn btn-secondary btn-sm btn-first" id="pdfViewer-first"><i class="material-icons-outlined">skip_previous</i></button>
<button class="btn btn-secondary btn-sm btn-prev" id="pdfViewer-prev"><i class="material-icons-outlined">navigate_before</i></button>
<span class="pageno"></span>
<button class="btn btn-secondary btn-sm btn-next" id="pdfViewer-next"><i class="material-icons-outlined">navigate_next</i></button>
<button class="btn btn-secondary btn-sm btn-last" id="pdfViewer-last"><i class="material-icons-outlined">skip_next</i></button>
</div>
<div class="col-12 col-lg-6 my-1">
<button class="btn btn-secondary btn-sm" id="pdfViewer-zoomOut"><i class="material-icons-outlined">zoom_out</i></button>
<span class="zoomval">100%</span>
<button class="btn btn-secondary btn-sm" id="pdfViewer-zoomIn"><i class="material-icons-outlined">zoom_in</i></button>
<button class="btn btn-secondary btn-sm ms-3" id="pdfViewer-zoomWidth"><i class="material-icons-outlined">swap_horiz</i></button>
<button class="btn btn-secondary btn-sm" id="pdfViewer-zoomHeight"><i class="material-icons-outlined">swap_vert</i></button>
<button class="btn btn-secondary btn-sm" id="pdfViewer-zoomFit"><i class="material-icons-outlined">fit_screen</i></button>
</div>
</div>
<div class="pdfjs-viewer h-100"></div>
<?php else: ?>
</div></div>
<script type="text/javascript">$(document).ready(function(){$("#view-player-<?php echo $file_key; ?>").html('<embed src="<?php echo $src; ?>" width="100%" height="100%">')});</script>
<?php endif;?>
</body>
<?php if ($cfg["google_analytics"] != ''): ?>
<script async src="https://www.googletagmanager.com/gtag/js?id=<?=$cfg["google_analytics"]?>"></script>
<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());gtag('config','<?=$cfg["google_analytics"]?>');</script>
<?php endif;?>
</html>

View File

@@ -0,0 +1,8 @@
<?php
define("_ISVALID", true);
include_once "f_core/config.core.php";
// Flow Player integration - basic implementation
echo "<h1>Flow Player</h1>";
echo "<p>Flow Player integration coming soon...</p>";
echo "<a href=\"/\">← Back to Home</a>";
?>

View File

@@ -0,0 +1,8 @@
<?php
define("_ISVALID", true);
include_once "f_core/config.core.php";
// Freepaper player - basic implementation
echo "<h1>Freepaper Player</h1>";
echo "<p>Freepaper functionality coming soon...</p>";
echo "<a href=\"/\">← Back to Home</a>";
?>

View File

@@ -0,0 +1,8 @@
<?php
define("_ISVALID", true);
include_once "f_core/config.core.php";
// Image playlist player - basic implementation
echo "<h1>Image Playlist Player</h1>";
echo "<p>Image playlist functionality coming soon...</p>";
echo "<a href=\"/\">← Back to Home</a>";
?>

View File

@@ -0,0 +1,8 @@
<?php
define("_ISVALID", true);
include_once "f_core/config.core.php";
// JW Player integration - basic implementation
echo "<h1>JW Player</h1>";
echo "<p>JW Player integration coming soon...</p>";
echo "<a href=\"/\">← Back to Home</a>";
?>

View File

@@ -0,0 +1,8 @@
<?php
define("_ISVALID", true);
include_once "f_core/config.core.php";
// Related videos - basic implementation
echo "<h1>Related Videos</h1>";
echo "<p>Related videos functionality coming soon...</p>";
echo "<a href=\"/\">← Back to Home</a>";
?>

View File

@@ -0,0 +1,116 @@
<?php
/*******************************************************************************************************************
| Software Name : EasyStream
| Software Description : High End YouTube Clone Script with Videos, Shorts, Streams, Images, Audio, Documents, Blogs
| Software Author : (c) Sami Ahmed
|*******************************************************************************************************************
|
|*******************************************************************************************************************
| This source file is subject to the EasyStream Proprietary License Agreement.
|
| By using this software, you acknowledge having read this Agreement and agree to be bound thereby.
|*******************************************************************************************************************
| Copyright (c) 2025 Sami Ahmed. All rights reserved.
|*******************************************************************************************************************/
define('_ISVALID', true);
$main_dir = realpath(dirname(__FILE__) . '/../../../');
set_include_path($main_dir);
include_once 'f_core/config.core.php';
$ad_key = $class_filter->clr_str($_GET["v"]);
$ad_type = $class_filter->clr_str($_GET["t"]);
if ($ad_key == '' or $ad_type == '') {
return;
}
$u = $db->execute(sprintf("SELECT * FROM `db_%sadentries` WHERE `ad_key`='%s' LIMIT 1;", $ad_type, $ad_key));
$ad_duration = gmdate("H:i:s", $u->fields["ad_duration"]);
$ad_click_url = $u->fields["ad_click_url"];
$ad_custom_url = $u->fields["ad_custom_url"];
$ad_click_url = $ad_custom_url != '' ? $ad_custom_url : $u->fields["ad_click_url"];
$ad_file = $class_database->singleFieldValue('db_jwadcodes', 'db_code', 'db_key', $u->fields["ad_custom"]);
$ad_file_type = $class_database->singleFieldValue('db_jwadcodes', 'db_type', 'db_key', $u->fields["ad_custom"]);
$ad_file_loc = $ad_file_type == 'code' ? $ad_file : $cfg["player_url"] . '/ad_files/' . $ad_file;
$ad_ext = VFileinfo::getExtension($ad_file);
$ad_width = $u->fields["ad_width"];
$ad_width = (intval($ad_width) > 0) ? ' width="' . $ad_width . '"' : null;
$ad_height = $u->fields["ad_height"];
$ad_height = (intval($ad_height) > 0) ? ' height="' . $ad_height . '"' : null;
$ad_bitrate = $u->fields["ad_bitrate"];
$ad_bitrate = (intval($ad_bitrate) > 0) ? ' bitrate="' . $ad_bitrate . '"' : null;
$impr = $cfg["main_url"] . '/' . VHref::getKey("adv") . '?t=' . $ad_type . '&impression=' . $ad_key;
$ctr = $cfg["main_url"] . '/' . VHref::getKey("adv") . '?t=' . $ad_type . '&click=' . $ad_key;
$pixel = $cfg["player_url"] . '/ad_files/single-pixel-ar7.gif';
header("Content-type: text/xml");
echo '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
?>
<VAST version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast.xsd">
<Ad id="812030">
<InLine>
<AdSystem>VS</AdSystem>
<AdTitle>EasyStream Static VAST Template 2.0</AdTitle>
<Description>date of revision 10-04-14</Description>
<Impression id="ft_vast_i">
<![CDATA[<?php echo $impr; ?>]]>
</Impression>
<Impression id="3rdparty">
<![CDATA[]]>
</Impression>
<Impression id="3rdparty">
<![CDATA[]]>
</Impression>
<Creatives>
<Creative sequence="1">
<Linear>
<Duration>00:00:15</Duration>
<TrackingEvents>
<Tracking event="start">
<![CDATA[<?php echo $pixel; ?>]]>
</Tracking>
<Tracking event="midpoint">
<![CDATA[<?php echo $pixel; ?>]]>
</Tracking>
<Tracking event="firstQuartile">
<![CDATA[<?php echo $pixel; ?>]]>
</Tracking>
<Tracking event="thirdQuartile">
<![CDATA[<?php echo $pixel; ?>]]>
</Tracking>
<Tracking event="complete">
<![CDATA[<?php echo $pixel; ?>]]>
</Tracking>
<Tracking event="mute">
<![CDATA[<?php echo $pixel; ?>]]>
</Tracking>
<Tracking event="fullscreen">
<![CDATA[<?php echo $pixel; ?>]]>
</Tracking>
</TrackingEvents>
<VideoClicks>
<ClickThrough>
<![CDATA[<?php echo $ad_click_url; ?>]]>
</ClickThrough>
<ClickTracking><![CDATA[<?php echo $ctr; ?>]]></ClickTracking>
</VideoClicks>
<MediaFiles>
<MediaFile id="1" delivery="progressive" type="video/<?php echo $ad_ext; ?>"<?php echo $ad_bitrate; ?><?php echo $ad_width; ?><?php echo $ad_height; ?>>
<![CDATA[<?php echo $ad_file_loc; ?>]]>
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
<Creative sequence="1">
<CompanionAds>
</CompanionAds>
</Creative>
</Creatives>
</InLine>
</Ad>
</VAST>

View File

@@ -0,0 +1,8 @@
<?php
define("_ISVALID", true);
include_once "f_core/config.core.php";
// Video playlist player - basic implementation
echo "<h1>Video Playlist Player</h1>";
echo "<p>Video playlist functionality coming soon...</p>";
echo "<a href=\"/\">← Back to Home</a>";
?>

View File

@@ -0,0 +1,43 @@
<?php
/*******************************************************************************************************************
| Software Name : EasyStream
| Software Description : High End YouTube Clone Script with Videos, Shorts, Streams, Images, Audio, Documents, Blogs
| Software Author : (c) Sami Ahmed
|*******************************************************************************************************************
|
|*******************************************************************************************************************
| This source file is subject to the EasyStream Proprietary License Agreement.
|
| By using this software, you acknowledge having read this Agreement and agree to be bound thereby.
|*******************************************************************************************************************
| Copyright (c) 2025 Sami Ahmed. All rights reserved.
|*******************************************************************************************************************/
define('_ISVALID', true);
include_once 'f_core/config.core.php';
$type = isset($_GET['a']) ? 'audio' : (isset($_GET['l']) ? 'live' : (isset($_GET['s']) ? 'short' : 'video'));
$file_key = $class_filter->clr_str($_GET[$type[0]]);
// Basic VMAP that points to a VAST pre-roll for this request.
// This is a scaffold; a rules engine can fill multiple AdBreaks.
header('Content-type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<VMAP xmlns="http://www.iab.net/videosuite/vmap" version="1.0">
<AdBreak breakType="linear" breakId="preroll" timeOffset="start">
<AdSource id="1" allowMultipleAds="false" followRedirects="true">
<VASTAdData>
<?php
$vast = $cfg['main_url'] . '/' . VHref::getKey('vast') . '?t=vjs&v=' . htmlspecialchars($file_key, ENT_QUOTES, 'UTF-8');
echo '<VAST xmlns="http://schemas.xmlsoap.org/ads/vast/3.0"><Ad><InLine><AdSystem>VS</AdSystem><AdTitle>VMAP VAST Wrapper</AdTitle><Creatives><Creative><Linear><TrackingEvents></TrackingEvents><MediaFiles></MediaFiles></Linear></Creative></Creatives></InLine></Ad></VAST>'; // minimal placeholder
?>
</VASTAdData>
<AdTagURI templateType="vast3">
<![CDATA[<?php echo $vast; ?>]]>
</AdTagURI>
</AdSource>
</AdBreak>
</VMAP>