<?php

/**
 * External Sources Input Classes for Back and Front End
 * @since: 5.0
 * */
if (!defined('ABSPATH'))
    die();

/**
 * Facebook
 *
 * with help of the API this class delivers album images from Facebook
 *
 * @package    socialstreams
 * @subpackage socialstreams/facebook
 * @author     ThemePunch <info@themepunch.com>
 */
class RevSliderFacebook {

    /**
     * Stream Array
     *
     * @since    1.0.0
     * @access   private
     * @var      array    $stream    Stream Data Array
     */
    private $stream;

    /**
     * Transient seconds
     *
     * @since    1.0.0
     * @access   private
     * @var      number    $transient Transient time in seconds
     */
    private $transient_sec;

    public function __construct($transient_sec = 1200) {
        $this->transient_sec = $transient_sec;
    }

    /**
     * Get User ID from its URL
     *
     * @since    1.0.0
     * @param    string    $user_url URL of the Page
     */
    public function get_user_from_url($user_url) {
        $theid = str_replace("https", "", $user_url);
        $theid = str_replace("http", "", $theid);
        $theid = str_replace("://", "", $theid);
        $theid = str_replace("www.", "", $theid);
        $theid = str_replace("facebook", "", $theid);
        $theid = str_replace(".com", "", $theid);
        $theid = str_replace("/", "", $theid);
        $theid = explode("?", $theid);
        return trim($theid[0]);
    }

    /**
     * Get Photosets List from User
     *
     * @since    1.0.0
     * @param    string    $user_id 	Facebook User id (not name)
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_photo_sets($user_id, $item_count = 10, $app_id, $app_secret) {
        //photoset params
        $oauth = wp_remote_get("https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=" . $app_id . "&client_secret=" . $app_secret);
        $oauth = json_decode($oauth['body']);
        $url = "https://graph.facebook.com/$user_id/albums?access_token=" . $oauth->access_token;


        $photo_sets_list = json_decode(wp_remote_get($url)['body']);
        //echo '<pre>';
        //print_r($photo_sets_list);
        //echo '</pre>';

        if (isset($photo_sets_list->data))
            return $photo_sets_list->data;
        else
            return '';
    }

    /**
     * Get Photoset Photos
     *
     * @since    5.1.1 
     * @param    string    $photo_set_id 	Photoset ID
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_photo_set_photos($photo_set_id, $item_count = 10, $app_id, $app_secret) {
        $oauth = wp_remote_get("https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=" . $app_id . "&client_secret=" . $app_secret);
        $oauth = json_decode($oauth['body']);

        $url = "https://graph.facebook.com/$photo_set_id/photos?fields=photos&access_token=" . $oauth->access_token . "&fields=id,from,message,picture,link,name,icon,privacy,type,status_type,object_id,application,created_time,updated_time,is_hidden,is_expired,comments.limit(1).summary(true),likes.limit(1).summary(true)";

        $transient_name = 'revslider_' . md5($url);

        if ($this->transient_sec > 0 && false !== ($data = get_transient($transient_name)))
            return ($data);

        $photo_set_photos = json_decode(wp_remote_get($url)['body']);

        /*
          echo '<pre>';
          print_r($photo_set_photos);
          echo '</pre>';
         */
        if (isset($photo_set_photos->data)) {
            set_transient($transient_name, $photo_set_photos->data, $this->transient_sec);
            return $photo_set_photos->data;
        } else
            return '';
    }

    /**
     * Get Photosets List from User as Options for Selectbox
     *
     * @since    1.0.0
     * @param    string    $user_url 	Facebook User id (not name)
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_photo_set_photos_options($user_url, $current_album, $app_id, $app_secret, $item_count = 99) {
        $user_id = $this->get_user_from_url($user_url);
        $photo_sets = $this->get_photo_sets($user_id, 999, $app_id, $app_secret);
        if (empty($current_album))
            $current_album = "";
        $return = array();
        if (is_array($photo_sets)) {
            foreach ($photo_sets as $photo_set) {
                $return[] = '<option title="' . $photo_set->name . '" ' . selected($photo_set->id, $current_album, false) . ' value="' . $photo_set->id . '">' . $photo_set->name . '</option>"';
            }
        }
        return $return;
    }

    /**
     * Get Feed
     *
     * @since    1.0.0
     * @param    string    $user 	User ID
     * @param    int       $item_count 	number of itmes to pull
     */
    public function get_photo_feed($user, $app_id, $app_secret, $item_count = 10) {
        $oauth = wp_remote_get("https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=" . $app_id . "&client_secret=" . $app_secret);

        $oauth = json_decode($oauth['body'], true);

        $url = "https://graph.facebook.com/$user/feed?access_token=" . $oauth['access_token'] . "&fields=id,from,message,picture,link,name,icon,privacy,type,status_type,object_id,application,created_time,updated_time,is_hidden,is_expired,comments.limit(1).summary(true),likes.limit(1).summary(true)";

        $transient_name = 'revslider_' . md5($url);

        if ($this->transient_sec > 0 && false !== ($data = get_transient($transient_name)))
            return ($data);

        $feed = json_decode(wp_remote_get($url)['body']);

        if (isset($feed->data)) {
            set_transient($transient_name, $feed->data, $this->transient_sec);
            return $feed->data;
        } else
            return '';
    }

    /**
     * Decode URL from feed
     *
     * @since    1.0.0
     * @param    string    $url 	facebook Output Data
     */
    private function decode_facebook_url($url) {
        $url = str_replace('u00253A', ':', $url);
        $url = str_replace('\u00255C\u00252F', '/', $url);
        $url = str_replace('u00252F', '/', $url);
        $url = str_replace('u00253F', '?', $url);
        $url = str_replace('u00253D', '=', $url);
        $url = str_replace('u002526', '&', $url);
        return $url;
    }

}

