We could not connect to WpStream.net. Make sure you have the php Curl library enabled and your hosting allows outgoing HTTP Connection. ';
}
$token = $this->wpstream_get_token();
if($token=='' and $page!='wpstream_plugin_options'){
echo '
'.__(' Incorrect username or password. Please check your credentials or go
here to reset your password.','wpstream').'
';
}
}
/*
* Curl request
*
*
*
* */
function wpstream_baker_do_curl_base($url,$curl_post_fields){
$curl = curl_init();
$api_url = WPSTREAM_API.'/'.$url;
curl_setopt_array($curl, array(
CURLOPT_URL =>$api_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => http_build_query($curl_post_fields),
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: application/x-www-form-urlencoded"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo 'cURL Error #: '.$err.'
';
}
return $response;
}
/**
* retreive server id based on show id
*
* @since 3.0.1
* returns live url
*/
function retrive_server_id_based_on_show_id($show_id){
$transient_name = 'server_id_to_return_'.$show_id;
$server_id_to_return = get_transient( $transient_name );
if ( false === $server_id_to_return ) {
$token = $this->wpstream_get_token();
$values_array=array(
"show_id" => intval($show_id),
);
$values_array=array();
$show_id=intval($show_id);
$url="https://rest-baker.wpstream.net/?&apiFunctionName=server_id_by_show_id&show_id=".$show_id."&access_token=".$token;
$arguments = array(
'method' => 'GET',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(),
'body' => $values_array,
'cookies' => array()
);
$response = wp_remote_post($url,$arguments);
$received_data = wp_remote_retrieve_body($response);
$received_data_decoded=json_decode($received_data);
if( isset($response['response']['code']) && $response['response']['code']=='200' && $received_data_decoded->success===true && $received_data_decoded->result!=''){
$server_id_to_return = $received_data_decoded->result;
set_transient( $transient_name, json_decode($server_id_to_return), 60 );
return $server_id_to_return;
}else{
return '';
}
}else{
return $server_id_to_return;
}
die();
}
/**
* edited 4.0
*
*
*
* check event status from start stremaing process
*
* @since 3.0.1
* returns live url
*/
public function wpstream_check_event_status(){
$channel_id = intval($_POST['channel_id']);
$notes = 'wpstream_check_event_status_note';
if(isset($_POST['notes'])){
$notes = sanitize_text_field($_POST['notes']);
}
$response = $this->wpstream_check_event_status_api_call($channel_id,$notes);
if( isset($response['success']) && $response['success']){
$this->api20_wpstream_update_event($response,$channel_id);
if( isset($response['broadcast_url']) && isset($response['status']) && $response['status']==='active' ){
$response['live_data_url'] = $response['qos_url'];
/* obsolote due to new url format
$local_event_options = get_post_meta ($channel_id,'local_event_options',true);
if( is_array( $local_event_options ) && intval( $local_event_options['autostart']) ==1 ){
$to_split=explode('/',$response['broadcast_url']);
$obs_stream = array_pop($to_split);;
$obs_uri = str_replace($obs_stream,'',$response['broadcast_url']);
}else{
$to_split=explode('wpstream/',$response['broadcast_url']);
$obs_uri = $to_split[0].'wpstream/';
$obs_stream = $to_split[1];
}
*/
$to_split = explode('/',$response['broadcast_url']);
$obs_stream = array_pop($to_split);;
$obs_uri = str_replace($obs_stream,'',$response['broadcast_url']);
$response['obs_uri'] = $obs_uri;
$response['obs_stream'] = $obs_stream;
update_post_meta($channel_id,'obs_uri',$obs_uri);
update_post_meta($channel_id,'obs_stream',$obs_stream);
update_post_meta($channel_id,'broadcast_url',$response['broadcast_url']);
}
}
print json_encode($response);
die();
}
/**
* edited 4.0
*
* check event status from API
*
* @since 3.0.1
* returns live url
*/
public function wpstream_check_event_status_api_call($channel_id,$notes){
$access_token = $this->wpstream_get_token();
$domain = parse_url ( get_site_url() );
$url = 'channel/info';
$curl_post_fields=array(
'access_token' => $access_token,
'channel_id' => $channel_id,
'domain' => $domain['host'],
'notes' => $notes
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
return $curl_response_decoded;
}
public function wpstream_reset_event_data($event_id){
update_post_meta($event_id,'stats_url','');
update_post_meta($event_id,'hls_playback_url','');
update_post_meta($event_id,'server_id', '' );
}
/**
* edited 4.0
* update event metadata
*
* @since 3.0.1
* returns live url
*/
function api20_wpstream_update_event($response,$channel_id){
if( is_array($response) ) {
$event_data_for_transient = array();
$transient_name = 'event_data_to_return_'.$channel_id;
foreach($response as $key=>$value){
update_post_meta($channel_id,$key,$value);
$event_data_for_transient[$key]=$value;
}
set_transient($transient_name,$event_data_for_transient,45);
return $event_data_for_transient;
}else{
return false;
}
}
/**
* Update event settings
*
* @since 3.0.1
* returns live url
*/
public function wpstream_update_local_event_settings(){
check_ajax_referer( 'wpstream_start_event_nonce', 'security' );
if(!is_user_logged_in()){
exit('not logged in');
}
if( !current_user_can('administrator') ){
exit('not admin');
}
$show_id = intval($_POST['show_id']);
$option_array = $_POST['option'];
$to_save_option=array();
foreach($option_array as $key=>$value){
$to_save_option[sanitize_key($key)]=sanitize_text_field($value);
}
if( $to_save_option['low_latency'] == 1 || $to_save_option['adaptive_bitrate'] ==1 ){
$to_save_option['encrypt']=0;
}
if( $to_save_option['encrypt']==1){
$to_save_option['low_latency'] = 0;
$to_save_option['adaptive_bitrate'] =0;
}
update_post_meta ($show_id,'local_event_options',$to_save_option);
$this->wpstream_update_chanel_on_baker($show_id,$to_save_option);
}
/**
* Update channel settings on baker
*
* @since 4.2
* returns live url
*/
public function wpstream_update_chanel_on_baker($channel_id,$to_save_option){
$access_token = $this->wpstream_get_token();
if($access_token==''){
echo json_encode( array(
'is_record' => '',
'conected' => false,
'event_data' => '',
'error' => esc_html('You are not connected to wpstream.net! Please check your WpStream credentials!','wpstream'),
));
exit();
}
$current_user = wp_get_current_user();
$userID = $current_user->ID;
$url = '/channel/update';
$local_event_options = get_post_meta($channel_id,'local_event_options',true);
$domain = parse_url ( get_site_url() );
$domain_scheme = 'http';
if(is_ssl()){
$domain_scheme='https';
}
$domain_ip= esc_html( $_SERVER['SERVER_ADDR'] );
if($domain_ip==''){
$domain_ip="0.0.0.0/0";
}
$corsorigin='*';
if( isset($local_event_options['domain_lock']) && intval( $local_event_options['domain_lock']) ==0 ){
$corsorigin='*';
} else{
$corsorigin=$domain_scheme.'://'.$domain['host'];
}
$url = 'channel/update';
$to_record="false";
if($to_save_option['record']){
$to_record="true";
}
if( $to_save_option['low_latency'] == 1 || $to_save_option['adaptive_bitrate'] ==1 ){
$to_save_option['encrypt']=0;
}
if( $to_save_option['encrypt']==1){
$to_save_option['low_latency'] = 0;
$to_save_option['adaptive_bitrate'] =0;
}
$abr='none';
if($to_save_option['adaptive_bitrate'] ==1 ){
$abr='common';
}
$curl_post_fields=array(
'access_token' => $access_token,
'channel_id' => $channel_id,
'domain' => $domain['host'],
'allow_access_from' => $corsorigin,
'record' => $to_record,
'encrypt' => boolval($to_save_option['encrypt']),
'autostart' => boolval($to_save_option['autostart']),
'low_latency' => boolval($to_save_option['low_latency']),
'abr' => $abr,
'hls_keys_url_prefix' => get_site_url().'?wpstream_livedrm=',
'allow_key_access_from' => $domain_ip,
'to_save_option' => $to_save_option,
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
print_r($curl_response);
exit();
}
/**
*
* added 5.0
*
* Turn off channel
*
*/
public function wpstream_turn_of_channel(){
$access_token = $this->wpstream_get_token();
if($access_token==''){
echo json_encode( array(
'is_record' => '',
'conected' => false,
'event_data' => '',
'error' => esc_html('You are not connected to wpstream.net! Please check your WpStream credentials!','wpstream'),
));
exit();
}
$current_user = wp_get_current_user();
$userID = $current_user->ID;
global $wpstream_plugin;
if( !$wpstream_plugin->main->wpstream_check_user_can_stream() ){
exit('You are not allowed to stream.Code 407');
}
$channel_id = intval($_POST['show_id']);
$url = 'channel/stop';
$domain = parse_url ( get_site_url() );
$curl_post_fields=array(
'access_token' => $access_token,
'channel_id' => $channel_id,
'domain' => $domain['host'],
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
if( isset($curl_response_decoded['success']) && $curl_response_decoded['success']===true ){
echo json_encode( array(
'conected' => true,
'answer' => $curl_response_decoded,
));
}else{
echo json_encode( array(
'conected' => false,
'error' => esc_html__('Channel is already turned off or does not exist!','wpstream'),
'answer' => $curl_response_decoded,
));
}
die();
}
/**
*
* Edited 4.0
*
* Request live url
*
* @since 3.0.1
* returns live url
*/
public function wpstream_give_me_live_uri(){
$access_token = $this->wpstream_get_token();
if($access_token==''){
echo json_encode( array(
'is_record' => '',
'conected' => false,
'event_data' => '',
'error' => esc_html('You are not connected to wpstream.net! Please check your WpStream credentials!','wpstream'),
));
exit();
}
$current_user = wp_get_current_user();
$userID = $current_user->ID;
global $wpstream_plugin;
if( !$wpstream_plugin->main->wpstream_check_user_can_stream() ){
exit('You are not allowed to stream.Code 407');
}
$channel_id = intval($_POST['show_id']);
$on_boarding = '';
if(isset($_POST['start_onboarding'])){
$on_boarding = sanitize_text_field($_POST['start_onboarding']);
}
$local_event_options = get_post_meta($channel_id,'local_event_options',true);
if(!is_array($local_event_options)){
$local_event_options = get_option('wpstream_user_streaming_global_channel_options') ;
}
// set encrypt option
$is_autostart="false";
if( intval( $local_event_options['autostart']) ==1 ){
$is_autostart="true";
}
// set encrypt option
$is_encrypt="false";
if( intval( $local_event_options['encrypt']) ==1 ){
$is_encrypt="true";
}
$low_latency="false";
if( intval( $local_event_options['low_latency']) ==1 ){
$low_latency="true";
}
$adaptive_bitrate="false";
if( intval( $local_event_options['adaptive_bitrate']) ==1 ){
$adaptive_bitrate="true";
}
if($adaptive_bitrate=="true" || $low_latency=="true" ){
$is_encrypt="false";
}
if( $is_encrypt=="true"){
$adaptive_bitrate="false";
$low_latency="false";
}
// set record option
$is_record="false";
if( intval( $local_event_options['record']) ==1 ){
$is_record="true";
}
$corsorigin='';
if( isset($local_event_options['domain_lock']) && intval( $local_event_options['domain_lock']) ==0 ){
$corsorigin='*';
}
$event_data = $this->wpstream_request_live_stream_uri($channel_id,$is_autostart,$is_record,$is_encrypt,$low_latency,$adaptive_bitrate,$userID,$corsorigin,$on_boarding);
if( isset($event_data['success']) && $event_data['success']===true ){
echo json_encode( array(
'is_record' => $is_record,
'conected' => true,
'event_data' => $event_data,
));
}else{
$default_error= 'Failed to turn channel ON. Please try again in a few minutes.';
if( isset($event_data['error'])){
$plumer_error = $event_data['error'];
switch ($plumer_error) {
case 'NOT_ENOUGH_TRAFFIC':
$default_error= 'You do not have enough Streaming Data to turn ON a live channel. Please upgrade your subscription for more resources.' ;
break;
}
}
echo json_encode( array(
'is_record' => $is_record,
'conected' => false,
'event_data' => $event_data,
'error' => $default_error,
));
}
die();
}
/**
*
* Edited 4.0
*
* Request live url via api
*
* @since 3.0.1
* returns live url
*/
public function wpstream_request_live_stream_uri($schannel_id,$is_autostart,$is_record,$is_encrypt,$low_latency,$adaptive_bitrate,$request_by_userid,$corsorigin,$on_boarding){
$domain = parse_url ( get_site_url() );
$domain_scheme = 'http';
if(is_ssl()){
$domain_scheme='https';
}
$domain_ip= esc_html( $_SERVER['SERVER_ADDR'] );
if($domain_ip==''){
$domain_ip="0.0.0.0/0";
}
if($corsorigin!='*'){
$corsorigin=$domain_scheme.'://'.$domain['host'];
}
$abr='none';
if($adaptive_bitrate=="true"){
$abr='common';
}
if($low_latency=="true"){
$low_latency=true;
}else{
$low_latency = false;
}
$url = 'channel/start';
$access_token = $this->wpstream_get_token();
$metadata_array=array(
'pluginVersion'=>WPSTREAM_PLUGIN_VERSION
);
if($on_boarding!=''){
$metadata_array['on_boarding']='yes';
}
$curl_post_fields=array(
'access_token' => $access_token,
'channel_id' => $schannel_id,
'domain' => $domain['host'],
'allow_access_from' => $corsorigin,
'record' => $is_record,
'encrypt' => $is_encrypt,
'low_latency' => $low_latency,
'abr' => $abr,
'hls_keys_url_prefix' => get_site_url().'?wpstream_livedrm=',
'allow_key_access_from' => $domain_ip,
'metadata' => json_encode($metadata_array),
'autostart' => $is_autostart,
// 'fakeError' => 'init'
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
// $curl_response_decoded['curl_post_fields']=$curl_post_fields;
return $curl_response_decoded;
}
/**
* Retrive auth token from tranzient
*
* @since 3.0.1
* returns token
*/
public function wpstream_get_token(){
$token = get_transient('wpstream_token_api');
if ( false === $token || $token==='' ) {
$token = $this->wpstream_club_get_token();
set_transient( 'wpstream_token_api', $token ,3500);
}
return $token;
}
public function wpstream_get_token_30(){
$token = get_transient('wpstream_token_request_30');
if ( false === $token || $token==='' ) {
$token = $this->wpstream_club_get_token_30();
set_transient( 'wpstream_token_request_30', $token ,600);
}
return $token;
}
/**
* Edited 4.0
*
* Request auth token from wpstream.net
*
* @since 3.0.1
* returns token fron wpstream
*/
protected function wpstream_club_get_token(){
$username = esc_html ( get_option('wpstream_api_username','') );
$password = esc_html ( get_option('wpstream_api_password','') );
if ( $username=='' || $password==''){
return;
}
$url='access_token';
$curl_post_fields=array(
'grant_type' => 'password',
'username' => $username,
'password' => $password
);
$curl_response=$this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$response= json_decode($curl_response);
if( isset($response->access_token) && $response->access_token!='' ){
return $response->access_token;
}else{
return false;
}
}
/*
*
* Return token for api version 3.0
*
*/
protected function wpstream_club_get_token_30(){
$client_id = esc_html ( get_option('wpstream_api_key','') );
$client_secret = esc_html ( get_option('wpstream_api_secret_key','') );
$username = esc_html ( get_option('wpstream_api_username','') );
$password = esc_html ( get_option('wpstream_api_password','') );
if ( $username=='' || $password==''){
return;
}
$curl = curl_init();
$json = array(
'grant_type'=>'password',
'username' =>$username,
'password' =>$password,
'client_id'=>'qxZ6fCoOMj4cNK8SXRHa5nug6vnswlFWSF37hsW3',
'client_secret'=>'L1fzLosJf9TlwnCCTZ5pkKmdqqkHShKEi0d4oFNE'
);
curl_setopt_array($curl, array(
CURLOPT_URL => WPSTREAM_CLUBLINKSSL."://www.".WPSTREAM_CLUBLINK."/?oauth=token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS=> json_encode($json),
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: application/json",
),
));
$response = curl_exec($curl);
if(!$response){
//
}
$err = curl_error($curl);
curl_close($curl);
$response= json_decode($response);
if(isset($response->access_token)){
return $response->access_token;
}else{
return;
}
}
/**
* edited 4.0
* Return admin package data
*
* @since 3.0.1
* returns pack data
*/
public function wpstream_request_pack_data_per_user(){
$event_data_for_transient = get_transient( 'wpstream_request_pack_data_per_user_transient' );
if($event_data_for_transient===false){
$url = 'user/quota';
$access_token = $this->wpstream_get_token();
$curl_post_fields=array(
'access_token'=>$access_token
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
if( isset($curl_response_decoded['success']) && $curl_response_decoded['success']===true ){
set_transient( 'wpstream_request_pack_data_per_user_transient', $curl_response_decoded, 15 );
update_option('wpstream_api_username_from_token',$curl_response_decoded['username']);
return $curl_response_decoded;
}else{
return false;
}
}else{
return $event_data_for_transient;
}
}
/**
* Edited 4.0
*
* Check Api Status
*
* @since 3.0.1
* returns true or false
*/
function wpstream_client_check_api_status(){
return true;
}
/**
*
* Edited 4.0
*
* Start Get live events for users
*
* @since 3.0.1
* returns true or false
*/
public function wpstream_get_live_event_for_user(){
$current_user = wp_get_current_user();
$userID = $current_user->ID;
global $wpstream_plugin;
if( !$wpstream_plugin->main->wpstream_check_user_can_stream() ){
exit('You are not allowed to start a live stream !');
}
$event_data = $this->wpstream_request_live_stream_for_user($userID);
$return_event = array();
if(is_array($event_data)):
foreach ($event_data as $key=>$event){
$return_event[$event['channel_id']]=$event;
}
endif;
return $return_event;
}
/**
*
* Edited 4.0
*
* Get live events for users
*
* @since 3.0.1
* returns true or false
*/
public function wpstream_request_live_stream_for_user($user_id){
global $wpstream_plugin;
$domain = parse_url ( get_site_url() );
$url = 'channel/list';
$access_token = $this->wpstream_get_token();
$curl_post_fields=array(
'access_token' => $access_token,
'domain' => $domain['host'],
'status' => 'active'
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
if( isset($curl_response_decoded['success']) && $curl_response_decoded['success']==true ){
return $curl_response_decoded['channels'];
}else{
return false;
}
}
/**
* live events for shortocde - behind tranzisnt
* returns an array with local show id for live events
* @since 3.0.1
* returns noda
*/
public function api20_wpstream_request_live_stream_for_user_for_shortcode($outside=''){
global $wpstream_plugin;
$return_array=array();
$result = get_transient('wpstream_live_stream_for_user_for_shortcode');
if($result===false){
$result = $this->wpstream_request_live_stream_for_user('');
set_transient('wpstream_live_stream_for_user_for_shortcode',$result,30);
}
if(is_array($result)):
foreach($result as $key=>$event){
$return_array[]=$event['channel_id'];
}
endif;
return $return_array;
}
/**
* Delete event
*
* @since 3.0.1
* returns noda
*/
public function wpstream_close_event(){
//not implemented yet
}
/**
* Get signed upload form data
*
* @since 3.0.1
* returns aws form
*/
public function wpstream_get_signed_form_upload_data(){
if( !current_user_can('administrator') ){
exit('not admin on wpstream_get_signed_form_upload_data');
}
$url = 'video/upload';
$access_token = $this->wpstream_get_token();
$curl_post_fields=array(
'access_token' => $access_token,
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
return $curl_response_decoded;
exit();
}
/**
*
* Get video from storage- clear data for front end use
*
* @since 3.0.1
* returns aws data
*
*/
public function wpstream_get_videos(){
if( !current_user_can('administrator') ){
exit('not admin on wpstream_get_videos');
}
$video_options = array();
$video_array = $this->wpstream_get_videos_from_api();
$video_list_raw_array = $video_array['items'];
if(is_array($video_list_raw_array)){
$keys = array_column($video_list_raw_array, 'time');
array_multisort($keys, SORT_DESC , $video_list_raw_array);
foreach ($video_list_raw_array as $key => $videos){
if($videos['name']!=''):
$video_options[$videos['name']]=$videos['name'];
endif;
}
}
return $video_options;
}
/**
*
* Get video from storage- raw data
*
* @since 3.0.1
* returns aws data
*
*/
public function wpstream_get_videos_from_api( ){
if( !current_user_can('administrator') ){
exit('not admin on wpstream_get_videos_from_api');
}
$url = 'video/list';
$access_token = $this->wpstream_get_token();
$curl_post_fields=array(
'access_token' => $access_token,
);
$current_page= get_current_screen();
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
if( isset($curl_response_decoded['success']) && $curl_response_decoded['success']==true ){
return $curl_response_decoded;
}else{
return array();
}
}
/**
* Get download link from aws
*
* @since 3.0.1
* returns aws data
*/
function wpstream_get_download_link(){
if( !current_user_can('administrator') ){
exit('not admin on get_download_link');
}
$video_name = sanitize_text_field($_POST['video_name']);
$url = 'video/download';
$access_token = $this->wpstream_get_token();
$curl_post_fields=array(
'access_token' => $access_token,
'name' => $video_name,
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
print $curl_response;
exit();
}
/**
* Delete file from storage
*
* @since 3.0.1
*
*/
public function wpstream_get_delete_file(){
if( !current_user_can('administrator') ){
exit('not admin on get_delete_file');
}
$video_name = esc_html($_POST['video_name']);
$url = 'video/delete';
$access_token = $this->wpstream_get_token();
$curl_post_fields=array(
'access_token' => $access_token,
'name'=>$video_name,
);
$curl_response = $this->wpstream_baker_do_curl_base($url,$curl_post_fields);
$curl_response_decoded = json_decode($curl_response,JSON_OBJECT_AS_ARRAY);
print $curl_response;
exit();
}
}// end class