railpage/railpagecore

View on GitHub
lib/Images/Provider/FiveHundredPx.php

Summary

Maintainability
B
6 hrs
Test Coverage
<?php

/**
 * 500px image provider for Images
 * @since Version 3.10.0
 * @package Railpage
 * @author Michael Greenhill
 */

namespace Railpage\Images\Provider;

use Railpage\Images\Images;
use Railpage\Images\Image;
use Railpage\Images\ProviderInterface;
use Railpage\Users\User;
use Railpage\AppCore;
use Railpage\Url;
use Exception;
use InvalidArgumentException;
use DateTime;
use DateTimeZone;
use GuzzleHttp\Client;
use GuzzleHttp\Subscriber\Oauth\Oauth1;

/**
 * Flickr image provider
 */

class FiveHundredPx extends AppCore implements ProviderInterface {
    
    /**
     * Provider name
     * @since Version 3.10.0
     * @const PROVIDER_NAME
     */
    
    const PROVIDER_NAME = "FiveHundredPx";
    
    /**
     * API endpoint
     * @since Version 3.10.0
     * @const string API_ENDPOINT
     */
    
    const API_ENDPOINT = "https://api.500px.com/";
    
    /**
     * Permission: group moderator
     * @since Version 3.10.0
     * @const string ACL_GROUP_ADMIN
     */
    
    const ACL_GROUP_ADMIN = 200;
    
    /**
     * Provider API version
     * @since Version 3.10.0
     * @const string PROVIDER_API_VERSION
     */
    
    const PROVIDER_API_VERSION = "v1";
    
    /**
     * Provider's timestamp format
     * @since Version 3.10.0
     * @const string PROVIDER_TIMESTAMP_FORMAT
     */
    
    const PROVIDER_TIMESTAMP_FORMAT = "Y-m-d\TH:i:sP";
    
    /**
     * OAuth consumer key
     * @since VErsion 3.10.0
     * @var string $oauth_consumer_key
     */
    
    private $oauth_consumer_key;
    
    /**
     * OAuth consumer secret
     * @since Version 3.10.0
     * @var string $oauth_consumer_secret
     */
    
    private $oauth_consumer_secret;
    
    /**
     * The photo data as extracted from Flickr
     * @since Version 3.10.0
     * @var array $photo
     */
    
    private $photo;
    
    /**
     * API response format
     * @since Version 3.10.0
     * @var string $format
     */
    
    public $format = "json";
    
    /**
     * Last error code returned from the provider's API
     * @since Version 3.10.0
     * @var int $errcode
     */
    
    private $errcode;
    
    /**
     * Last error message returned from the provider's API
     * @since Version 3.10.0
     * @var string $errmessage
     */
    
    private $errmessage;
    
    /**
     * GuzzleHTTP Client
     * @since Version 3.10.0
     * @var \GuzzleHttp\Client $Client
     */
    
    private $Client;
    
    /**
     * Constructor
     * @since Version 3.10.0
     * @param array $params
     */
    
    public function __construct($params = null) {
        
        parent::__construct(); 
        
        #if ($params === false) {
            /*
            $Config = AppCore::getConfig();
            
            $params = array(
                "api_key" => $Config->FiveHundredPX->APIKey,
                "api_secret" => $Config->FiveHundredPX->APISecret
            );
            */
            
            // temporary hard code
            $params = [
                "oauth_consumer_key" => "X9hfaNi3y6uJsVjOEz6Ld4lQIY1T8AqpR4mYJvYr",
                "oauth_consumer_secret" => "48ElAgTOSn1lYon4Phs8A1zjXpmy7jCTU4xa0t2o",
                "javascript_sdk_key" => "33339f35f4f5aad73b6380ce54a56cf0e464e076",
                "callback_url" => "http://www.railpage.com.au/endpoint/500px"
            ];
        #}
        
        /*
        $opts = array(
            "oauth_consumer_key" => "api_key",
            "oauth_consumer_secret" => "api_secret"
        );
        
        foreach ($opts as $var => $val) {
            if (!isset($params[$val]) || is_null(filter_var($params[$val], FILTER_SANITIZE_STRING))) {
                $this->$var = NULL;
            } else {
                $this->$var = $params[$val];
            }
        }
        */
        
        #printArray($params); 
        
        foreach ($params as $key => $val) {
            $this->$key = $val; 
        }
        
        $this->Client = new Client;
        
    }
    
    
    /**
     * Set some options for this provider
     * @since Version 3.9.1
     * @param array $options
     * @return \Railpage\Images\Provider\Flickr
     */
    
    public function setOptions($options) {
        
        foreach ($options as $key => $val) {
            
            $this->$key = $val;
        }
        
        return $this;
    }
    
