0
0
mirror of https://github.com/RSS-Bridge/rss-bridge.git synced 2025-06-29 18:21:07 +00:00

[TikTokBridge] Use oEmbed for video metadata (#4514)

* [TikTokBridge] Use oEmbed for video metadata

Fetches oEmbed-formatted metadata for videos through the TikTok API to
provide post titles, thumbnails, and authors. This hasn't yet been
tested, so it's possible it doesn't work.

* [TikTokBridge] Add back view count parsing

oops

* [TikTokBridge] Prepend www to the oEmbed API endpoint URL

The non-www URL resulted in a 301 redirect to the www URL, so this just
skips that redirect, improving performance a bit and hopefully helping
with the 400 errors.

* [TikTokBridge] Retry failed OEmbed requests

If an OEmbed request fails, retry a few times, waiting a bit in between
each retry. This should fix the problem for the most part, since I think
the problem was related to some sort of rate limit (it isn't mentioned
in the docs, but it seems to only happen when sending large quantities
of sequential requests).
This commit is contained in:
Apollo Nargang 2025-05-08 23:10:04 -04:00 committed by GitHub
parent 72e1998e16
commit 5bd767b862
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -21,6 +21,8 @@ class TikTokBridge extends BridgeAbstract
'context' => 'By user', 'username' => '@tiktok'
]
];
const OEMBED_RETRY_COUNT = 20;
const OEMBED_RETRY_DELAY = 0.1;
const CACHE_TIMEOUT = 900; // 15 minutes
@ -42,16 +44,33 @@ class TikTokBridge extends BridgeAbstract
$parsedUrl = parse_url($href);
$url = $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . '/' . ltrim($parsedUrl['path'], '/');
$image = $video->find('video', 0)->poster;
// Sometimes the API fails to return data for a second, so try a few times
$attempts = 0;
do {
try {
// Fetch the video embed data from the OEmbed API
$videoEmbedResponse = getContents('https://www.tiktok.com/oembed?url=' . $url);
} catch (Exception $e) {
$attempts++;
sleep($OEMBED_RETRY_DELAY);
continue;
}
break;
} while($attempts < $OEMBED_RETRY_COUNT);
$videoEmbedData = json_decode($videoEmbedResponse);
$title = $videoEmbedData->title;
$image = $videoEmbedData->thumbnail_url;
$views = $video->find('div[data-e2e=common-Video-Count]', 0)->plaintext;
$enclosures = [$image, $authorProfilePicture];
$item['uri'] = $url;
$item['title'] = 'Video';
$item['author'] = '@' . $author;
$item['title'] = $title;
$item['author'] = '@' . $videoEmbedData->author_unique_id;
$item['enclosures'] = $enclosures;
$item['content'] = <<<EOD
<p>$title</p>
<a href="{$url}"><img src="{$image}"/></a>
<p>{$views} views<p><br/>
EOD;