// End Class

/**
 * Twitter
 *
 * with help of the API this class delivers all kind of tweeted images from twitter
 *
 * @package    socialstreams
 * @subpackage socialstreams/twitter
 * @author     ThemePunch <info@themepunch.com>
 */
class RevSliderTwitter {

    /**
     * Consumer Key
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $consumer_key    Consumer Key
     */
    private $consumer_key;

    /**
     * Consumer Secret
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $consumer_secret    Consumer Secret
     */
    private $consumer_secret;

    /**
     * Access Token
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $access_token    Access Token
     */
    private $access_token;

    /**
     * Access Token Secret
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $access_token_secret    Access Token Secret
     */
    private $access_token_secret;

    /**
     * Twitter Account
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $twitter_account    Account User Name
     */
    private $twitter_account;

    /**
     * Transient seconds
     *
     * @since    1.0.0
     * @access   private
     * @var      number    $transient Transient time in seconds
     */
    private $transient_sec;

    /**
     * Stream Array
     *
     * @since    1.0.0
     * @access   private
     * @var      array    $stream    Stream Data Array
     */
    private $stream;

    /**
     * Initialize the class and set its properties.
     *
     * @since    1.0.0
     * @param      string    $consumer_key Twitter App Registration Consomer Key
     * @param      string    $consumer_secret Twitter App Registration Consomer Secret
     * @param      string    $access_token Twitter App Registration Access Token
     * @param      string    $access_token_secret Twitter App Registration Access Token Secret
     */
    public function __construct($consumer_key, $consumer_secret, $access_token, $access_token_secret, $transient_sec = 1200) {
        $this->consumer_key = $consumer_key;
        $this->consumer_secret = $consumer_secret;
        $this->access_token = $access_token;
        $this->access_token_secret = $access_token_secret;
        $this->transient_sec = $transient_sec;
    }

