diff --git a/src/embeds/image_host.ts b/src/embeds/image_host.ts deleted file mode 100644 index a804ebc..0000000 --- a/src/embeds/image_host.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { HTMLElement } from 'node-html-parser'; -import { RedditPost } from '../reddit/types'; -import { isDefined } from 'remeda'; - -export async function externalImageEmbed(post: RedditPost, _link: string, head: HTMLElement) { - if (isDefined(post.preview_image_url)) { - head.image(post.preview_image_url, post.resolution?.width, post.resolution?.height, 'large'); - } -} \ No newline at end of file diff --git a/src/embeds/imgur.ts b/src/embeds/imgur.ts new file mode 100644 index 0000000..3d765cb --- /dev/null +++ b/src/embeds/imgur.ts @@ -0,0 +1,28 @@ + +import { HTMLElement, parse as parseHTML } from 'node-html-parser'; +import { RedditPost } from '../reddit/types'; +import { isDefined } from 'remeda'; +import { CACHE_CONFIG } from '../cache'; + +export async function externalImgurEmbed(post: RedditPost, link: string, head: HTMLElement) { + const html = await fetch(link, { ...CACHE_CONFIG }).then(r => r.text()).then(parseHTML); + + const videoUrl = html.querySelector('meta[property="og:video"]')?.getAttribute('content'); + const twitterPlayerStream = html.querySelector('meta[name="twitter:player:stream"]')?.getAttribute('content'); + + const videoSource = videoUrl || twitterPlayerStream; + + const thumbnail = html.querySelector('meta[name="twitter:image"]')?.getAttribute('content'); + + if (videoSource) { + if (thumbnail) { + head.image(thumbnail, post.resolution?.width, post.resolution?.height); + } + + head.video(videoSource, post.resolution?.width, post.resolution?.height, 'video/mp4'); + } else if (isDefined(post.preview_image_url)) { + head.image(post.preview_image_url, post.resolution?.width, post.resolution?.height, 'large'); + } else if (thumbnail) { + head.image(thumbnail, post.resolution?.width, post.resolution?.height, 'large'); + } +} \ No newline at end of file diff --git a/src/embeds/redgif.ts b/src/embeds/redgif.ts new file mode 100644 index 0000000..9636327 --- /dev/null +++ b/src/embeds/redgif.ts @@ -0,0 +1,17 @@ +import { HTMLElement, parse as parseHTML } from 'node-html-parser'; +import { RedditPost } from '../reddit/types'; +import { CACHE_CONFIG } from '../cache'; + +export async function externalRedgifEmbed(post: RedditPost, link: string, head: HTMLElement) { + const html = await fetch(link, { ...CACHE_CONFIG }).then(r => r.text()).then(parseHTML); + const clipEmbed = html.querySelector('meta[name="twitter:player"]')?.getAttribute('content'); + const thumbnail = html.querySelector('meta[name="twitter:image"]')?.getAttribute('content'); + console.log('here123', thumbnail, link); + console.log('w/h', post.resolution?.width, post.resolution?.height); + if (thumbnail) { + head.image(thumbnail, post.resolution?.width, post.resolution?.height); + } + if (clipEmbed) { + head.video(clipEmbed, post.resolution?.width, post.resolution?.height, 'video/mp4'); + } +} \ No newline at end of file diff --git a/src/reddit/compile.ts b/src/reddit/compile.ts index a198190..52653c5 100644 --- a/src/reddit/compile.ts +++ b/src/reddit/compile.ts @@ -6,8 +6,9 @@ import { twitterLinkEmbed } from '../embeds/twitter'; import '../html'; import { get_packaged_video } from '../util'; import { isNonNullish } from 'remeda'; -import { externalImageEmbed } from '../embeds/image_host'; +import { externalImgurEmbed } from '../embeds/imgur'; import { encodeOEmbed } from './oembed'; +import { externalRedgifEmbed } from '../embeds/redgif'; const imageExtensions = [ 'png', @@ -43,8 +44,14 @@ function getDomainHandler(domain?: string) { case 'imgur.com': case 'i.imgur.com': return { - handler: externalImageEmbed, - type: 'article', + handler: externalImgurEmbed, + type: 'video.other', + }; + case 'redgifs.com': + case 'v3.redgifs.com': + return { + handler: externalRedgifEmbed, + type: 'video.other', }; default: return null;