2022-03-29 13:30:31 -04:00
|
|
|
<?php
|
|
|
|
namespace App\Helpers;
|
|
|
|
|
2023-01-25 09:56:23 -05:00
|
|
|
use App\Cache\ApcuCache;
|
2022-03-29 13:30:31 -04:00
|
|
|
use App\Cache\JSONCache;
|
|
|
|
use App\Cache\RedisCache;
|
2022-08-13 07:09:39 -04:00
|
|
|
use App\Constants\CacheMethods;
|
2023-04-02 13:55:04 -04:00
|
|
|
use App\Constants\TextExtras;
|
2022-11-04 15:08:19 -04:00
|
|
|
use App\Models\BaseTemplate;
|
2022-03-29 13:30:31 -04:00
|
|
|
|
|
|
|
class Wrappers {
|
|
|
|
/**
|
|
|
|
* Setup of Latte template engine
|
|
|
|
*/
|
2023-04-27 14:23:23 -04:00
|
|
|
public static function latte(string $template, BaseTemplate $base) {
|
2022-03-29 13:30:31 -04:00
|
|
|
$latte = new \Latte\Engine;
|
|
|
|
$cache_path = Misc::env('LATTE_CACHE', __DIR__ . '/../../cache/latte');
|
|
|
|
$latte->setTempDirectory($cache_path);
|
|
|
|
|
|
|
|
// -- CUSTOM FUNCTIONS -- //
|
|
|
|
// Get URL with optional endpoint
|
|
|
|
$latte->addFunction('path', function (string $endpoint = ''): string {
|
|
|
|
return Misc::url($endpoint);
|
|
|
|
});
|
2022-11-04 15:08:19 -04:00
|
|
|
|
|
|
|
// Static assets
|
|
|
|
$latte->addFunction('static', function (string $type, string $file, bool $isVendor = false): string {
|
|
|
|
$endpoint = '';
|
|
|
|
switch ($type) {
|
|
|
|
case 'js':
|
|
|
|
$endpoint .= '/scripts';
|
|
|
|
break;
|
|
|
|
case 'css':
|
|
|
|
$endpoint .= '/styles';
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throw new \Exception('Invalid static asset type');
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($isVendor) $endpoint .= '/vendor';
|
|
|
|
|
|
|
|
$endpoint .= '/' . $file;
|
|
|
|
|
|
|
|
return Misc::url($endpoint);
|
|
|
|
});
|
|
|
|
|
|
|
|
$latte->addFunction('theme', function(): string {
|
|
|
|
return Cookies::theme();
|
|
|
|
});
|
|
|
|
|
2022-03-29 13:30:31 -04:00
|
|
|
// Version being used
|
2022-06-28 14:41:51 -04:00
|
|
|
$latte->addFunction('version_frontend', function (): string {
|
2022-03-29 13:30:31 -04:00
|
|
|
return \Composer\InstalledVersions::getVersion('pablouser1/proxitok');
|
|
|
|
});
|
2022-06-28 14:41:51 -04:00
|
|
|
$latte->addFunction('version_scraper', function (): string {
|
|
|
|
return \Composer\InstalledVersions::getVersion('pablouser1/tikscraper');
|
|
|
|
});
|
2022-11-04 15:08:19 -04:00
|
|
|
|
|
|
|
// https://stackoverflow.com/a/36365553
|
|
|
|
$latte->addFunction('number', function (float $x) {
|
|
|
|
if($x > 1000) {
|
|
|
|
$x_number_format = number_format($x);
|
|
|
|
$x_array = explode(',', $x_number_format);
|
|
|
|
$x_parts = array('K', 'M', 'B', 'T');
|
|
|
|
$x_count_parts = count($x_array) - 1;
|
|
|
|
$x_display = $x;
|
|
|
|
$x_display = $x_array[0] . ((int) $x_array[1][0] !== 0 ? '.' . $x_array[1][0] : '');
|
|
|
|
$x_display .= $x_parts[$x_count_parts - 1];
|
|
|
|
return $x_display;
|
|
|
|
}
|
|
|
|
return $x;
|
2022-03-29 13:30:31 -04:00
|
|
|
});
|
2022-09-25 13:53:00 -04:00
|
|
|
|
|
|
|
// UrlBuilder
|
|
|
|
$latte->addFunction('url_stream', function (string $url): string {
|
|
|
|
return UrlBuilder::stream($url);
|
|
|
|
});
|
|
|
|
$latte->addFunction('url_user', function (string $username): string {
|
|
|
|
return UrlBuilder::user($username);
|
|
|
|
});
|
2022-11-26 18:05:11 -05:00
|
|
|
$latte->addFunction('url_tag', function (string $tag): string {
|
|
|
|
return UrlBuilder::tag($tag);
|
|
|
|
});
|
2022-09-25 13:53:00 -04:00
|
|
|
$latte->addFunction('url_video_internal', function (string $username, string $id): string {
|
|
|
|
return UrlBuilder::video_internal($username, $id);
|
|
|
|
});
|
|
|
|
$latte->addFunction('url_video_external', function (string $username, string $id): string {
|
|
|
|
return UrlBuilder::video_external($username, $id);
|
|
|
|
});
|
2022-10-24 14:53:59 -04:00
|
|
|
$latte->addFunction('url_download', function (string $url, string $username, string $id, bool $watermark): string {
|
|
|
|
return UrlBuilder::download($url, $username, $id, $watermark);
|
2022-09-25 13:53:00 -04:00
|
|
|
});
|
2022-11-04 15:08:19 -04:00
|
|
|
|
2023-04-02 14:14:48 -04:00
|
|
|
$latte->addFunction('bool_to_str', function (bool $cond): string {
|
|
|
|
return $cond ? 'yes' : 'no';
|
|
|
|
});
|
|
|
|
|
2023-04-02 13:55:04 -04:00
|
|
|
// Add URLs to video descriptions
|
|
|
|
// TODO: Make it work with unicode characters such as emojis
|
|
|
|
$latte->addFunction('render_desc', function (string $desc, array $textExtras = []): string {
|
2023-04-02 14:14:48 -04:00
|
|
|
$bytesCount = strlen($desc);
|
|
|
|
$charsCount = mb_strlen($desc);
|
|
|
|
// Skip urlify for now if there is a special char like an emoji to avoid issues
|
|
|
|
if ($bytesCount !== $charsCount) {
|
|
|
|
return $desc;
|
|
|
|
}
|
2023-04-02 13:55:04 -04:00
|
|
|
$sanitizedDesc = htmlspecialchars($desc);
|
|
|
|
$out = $sanitizedDesc;
|
|
|
|
foreach ($textExtras as $extra) {
|
|
|
|
$url = '';
|
|
|
|
$text = mb_substr($desc, $extra->start, $extra->end - $extra->start, 'UTF-8');
|
|
|
|
switch ($extra->type) {
|
|
|
|
// User URL
|
|
|
|
case TextExtras::USER:
|
|
|
|
$url = UrlBuilder::user(htmlspecialchars($extra->userUniqueId));
|
|
|
|
break;
|
|
|
|
// Hashtag URL
|
|
|
|
case TextExtras::HASHTAG:
|
|
|
|
$url = UrlBuilder::tag(htmlspecialchars($extra->hashtagName));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
$out = str_replace($text, "<a href=\"$url\">$text</a>", $out);
|
|
|
|
}
|
|
|
|
return $out;
|
|
|
|
});
|
|
|
|
|
2022-11-04 15:08:19 -04:00
|
|
|
$latte->render(Misc::getView($template), $base);
|
2022-03-29 13:30:31 -04:00
|
|
|
}
|
|
|
|
|
2022-05-24 08:10:41 -04:00
|
|
|
/**
|
2022-03-29 13:30:31 -04:00
|
|
|
* Setup of TikTok Api wrapper
|
|
|
|
*/
|
2023-04-27 14:23:23 -04:00
|
|
|
public static function api(): \TikScraper\Api {
|
2022-08-13 07:09:39 -04:00
|
|
|
$method = Misc::env('API_SIGNER', '');
|
|
|
|
$url = Misc::env('API_SIGNER_URL', '');
|
|
|
|
if (!$method) {
|
|
|
|
// Legacy support
|
|
|
|
$browser_url = Misc::env('API_BROWSER_URL', '');
|
|
|
|
if ($url) {
|
|
|
|
$method = 'remote';
|
|
|
|
} elseif ($browser_url) {
|
|
|
|
$url = $browser_url;
|
|
|
|
$method = 'browser';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-29 13:30:31 -04:00
|
|
|
$options = [
|
2022-06-28 14:41:51 -04:00
|
|
|
'use_test_endpoints' => Misc::env('API_TEST_ENDPOINTS', false) || isset($_COOKIE['api-test_endpoints']) && $_COOKIE['api-test_endpoints'] === 'yes',
|
2022-03-29 13:30:31 -04:00
|
|
|
'signer' => [
|
2022-08-13 07:09:39 -04:00
|
|
|
'method' => $method,
|
|
|
|
'url' => $url,
|
2022-03-29 13:30:31 -04:00
|
|
|
'close_when_done' => false
|
|
|
|
]
|
|
|
|
];
|
2022-09-03 07:21:43 -04:00
|
|
|
|
|
|
|
// -- PROXY CONFIG -- //
|
|
|
|
$proxy_host = Misc::env('PROXY_HOST', '');
|
|
|
|
$proxy_port = Misc::env('PROXY_PORT', '');
|
|
|
|
|
|
|
|
if ($proxy_host && $proxy_port) {
|
|
|
|
$options['proxy'] = [
|
|
|
|
'host' => $proxy_host,
|
|
|
|
'port' => $proxy_port,
|
|
|
|
'username' => Misc::env('PROXY_USERNAME', null),
|
|
|
|
'password' => Misc::env('PROXY_PASSWORD', null)
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
2022-03-29 13:30:31 -04:00
|
|
|
// Cache config
|
2022-08-13 07:09:39 -04:00
|
|
|
$cacheEngine = null;
|
2022-03-29 13:30:31 -04:00
|
|
|
if (isset($_ENV['API_CACHE'])) {
|
|
|
|
switch ($_ENV['API_CACHE']) {
|
2022-08-13 07:09:39 -04:00
|
|
|
case CacheMethods::JSON:
|
2022-03-29 13:30:31 -04:00
|
|
|
$cacheEngine = new JSONCache();
|
|
|
|
break;
|
2023-01-25 09:56:23 -05:00
|
|
|
case CacheMethods::APCU:
|
|
|
|
$cacheEngine = new ApcuCache();
|
|
|
|
break;
|
2022-08-13 07:09:39 -04:00
|
|
|
case CacheMethods::REDIS:
|
2022-03-29 13:30:31 -04:00
|
|
|
if (!(isset($_ENV['REDIS_URL']) || isset($_ENV['REDIS_HOST'], $_ENV['REDIS_PORT']))) {
|
|
|
|
throw new \Exception('You need to set REDIS_URL or REDIS_HOST and REDIS_PORT to use Redis Cache!');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($_ENV['REDIS_URL'])) {
|
|
|
|
$url = parse_url($_ENV['REDIS_URL']);
|
|
|
|
$host = $url['host'];
|
|
|
|
$port = $url['port'];
|
|
|
|
$password = $url['pass'] ?? null;
|
|
|
|
} else {
|
|
|
|
$host = $_ENV['REDIS_HOST'];
|
|
|
|
$port = (int) $_ENV['REDIS_PORT'];
|
|
|
|
$password = isset($_ENV['REDIS_PASSWORD']) ? $_ENV['REDIS_PASSWORD'] : null;
|
|
|
|
}
|
|
|
|
$cacheEngine = new RedisCache($host, $port, $password);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-05 07:18:34 -05:00
|
|
|
$customUa = Misc::env("USER_AGENT", '');
|
|
|
|
|
|
|
|
if ($customUa) {
|
|
|
|
$options['user_agent'] = $customUa;
|
|
|
|
}
|
2023-02-17 15:14:01 -05:00
|
|
|
|
2022-06-04 15:04:43 -04:00
|
|
|
return new \TikScraper\Api($options, $cacheEngine);
|
2022-03-29 13:30:31 -04:00
|
|
|
}
|
|
|
|
}
|