Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GettrBridge] Add new bridge for gettr.com (#2495) #2505

Merged
merged 3 commits into from
Mar 22, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 135 additions & 0 deletions bridges/GettrBridge.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?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()
{
$api = sprintf(
'https://api.gettr.com/u/user/%s/posts?offset=0&max=%s&dir=fwd&incl=posts&fp=f_uo',
$this->getInput('user'),
max($this->getInput('limit'), 20)
);
$data = json_decode(getContents($api), false, JSON_THROW_ON_ERROR);

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';
}
}