diff --git a/.env.example b/.env.example
index 852f23d..783c759 100644
--- a/.env.example
+++ b/.env.example
@@ -13,4 +13,5 @@ EMBED_URL = "https://github.com/FixTweet/FxTwitter"
SENTRY_DSN = ""
SENTRY_AUTH_TOKEN = ""
SENTRY_ORG = ""
-SENTRY_PROJECT = ""
\ No newline at end of file
+SENTRY_PROJECT = ""
+GIF_TRANSCODE_DOMAIN = "gif.fxtwitter.com"
\ No newline at end of file
diff --git a/esbuild.config.mjs b/esbuild.config.mjs
index f169fe1..b6596d6 100644
--- a/esbuild.config.mjs
+++ b/esbuild.config.mjs
@@ -44,7 +44,8 @@ let envVariables = [
'EMBED_URL',
'MOSAIC_DOMAIN_LIST',
'API_HOST_LIST',
- 'SENTRY_DSN'
+ 'SENTRY_DSN',
+ 'GIF_TRANSCODE_DOMAIN'
];
// Create defines for all environment variables
diff --git a/src/constants.ts b/src/constants.ts
index 5b65c11..21dd34b 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -13,10 +13,12 @@ export const Constants = {
EMBED_URL: EMBED_URL,
REDIRECT_URL: REDIRECT_URL,
RELEASE_NAME: RELEASE_NAME,
+ GIF_TRANSCODE_DOMAIN: GIF_TRANSCODE_DOMAIN,
API_DOCS_URL: `https://github.com/dangeredwolf/FixTweet/wiki/API-Home`,
TWITTER_ROOT: 'https://twitter.com',
TWITTER_GLOBAL_NAME_ROOT: 'twitter.com',
TWITTER_API_ROOT: 'https://api.twitter.com',
+ TWITTER_VIDEO_BASE: 'https://video.twimg.com',
BOT_UA_REGEX:
/bot|facebook|embed|got|firefox\/92|firefox\/38|curl|wget|go-http|yahoo|generator|whatsapp|revoltchat|preview|link|proxy|vkshare|images|analyzer|index|crawl|spider|python|cfnetwork|node|mastodon|http\.rb|ruby|bun\/|fiddler|iframely/gi,
/* 3 hours */
diff --git a/src/embed/status.ts b/src/embed/status.ts
index 99ce762..520d772 100644
--- a/src/embed/status.ts
+++ b/src/embed/status.ts
@@ -473,9 +473,12 @@ export const handleStatus = async (
const mediaType = overrideMedia ?? status.media.videos?.[0]?.type;
if (mediaType === 'gif') {
- provider = `GIF - ${Constants.BRANDING_NAME}`;
- } else if (status.embed_card === 'player' && providerEngagementText !== Strings.DEFAULT_AUTHOR_TEXT) {
- provider = providerEngagementText
+ provider = `GIF - ${Constants.BRANDING_NAME}`;
+ } else if (
+ status.embed_card === 'player' &&
+ providerEngagementText !== Strings.DEFAULT_AUTHOR_TEXT
+ ) {
+ provider = providerEngagementText;
}
// Now you can use the 'provider' variable
diff --git a/src/experiments.ts b/src/experiments.ts
index b7f229d..f93b2fd 100644
--- a/src/experiments.ts
+++ b/src/experiments.ts
@@ -2,7 +2,8 @@ export enum Experiment {
ELONGATOR_BY_DEFAULT = 'ELONGATOR_BY_DEFAULT',
ELONGATOR_PROFILE_API = 'ELONGATOR_PROFILE_API',
TWEET_DETAIL_API = 'TWEET_DETAIL_API',
- DISCORD_NATIVE_MULTI_IMAGE = 'DISCORD_NATIVE_MULTI_IMAGE'
+ DISCORD_NATIVE_MULTI_IMAGE = 'DISCORD_NATIVE_MULTI_IMAGE',
+ TRANSCODE_GIFS = 'TRANSCODE_GIFS'
}
type ExperimentConfig = {
@@ -31,6 +32,11 @@ const Experiments: { [key in Experiment]: ExperimentConfig } = {
name: 'Discord native multi-image',
description: 'Use Discord native multi-image',
percentage: 1
+ },
+ [Experiment.TRANSCODE_GIFS]: {
+ name: 'Transcode GIFs',
+ description: 'Transcode GIFs for Discord, etc.',
+ percentage: 0.25
}
};
diff --git a/src/render/video.ts b/src/render/video.ts
index 065cc87..a4977e6 100644
--- a/src/render/video.ts
+++ b/src/render/video.ts
@@ -1,4 +1,5 @@
import { Constants } from '../constants';
+import { Experiment, experimentCheck } from '../experiments';
import { handleQuote } from '../helpers/quote';
import { Strings } from '../strings';
@@ -47,14 +48,27 @@ export const renderVideo = (
instructions.authorText += `\n${handleQuote(status.quote)}`;
}
+ let url = video.url;
+
+ if (
+ experimentCheck(Experiment.TRANSCODE_GIFS, !!Constants.GIF_TRANSCODE_DOMAIN) &&
+ !userAgent?.includes('TelegramBot') &&
+ video.type === 'gif'
+ ) {
+ url = video.url.replace(
+ Constants.TWITTER_VIDEO_BASE,
+ `https://${Constants.GIF_TRANSCODE_DOMAIN}`
+ );
+ }
+
/* Push the raw video-related headers */
instructions.addHeaders = [
``,
``,
- ``,
+ ``,
``,
- ``,
- ``,
+ ``,
+ ``,
``,
``,
``,
diff --git a/src/types/env.d.ts b/src/types/env.d.ts
index b371448..d223407 100644
--- a/src/types/env.d.ts
+++ b/src/types/env.d.ts
@@ -10,6 +10,7 @@ declare const EMBED_URL: string;
declare const REDIRECT_URL: string;
declare const MOSAIC_DOMAIN_LIST: string;
declare const API_HOST_LIST: string;
+declare const GIF_TRANSCODE_DOMAIN: string;
declare const SENTRY_DSN: string;
declare const RELEASE_NAME: string;