    /**
     * Get Tweets
     *
     * @since    1.0.0
     * @param    string    $twitter_account   Twitter account without trailing @ char
     */
    public function get_public_photos($twitter_account, $include_rts, $exclude_replies, $count, $imageonly) {

        //require_once( 'class-wp-twitter-api.php' );
        // Set your personal data retrieved at https://dev.twitter.com/apps
        $credentials = array(
            'consumer_key' => $this->consumer_key,
            'consumer_secret' => $this->consumer_secret
        );
        // Let's instantiate our class with our credentials
        $twitter_api = new RevSliderTwitterApi($credentials, $this->transient_sec);

        $include_rts = $include_rts == "on" ? "true" : "false";
        $exclude_replies = $include_rts == "on" ? "false" : "true";

        $query = 'count=500&include_entities=true&include_rts=' . $include_rts . '&exclude_replies=' . $exclude_replies . '&screen_name=' . $twitter_account;

        $tweets = $twitter_api->query($query);

        if (!empty($tweets)) {
            return $tweets;
        } else
            return '';
    }

    /**
     * Find Key in array and return value (multidim array possible)
     *
     * @since    1.0.0
     * @param    string    $key   Needle
     * @param    array     $form  Haystack
     */
    public function array_find_element_by_key($key, $form) {
        if (is_array($form) && array_key_exists($key, $form)) {
            $ret = $form[$key];
            return $ret;
        }
        if (is_array($form))
            foreach ($form as $k => $v) {
                if (is_array($v)) {
                    $ret = $this->array_find_element_by_key($key, $form[$k]);
                    if ($ret) {
                        return $ret;
                    }
                }
            }
        return FALSE;
    }

}

// End Class

/**
 * Class WordPress Twitter API
 *
 * https://github.com/micc83/Twitter-API-1.1-Client-for-Wordpress/blob/master/class-wp-twitter-api.php
 * @version 1.0.0
 */
class RevSliderTwitterApi {

    var $bearer_token,
            // Default credentials
            $args = array(
                'consumer_key' => 'default_consumer_key',
                'consumer_secret' => 'default_consumer_secret'
                    ),
            // Default type of the resource and cache duration
            $query_args = array(
                'type' => 'statuses/user_timeline',
                'cache' => 1800
                    ),
            $has_error = false;

    /**
     * WordPress Twitter API Constructor
     *
     * @param array $args
     */
    public function __construct($args = array(), $transient_sec = 1200) {


        if (is_array($args) && !empty($args))
            $this->args = array_merge($this->args, $args);

        if (!$this->bearer_token = get_option('twitter_bearer_token'))
            $this->bearer_token = $this->get_bearer_token();

        $this->query_args['cache'] = $transient_sec;
    }

    /**
     * Get the token from oauth Twitter API
     *
     * @return string Oauth Token
     */
    private function get_bearer_token() {

        $bearer_token_credentials = $this->args['consumer_key'] . ':' . $this->args['consumer_secret'];
        $bearer_token_credentials_64 = base64_encode($bearer_token_credentials);

        $args = array(
            'method' => 'POST',
            'timeout' => 5,
            'redirection' => 5,
            'httpversion' => '1.0',
            'blocking' => true,
            'headers' => array(
                'Authorization' => 'Basic ' . $bearer_token_credentials_64,
                'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8',
                'Accept-Encoding' => 'gzip'
            ),
            'body' => array('grant_type' => 'client_credentials'),
            'cookies' => array()
        );

        $response = wp_remote_post('https://api.twitter.com/oauth2/token', $args);
        // var_dump($response);die();

        if (200 != $response['info']['http_code'])
            return $this->bail(__('Can\'t get the bearer token, check your credentials', 'wp_twitter_api'), $response);

        $result = json_decode($response['body']);

        update_option('twitter_bearer_token', $result->access_token);

        return $result->access_token;
    }

