From 987b0559fb956bbbd7c8dcd3a846d9add5cfd360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Vuong=20=F0=9F=8D=82?= Date: Sat, 29 Mar 2025 13:29:22 +0700 Subject: [PATCH] api/reddit: add support for short links --- api/src/processing/service-config.js | 4 +++- api/src/processing/service-patterns.js | 3 ++- api/src/processing/services/reddit.js | 21 +++++++++++++++++++-- api/src/processing/url.js | 8 ++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/api/src/processing/service-config.js b/api/src/processing/service-config.js index 00fa4ebf..87a71c38 100644 --- a/api/src/processing/service-config.js +++ b/api/src/processing/service-config.js @@ -90,7 +90,9 @@ export const services = { "r/u_:user/comments/:id/:title", "r/u_:user/comments/:id/comment/:commentId", - "r/:sub/s/:shareId" + "r/:sub/s/:shareId", + + "video/:shortId", ], subdomains: "*", }, diff --git a/api/src/processing/service-patterns.js b/api/src/processing/service-patterns.js index 8735f123..2412fd46 100644 --- a/api/src/processing/service-patterns.js +++ b/api/src/processing/service-patterns.js @@ -23,7 +23,8 @@ export const testers = { pattern.id?.length <= 16 && !pattern.sub && !pattern.user || (pattern.sub?.length <= 22 && pattern.id?.length <= 16) || (pattern.user?.length <= 22 && pattern.id?.length <= 16) - || (pattern.sub?.length <= 22 && pattern.shareId?.length <= 16), + || (pattern.sub?.length <= 22 && pattern.shareId?.length <= 16) + || (pattern.shortId?.length <= 16), "rutube": pattern => (pattern.id?.length === 32 && pattern.key?.length <= 32) || diff --git a/api/src/processing/services/reddit.js b/api/src/processing/services/reddit.js index 50c78d35..305cd288 100644 --- a/api/src/processing/services/reddit.js +++ b/api/src/processing/services/reddit.js @@ -1,4 +1,4 @@ -import { resolveRedirectingURL } from "../url.js"; +import { extract, resolveRedirectingURL, normalizeURL } from "../url.js"; import { genericUserAgent, env } from "../../config.js"; import { getCookie, updateCookieValues } from "../cookie/manager.js"; @@ -50,6 +50,24 @@ async function getAccessToken() { export default async function(obj) { let params = obj; + const accessToken = await getAccessToken(); + + if (params.shortId) { + let r = await fetch(`https://www.reddit.com/video/${params.shortId}`, { + headers: { + 'User-Agent': genericUserAgent, + 'Authorization': `Bearer ${accessToken}` + } + }).then(r => r.url).catch(() => {}); + + if (!r) return { error: "fetch.fail" }; + + try { + params = extract(normalizeURL(r)).patternMatch; + } catch (error) { + return { error: "fetch.fail" }; + } + } if (!params.id && params.shareId) { params = await resolveRedirectingURL( @@ -63,7 +81,6 @@ export default async function(obj) { const url = new URL(`https://www.reddit.com/comments/${params.id}.json`); - const accessToken = await getAccessToken(); if (accessToken) url.hostname = 'oauth.reddit.com'; let data = await fetch( diff --git a/api/src/processing/url.js b/api/src/processing/url.js index 82299999..a0f70fed 100644 --- a/api/src/processing/url.js +++ b/api/src/processing/url.js @@ -106,6 +106,14 @@ function aliasURL(url) { url.pathname = `/share/${idPart.slice(-32)}`; } break; + + case "redd": + /* reddit short video links can be treated by changing https://v.redd.it/ + to https://reddit.com/video/.*/ + if (url.hostname === "v.redd.it" && parts.length === 2) { + url = new URL(`https://www.reddit.com/video/${parts[1]}`); + } + break; } return url;