RSS-Bridge_rss-bridge/bridges/GettrBridge.php

145 lines
4.0 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';
}
}