    /**
     * Query twitter's API
     *
     * @uses $this->get_bearer_token() to retrieve token if not working
     *
     * @param string $query Insert the query in the format "count=1&include_entities=true&include_rts=true&screen_name=micc1983!
     * @param array $query_args Array of arguments: Resource type (string) and cache duration (int)
     * @param bool $stop Stop the query to avoid infinite loop
     *
     * @return bool|object Return an object containing the result
     */
    public function query($query, $query_args = array(), $stop = false) {

        if ($this->has_error)
            return false;

        if (is_array($query_args) && !empty($query_args))
            $this->query_args = array_merge($this->query_args, $query_args);

        $transient_name = 'wta_' . md5($query);

        if ($this->query_args['cache'] > 0 && false !== ( $data = get_transient($transient_name) ))
            return json_decode($data);

        $args = array(
            'method' => 'GET',
            'timeout' => 5,
            'redirection' => 5,
            'httpversion' => '1.0',
            'blocking' => true,
            'headers' => array(
                'Authorization' => 'Bearer ' . $this->bearer_token,
                'Accept-Encoding' => 'gzip'
            ),
            'body' => null,
            'cookies' => array()
        );

        $response = wp_remote_get('https://api.twitter.com/1.1/' . $this->query_args['type'] . '.json?' . $query, $args);
        if (200 != $response['info']['http_code']) {

            if (!$stop) {
                $this->bearer_token = $this->get_bearer_token();
                return $this->query($query, $this->query_args, true);
            } else {
                return $this->bail(__('Bearer Token is good, check your query', 'wp_twitter_api'), $response);
            }
        }
        set_transient($transient_name, $response['body'], $this->query_args['cache']);
        return json_decode($response['body']);
    }

    /**
     * Let's manage errors
     *
     * WP_DEBUG has to be set to true to show errors
     *
     * @param string $error_text Error message
     * @param string $error_object Server response or wp_error
     */
    private function bail($error_text, $error_object = '') {

        $this->has_error = true;

//                if ( is_wp_error( $error_object ) ){
//                        $error_text .= ' - Wp Error: ' . $error_object->get_error_message();
//                } elseif ( !empty( $error_object ) && isset( $error_object['response']['message'] ) ) {
//                        $error_text .= ' ( Response: ' . $error_object['response']['message'] . ' )';
//                }
        if (200 != $error_object['errno']) {
            $error_text .= ' ( Response: ' . $error_object['error'] . ' )';
        }
        trigger_error($error_text, E_USER_NOTICE);
    }

}

/**
 * Instagram
 *
 * with help of the API this class delivers all kind of Images from instagram
 *
 * @package    socialstreams
 * @subpackage socialstreams/instagram
 * @author     ThemePunch <info@themepunch.com>
 */
class RevSliderInstagram {

    /**
     * API key
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $api_key    Instagram API key
     */
    private $api_key;

    /**
     * Stream Array
     *
     * @since    1.0.0
     * @access   private
     * @var      array    $stream    Stream Data Array
     */
    private $stream;

    /**
     * Transient seconds
     *
     * @since    1.0.0
     * @access   private
     * @var      number    $transient Transient time in seconds
     */
    private $transient_sec;

    /**
     * Initialize the class and set its properties.
     *
     * @since    1.0.0
     * @param      string    $api_key	Instagram API key.
     */
    public function __construct($api_key, $transient_sec = 1200) {
        $this->api_key = $api_key;
        $this->transient_sec = $transient_sec;
    }

    /**
     * Get Instagram Pictures Public by User
     *
     * @since    1.0.0
     * @param    string    $user_id 	Instagram User id (not name)
     */
    public function get_public_photos($search_user_id, $count) {
        //call the API and decode the response
        $url = "https://www.instagram.com/" . $search_user_id . "/media/";


        $transient_name = 'revslider_' . md5($url);
        if ($this->transient_sec > 0 && false !== ($data = get_transient($transient_name)))
            return ($data);


        $rsp = json_decode(wp_remote_get($url)['body']);
        //  $rsp =  wp_remote_fopen($url) ; 


        if (isset($rsp->items)) {
            for ($i = 0; $i < $count; $i++) {
                $return[] = $rsp->items[$i];
            }
            $rsp->items = $return;
            set_transient($transient_name, $rsp->items, $this->transient_sec);
            return $rsp->items;
        } else
            return '';
    }

