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;