coryd.dev/api/oembed.php

107 lines
3.4 KiB
PHP

<?php
require __DIR__ . "/../vendor/autoload.php";
require __DIR__ . '/../server/utils/init.php';
use App\Classes\BaseHandler;
use GuzzleHttp\Client;
class OembedHandler extends BaseHandler
{
public function handleRequest(): void
{
$requestUrl = $_GET['url'] ?? null;
$globals = $this->fetchGlobals();
$parsed = $requestUrl ? parse_url($requestUrl) : null;
$relativePath = $parsed['path'] ?? null;
if (!$requestUrl || $relativePath === '/') $this->sendResponse($this->buildResponse(
$globals['site_name'],
$globals['url'],
$globals['avatar'],
$globals
));
if (!$relativePath) $this->sendErrorResponse('Invalid url', 400);
$relativePath = '/' . ltrim($relativePath ?? '', '/');
if ($relativePath !== '/' && str_ends_with($relativePath, '/')) $relativePath = rtrim($relativePath, '/');
$cacheKey = 'oembed:' . md5($relativePath);
if ($this->cache && $this->cache->exists($cacheKey)) {
$cachedItem = json_decode($this->cache->get($cacheKey), true);
$this->sendResponse($this->buildResponse(
$cachedItem['title'],
$cachedItem['url'],
$cachedItem['image_url'],
$globals,
$cachedItem['description'] ?? ''
));
}
$results = $this->fetchFromApi('optimized_oembed', 'url=eq.' . urlencode($relativePath));
if (!empty($results)) {
$item = $results[0];
if ($this->cache) $this->cache->setex($cacheKey, 300, json_encode($item));
$this->sendResponse($this->buildResponse(
$item['title'],
$item['url'],
$item['image_url'],
$globals,
$item['description'] ?? ''
));
}
$segments = explode('/', trim($relativePath, '/'));
if (count($segments) === 1 && $segments[0] !== '') {
$title = ucwords(str_replace('-', ' ', $segments[0])) . ' • ' . $globals['author'];
$this->sendResponse($this->buildResponse(
$title,
$relativePath,
$globals['avatar'],
$globals
));
}
$this->sendErrorResponse('No match found', 404);
}
private function buildResponse(string $title, string $url, string $imagePath, array $globals, string $description = ''): array
{
$safeDescription = truncateText(strip_tags(parseMarkdown($description)), 175);
$html = '<p><a href="' . htmlspecialchars($url) . '">' . htmlspecialchars($title) . '</a></p>';
if ($description) $html .= '<p>' . htmlspecialchars($safeDescription, ENT_QUOTES, 'UTF-8') . '</p>';
return [
'version' => '1.0',
'type' => 'link',
'title' => $title,
'author_name' => $globals['author'],
'provider_name' => $globals['site_name'],
'provider_url' => $globals['url'],
'thumbnail_url' => $globals['url'] . '/og/w800' . $imagePath,
'html' => $html,
'description' => $safeDescription,
];
}
private function fetchGlobals(): array
{
$cacheKey = 'globals_data';
if ($this->cache && $this->cache->exists($cacheKey)) return json_decode($this->cache->get($cacheKey), true);
$globals = $this->fetchFromApi('optimized_globals', 'limit=1')[0] ?? [
'author' => 'Cory Dransfeldt',
'site_name' => 'coryd.dev',
'url' => 'https://www.coryd.dev',
'avatar' => ''
];
if ($this->cache) $this->cache->setex($cacheKey, 3600, json_encode($globals));
return $globals;
}
}
$handler = new OembedHandler();
$handler->handleRequest();