2025-07-10 20:01:56 +03:00
<? php
if ( isset ( $rSkipVerify ) || php_sapi_name () != 'cli' ) {
session_start ();
2025-10-19 18:00:54 +03:00
require_once '/home/xc_vm/www/constants.php' ;
2026-03-03 20:00:34 +03:00
require_once MAIN_HOME . 'core/Init/LegacyInitializer.php' ;
2026-02-20 19:56:08 +03:00
require_once MAIN_HOME . 'core/Database/DatabaseHandler.php' ;
2025-10-19 18:00:54 +03:00
require_once INCLUDES_PATH . 'libs/tmdb.php' ;
2025-07-10 20:01:56 +03:00
2026-02-20 19:56:08 +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
2025-10-19 18:00:54 +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 ();
}
2025-10-19 18:00:54 +03:00
function sortArrayStreamName ( $a , $b ) {
$rColumn = ( isset ( $a [ 'stream_display_name' ]) ? 'stream_display_name' : 'title' );
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
return strcmp ( $a [ $rColumn ], $b [ $rColumn ]);
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
function destroySession () {
global $_SESSION ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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-10-19 18:00:54 +03:00
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
function sortArrayByArray ( $rArray , $rSort ) {
if ( ! ( empty ( $rArray ) || empty ( $rSort ))) {
$rOrdered = array ();
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
}
}
2025-10-19 18:00:54 +03:00
return $rOrdered + $rArray ;
} else {
return array ();
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
if ( $rRow [ 'title' ]) {
$rRow [ 'stream_display_name' ] = $rRow [ 'title' ];
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
return $rRow ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
}
function getSerie ( $rID ) {
global $db ;
$db -> query ( 'SELECT * FROM `streams_series` WHERE `id` = ?;' , $rID );
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
if ( $db -> num_rows () == 1 ) {
return $db -> get_row ();
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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 );
2025-10-19 18:00:54 +03:00
$rReturn = array ();
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
if ( is_array ( $rSubtitles )) {
$i = 0 ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
foreach ( $rSubtitles as $rSubtitle ) {
$rLanguage = null ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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 {
2025-10-19 18:00:54 +03:00
list (, $rLanguage ) = explode ( '-' , $rKey , 2 );
break ;
2025-07-10 20:01:56 +03:00
}
}
2025-10-19 18:00:54 +03:00
if ( ! $rLanguage ) {
$rLanguage = 'Subtitle #' . ( $i + 1 );
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
}
}
2025-10-19 18:00:54 +03:00
return $rReturn ;
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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 ) {
2025-10-19 18:00:54 +03:00
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
}
}
2025-10-19 18:00:54 +03:00
$rTitle = array_column ( $rReturn , 'cat_order' );
array_multisort ( $rTitle , SORT_ASC , $rReturn );
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
}
2025-10-19 18:00:54 +03:00
return $rReturn ;
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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' ]);
2025-10-19 18:00:54 +03:00
} 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
}
2025-10-19 18:00:54 +03:00
return ( $rTMDB -> getMovie ( $rID ) ?: null );
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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' ]);
2025-10-19 18:00:54 +03:00
} 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
}
2025-10-19 18:00:54 +03:00
return ( json_decode ( $rTMDB -> getTVShow ( $rID ) -> getJSON (), true ) ?: null );
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +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' ]);
2025-10-19 18:00:54 +03:00
} else {
2026-03-07 21:53:45 +03:00
$rTMDB = new TMDB ( SettingsManager :: getAll ()[ 'tmdb_api_key' ]);
2025-10-19 18:00:54 +03:00
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
return json_decode ( $rTMDB -> getSeason ( $rID , intval ( $rSeason )) -> getJSON (), true );
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
case 'movie' :
$rChannels = array_merge ( $rChannels , $rUserInfo [ 'vod_ids' ]);
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'radio_streams' :
$rChannels = array_merge ( $rChannels , $rUserInfo [ 'radio_ids' ]);
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'series' :
$rChannels = array_merge ( $rChannels , $rUserInfo [ 'episode_ids' ]);
break ;
2025-07-10 20:01:56 +03:00
}
}
2025-10-19 18:00:54 +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' ]) {
2025-10-19 18:00:54 +03:00
$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
}
2025-10-19 18:00:54 +03:00
if ( count ( $rTypes ) > 0 ) {
$rWhere [] = '`type` IN (' . implode ( ',' , mapContentTypesToNumbers ( $rTypes )) . ')' ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
if ( $rLiveIDs && 0 < count ( $rLiveIDs )) {
$rWhere [] = '`id` IN (' . implode ( ',' , array_map ( 'intval' , $rLiveIDs )) . ')' ;
2025-07-10 20:01:56 +03:00
}
}
}
2025-10-19 18:00:54 +03:00
if ( $rPicking [ 'filter' ]) {
switch ( $rPicking [ 'filter' ]) {
case 'all' :
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
if ( ! empty ( $rFav )) {
$favoriteChannelIds = array ();
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
foreach ( $rTypes as $rType ) {
foreach ( $rUserInfo [ 'fav_channels' ][ $rType ] as $rStreamID ) {
$favoriteChannelIds [] = intval ( $rStreamID );
2025-07-10 20:01:56 +03:00
}
}
2025-10-19 18:00:54 +03:00
$rChannels = array_intersect ( $favoriteChannelIds , $rChannels );
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
if ( ! empty ( $rSearchBy )) {
$rWhere [] = '`stream_display_name` LIKE ?' ;
$rWhereV [] = '%' . $rSearchBy . '%' ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +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
}
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
switch ( $rOrderBy ) {
case 'name' :
uasort ( $rStreams [ 'streams' ], 'sortArrayStreamName' );
$rOrder = '`stream_display_name` ASC' ;
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'top' :
case 'rating' :
$rOrder = '`rating` DESC' ;
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'added' :
$rOrder = '`added` DESC' ;
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'release' :
$rOrder = '`year` DESC, `stream_display_name` ASC' ;
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'number' :
default :
2026-03-07 21:53:45 +03:00
if ( SettingsManager :: getAll ()[ 'channel_number_type' ] != 'manual' && 0 < count ( $rChannels )) {
2025-10-19 18:00:54 +03:00
$rOrder = 'FIELD(id,' . implode ( ',' , $rChannels ) . ')' ;
2025-07-10 20:01:56 +03:00
} else {
2025-10-19 18:00:54 +03:00
$rOrder = '`order` ASC' ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
break ;
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
$rStreams [ 'count' ] = $db -> get_row ()[ 'count' ];
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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 {
2025-10-19 18:00:54 +03:00
$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
}
2025-10-19 18:00:54 +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
}
2025-10-19 18:00:54 +03:00
$db -> query ( $rQuery , ... $rWhereV );
$rRows = $db -> get_rows ();
2025-07-10 20:01:56 +03:00
} else {
2025-10-19 18:00:54 +03:00
$rRows = array ();
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
if ( $rIDs ) {
return $rRows ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
foreach ( $rRows as $rStream ) {
$rStream [ 'number' ] = $rKey ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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 {
2025-10-19 18:00:54 +03:00
list ( $rStream [ 'category_id' ]) = json_decode ( $rStream [ 'category_id' ], true );
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +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
}
2025-10-19 18:00:54 +03:00
return $rStreams ;
} else {
return $rStreams ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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' ]) {
2025-10-19 18:00:54 +03:00
$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
}
2025-10-19 18:00:54 +03:00
if ( ! empty ( $rCategoryID )) {
$rWhere [] = "JSON_CONTAINS(`category_id`, ?, ' \$ ')" ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
$rWhereV [] = $rCategoryID ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
if ( is_array ( $rPicking [ 'year_range' ])) {
$rWhere [] = '(`year` >= ? AND `year` <= ?)' ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
$rWhereV [] = $rPicking [ 'year_range' ][ 0 ];
$rWhereV [] = $rPicking [ 'year_range' ][ 1 ];
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
switch ( $rOrderBy ) {
case 'name' :
uasort ( $rStreams [ 'streams' ], 'sortArrayStreamName' );
$rOrder = '`title` ASC' ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'top' :
case 'rating' :
$rOrder = '`rating` DESC' ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'added' :
$rOrder = '`last_modified` DESC' ;
break ;
2025-09-24 21:31:50 +03:00
2025-10-19 18:00:54 +03:00
case 'release' :
$rOrder = '`release_date` DESC' ;
break ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
case 'number' :
default :
2026-03-07 21:53:45 +03:00
if ( SettingsManager :: getAll ()[ 'vod_sort_newest' ]) {
2025-10-19 18:00:54 +03:00
$rOrder = '`last_modified` DESC' ;
2025-09-24 21:31:50 +03:00
} else {
2025-10-19 18:00:54 +03:00
$rOrder = 'FIELD(id,' . implode ( ',' , $rSeries ) . ')' ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
break ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
$rStreams [ 'count' ] = $db -> get_row ()[ 'count' ];
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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 {
2025-10-19 18:00:54 +03:00
$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
}
2025-10-19 18:00:54 +03:00
$db -> query ( $rQuery , ... $rWhereV );
$rRows = $db -> get_rows ();
2025-09-24 21:31:50 +03:00
} else {
2025-10-19 18:00:54 +03:00
if ( $additionalOptions ) {
return null ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
$rRows = array ();
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
foreach ( $rRows as $rStream ) {
$rStream [ 'number' ] = $rKey ;
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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 {
2025-10-19 18:00:54 +03:00
list ( $rStream [ 'category_id' ]) = json_decode ( $rStream [ 'category_id' ], true );
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
$rStreams [ 'streams' ][ $rStream [ 'id' ]] = $rStream ;
$rKey ++ ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
return $rStreams ;
} else {
return $rStreams ;
2025-07-10 20:01:56 +03:00
}
2025-10-19 18:00:54 +03:00
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
function getIncludedFileNameWithoutExtension () {
return strtolower ( basename ( get_included_files ()[ 0 ], '.php' ));
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +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
2025-10-19 18:00:54 +03:00
foreach ( $rTypes as $rType ) {
$rReturn [] = $rTypeInt [ $rType ];
}
2025-07-10 20:01:56 +03:00
2025-10-19 18:00:54 +03:00
return $rReturn ;
2025-09-30 16:21:06 +03:00
}