From e39824e65e12c44082f88ee553f21b3154f06726 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Tue, 29 Jul 2025 06:39:44 -0400 Subject: [PATCH] GifCollections: Refresh URLs --- src/equicordplugins/gifCollections/index.tsx | 4 +-- .../gifCollections/utils/cleanUrl.ts | 16 +++++++++++- .../gifCollections/utils/getGif.ts | 26 +++++++++---------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/equicordplugins/gifCollections/index.tsx b/src/equicordplugins/gifCollections/index.tsx index c6a098223..1632c385b 100644 --- a/src/equicordplugins/gifCollections/index.tsx +++ b/src/equicordplugins/gifCollections/index.tsx @@ -31,10 +31,10 @@ export const SortingOptions = { MODIFIED_DATE: 3 }; -const addCollectionContextMenuPatch: NavContextMenuPatchCallback = (children, props) => { +const addCollectionContextMenuPatch: NavContextMenuPatchCallback = async (children, props) => { if (!props) return; const { message, itemSrc, itemHref, target } = props; - const gif = getGif(message, itemSrc ?? itemHref, target); + const gif = await getGif(message, itemSrc ?? itemHref, target); if (!gif) return; const group = findGroupChildrenByChildId("open-native-link", children) ?? findGroupChildrenByChildId("copy-link", children); diff --git a/src/equicordplugins/gifCollections/utils/cleanUrl.ts b/src/equicordplugins/gifCollections/utils/cleanUrl.ts index 415598487..23d820472 100644 --- a/src/equicordplugins/gifCollections/utils/cleanUrl.ts +++ b/src/equicordplugins/gifCollections/utils/cleanUrl.ts @@ -4,8 +4,22 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -export const cleanUrl = (url: string) => { +export const cleanUrl = async (url: string) => { const urlObject = new URL(url); urlObject.search = ""; + + try { + const res = await fetch(urlObject.href, { method: "HEAD" }); + if (res.status === 404) { + const proxyUrl = `https://cdnproxy.thororen.com/?${urlObject.href}`; + const proxyRes = await fetch(proxyUrl, { method: "HEAD" }); + if (!proxyRes.ok) throw new Error(`URL not found: ${proxyUrl}`); + urlObject.href = proxyUrl; + } + } catch (err) { + console.error(err); + } + return urlObject.href; }; + diff --git a/src/equicordplugins/gifCollections/utils/getGif.ts b/src/equicordplugins/gifCollections/utils/getGif.ts index 951791557..066c4aaa8 100644 --- a/src/equicordplugins/gifCollections/utils/getGif.ts +++ b/src/equicordplugins/gifCollections/utils/getGif.ts @@ -13,7 +13,7 @@ import { cleanUrl } from "./cleanUrl"; import { isAudio } from "./isAudio"; import { uuidv4 } from "./uuidv4"; -export function getGifByTarget(url: string, target?: HTMLDivElement | null): Gif | null { +export async function getGifByTarget(url: string, target?: HTMLDivElement | null): Promise { const liElement = target?.closest("li"); if (!target || !liElement || !liElement.id) return null; @@ -24,28 +24,28 @@ export function getGifByTarget(url: string, target?: HTMLDivElement | null): Gif const message = MessageStore.getMessage(channelId, messageId); if (!message || !message.embeds.length && !message.attachments.length) return null; - return getGifByMessageAndUrl(url, message); + return await getGifByMessageAndUrl(url, message); } -export function getGifByMessageAndTarget(target: HTMLDivElement, message: Message) { +export async function getGifByMessageAndTarget(target: HTMLDivElement, message: Message) { const url = target.closest('[class^="imageWrapper"]')?.querySelector("video")?.src ?? target.closest('[class^="imageWrapper"]')?.querySelector("img")?.src; if (!url) return null; - return getGifByMessageAndUrl(url, message); + return await getGifByMessageAndUrl(url, message); } -export function getGifByMessageAndUrl(url: string, message: Message): Gif | null { +export async function getGifByMessageAndUrl(url: string, message: Message): Promise { if (!message.embeds.length && !message.attachments.length || isAudio(url)) return null; - const cleanedUrl = cleanUrl(url); + const cleanedUrl = await cleanUrl(url); // find embed with matching url or image/thumbnail url - const embed = message.embeds.find(e => { - const hasMatchingUrl = e.url && cleanUrl(e.url) === cleanedUrl; - const hasMatchingImage = e.image && cleanUrl(e.image.url) === cleanedUrl; + const embed = message.embeds.find(async e => { + const hasMatchingUrl = e.url && await cleanUrl(e.url) === cleanedUrl; + const hasMatchingImage = e.image && await cleanUrl(e.image.url) === cleanedUrl; const hasMatchingImageProxy = e.image?.proxyURL === cleanedUrl; const hasMatchingVideoProxy = e.video?.proxyURL === cleanedUrl; const hasMatchingThumbnailProxy = e.thumbnail?.proxyURL === cleanedUrl; @@ -87,7 +87,7 @@ export function getGifByMessageAndUrl(url: string, message: Message): Gif | null } - const attachment = message.attachments.find(a => cleanUrl(a.url) === cleanedUrl || a.proxy_url === cleanedUrl); + const attachment = message.attachments.find(async a => await cleanUrl(a.url) === cleanedUrl || a.proxy_url === cleanedUrl); if (attachment) return { id: uuidv4(settings.store.itemPrefix), height: attachment.height ?? 50, @@ -99,9 +99,9 @@ export function getGifByMessageAndUrl(url: string, message: Message): Gif | null return null; } -export const getGif = (message: Message | null, url: string | null, target: HTMLDivElement | null) => { +export const getGif = async (message: Message | null, url: string | null, target: HTMLDivElement | null) => { if (message && url) { - const gif = getGifByMessageAndUrl(url, message); + const gif = await getGifByMessageAndUrl(url, message); if (!gif) return null; return gif; @@ -114,7 +114,7 @@ export const getGif = (message: Message | null, url: string | null, target: HTML } if (url && target && !message) { // youtube thumbnail url is message link for some reason eh - const gif = getGifByTarget(url.startsWith("https://discord.com/") ? target.parentElement?.querySelector("img")?.src ?? url : url, target); + const gif = await getGifByTarget(url.startsWith("https://discord.com/") ? target.parentElement?.querySelector("img")?.src ?? url : url, target); if (!gif) return null; return gif;