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..3d382c69 100644 --- a/api/src/processing/service-config.js +++ b/api/src/processing/service-config.js @@ -65,8 +65,21 @@ export const services = { }, reddit: { patterns: [ + "comments/:id", + + "r/:sub/comments/:id", "r/:sub/comments/:id/:title", - "user/:user/comments/:id/:title" + "r/:sub/comments/:id/comment/:commentId", + + "user/:user/comments/:id", + "user/:user/comments/:id/:title", + "user/:user/comments/:id/comment/:commentId", + + "r/u_:user/comments/:id", + "r/u_:user/comments/:id/:title", + "r/u_:user/comments/:id/comment/:commentId", + + "r/:sub/s/:shareId" ], subdomains: "*", }, diff --git a/api/src/processing/service-patterns.js b/api/src/processing/service-patterns.js index cf89d574..8735f123 100644 --- a/api/src/processing/service-patterns.js +++ b/api/src/processing/service-patterns.js @@ -20,8 +20,10 @@ export const testers = { pattern.id?.length <= 128 || pattern.shortLink?.length <= 32, "reddit": pattern => - (pattern.sub?.length <= 22 && pattern.id?.length <= 10) - || (pattern.user?.length <= 22 && pattern.id?.length <= 10), + 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), "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..50c78d35 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,20 @@ 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/comments/${params.id}.json`); + const accessToken = await getAccessToken(); if (accessToken) url.hostname = 'oauth.reddit.com'; @@ -73,12 +82,17 @@ export default async function(obj) { data = data[0]?.data?.children[0]?.data; - const id = `${String(obj.sub).toLowerCase()}_${obj.id}`; + let sourceId; + if (params.sub || params.user) { + sourceId = `${String(params.sub || params.user).toLowerCase()}_${params.id}`; + } else { + sourceId = params.id; + } if (data?.url?.endsWith('.gif')) return { typeId: "redirect", urls: data.url, - filename: `reddit_${id}.gif`, + filename: `reddit_${sourceId}.gif`, } if (!data.secure_media?.reddit_video) @@ -87,8 +101,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')) { @@ -121,7 +136,7 @@ export default async function(obj) { typeId: "tunnel", type: "merge", urls: [video, audioFileLink], - audioFilename: `reddit_${id}_audio`, - filename: `reddit_${id}.mp4` + audioFilename: `reddit_${sourceId}_audio`, + filename: `reddit_${sourceId}.mp4` } }