Your IP : 216.73.216.229


Current Path : /home/jeromecohp/www/plugins/system/yooessentials/modules/api/src/TikTok/
Upload File :
Current File : /home/jeromecohp/www/plugins/system/yooessentials/modules/api/src/TikTok/TikTokApi.php

<?php
/**
 * @package   Essentials YOOtheme Pro (Freemium) 2.0.19 build 1026.0920
 * @author    ZOOlanders https://www.zoolanders.com
 * @copyright Copyright (C) Joolanders, SL
 * @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
 */

namespace ZOOlanders\YOOessentials\Api\TikTok;

use YOOtheme\Arr;
use YOOtheme\Http\Response;
use ZOOlanders\YOOessentials\Api\AbstractApi;
use ZOOlanders\YOOessentials\Auth\AuthOAuth;

class TikTokApi extends AbstractApi
{
    protected const CLIENT_KEY = 'aw7gb56h2gkhl8a9';

    // prettier-ignore
    protected const VIDEO_FIELDS = ['create_time', 'cover_image_url', 'share_url', 'video_description', 'duration', 'height', 'width', 'id', 'title', 'embed_html', 'embed_link', 'like_count', 'comment_count', 'share_count', 'view_count'];

    /** @var string */
    protected $apiEndpoint = 'https://open-api.tiktok.com/';

    /** @var AuthOAuth */
    protected $account;

    public function queryVideos(array $filters = []): array
    {
        $result = $this->post(
            'video/query/',
            [
                'open_id' => $this->account->userId(),
                'access_token' => $this->account->accessToken(),
                'fields' => self::VIDEO_FIELDS,
                'filters' => Arr::pick($filters, ['video_ids'])
            ]
        );

        return $result['videos'] ?? [];
    }

    public function listVideos(array $filter = []): array
    {
        $result = $this->post(
            'video/list/',
            [
                'open_id' => $this->account->userId(),
                'access_token' => $this->account->accessToken(),
                'fields' => self::VIDEO_FIELDS
            ] + Arr::pick($filter, ['cursor', 'max_count'])
        );

        return $result['videos'] ?? [];
    }

    public function refreshAccessToken(string $refreshToken): array
    {
        return $this->processResponse(
            $this->client->post(
                $this->apiEndpoint . '/oauth/refresh_token/',
                [
                    'client_key' => self::CLIENT_KEY,
                    'grant_type' => 'refresh_token',
                    'refresh_token' => $refreshToken,
                ],
                [
                    'Content-Type' => 'application/x-www-form-urlencoded',
                ]
            )
        );
    }

    public function forAccount(AuthOAuth $account): self
    {
        $this->account = $account;

        return $this;
    }

    protected function processResponse(Response $response): array
    {
        $result = json_decode($response->getBody(), true);
        $success =
            $response->getStatusCode() >= 200 && $response->getStatusCode() <= 299 && ($result['message'] ?? '') !== 'error';

        if (!$success) {
            $code = $result['error']['code'] ?? ($result['data']['error_code'] ?? ($response->getStatusCode() ?? 400));
            $message =
                $result['error']['message'] ??
                ($result['data']['description'] ??
                ($response->getReasonPhrase() ?? 'Unknown Error'));

            throw new \Exception($message, $code);
        }

        return $result['data'];
    }
}