Files
XC_VM/src/player/functions.php
T

498 lines
14 KiB
PHP
Raw Normal View History

2025-07-10 20:01:56 +03:00
<?php
if (isset($rSkipVerify) || php_sapi_name() != 'cli') {
session_start();
require_once '/home/xc_vm/www/constants.php';
2026-03-03 20:00:34 +03:00
require_once MAIN_HOME . 'core/Init/LegacyInitializer.php';
require_once MAIN_HOME . 'core/Database/DatabaseHandler.php';
require_once INCLUDES_PATH . 'libs/tmdb.php';
2025-07-10 20:01:56 +03:00
$db = new DatabaseHandler($_INFO['username'], $_INFO['password'], $_INFO['database'], $_INFO['hostname'], $_INFO['port']);
2026-03-07 21:53:45 +03:00
DatabaseFactory::set($db);
LegacyInitializer::initCore();
2025-07-10 20:01:56 +03:00
2026-03-07 21:53:45 +03:00
define('SERVER_ID', ConnectionTracker::getMainID());
2025-07-10 20:01:56 +03:00
$_PAGE = getIncludedFileNameWithoutExtension();
2026-03-07 21:53:45 +03:00
$rServers = ServerRepository::getAll();
SettingsManager::update('live_streaming_pass', md5(sha1($rServers[SERVER_ID]['server_name'] . $rServers[SERVER_ID]['server_ip']) . '5f13a731fb85944e5c69ce863b0c990d'));
2025-07-10 20:01:56 +03:00
2025-09-24 21:31:50 +03:00
if (!isset($rSkipVerify)) {
2026-03-07 21:53:45 +03:00
if (!(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || $rServers[SERVER_ID]['enable_https']) {
2025-07-10 20:01:56 +03:00
if (isset($_SESSION['phash'])) {
2026-03-07 21:53:45 +03:00
$rUserInfo = UserRepository::getUserInfo($_SESSION['phash'], null, null, true);
2025-07-10 20:01:56 +03:00
if (!(!$rUserInfo || $_SESSION['pverify'] != md5($rUserInfo['username'] . '||' . $rUserInfo['password']) || !is_null($rUserInfo['exp_date']) && $rUserInfo['exp_date'] <= time() || $rUserInfo['admin_enabled'] == 0 || $rUserInfo['enabled'] == 0)) {
sort($rUserInfo['bouquet']);
} else {
destroySession();
header('Location: login.php');
exit();
}
} else {
header('Location: login.php');
exit();
}
} else {
2026-03-07 21:53:45 +03:00
header('Location: ' . $rServers[SERVER_ID]['http_url'] . ltrim($_SERVER['REQUEST_URI'], '/'));
2025-07-10 20:01:56 +03:00
exit();
}
}
} else {
exit();
}
function sortArrayStreamName($a, $b) {
$rColumn = (isset($a['stream_display_name']) ? 'stream_display_name' : 'title');
2025-07-10 20:01:56 +03:00
return strcmp($a[$rColumn], $b[$rColumn]);
}
2025-07-10 20:01:56 +03:00
function destroySession() {
global $_SESSION;
2025-07-10 20:01:56 +03:00
foreach (array('phash', 'pverify') as $rKey) {
if (!isset($_SESSION[$rKey])) {
} else {
unset($_SESSION[$rKey]);
2025-07-10 20:01:56 +03:00
}
}
}
2025-07-10 20:01:56 +03:00
function sortArrayByArray($rArray, $rSort) {
if (!(empty($rArray) || empty($rSort))) {
$rOrdered = array();
2025-07-10 20:01:56 +03:00
foreach ($rSort as $rValue) {
if (($rKey = array_search($rValue, $rArray)) === false) {
} else {
$rOrdered[] = $rValue;
unset($rArray[$rKey]);
2025-07-10 20:01:56 +03:00
}
}
return $rOrdered + $rArray;
} else {
return array();
2025-07-10 20:01:56 +03:00
}
}
2025-07-10 20:01:56 +03:00
function getStream($rID) {
global $db;
$db->query('SELECT * FROM `streams` WHERE `id` = ?;', $rID);
if ($db->num_rows() == 1) {
$rRow = $db->get_row();
2025-07-10 20:01:56 +03:00
if ($rRow['title']) {
$rRow['stream_display_name'] = $rRow['title'];
2025-07-10 20:01:56 +03:00
}
return $rRow;
2025-07-10 20:01:56 +03:00
}
}
function getSerie($rID) {
global $db;
$db->query('SELECT * FROM `streams_series` WHERE `id` = ?;', $rID);
2025-07-10 20:01:56 +03:00
if ($db->num_rows() == 1) {
return $db->get_row();
2025-07-10 20:01:56 +03:00
}
}
2025-07-10 20:01:56 +03:00
function getSubtitles($rStreamID, $rSubtitles) {
global $rUserInfo;
2026-03-07 21:53:45 +03:00
$rDomainName = DomainResolver::resolve(SERVER_ID, !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443);
$rReturn = array();
2025-07-10 20:01:56 +03:00
if (is_array($rSubtitles)) {
$i = 0;
2025-07-10 20:01:56 +03:00
foreach ($rSubtitles as $rSubtitle) {
$rLanguage = null;
2025-07-10 20:01:56 +03:00
foreach (array_keys($rSubtitle['tags']) as $rKey) {
if (!in_array(strtoupper(explode('-', $rKey)[0]), array('BPS', 'DURATION', 'NUMBER_OF_FRAMES', 'NUMBER_OF_BYTES'))) {
if ($rKey == 'language') {
$rLanguage = $rSubtitle['tags'][$rKey];
break;
2025-07-10 20:01:56 +03:00
}
} else {
list(, $rLanguage) = explode('-', $rKey, 2);
break;
2025-07-10 20:01:56 +03:00
}
}
if (!$rLanguage) {
$rLanguage = 'Subtitle #' . ($i + 1);
}
2025-07-10 20:01:56 +03:00
$rReturn[] = array('label' => $rLanguage, 'file' => $rDomainName . 'subtitle/' . $rUserInfo['username'] . '/' . $rUserInfo['password'] . '/' . $rStreamID . '?sub_id=' . $i . '&webvtt=1', 'kind' => 'subtitles');
$i++;
2025-07-10 20:01:56 +03:00
}
}
return $rReturn;
}
2025-07-10 20:01:56 +03:00
function getOrderedCategories($rCategories, $rType = 'movie') {
$rReturn = array();
2025-07-10 20:01:56 +03:00
2026-03-07 21:53:45 +03:00
foreach (CategoryService::getFromDatabase($rType) as $rCategory) {
if (in_array($rCategory['id'], $rCategories)) {
$rReturn[] = array('title' => $rCategory['category_name'], 'id' => $rCategory['id'], 'cat_order' => $rCategory['cat_order']);
2025-07-10 20:01:56 +03:00
}
}
$rTitle = array_column($rReturn, 'cat_order');
array_multisort($rTitle, SORT_ASC, $rReturn);
2025-07-10 20:01:56 +03:00
if ($rType != 'live') {
array_unshift($rReturn, array('id' => '0', 'cat_order' => 0, 'title' => 'All Genres'));
} else {
array_unshift($rReturn, array('id' => '0', 'cat_order' => 0, 'title' => 'Most Popular'));
2025-07-10 20:01:56 +03:00
}
return $rReturn;
}
2025-07-10 20:01:56 +03:00
function getMovieTMDB($rID) {
2026-03-07 21:53:45 +03:00
if (0 < strlen(SettingsManager::getAll()['tmdb_language'])) {
$rTMDB = new TMDB(SettingsManager::getAll()['tmdb_api_key'], SettingsManager::getAll()['tmdb_language']);
} else {
2026-03-07 21:53:45 +03:00
$rTMDB = new TMDB(SettingsManager::getAll()['tmdb_api_key']);
2025-07-10 20:01:56 +03:00
}
return ($rTMDB->getMovie($rID) ?: null);
}
2025-07-10 20:01:56 +03:00
function getSeriesTMDB($rID) {
2026-03-07 21:53:45 +03:00
if (0 < strlen(SettingsManager::getAll()['tmdb_language'])) {
$rTMDB = new TMDB(SettingsManager::getAll()['tmdb_api_key'], SettingsManager::getAll()['tmdb_language']);
} else {
2026-03-07 21:53:45 +03:00
$rTMDB = new TMDB(SettingsManager::getAll()['tmdb_api_key']);
2025-07-10 20:01:56 +03:00
}
return (json_decode($rTMDB->getTVShow($rID)->getJSON(), true) ?: null);
2025-07-10 20:01:56 +03:00
}
function getSeasonTMDB($rID, $rSeason) {
2026-03-07 21:53:45 +03:00
if (0 < strlen(SettingsManager::getAll()['tmdb_language'])) {
$rTMDB = new TMDB(SettingsManager::getAll()['tmdb_api_key'], SettingsManager::getAll()['tmdb_language']);
} else {
2026-03-07 21:53:45 +03:00
$rTMDB = new TMDB(SettingsManager::getAll()['tmdb_api_key']);
}
2025-07-10 20:01:56 +03:00
return json_decode($rTMDB->getSeason($rID, intval($rSeason))->getJSON(), true);
}
2025-07-10 20:01:56 +03:00
function getUserStreams($rUserInfo, $rTypes = array(), $rCategoryID = null, $rFav = null, $rOrderBy = null, $rSearchBy = null, $rPicking = array(), $rStart = 0, $rLimit = 10, $rIDs = false) {
global $db;
$rAdded = false;
$rChannels = array();
foreach ($rTypes as $rType) {
switch ($rType) {
case 'live':
case 'created_live':
if (!$rAdded) {
$rChannels = array_merge($rChannels, $rUserInfo['live_ids']);
$rAdded = true;
break;
}
break;
2025-07-10 20:01:56 +03:00
case 'movie':
$rChannels = array_merge($rChannels, $rUserInfo['vod_ids']);
break;
2025-07-10 20:01:56 +03:00
case 'radio_streams':
$rChannels = array_merge($rChannels, $rUserInfo['radio_ids']);
break;
2025-07-10 20:01:56 +03:00
case 'series':
$rChannels = array_merge($rChannels, $rUserInfo['episode_ids']);
break;
2025-07-10 20:01:56 +03:00
}
}
$rStreams = array('count' => 0, 'streams' => array());
$rKey = $rStart + 1;
$rWhereV = $rWhere = array();
2025-07-10 20:01:56 +03:00
2026-03-07 21:53:45 +03:00
if (SettingsManager::getAll()['player_hide_incompatible']) {
$rWhere[] = '(SELECT MAX(`compatible`) FROM `streams_servers` WHERE `streams_servers`.`stream_id` = `streams`.`id` LIMIT 1) = 1';
2025-07-10 20:01:56 +03:00
}
if (count($rTypes) > 0) {
$rWhere[] = '`type` IN (' . implode(',', mapContentTypesToNumbers($rTypes)) . ')';
2025-07-10 20:01:56 +03:00
}
if (!empty($rCategoryID)) {
$rWhere[] = "JSON_CONTAINS(`category_id`, ?, '\$')";
$rWhereV[] = $rCategoryID;
} else {
if (in_array('live', $rTypes) && empty($rSearchBy)) {
$rStart = 0;
$rLimit = 200;
$rLiveIDs = igbinary_unserialize(file_get_contents(CONTENT_PATH . 'live_popular'));
2025-07-10 20:01:56 +03:00
if ($rLiveIDs && 0 < count($rLiveIDs)) {
$rWhere[] = '`id` IN (' . implode(',', array_map('intval', $rLiveIDs)) . ')';
2025-07-10 20:01:56 +03:00
}
}
}
if ($rPicking['filter']) {
switch ($rPicking['filter']) {
case 'all':
break;
2025-07-10 20:01:56 +03:00
case 'timeshift':
$rWhere[] = '`tv_archive_duration` > 0 AND `tv_archive_server_id` > 0';
break;
2025-07-10 20:01:56 +03:00
}
}
2026-03-07 21:53:45 +03:00
$rChannels = StreamSorter::sortChannels($rChannels);
2025-07-10 20:01:56 +03:00
if (!empty($rFav)) {
$favoriteChannelIds = array();
2025-07-10 20:01:56 +03:00
foreach ($rTypes as $rType) {
foreach ($rUserInfo['fav_channels'][$rType] as $rStreamID) {
$favoriteChannelIds[] = intval($rStreamID);
2025-07-10 20:01:56 +03:00
}
}
$rChannels = array_intersect($favoriteChannelIds, $rChannels);
2025-07-10 20:01:56 +03:00
}
if (!empty($rSearchBy)) {
$rWhere[] = '`stream_display_name` LIKE ?';
$rWhereV[] = '%' . $rSearchBy . '%';
2025-07-10 20:01:56 +03:00
}
if (is_array($rPicking['year_range'])) {
$rWhere[] = '(`year` >= ? AND `year` <= ?)';
$rWhereV[] = $rPicking['year_range'][0];
$rWhereV[] = $rPicking['year_range'][1];
2025-07-10 20:01:56 +03:00
}
if (is_array($rPicking['rating_range'])) {
$rWhere[] = '(`rating` >= ? AND `rating` <= ?)';
$rWhereV[] = $rPicking['rating_range'][0];
$rWhereV[] = $rPicking['rating_range'][1];
2025-07-10 20:01:56 +03:00
}
2026-03-07 21:53:45 +03:00
$rChannels = InputValidator::confirmIDs($rChannels);
2025-07-10 20:01:56 +03:00
if (count($rChannels) != 0) {
$rWhere[] = '`id` IN (' . implode(',', array_map('intval', $rChannels)) . ')';
$rWhereString = 'WHERE ' . implode(' AND ', $rWhere);
2025-07-10 20:01:56 +03:00
switch ($rOrderBy) {
case 'name':
uasort($rStreams['streams'], 'sortArrayStreamName');
$rOrder = '`stream_display_name` ASC';
break;
2025-07-10 20:01:56 +03:00
case 'top':
case 'rating':
$rOrder = '`rating` DESC';
break;
2025-07-10 20:01:56 +03:00
case 'added':
$rOrder = '`added` DESC';
break;
2025-07-10 20:01:56 +03:00
case 'release':
$rOrder = '`year` DESC, `stream_display_name` ASC';
break;
2025-07-10 20:01:56 +03:00
case 'number':
default:
2026-03-07 21:53:45 +03:00
if (SettingsManager::getAll()['channel_number_type'] != 'manual' && 0 < count($rChannels)) {
$rOrder = 'FIELD(id,' . implode(',', $rChannels) . ')';
2025-07-10 20:01:56 +03:00
} else {
$rOrder = '`order` ASC';
2025-07-10 20:01:56 +03:00
}
break;
}
2025-07-10 20:01:56 +03:00
if (0 < count($rChannels)) {
$db->query('SELECT COUNT(`id`) AS `count` FROM `streams` ' . $rWhereString . ';', ...$rWhereV);
2025-09-24 21:31:50 +03:00
$rStreams['count'] = $db->get_row()['count'];
2025-07-10 20:01:56 +03:00
if ($rLimit) {
if ($rIDs) {
$rQuery = 'SELECT `id` FROM `streams` ' . $rWhereString . ' ORDER BY ' . $rOrder . ' LIMIT ' . $rStart . ', ' . $rLimit . ';';
2025-07-10 20:01:56 +03:00
} else {
$rQuery = 'SELECT (SELECT `stream_info` FROM `streams_servers` WHERE `streams_servers`.`pid` IS NOT NULL AND `streams_servers`.`stream_id` = `streams`.`id` LIMIT 1) AS `stream_info`, `id`, `stream_display_name`, `movie_properties`, `target_container`, `added`, `year`, `category_id`, `channel_id`, `epg_id`, `tv_archive_duration`, `stream_icon`, `allow_record`, `type` FROM `streams` ' . $rWhereString . ' ORDER BY ' . $rOrder . ' LIMIT ' . $rStart . ', ' . $rLimit . ';';
2025-07-10 20:01:56 +03:00
}
} else {
if ($rIDs) {
$rQuery = 'SELECT `id` FROM `streams` ' . $rWhereString . ' ORDER BY ' . $rOrder . ';';
} else {
$rQuery = 'SELECT (SELECT `stream_info` FROM `streams_servers` WHERE `streams_servers`.`pid` IS NOT NULL AND `streams_servers`.`stream_id` = `streams`.`id` LIMIT 1) AS `stream_info`, `id`, `stream_display_name`, `movie_properties`, `target_container`, `added`, `year`, `category_id`, `channel_id`, `epg_id`, `tv_archive_duration`, `stream_icon`, `allow_record`, `type` FROM `streams` ' . $rWhereString . ' ORDER BY ' . $rOrder . ';';
2025-09-30 16:21:06 +03:00
}
2025-07-10 20:01:56 +03:00
}
$db->query($rQuery, ...$rWhereV);
$rRows = $db->get_rows();
2025-07-10 20:01:56 +03:00
} else {
$rRows = array();
2025-07-10 20:01:56 +03:00
}
if ($rIDs) {
return $rRows;
2025-07-10 20:01:56 +03:00
}
foreach ($rRows as $rStream) {
$rStream['number'] = $rKey;
2025-07-10 20:01:56 +03:00
if (in_array($rCategoryID, json_decode($rStream['category_id'], true))) {
$rStream['category_id'] = $rCategoryID;
2025-07-10 20:01:56 +03:00
} else {
list($rStream['category_id']) = json_decode($rStream['category_id'], true);
2025-07-10 20:01:56 +03:00
}
$rStream['stream_info'] = json_decode($rStream['stream_info'], true);
$rStreams['streams'][$rStream['id']] = $rStream;
$rKey++;
2025-07-10 20:01:56 +03:00
}
return $rStreams;
} else {
return $rStreams;
2025-07-10 20:01:56 +03:00
}
}
2025-07-10 20:01:56 +03:00
function getUserSeries($rUserInfo, $rCategoryID = null, $rFav = null, $rOrderBy = null, $rSearchBy = null, $rPicking = array(), $rStart = 0, $rLimit = 10, $additionalOptions = null) {
global $db;
$rSeries = $rUserInfo['series_ids'];
$rStreams = array('count' => 0, 'streams' => array());
$rKey = $rStart + 1;
$rWhereV = $rWhere = array();
2025-07-10 20:01:56 +03:00
2026-03-07 21:53:45 +03:00
if (SettingsManager::getAll()['player_hide_incompatible']) {
$rWhere[] = '(SELECT MAX(`compatible`) FROM `streams_servers` LEFT JOIN `streams_episodes` ON `streams_episodes`.`stream_id` = `streams_servers`.`stream_id` WHERE `streams_episodes`.`series_id` = `streams_series`.`id`) = 1';
2025-07-10 20:01:56 +03:00
}
if (!empty($rCategoryID)) {
$rWhere[] = "JSON_CONTAINS(`category_id`, ?, '\$')";
2025-07-10 20:01:56 +03:00
$rWhereV[] = $rCategoryID;
2025-07-10 20:01:56 +03:00
}
if (is_array($rPicking['year_range'])) {
$rWhere[] = '(`year` >= ? AND `year` <= ?)';
2025-07-10 20:01:56 +03:00
$rWhereV[] = $rPicking['year_range'][0];
$rWhereV[] = $rPicking['year_range'][1];
2025-07-10 20:01:56 +03:00
}
if (is_array($rPicking['rating_range'])) {
$rWhere[] = '(`rating` >= ? AND `rating` <= ?)';
$rWhereV[] = $rPicking['rating_range'][0];
$rWhereV[] = $rPicking['rating_range'][1];
}
2025-07-10 20:01:56 +03:00
if (!empty($rSearchBy)) {
$rWhere[] = '`title` LIKE ?';
$rWhereV[] = '%' . $rSearchBy . '%';
}
2025-07-10 20:01:56 +03:00
2026-03-07 21:53:45 +03:00
$rSeries = InputValidator::confirmIDs($rSeries);
2025-07-10 20:01:56 +03:00
if (count($rSeries) != 0) {
$rWhere[] = '`id` IN (' . implode(',', array_map('intval', $rSeries)) . ')';
$rWhereString = 'WHERE ' . implode(' AND ', $rWhere);
2025-07-10 20:01:56 +03:00
switch ($rOrderBy) {
case 'name':
uasort($rStreams['streams'], 'sortArrayStreamName');
$rOrder = '`title` ASC';
2025-07-10 20:01:56 +03:00
break;
2025-07-10 20:01:56 +03:00
case 'top':
case 'rating':
$rOrder = '`rating` DESC';
2025-07-10 20:01:56 +03:00
break;
2025-07-10 20:01:56 +03:00
case 'added':
$rOrder = '`last_modified` DESC';
break;
2025-09-24 21:31:50 +03:00
case 'release':
$rOrder = '`release_date` DESC';
break;
2025-07-10 20:01:56 +03:00
case 'number':
default:
2026-03-07 21:53:45 +03:00
if (SettingsManager::getAll()['vod_sort_newest']) {
$rOrder = '`last_modified` DESC';
2025-09-24 21:31:50 +03:00
} else {
$rOrder = 'FIELD(id,' . implode(',', $rSeries) . ')';
2025-07-10 20:01:56 +03:00
}
break;
2025-07-10 20:01:56 +03:00
}
if (0 < count($rSeries)) {
$db->query('SELECT COUNT(`id`) AS `count` FROM `streams_series` ' . $rWhereString . ';', ...$rWhereV);
2025-07-10 20:01:56 +03:00
$rStreams['count'] = $db->get_row()['count'];
2025-07-10 20:01:56 +03:00
if ($rLimit) {
$rQuery = 'SELECT `id`, `title`, `category_id`, `cover`, `rating`, `release_date`, `last_modified`, `tmdb_id`, `seasons`, `backdrop_path`, `year` FROM `streams_series` ' . $rWhereString . ' ORDER BY ' . $rOrder . ' LIMIT ' . $rStart . ', ' . $rLimit . ';';
2025-07-10 20:01:56 +03:00
} else {
$rQuery = 'SELECT `id`, `title`, `category_id`, `cover`, `rating`, `release_date`, `last_modified`, `tmdb_id`, `seasons`, `backdrop_path`, `year` FROM `streams_series` ' . $rWhereString . ' ORDER BY ' . $rOrder . ';';
2025-07-10 20:01:56 +03:00
}
$db->query($rQuery, ...$rWhereV);
$rRows = $db->get_rows();
2025-09-24 21:31:50 +03:00
} else {
if ($additionalOptions) {
return null;
2025-07-10 20:01:56 +03:00
}
$rRows = array();
2025-07-10 20:01:56 +03:00
}
foreach ($rRows as $rStream) {
$rStream['number'] = $rKey;
2025-07-10 20:01:56 +03:00
if (in_array($rCategoryID, json_decode($rStream['category_id'], true))) {
$rStream['category_id'] = $rCategoryID;
2025-07-10 20:01:56 +03:00
} else {
list($rStream['category_id']) = json_decode($rStream['category_id'], true);
2025-07-10 20:01:56 +03:00
}
$rStreams['streams'][$rStream['id']] = $rStream;
$rKey++;
2025-07-10 20:01:56 +03:00
}
return $rStreams;
} else {
return $rStreams;
2025-07-10 20:01:56 +03:00
}
}
2025-07-10 20:01:56 +03:00
function getIncludedFileNameWithoutExtension() {
return strtolower(basename(get_included_files()[0], '.php'));
}
2025-07-10 20:01:56 +03:00
function mapContentTypesToNumbers($rTypes) {
$rReturn = array();
$rTypeInt = array('live' => 1, 'movie' => 2, 'created_live' => 3, 'radio_streams' => 4, 'series' => 5);
2025-07-10 20:01:56 +03:00
foreach ($rTypes as $rType) {
$rReturn[] = $rTypeInt[$rType];
}
2025-07-10 20:01:56 +03:00
return $rReturn;
2025-09-30 16:21:06 +03:00
}