    /**
     * Get Instagram Pictures Public by Tag
     *
     * @since    1.0.0
     * @param    string    $user_id 	Instagram User id (not name)
     */
    public function get_tag_photos($search_tag,$count){
		//call the API and decode the response
		$url = "https://api.instagram.com/v1/tags/".$search_tag."/media/recent?count=".$count."&access_token=".$this->api_key;

		$transient_name = 'revslider_' . md5($url);
		if ($this->transient_sec > 0 && false !== ($data = get_transient( $transient_name)))
			return ($data);

		$rsp = json_decode(wp_remote_get($url)['body']);

      for($i=0;$i<$count;$i++) {
          $return[] = $rsp->tag->media->nodes[$i];
      }
    
    if(isset($rsp->tag->media->nodes)){
      $rsp->tag->media->nodes = $return;
      set_transient( $transient_name, $rsp->tag->media->nodes, $this->transient_sec );
      return $rsp->tag->media->nodes;
    }
    else return '';
	}

}

// End Class

/**
 * Flickr
 *
 * with help of the API this class delivers all kind of Images from flickr
 *
 * @package    socialstreams
 * @subpackage socialstreams/flickr
 * @author     ThemePunch <info@themepunch.com>
 */
class RevSliderFlickr {

    /**
     * API key
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $api_key    flickr API key
     */
    private $api_key;

    /**
     * API params
     *
     * @since    1.0.0
     * @access   private
     * @var      array    $api_param_defaults    Basic params to call with API
     */
    private $api_param_defaults;

    /**
     * Stream Array
     *
     * @since    1.0.0
     * @access   private
     * @var      array    $stream    Stream Data Array
     */
    private $stream;

    /**
     * Basic URL
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $url    Url to fetch user from
     */
    private $flickr_url;

    /**
     * Transient seconds
     *
     * @since    1.0.0
     * @access   private
     * @var      number    $transient Transient time in seconds
     */
    private $transient_sec;

    /**
     * Initialize the class and set its properties.
     *
     * @since    1.0.0
     * @param      string    $api_key	flickr API key.
     */
    public function __construct($api_key, $transient_sec = 1200) {
        $this->api_key = $api_key;
        $this->api_param_defaults = array(
            'api_key' => $this->api_key,
            'format' => 'json',
            'nojsoncallback' => 1,
        );

        $this->transient_sec = $transient_sec;
    }

    /**
     * Calls Flicker API with set of params, returns json
     *
     * @since    1.0.0
     * @param    array    $params 	Parameter build for API request
     */
    private function call_flickr_api($params) {
        //build url
        $encoded_params = array();
        foreach ($params as $k => $v) {
            $encoded_params[] = urlencode($k) . '=' . urlencode($v);
        }

        //call the API and decode the response
        $url = "https://api.flickr.com/services/rest/?" . implode('&', $encoded_params);
        $transient_name = 'revslider_' . md5($url);

        if ($this->transient_sec > 0 && false !== ($data = get_transient($transient_name)))
            return ($data);

        $rsp = json_decode(file_get_contents($url));
        if (isset($rsp)) {
            set_transient($transient_name, $rsp, $this->transient_sec);
            return $rsp;
        } else
            return '';
    }

    /**
     * Get User ID from its URL
     *
     * @since    1.0.0
     * @param    string    $user_url URL of the Gallery
     */
    public function get_user_from_url($user_url) {
        //gallery params
        $user_params = $this->api_param_defaults + array(
            'method' => 'flickr.urls.lookupUser',
            'url' => $user_url,
        );

        //set User Url
        $this->flickr_url = $user_url;

        //get gallery info
        $user_info = $this->call_flickr_api($user_params);
        if (isset($user_info->user->id))
            return $user_info->user->id;
        else
            return '';
    }

