Project structure change

This commit is contained in:
Pablo Ferreiro 2022-01-31 00:02:52 +01:00
parent bd1642957c
commit 837f126021
No known key found for this signature in database
GPG key ID: 41FBCE65B779FA24
29 changed files with 298 additions and 254 deletions

21
app/Helpers/Cookies.php Normal file
View file

@ -0,0 +1,21 @@
<?php
namespace App\Helpers;
class Cookies {
const PROXY = ['proxy-host', 'proxy-port', 'proxy-username', 'proxy-password'];
static public function get(string $name): string {
if (isset($_COOKIE[$name]) && !empty($_COOKIE[$name])) {
return $_COOKIE[$name];
}
return '';
}
static public function exists(string $name): bool {
return isset($_COOKIE[$name]);
}
static public function set(string $name, string $value) {
setcookie($name, $value, time()+60*60*24*30, '/', '', isset($_SERVER['HTTPS']), true);
}
};

View file

@ -0,0 +1,10 @@
<?php
namespace App\Helpers;
class ErrorHandler {
static public function show(object $meta) {
http_response_code($meta->http_code);
$latte = Misc::latte();
$latte->render(Misc::getView('error'), ['error' => $meta]);
}
}

37
app/Helpers/Following.php Normal file
View file

@ -0,0 +1,37 @@
<?php
namespace App\Helpers;
class Following {
static public function getUsers (): array {
$following_string = Cookies::get('following');
if ($following_string) {
return explode(',', $following_string);
}
return [];
}
static public function getAll (array $users): object {
$allowed_items_total = isset($_GET['max']) && is_numeric($_GET['max']) && $_GET['max'] <= 100 ? $_GET['max'] : 20;
$items = [];
if (count($users) !== 0) {
$api = Misc::api();
$max_items_per_user = $allowed_items_total / count($users);
foreach ($users as $user) {
$user_feed = $api->getUserFeed($user);
if ($user_feed) {
$max = count($user_feed->items) > $max_items_per_user ? $max_items_per_user : count($user_feed->items);
for ($i = 0; $i < $max; $i++) {
$item = $user_feed->items[$i];
array_push($items, $item);
}
}
}
}
$feed = (object) [
'items' => $items,
'hasMore' => false
];
return $feed;
}
};

107
app/Helpers/Misc.php Normal file
View file

@ -0,0 +1,107 @@
<?php
namespace App\Helpers;
use Exception;
use App\Cache\JSONCache;
use App\Cache\RedisCache;
class Misc {
static public function getCursor(): int {
return isset($_GET['cursor']) && is_numeric($_GET['cursor']) ? (int) $_GET['cursor'] : 0;
}
static public function getURL(): string {
return self::env('APP_URL', '');
}
static public function env(string $key, mixed $default_value): string {
return isset($_ENV[$key]) && !empty($_ENV[$key]) ? $_ENV[$key] : $default_value;
}
/**
* Returns absolute path for view
*/
static public function getView(string $template): string {
return __DIR__ . "/../../views/{$template}.latte";
}
/**
* Setup of TikTok Api wrapper
*/
static public function api(): \Sovit\TikTok\Api {
$options = [];
$cacheEngine = false;
// Proxy config
foreach(Cookies::PROXY as $proxy_element) {
if (isset($_COOKIE[$proxy_element])) {
$options['proxy'][$proxy_element] = $_COOKIE[$proxy_element];
}
}
// Cache config
if (isset($_ENV['API_CACHE'])) {
switch ($_ENV['API_CACHE']) {
case 'json':
$cacheEngine = new JSONCache();
break;
case 'redis':
if (!isset($_ENV['REDIS_URL'])) {
throw new Exception('You need to set REDIS_URL to use Redis Cache!');
}
$url = parse_url($_ENV['REDIS_URL']);
$host = $url['host'];
$port = $url['port'];
$password = $url['pass'] ?? null;
$cacheEngine = new RedisCache($host, $port, $password);
break;
}
}
$api = new \Sovit\TikTok\Api($options, $cacheEngine);
return $api;
}
/**
* Setup of Latte template engine
*/
static public function latte(): \Latte\Engine {
// Workaround to avoid weird path issues
$url = self::getURL();
$latte = new \Latte\Engine;
$cache_path = self::env('LATTE_CACHE', __DIR__ . '/../../cache/latte');
$latte->setTempDirectory($cache_path);
// -- CUSTOM FUNCTIONS -- //
// Import assets
$latte->addFunction('assets', function (string $name, string $type) use ($url) {
$path = "{$url}/{$type}/{$name}";
return $path;
});
// Get base URL
$latte->addFunction('path', function (string $path = '') use ($url) {
return "{$url}/{$path}";
});
// Version being used
$latte->addFunction('version', function () {
return \Composer\InstalledVersions::getVersion('pablouser1/proxitok');
});
// https://stackoverflow.com/a/36365553
$latte->addFunction('number', function (int $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;
});
$latte->addFunction('size', function (string $url) {
$download = new \Sovit\TikTok\Download();
return $download->file_size($url);
});
return $latte;
}
}

40
app/Helpers/RSS.php Normal file
View file

@ -0,0 +1,40 @@
<?php
namespace App\Helpers;
use \Bhaktaraz\RSSGenerator\Feed;
use \Bhaktaraz\RSSGenerator\Channel;
use \Bhaktaraz\RSSGenerator\Item;
use \Sovit\TikTok\Download;
class RSS {
static public function build (string $endpoint, string $title, string $description, array $items): Feed {
$url = Misc::env('APP_URL', '');
$download = new Download();
$rss_feed = new Feed();
$rss_channel = new Channel();
$rss_channel
->title($title)
->description($description)
->url($url . $endpoint)
->atomLinkSelf($url . $endpoint . '/rss')
->appendTo($rss_feed);
foreach ($items as $item) {
$rss_item = new Item();
$video = $item->video->playAddr;
$rss_item
->title($item->desc)
->description($item->desc)
->url($url . '/video/' . $item->id)
->pubDate((int)$item->createTime)
->guid($item->id, false)
->enclosure($url . '/stream?url=' . urlencode($video), $download->file_size($video), 'video/mp4')
->appendTo($rss_channel);
}
return $rss_feed;
}
static public function setHeaders (string $filename) {
header('Content-Type: application/rss+xml');
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
}