    /**
     * Get the photo from the provider
     * @since Version 3.9
     * @param int $id The ID of the photo from the provider
     * @param boolean $force
     * @return array
     */
    
    public function getImage($id, $force = 0) {
        
        $params['image_size'] = "1,2,3,4,5,20,21,30,100,200,440,600,1080,1600,2048";
        
        return $this->execute("photos/" . $id, $params); 
        
    }
    
    /**
     * Save the changes to this photo
     * @since Version 3.9
     * @return self
     * @param \Railpage\Images\Image $imageObject
     */
    
    public function setImage(Image $imageObject) {
        
    }
    
    /**
     * Get a list of photos
     * @since Version 3.9
     * @param int $page
     * @param int $itemsPerPage
     * @return array
     */
    
    public function getImages($page, $itemsPerPage) {
        
    }
    
    /**
     * Return the name of this provider
     * @since Version 3.9
     * @return string
     */
    
    public function getProviderName() {
        return self::PROVIDER_NAME;
    }
    
    /**
     * Return the context of the supplied photo
     * @since Version 3.9
     * @return array
     */
    
    public function getImageContext(Image $imageObject) {
        
    }
    
    /**
     * Delete this photo
     * @since Version 3.9.1
     * @return boolean
     * @param \Railpage\Images\Image $imageObject
     */
    
    public function deleteImage(Image $imageObject) {
        
    }
    
    /**
     * Fetch a request from Flickr's API
     * @since Version 3.9.1
     * @param string $method
     * @param array $params
     * @return array
     */
    
    public function execute($method = null, $params = array()) {
        
        if (strpos("consumer_key=" . $this->oauth_consumer_key, $method) === false && !isset($params['oauth_consumer_key'])) {
            $params['consumer_key'] = $this->oauth_consumer_key; 
        }
        
        $url = sprintf("%s%s/%s", self::API_ENDPOINT, self::PROVIDER_API_VERSION, $method); 
        
        if (count($params)) {
            $params = http_build_query($params);
            $url = sprintf("%s?%s", $url, $params);
        }
        
        $response = $this->Client->get($url); 
        
        if ($response->getStatusCode() != 200) {
            throw new Exception(sprintf("An unexpected HTTP response code of %s was returned from %s", $response->getStatusCode(), self::PROVIDER_NAME));
        }
        
        $result = $response->json(); 
        
        $result = $this->normaliseResult($result); 
        
        return $result;
        
    }
    
    /**
     * Normalise the result set
     * @since Version 3.10.0
     * @param array $result
     * @return array
     */
    
    private function normaliseResult($result) {
        
        $result = $result['photo'];
        
        $result['title'] = $result['name'];
        $result['sizes'] = $result['images'];
        
        foreach ($result['sizes'] as $key => $size) {
            $result['sizes'][$key] = $this->normaliseSize($size);
        }
        
        $result['author'] = $result['user'];
        $result['location'] = [ 
            "latitude" => $result['latitude'],
            "longitude" => $result['longitude']
        ];
        
        $result['dates'] = [
            "taken" => DateTime::CreateFromFormat(self::PROVIDER_TIMESTAMP_FORMAT, $result['taken_at']),
            "uploaded" => DateTime::CreateFromFormat(self::PROVIDER_TIMESTAMP_FORMAT, $result['created_at'])
        ];
        
        $result['urls']['url'][0]['_content'] = sprintf("https://500px.com/photo/%s", $result['id']); 
        
        return $result;
        
    }
    
    /**
     * Normalise the image size
     * @since Version 3.10.0
     * @param array $size
     * @return array
     */
    
    private function normaliseSize($size) {
        
        $size['source'] = $size['https_url']; 
        
        $key = sprintf("%s:image.size;image=%s", self::PROVIDER_NAME, $size['source']); 
        
        if (!$result = $this->Memcached->fetch($key)) {
            
            $result = getimagesize($size['source']); 
            $this->Memcached->save($key, $result); 
            
        }
        
        $size['width'] = $result[0];
        $size['height'] = $result[1]; 
        
        return $size;
        
    }
    
    /**
     * Make an OAuth URL if we have the required information
     * @since Version 3.9.1
     * @return void
     */
    
    private function configureOAuth() {
        
    }
    
    /**
     * Get error code
     * @since Version 3.9.1
     * @return int
     */
    
    public function getErrorCode() {
        return $this->errcode;
    }
    
    /**
     * Get the last error message
     * @since Version 3.9.1
     * @return string
     */
    
    public function getErrorMessage() {
        return $this->errmessage;
    }
    
    /**
     * Get the EXIF data for this image
     * @since Version 3.10.0
     * @return array
     * @param int $photoId
     */
    
    public function getExif($photoId) {
        
        $data = $this->getImage($photoId); 
        
        // finish this 
        
    }
    
}