Files
szkoleniauryzaj.pl/wp-content/plugins/youtube-feed-pro/inc/Pro/SBY_Settings_Pro.php
2026-04-26 23:47:49 +02:00

509 lines
17 KiB
PHP

<?php
namespace SmashBalloon\YouTubeFeed\Pro;
use SmashBalloon\YouTubeFeed\SBY_Settings;
class SBY_Settings_Pro extends SBY_Settings {
protected function after_settings_set() {
if ( $this->settings['type'] === 'search'
&& $this->settings['sortby'] === 'none' ) {
$this->settings['sortby'] = 'relevance';
}
}
/**
* Based on the settings related to retrieving post data from the API,
* this setting is used to make sure all endpoints needed for the feed are
* connected and stored for easily looping through when adding posts
*
* Overwritten in the Pro version.
*
* @since 1.0
*/
public function set_feed_type_and_terms() {
//global $sby_posts_manager;
$connected_accounts_in_feed = array();
$feed_type_and_terms = array();
$connected_account = sby_get_first_connected_account();
$channel_only = isset( $connected_account['api_key'] ) ? false : true;
if ( $channel_only ) {
$updated_hoverinclude = array();
if ( \is_array( $this->settings['hoverinclude'] ) ) {
foreach ( $this->settings['hoverinclude'] as $hoverinclude ) {
if ( ! in_array( $hoverinclude, array( 'views', 'stats', 'countdown' ), true ) ) {
$updated_hoverinclude[] = $hoverinclude;
}
}
$this->settings['hoverinclude'] = $updated_hoverinclude;
}
if ( is_array( $this->settings['include'] ) ) {
$updated_include = array();
foreach ( $this->settings['include'] as $include ) {
if ( ! in_array( $include, array( 'views', 'stats', 'countdown' ), true ) ) {
$updated_include[] = $include;
}
}
$this->settings['include'] = $updated_include;
}
global $sby_posts_manager;
$message = '<p><b>' . __( 'Important: No API Key Entered.', 'feeds-for-youtube' ). '</b>';
$message .= '<p>'. __( 'Many features are not available without adding an API Key. Please go to the YouTube Feeds settings page to add an API key after following <a href="https://smashballoon.com/youtube-api-key/" target="_blank" rel="noopener">these instructions.</a>', 'feeds-for-youtube' ). '</p>';
$sby_posts_manager->add_frontend_error( 'no_api_key', $message );
}
if ( ! $channel_only && $this->settings['type'] === 'search' ) {
$feed_type_and_terms = array( 'search' => array() );
if ( $this->settings['usecustomsearch'] ) {
$searches_array = is_array( $this->settings['customsearch'] ) ? $this->settings['customsearch'] : explode( ',', $this->settings['customsearch'] );
foreach ( $searches_array as $search ) {
$search_slug = trim( preg_replace( "/[^A-Za-z0-9]/", '', $search ) );
$feed_type_and_terms['search'][] = array(
'term' => $search_slug,
'params' => array(
'isCustom' => true,
'customSearch' => $this->settings['customsearch'],
'type' => 'video'
)
);
$connected_accounts_in_feed[ $search_slug ] = $connected_account;
}
} elseif ( ! empty( $this->settings['search'] ) ) {
$searches_array = is_array( $this->settings['search'] ) ? $this->settings['search'] : explode( ',', $this->settings['search'] );
foreach ( $searches_array as $search ) {
$search_slug = urlencode( trim( $search ) );
$feed_type_and_terms['search'][] = array(
'term' => $search_slug,
'params' => array(
'q' => trim( $search ),
'type' => 'video'
)
);
$connected_accounts_in_feed[ $search_slug ] = $connected_account;
}
}
} elseif ( ! $channel_only && $this->settings['type'] === 'live' ) {
$feed_type_and_terms = array( 'live' => array() );
$raw_term_att = '';
if ( ! empty( $this->settings['live'] ) ) {
$raw_term_att = $this->settings['live'];
} elseif ( ! empty( $this->settings['id'] ) ) {
$raw_term_att = $this->settings['id'];
} elseif ( ! empty( $this->settings['channel'] ) ) {
$raw_term_att = $this->settings['channel'];
}
if ( ! empty( $raw_term_att ) ) {
$channels_array = is_array( $raw_term_att ) ? $raw_term_att : explode( ',', $raw_term_att );
if ( empty( $this->settings['headerchannel'] ) ) {
$this->settings['headerchannel'] = $channels_array[0];
}
foreach ( $channels_array as $channel ) {
$feed_type_and_terms['live'][] = array(
'term' => $channel.'_live',
'params' => array(
'channelId' => trim( $channel ),
'eventType' => 'live',
'type' => 'video'
)
);
$connected_accounts_in_feed[ $channel.'_live' ] = $connected_account;
}
}
} elseif ( ! $channel_only && $this->settings['type'] === 'playlist' ) {
$this->settings['sortby'] = 'api';
$feed_type_and_terms = array( 'playlist' => array() );
$raw_term_att = '';
if ( ! empty( $this->settings['playlist'] ) ) {
$raw_term_att = $this->settings['playlist'];
} elseif ( ! empty( $this->settings['id'] ) ) {
$raw_term_att = $this->settings['id'];
}
if ( ! empty( $raw_term_att ) ) {
$playlist_array = is_array( $raw_term_att ) ? $raw_term_att : explode( ',', $raw_term_att );
foreach ( $playlist_array as $playlist ) {
$feed_type_and_terms['playlist'][] = array(
'term' => $playlist,
'params' => array(
'playlistId' => $playlist,
)
);
$connected_accounts_in_feed[ $playlist ] = $connected_account;
}
}
} elseif ( ! $channel_only && $this->settings['type'] === 'favorites' ) {
$feed_type_and_terms = array( 'favorites' => array() );
if ( ! empty( $this->settings['id'] ) ) {
$channel_array = is_array( $this->settings['id'] ) ? $this->settings['id'] : explode( ',', str_replace( ' ', '', $this->settings['id'] ) );
if ( empty( $this->settings['headerchannel'] ) ) {
$this->settings['headerchannel'] = $channel_array[0];
}
foreach ( $channel_array as $channel ) {
if ( isset( $this->connected_accounts[ $channel ] ) ) {
$feed_type_and_terms['favorites'][] = array(
'term' => $this->connected_accounts[ $channel ]['channel_id'],
'params' => array(
'channel_id' => $this->connected_accounts[ $channel ]['channel_id']
)
);
$connected_accounts_in_feed[ $this->connected_accounts[ $channel ]['channel_id'] ] = $this->connected_accounts[ $channel ];
}
}
if ( empty( $connected_accounts_in_feed ) ) {
$an_account = array();
foreach ( $this->connected_accounts as $account ) {
if ( empty( $an_account ) ) {
$an_account = $account;
}
}
foreach ( $channel_array as $channel ) {
$feed_type_and_terms['channels'][] = array(
'term' => $channel,
'params' => array(
'channel_id' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
}
} elseif ( ! $channel_only && ! empty( $this->settings['favorites'] ) ) {
$channel_array = is_array( $this->settings['favorites'] ) ? $this->settings['favorites'] : explode( ',', str_replace( ' ', '', $this->settings['favorites'] ) );
$an_account = array();
foreach ( $this->connected_accounts as $account ) {
if ( empty( $an_account ) ) {
$an_account = $account;
}
}
if ( empty( $this->settings['headerchannel'] ) ) {
$this->settings['headerchannel'] = $channel_array[0];
}
foreach ( $channel_array as $channel ) {
if ( strpos( $channel, 'UC' ) !== 0 ) {
$channel_id = sby_get_channel_id_from_channel_name( $channel );
if ( $channel_id ) {
$feed_type_and_terms['favorites'][] = array(
'term' => $channel_id,
'params' => array(
'channel_id' => $channel_id
)
);
$connected_accounts_in_feed[ $channel_id ] = $an_account;
} else {
$feed_type_and_terms['favorites'][] = array(
'term' => $channel,
'params' => array(
'channel_name' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
} else {
$feed_type_and_terms['favorites'][] = array(
'term' => $channel,
'params' => array(
'channel_id' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
}
} elseif ( ! empty( $this->settings['channel'] ) ) {
$channel_array = is_array( $this->settings['channel'] ) ? $this->settings['channel'] : explode( ',', str_replace( ' ', '', $this->settings['channel'] ) );
$an_account = array();
foreach ( $this->connected_accounts as $account ) {
if ( empty( $an_account ) ) {
$an_account = $account;
}
}
foreach ( $channel_array as $channel ) {
if ( strpos( $channel, 'UC' ) !== 0 ) {
$channel_id = sby_get_channel_id_from_channel_name( $channel );
if ( $channel_id ) {
$feed_type_and_terms['favorites'][] = array(
'term' => $channel_id,
'params' => array(
'channel_id' => $channel_id
)
);
$connected_accounts_in_feed[ $channel_id ] = $an_account;
} else {
$feed_type_and_terms['favorites'][] = array(
'term' => $channel,
'params' => array(
'channel_name' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
} else {
$feed_type_and_terms['favorites'][] = array(
'term' => $channel,
'params' => array(
'channel_id' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
}
}
} elseif ( ! $channel_only && $this->settings['type'] === 'single' ) {
$feed_type_and_terms = array( 'single' => array() );
$videos_array = array();
if ( ! empty( $this->settings['id'] ) ) {
$videos_array = is_array( $this->settings['id'] ) ? $this->settings['id'] : explode( ',', str_replace( ' ', '', $this->settings['id'] ) );
} elseif ( ! empty( $this->settings['single'] ) ) {
$videos_array = is_array( $this->settings['single'] ) ? $this->settings['single'] : explode( ',', str_replace( ' ', '', $this->settings['single'] ) );
}
$filtered_vids = array();
foreach ( $videos_array as $single_video ) {
if ( strpos( $single_video, '=' ) === false ) {
$filtered_vids[] = $single_video;
} else {
$exploded = explode( '&', $single_video );
$filtered_vids[] = $exploded[0];
}
}
$videos_array = $filtered_vids;
if ( ! empty( $videos_array ) ) {
$feed_type_and_terms['single'][] = array(
'term' => implode( '', $videos_array ),
'params' => array(
'video_ids' => $videos_array
)
);
$connected_accounts_in_feed[ implode( '', $videos_array ) ] = $connected_account;
}
} else {
$feed_type_and_terms = array( 'channels' => array() );
if ( ! empty( $this->settings['id'] ) ) {
$channel_array = is_array( $this->settings['id'] ) ? $this->settings['id'] : explode( ',', str_replace( ' ', '', $this->settings['id'] ) );
foreach ( $channel_array as $channel ) {
if ( isset( $this->connected_accounts[ $channel ] ) ) {
$feed_type_and_terms['channels'][] = array(
'term' => $this->connected_accounts[ $channel ]['channel_id'],
'params' => array(
'channel_id' => $this->connected_accounts[ $channel ]['channel_id']
)
);
$connected_accounts_in_feed[ $this->connected_accounts[ $channel ]['channel_id'] ] = $this->connected_accounts[ $channel ];
}
}
if ( empty( $connected_accounts_in_feed ) ) {
$an_account = array();
foreach ( $this->connected_accounts as $account ) {
if ( empty( $an_account ) ) {
$an_account = $account;
}
}
foreach ( $channel_array as $channel ) {
$feed_type_and_terms['channels'][] = array(
'term' => $channel,
'params' => array(
'channel_id' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
}
} elseif ( ! empty( $this->settings['channel'] ) ) {
$channel_array = is_array( $this->settings['channel'] ) ? $this->settings['channel'] : explode( ',', str_replace( ' ', '', $this->settings['channel'] ) );
$an_account = array();
foreach ( $this->connected_accounts as $account ) {
if ( empty( $an_account ) ) {
$an_account = $account;
}
}
foreach ( $channel_array as $channel ) {
if ( strpos( $channel, 'UC' ) !== 0 ) {
$channel_id = sby_get_channel_id_from_channel_name( $channel );
if ( $channel_id ) {
$feed_type_and_terms['channels'][] = array(
'term' => $channel_id,
'params' => array(
'channel_id' => $channel_id
)
);
$connected_accounts_in_feed[ $channel_id ] = $an_account;
} else {
$feed_type_and_terms['channels'][] = array(
'term' => $channel,
'params' => array(
'channel_name' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
} else {
$feed_type_and_terms['channels'][] = array(
'term' => $channel,
'params' => array(
'channel_id' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
}
} else {
foreach ( $this->connected_accounts as $connected_account ) {
if ( empty( $feed_type_and_terms['channels'] ) && is_array($connected_account) ) {
$feed_type_and_terms['channels'][] = array(
'term' => $connected_account['channel_id'],
'params' => array(
'channel_id' => $connected_account['channel_id']
)
);
$connected_accounts_in_feed[ $connected_account['channel_id'] ] = $connected_account;
}
}
}
}
$this->connected_accounts_in_feed = $connected_accounts_in_feed;
$this->feed_type_and_terms = $feed_type_and_terms;
}
/**
* Uses the feed types and terms as well as as some
* settings to create a semi-unique feed id used for
* caching and other features.
*
* Overwritten in the Pro version.
*
* @param string $transient_name
*
* @since 1.0
*/
public function set_transient_name( $transient_name = '' ) {
if ( ! empty( $transient_name ) ) {
$this->transient_name = $transient_name;
} elseif ( false && ! empty( $this->settings['feedid'] ) ) { //disabled due to new caching system not yet being used
$this->transient_name = 'sby_' . $this->settings['feedid'];
} else {
$feed_type_and_terms = $this->feed_type_and_terms;
$sby_transient_name = 'sby_';
$sby_include_words = isset( $this->settings['includewords'] ) ? $this->settings['includewords'] : '';
$sby_exclude_words = isset( $this->settings['excludewords'] ) ? $this->settings['excludewords'] : '';
$cache_string_include = '';
$cache_string_exclude = '';
//Convert include words array into a string consisting of 3 chars each
if ( ! empty( $sby_include_words ) ) {
$sby_include_words_arr = explode(',', $sby_include_words);
foreach( $sby_include_words_arr as $word ){
$include_word = str_replace( str_split(' #'), '', $word );
$cache_string_include .= substr( str_replace('%','', urlencode( $include_word ) ), 0, 3 );
}
}
//Convert exclude words array into a string consisting of 3 chars each
if ( ! empty( $sby_exclude_words ) ) {
$sby_exclude_words_arr = explode( ',', $sby_exclude_words );
foreach( $sby_exclude_words_arr as $word ){
$exclude_word = str_replace( str_split( ' #' ) , '', $word );
$cache_string_exclude .= substr( str_replace( '%','', urlencode( $exclude_word ) ), 0, 3 );
}
}
//Figure out how long the first part of the caching string should be
$cache_string_include_length = strlen( $cache_string_include );
$cache_string_exclude_length = strlen( $cache_string_exclude );
$cache_string_length = $cache_string_include_length + $cache_string_exclude_length;
if ( isset( $feed_type_and_terms['channels'] ) ) {
foreach ( $feed_type_and_terms['channels'] as $term_and_params ) {
$channel = $term_and_params['term'];
$sby_transient_name .= $channel;
}
} elseif ( isset( $feed_type_and_terms['playlist'] ) ) {
foreach ( $feed_type_and_terms['playlist'] as $term_and_params ) {
$playlist = substr( $term_and_params['term'], 0, 6 );
$playlist_end = substr( $term_and_params['term'], -7 );
$sby_transient_name .= $playlist . $playlist_end;
}
} elseif ( isset( $feed_type_and_terms['search'] ) ) {
foreach ( $feed_type_and_terms['search'] as $term_and_params ) {
$sby_transient_name .= 'Q?';
$search = $term_and_params['term'];
$length = strlen( $search );
$sby_transient_name .= substr( $search, 0, 15 );
if ( $length > 15 ) {
$sby_transient_name .= substr( $search, -5, 5 );
}
}
} elseif ( isset( $feed_type_and_terms['live'] ) ) {
foreach ( $feed_type_and_terms['live'] as $term_and_params ) {
$sby_transient_name .= $term_and_params['term'];
}
} elseif ( isset( $feed_type_and_terms['favorites'] ) ) {
foreach ( $feed_type_and_terms['favorites'] as $term_and_params ) {
$sby_transient_name .= 'F!';
$channel = $term_and_params['term'];
$sby_transient_name .= $channel;
}
} elseif ( isset( $feed_type_and_terms['single'] ) ) {
foreach ( $feed_type_and_terms['single'] as $term_and_params ) {
$sby_transient_name .= 'S!';
$video = $term_and_params['term'];
$sby_transient_name .= $video;
}
}
$num = $this->settings['num'];
$num_length = strlen( $num ) + 1;
//Add both parts of the caching string together and make sure it doesn't exceed 45
$sby_transient_name = substr( $sby_transient_name, 0, 45 - $num_length - $cache_string_length ) . $cache_string_include . $cache_string_exclude;
$sby_transient_name .= '#' . $num;
$this->transient_name = $sby_transient_name;
}
}
}