mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2024-11-22 09:35:28 +03:00
144 lines
4 KiB
PHP
144 lines
4 KiB
PHP
<?php
|
|
|
|
class GettrBridge extends BridgeAbstract
|
|
{
|
|
const NAME = 'Gettr.com bridge';
|
|
const URI = 'https://gettr.com';
|
|
const DESCRIPTION = 'Fetches the latest posts from a GETTR user';
|
|
const MAINTAINER = 'dvikan';
|
|
const CACHE_TIMEOUT = 60 * 15; // 15m
|
|
const PARAMETERS = [
|
|
[
|
|
'user' => [
|
|
'name' => 'User',
|
|
'type' => 'text',
|
|
'required' => true,
|
|
'exampleValue' => 'joerogan',
|
|
],
|
|
'limit' => [
|
|
'name' => 'Limit',
|
|
'type' => 'number',
|
|
'title' => 'Maximum number of items to return (maximum 20)',
|
|
'defaultValue' => 5,
|
|
'required' => true,
|
|
],
|
|
]
|
|
];
|
|
|
|
public function collectData()
|
|
{
|
|
$user = $this->getInput('user');
|
|
$api = sprintf(
|
|
'https://api.gettr.com/u/user/%s/posts?offset=0&max=%s&dir=fwd&incl=posts&fp=f_uo',
|
|
$user,
|
|
min($this->getInput('limit'), 20)
|
|
);
|
|
try {
|
|
$json = getContents($api);
|
|
} catch (HttpException $e) {
|
|
if ($e->getCode() === 400 && str_contains($e->response->getBody(), 'E_USER_NOTFOUND')) {
|
|
throw new \Exception('User not found: ' . $user);
|
|
}
|
|
throw $e;
|
|
}
|
|
$data = json_decode($json, false);
|
|
|
|
foreach ($data->result->aux->post as $post) {
|
|
$this->items[] = [
|
|
'title' => mb_substr($post->txt ?? $post->uid . '@gettr.com', 0, 100),
|
|
'uri' => sprintf('https://gettr.com/post/%s', $post->_id),
|
|
'author' => $post->uid,
|
|
// Convert from ms to s
|
|
'timestamp' => substr($post->cdate, 0, strlen($post->cdate) - 3),
|
|
'uid' => $post->_id,
|
|
// Hashtags found within post text
|
|
'categories' => $post->htgs ?? [],
|
|
'content' => $this->createContent($post),
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Collect text, image and video, if they exist
|
|
*/
|
|
private function createContent(\stdClass $post): string
|
|
{
|
|
$content = '';
|
|
|
|
// Text
|
|
if (isset($post->txt)) {
|
|
$isRepost = $this->getInput('user') !== $post->uid;
|
|
if ($isRepost) {
|
|
$content .= 'Reposted by ' . $this->getInput('user') . '@gettr.com<br><br>';
|
|
}
|
|
$content .= "$post->txt <br><br>";
|
|
}
|
|
|
|
// Preview image
|
|
if (isset($post->previmg)) {
|
|
$content .= <<<HTML
|
|
<a href="$post->prevsrc" target="_blank">
|
|
<img
|
|
src='$post->previmg'
|
|
alt='Unable to load image'
|
|
loading='lazy'
|
|
>
|
|
</a>
|
|
<br><br>
|
|
HTML;
|
|
}
|
|
|
|
// Images
|
|
foreach ($post->imgs ?? [] as $imageUrl) {
|
|
$content .= <<<HTML
|
|
<img
|
|
src='https://media.gettr.com/$imageUrl'
|
|
alt='Unable to load image'
|
|
target='_blank'
|
|
>
|
|
<br><br>
|
|
HTML;
|
|
}
|
|
|
|
// Video
|
|
if (isset($post->ovid)) {
|
|
$mainImage = $post->main;
|
|
|
|
$content .= <<<HTML
|
|
<video
|
|
style="max-width: 100%"
|
|
controls
|
|
preload="none"
|
|
poster="https://media.gettr.com/$mainImage"
|
|
>
|
|
<source src="https://media.gettr.com/$post->ovid" type="video/mp4">
|
|
Your browser does not support the video element. Kindly update it to latest version.
|
|
</video >
|
|
HTML;
|
|
// This is typically a m3u8 which I don't know how to present in a browser
|
|
$streamingUrl = $post->vid;
|
|
}
|
|
$this->processMetadata($post);
|
|
|
|
return $content;
|
|
}
|
|
|
|
public function getIcon()
|
|
{
|
|
return 'https://gettr.com/favicon.ico';
|
|
}
|
|
|
|
/**
|
|
* @param stdClass $post
|
|
*/
|
|
private function processMetadata(stdClass $post): void
|
|
{
|
|
// Unused metadata, maybe used later
|
|
$textLanguage = $post->txt_lang ?? 'en';
|
|
$replies = $post->cm ?? 0;
|
|
$likes = $post->lkbpst ?? 0;
|
|
$reposts = $post->shbpst ?? 0;
|
|
// I think a visibility of "p" means that it's public
|
|
$visibility = $post->vis ?? 'p';
|
|
}
|
|
}
|