diff --git a/api/src/processing/match.js b/api/src/processing/match.js index 9fabf379..b7be8456 100644 --- a/api/src/processing/match.js +++ b/api/src/processing/match.js @@ -120,9 +120,8 @@ export default async function({ host, patternMatch, params }) { case "reddit": r = await reddit({ - sub: patternMatch.sub, - id: patternMatch.id, - user: patternMatch.user + ...patternMatch, + dispatcher, }); break; diff --git a/api/src/processing/service-config.js b/api/src/processing/service-config.js index 68301adc..b0ff44ab 100644 --- a/api/src/processing/service-config.js +++ b/api/src/processing/service-config.js @@ -66,7 +66,8 @@ export const services = { reddit: { patterns: [ "r/:sub/comments/:id/:title", - "user/:user/comments/:id/:title" + "user/:user/comments/:id/:title", + "r/:sub/s/:shareId" ], subdomains: "*", }, diff --git a/api/src/processing/service-patterns.js b/api/src/processing/service-patterns.js index cf89d574..92550e5e 100644 --- a/api/src/processing/service-patterns.js +++ b/api/src/processing/service-patterns.js @@ -21,7 +21,8 @@ export const testers = { "reddit": pattern => (pattern.sub?.length <= 22 && pattern.id?.length <= 10) - || (pattern.user?.length <= 22 && pattern.id?.length <= 10), + || (pattern.user?.length <= 22 && pattern.id?.length <= 10) + || (pattern.sub?.length <= 22 && pattern.shareId?.length <= 12), "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 701db236..f83083e4 100644 --- a/api/src/processing/services/reddit.js +++ b/api/src/processing/services/reddit.js @@ -1,3 +1,4 @@ +import { resolveRedirectingURL } from "../url.js"; import { genericUserAgent, env } from "../../config.js"; import { getCookie, updateCookieValues } from "../cookie/manager.js"; @@ -48,12 +49,22 @@ async function getAccessToken() { } export default async function(obj) { - let url = new URL(`https://www.reddit.com/r/${obj.sub}/comments/${obj.id}.json`); + let params = obj; - if (obj.user) { - url.pathname = `/user/${obj.user}/comments/${obj.id}.json`; + if (!params.id && params.shareId) { + params = await resolveRedirectingURL( + `https://www.reddit.com/r/${params.sub}/s/${params.shareId}`, + obj.dispatcher, + genericUserAgent + ); } + if (!params?.id) return { error: "fetch.short_link" }; + + const url = new URL( + `https://www.reddit.com/r/${params.sub || params.user}/comments/${params.id}.json` + ); + const accessToken = await getAccessToken(); if (accessToken) url.hostname = 'oauth.reddit.com'; @@ -73,7 +84,7 @@ export default async function(obj) { data = data[0]?.data?.children[0]?.data; - const id = `${String(obj.sub).toLowerCase()}_${obj.id}`; + const id = `${String(params.sub).toLowerCase()}_${params.id}`; if (data?.url?.endsWith('.gif')) return { typeId: "redirect", @@ -87,8 +98,9 @@ export default async function(obj) { if (data.secure_media?.reddit_video?.duration > env.durationLimit) return { error: "content.too_long" }; + const video = data.secure_media?.reddit_video?.fallback_url?.split('?')[0]; + let audio = false, - video = data.secure_media?.reddit_video?.fallback_url?.split('?')[0], audioFileLink = `${data.secure_media?.reddit_video?.fallback_url?.split('DASH')[0]}audio`; if (video.match('.mp4')) {