mirror of
				https://github.com/RSS-Bridge/rss-bridge.git
				synced 2025-10-26 21:11:30 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			145 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			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';
 | |
|     }
 | |
| }
 |