    /**
     * Get Group ID from its URL
     *
     * @since    1.0.0
     * @param    string    $group_url URL of the Gallery
     */
    public function get_group_from_url($group_url) {
        //gallery params
        $group_params = $this->api_param_defaults + array(
            'method' => 'flickr.urls.lookupGroup',
            'url' => $group_url,
        );

        //set User Url
        $this->flickr_url = $group_url;

        //get gallery info
        $group_info = $this->call_flickr_api($group_params);
        if (isset($group_info->group->id))
            return $group_info->group->id;
        else
            return '';
    }

    /**
     * Get Public Photos
     *
     * @since    1.0.0
     * @param    string    $user_id 	flicker User id (not name)
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_public_photos($user_id, $item_count = 10) {
        //public photos params
        $public_photo_params = $this->api_param_defaults + array(
            'method' => 'flickr.people.getPublicPhotos',
            'user_id' => $user_id,
            'extras' => 'description, license, date_upload, date_taken, owner_name, icon_server, original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o',
            'per_page' => $item_count,
            'page' => 1
        );

        //get photo list
        $public_photos_list = $this->call_flickr_api($public_photo_params);
        //var_dump($public_photos);
        if (isset($public_photos_list->photos->photo))
            return $public_photos_list->photos->photo;
        else
            return '';
    }

    /**
     * Get Photosets List from User
     *
     * @since    1.0.0
     * @param    string    $user_id 	flicker User id (not name)
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_photo_sets($user_id, $item_count = 10, $current_photoset) {
        //photoset params
        $photo_set_params = $this->api_param_defaults + array(
            'method' => 'flickr.photosets.getList',
            'user_id' => $user_id,
            'per_page' => $item_count,
            'page' => 1
        );

        //get photoset list
        $photo_sets_list = $this->call_flickr_api($photo_set_params);

        $return = array();
        foreach ($photo_sets_list->photosets->photoset as $photo_set) {
            if (empty($photo_set->title->_content))
                $photo_set->title->_content = "";
            if (empty($photo_set->photos))
                $photo_set->photos = 0;
            $return[] = '<option title="' . $photo_set->description->_content . '" ' . selected($photo_set->id, $current_photoset, false) . ' value="' . $photo_set->id . '">' . $photo_set->title->_content . ' (' . $photo_set->photos . ' photos)</option>"';
        }
        return $return;
    }

    /**
     * Get Photoset Photos
     *
     * @since    1.0.0
     * @param    string    $photo_set_id 	Photoset ID
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_photo_set_photos($photo_set_id, $item_count = 10) {
        //photoset photos params
        $this->stream = array();
        $photo_set_params = $this->api_param_defaults + array(
            'method' => 'flickr.photosets.getPhotos',
            'photoset_id' => $photo_set_id,
            'per_page' => $item_count,
            'page' => 1,
            'extras' => 'license, date_upload, date_taken, owner_name, icon_server, original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o'
        );

        //get photo list
        $photo_set_photos = $this->call_flickr_api($photo_set_params);
        if (isset($photo_set_photos->photoset->photo))
            return $photo_set_photos->photoset->photo;
        else
            return '';
    }

    /**
     * Get Groop Pool Photos
     *
     * @since    1.0.0
     * @param    string    $group_id 	Photoset ID
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_group_photos($group_id, $item_count = 10) {
        //photoset photos params
        $group_pool_params = $this->api_param_defaults + array(
            'method' => 'flickr.groups.pools.getPhotos',
            'group_id' => $group_id,
            'per_page' => $item_count,
            'page' => 1,
            'extras' => 'license, date_upload, date_taken, owner_name, icon_server, original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o'
        );

        //get photo list
        $group_pool_photos = $this->call_flickr_api($group_pool_params);
        if (isset($group_pool_photos->photos->photo))
            return $group_pool_photos->photos->photo;
        else
            return '';
    }

    /**
     * Get Gallery ID from its URL
     *
     * @since    1.0.0
     * @param    string    $gallery_url URL of the Gallery
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_gallery_from_url($gallery_url) {
        //gallery params
        $gallery_params = $this->api_param_defaults + array(
            'method' => 'flickr.urls.lookupGallery',
            'url' => $gallery_url,
        );

        //get gallery info
        $gallery_info = $this->call_flickr_api($gallery_params);
        if (isset($gallery_info->gallery->id))
            return $gallery_info->gallery->id;
        else
            return '';
    }

    /**
     * Get Gallery Photos
     *
     * @since    1.0.0
     * @param    string    $gallery_id 	flicker Gallery id (not name)
     * @param    int       $item_count 	number of photos to pull
     */
    public function get_gallery_photos($gallery_id, $item_count = 10) {
        //gallery photos params
        $gallery_photo_params = $this->api_param_defaults + array(
            'method' => 'flickr.galleries.getPhotos',
            'gallery_id' => $gallery_id,
            'extras' => 'description, license, date_upload, date_taken, owner_name, icon_server, original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o',
            'per_page' => $item_count,
            'page' => 1
        );

        //get photo list
        $gallery_photos_list = $this->call_flickr_api($gallery_photo_params);
        if (isset($gallery_photos_list->photos->photo))
            return $gallery_photos_list->photos->photo;
        else
            return '';
    }

