api/reddit: add support for mobile links & bunch of other links (#1098)

* api/reddit: extract params from a mobile share link

* api/reddit: add support for a bunch of links & update the api endpoint

also fixed "undefined" in a filename when downloading a user post

* api/service-patterns: fix reddit id pattern
This commit is contained in:
wukko 2025-02-10 00:17:48 +06:00 committed by GitHub
parent 5306760890
commit a0f227d68b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 43 additions and 14 deletions

View file

@ -120,9 +120,8 @@ export default async function({ host, patternMatch, params }) {
case "reddit": case "reddit":
r = await reddit({ r = await reddit({
sub: patternMatch.sub, ...patternMatch,
id: patternMatch.id, dispatcher,
user: patternMatch.user
}); });
break; break;

View file

@ -65,8 +65,21 @@ export const services = {
}, },
reddit: { reddit: {
patterns: [ patterns: [
"comments/:id",
"r/:sub/comments/:id",
"r/:sub/comments/:id/:title", "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: "*", subdomains: "*",
}, },

View file

@ -20,8 +20,10 @@ export const testers = {
pattern.id?.length <= 128 || pattern.shortLink?.length <= 32, pattern.id?.length <= 128 || pattern.shortLink?.length <= 32,
"reddit": pattern => "reddit": pattern =>
(pattern.sub?.length <= 22 && pattern.id?.length <= 10) pattern.id?.length <= 16 && !pattern.sub && !pattern.user
|| (pattern.user?.length <= 22 && pattern.id?.length <= 10), || (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 => "rutube": pattern =>
(pattern.id?.length === 32 && pattern.key?.length <= 32) || (pattern.id?.length === 32 && pattern.key?.length <= 32) ||

View file

@ -1,3 +1,4 @@
import { resolveRedirectingURL } from "../url.js";
import { genericUserAgent, env } from "../../config.js"; import { genericUserAgent, env } from "../../config.js";
import { getCookie, updateCookieValues } from "../cookie/manager.js"; import { getCookie, updateCookieValues } from "../cookie/manager.js";
@ -48,12 +49,20 @@ async function getAccessToken() {
} }
export default async function(obj) { 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) { if (!params.id && params.shareId) {
url.pathname = `/user/${obj.user}/comments/${obj.id}.json`; 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(); const accessToken = await getAccessToken();
if (accessToken) url.hostname = 'oauth.reddit.com'; if (accessToken) url.hostname = 'oauth.reddit.com';
@ -73,12 +82,17 @@ export default async function(obj) {
data = data[0]?.data?.children[0]?.data; 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 { if (data?.url?.endsWith('.gif')) return {
typeId: "redirect", typeId: "redirect",
urls: data.url, urls: data.url,
filename: `reddit_${id}.gif`, filename: `reddit_${sourceId}.gif`,
} }
if (!data.secure_media?.reddit_video) if (!data.secure_media?.reddit_video)
@ -87,8 +101,9 @@ export default async function(obj) {
if (data.secure_media?.reddit_video?.duration > env.durationLimit) if (data.secure_media?.reddit_video?.duration > env.durationLimit)
return { error: "content.too_long" }; return { error: "content.too_long" };
const video = data.secure_media?.reddit_video?.fallback_url?.split('?')[0];
let audio = false, 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`; audioFileLink = `${data.secure_media?.reddit_video?.fallback_url?.split('DASH')[0]}audio`;
if (video.match('.mp4')) { if (video.match('.mp4')) {
@ -121,7 +136,7 @@ export default async function(obj) {
typeId: "tunnel", typeId: "tunnel",
type: "merge", type: "merge",
urls: [video, audioFileLink], urls: [video, audioFileLink],
audioFilename: `reddit_${id}_audio`, audioFilename: `reddit_${sourceId}_audio`,
filename: `reddit_${id}.mp4` filename: `reddit_${sourceId}.mp4`
} }
} }