Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Giphy/Api.php
<?php

namespace XF\Giphy;

use
GuzzleHttp\Exception\RequestException;
use
GuzzleHttp\Psr7\Request;

use function
is_array;

class
Api
{
   
/**
     * @var \GuzzleHttp\Client
     */
   
protected $client;

    protected
$baseApiUrl = 'https://api.giphy.com/v1/';

    protected
$apiKey;

    protected
$config = [
       
'random_id' => null,
       
'rating' => 'g',
       
'lang' => 'en'
   
];

    public function
__construct(string $apiKey, array $config = [])
    {
       
$this->apiKey = $apiKey;

       
$this->config = array_replace($this->config, $config);

       
$this->client = \XF::app()->http()->createClient([
           
'base_uri' => $this->baseApiUrl,
           
'http_errors' => false
         
]);
    }

    public function
getTrending(int $offset, int $limit, string &$error = null)
    {
       
$config = $this->config;

       
$result = $this->request('gifs/trending', [
           
'random_id' => $config['random_id'],
           
'rating' => $config['rating'],
           
'limit' => $limit,
           
'offset' => $offset
       
], $error);

        if (
$error)
        {
            return [];
        }

       
$images = $this->prepareImageResults($result);
        return
$images;
    }

    public function
getSearchResults(string $q, int $offset, int $limit, string &$error = null)
    {
       
$config = $this->config;

       
$result = $this->request('gifs/search', [
           
'q' => $q,
           
'random_id' => $config['random_id'],
           
'rating' => $config['rating'],
           
'limit' => $limit,
           
'offset' => $offset
       
], $error);

        if (
$error)
        {
            return [];
        }

       
$images = $this->prepareImageResults($result);
        return
$images;
    }

    public function
request(string $path, array $params = [], string &$error = null, string $method = 'get'): array
    {
       
$params = ['api_key' => $this->apiKey] + $params;
       
$path .= '?' . http_build_query($params);

       
$request = new Request($method, $path);

        try
        {
           
$response = $this->client->send($request);
           
$body = $response->getBody();

            if (
$body)
            {
               
$contents = @json_decode($body->getContents(), true);
               
$result = is_array($contents) ? $contents : [];

                if (
$response->getStatusCode() !== 200)
                {
                   
$error = 'GIPHY API error: ' . ($result['message'] ?? \XF::phrase('unexpected_error_occurred'));
                    \
XF::logError($error);
                }
            }
            else
            {
               
$result = [];
               
$error = 'GIPHY API error: ' . \XF::phrase('unexpected_error_occurred');
                \
XF::logError($error);
            }
        }
        catch (
RequestException $e)
        {
            \
XF::logException($e, false, 'GIPHY connection error: ');
           
$result = [];

           
$error = $e->getMessage();
        }

        return
$result;
    }

    protected function
prepareImageResults($result): array
    {
       
$images = [];

        if (
is_array($result))
        {
            foreach (
$result['data'] AS $data)
            {
               
$fixedHeight = $data['images']['fixed_height']['url']; // always available
               
$fixedHeightStill = $data['images']['fixed_height_still']['url']; // always available

               
$fixedHeightSmall = $data['images']['fixed_height_small']['url'] ?? $fixedHeight;
               
$fixedHeightSmallStill = $data['images']['fixed_height_small_still']['url'] ?? $fixedHeightStill;

               
$images[$data['id']] = [
                   
'title' => $data['title'],
                   
'insert' => $this->normalizeImageUrl($fixedHeight),
                   
'src' => $this->normalizeImageUrl($fixedHeightSmall),
                   
'thumb' => $this->normalizeImageUrl($fixedHeightSmallStill),
                ];
            }
        }

        return
$images;
    }

    protected function
normalizeImageUrl($url)
    {
       
$parts = parse_url($url);
        return
sprintf(
           
'%s://%s%s',
           
$parts['scheme'],
           
$parts['host'],
           
$parts['path']
        );
    }
}