    /**
     * Encode the flickr ID for URL (base58)
     *
     * @since    1.0.0
     * @param    string    $num 	flickr photo id
     */
    private function base_encode($num, $alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ') {
        $base_count = strlen($alphabet);
        $encoded = '';
        while ($num >= $base_count) {
            $div = $num / $base_count;
            $mod = ($num - ($base_count * intval($div)));
            $encoded = $alphabet[$mod] . $encoded;
            $num = intval($div);
        }
        if ($num)
            $encoded = $alphabet[$num] . $encoded;
        return $encoded;
    }

}

// End Class

/**
 * Youtube
 *
 * with help of the API this class delivers all kind of Images/Videos from youtube
 *
 * @package    socialstreams
 * @subpackage socialstreams/youtube
 * @author     ThemePunch <info@themepunch.com>
 */
class RevSliderYoutube {

    /**
     * API key
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $api_key    Youtube API key
     */
    private $api_key;

    /**
     * Channel ID
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $channel_id    Youtube Channel ID
     */
    private $channel_id;

    /**
     * Stream Array
     *
     * @since    1.0.0
     * @access   private
     * @var      array    $stream    Stream Data Array
     */
    private $stream;

    /**
     * Transient seconds
     *
     * @since    1.0.0
     * @access   private
     * @var      number    $transient Transient time in seconds
     */
    private $transient_sec;

    /**
     * Initialize the class and set its properties.
     *
     * @since    1.0.0
     * @param      string    $api_key	Youtube API key.
     */
    public function __construct($api_key, $channel_id, $transient_sec = 1200) {
        $this->api_key = $api_key;
        $this->channel_id = $channel_id;
        $this->transient_sec = $transient_sec;
    }

    /**
     * Get Youtube Playlists
     *
     * @since    1.0.0
     */
    public function get_playlists() {
        //call the API and decode the response
        $url = "https://www.googleapis.com/youtube/v3/playlists?part=snippet&maxResults=50&channelId=" . $this->channel_id . "&key=" . $this->api_key;
        $rsp = json_decode(wp_remote_get($url)['body']);
        if (isset($rsp->items)) {
            return $rsp->items;
        } else {
            return false;
        }
    }

    /**
     * Get Youtube Playlist Items
     *
     * @since    1.0.0
     * @param    string    $playlist_id 	Youtube Playlist ID
     * @param    integer    $count 	Max videos count
     */
    public function show_playlist_videos($playlist_id, $count = 50) {
        //call the API and decode the response
        if (empty($count))
            $count = 50;
        $url = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=" . $playlist_id . "&maxResults=" . $count . "&fields=items%2Fsnippet&key=" . $this->api_key;

        $transient_name = 'revslider_' . md5($url);

        if ($this->transient_sec > 0 && false !== ($data = get_transient($transient_name)))
            return ($data);

        $rsp = json_decode(wp_remote_get($url)['body']);
        // var_dump($rsp);die();
        set_transient($transient_name, $rsp->items, $this->transient_sec);
        return $rsp->items;
    }

    /**
     * Get Youtube Channel Items
     *
     * @since    1.0.0
     * @param    integer    $count 	Max videos count
     */
    public function show_channel_videos($count = 50) {
        if (empty($count))
            $count = 50;
        //call the API and decode the response
        $url = "https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=" . $this->channel_id . "&maxResults=" . $count . "&key=" . $this->api_key . "&order=date";

        $transient_name = 'revslider_' . md5($url);
        $data = get_transient($transient_name);
        // var_dump($data);die();
        if ($this->transient_sec > 0 && false !== ($data = get_transient($transient_name)))
            return ($data);

        $rsp = json_decode(wp_remote_get($url)['body']);

        if ((is_array($rsp) || is_object($rsp)) && !empty($rsp)) {
            set_transient($transient_name, $rsp->items, $this->transient_sec);
            return $rsp->items;
        }
    }

    /**
     * Get Playlists from Channel as Options for Selectbox
     *
     * @since    1.0.0
     */
    public function get_playlist_options($current_playlist) {
        $return = array();
        $playlists = $this->get_playlists();
        if (!empty($playlists)) {
            foreach ($playlists as $playlist) {
                $return[] = '<option title="' . $playlist->snippet->description . '" ' . selected($playlist->id, $current_playlist, false) . ' value="' . $playlist->id . '">' . $playlist->snippet->title . '</option>"';
            }
        }
        return $return;
    }

}

// End Class

/**
 * Vimeo
 *
 * with help of the API this class delivers all kind of Images/Videos from Vimeo
 *
 * @package    socialstreams
 * @subpackage socialstreams/vimeo
 * @author     ThemePunch <info@themepunch.com>
 */
class RevSliderVimeo {

    /**
     * Stream Array
     *
     * @since    1.0.0
     * @access   private
     * @var      array    $stream    Stream Data Array
     */
    private $stream;

    /**
     * Transient seconds
     *
     * @since    1.0.0
     * @access   private
     * @var      number    $transient Transient time in seconds
     */
    private $transient_sec;

    /**
     * Initialize the class and set its properties.
     *
     * @since    1.0.0
     * @param      string    $api_key	Youtube API key.
     */
    public function __construct($transient_sec = 1200) {
        $this->transient_sec = $transient_sec;
    }

    /**
     * Get Vimeo User Videos
     *
     * @since    1.0.0
     */
    public function get_vimeo_videos($type, $value) {

        //call the API and decode the response
        if ($type == "user") {
            $url = "https://vimeo.com/api/v2/" . $value . "/videos.json";
        } else {
            $url = "https://vimeo.com/api/v2/" . $type . "/" . $value . "/videos.json";
        }

        $transient_name = 'revslider_' . md5($url);

        if ($this->transient_sec > 0 && false !== ($data = get_transient($transient_name)))
            return ($data);

        $rsp = json_decode(wp_remote_get($url)['body']);
        if ((is_array($rsp) || is_object($rsp)) && !empty($rsp)) {
            set_transient($transient_name, $rsp, $this->transient_sec);
            return $rsp;
        }

        //return $rsp;
        return '';
    }

}

// End Class
?>