processing: add support for loom

This commit is contained in:
wukko 2024-05-29 11:36:42 +06:00
parent 64b5990d81
commit 1bae1ad5a6
No known key found for this signature in database
GPG Key ID: 3E30B3F26C7B4AA2
5 changed files with 57 additions and 3 deletions

View File

@ -24,6 +24,7 @@ import streamable from "./services/streamable.js";
import twitch from "./services/twitch.js"; import twitch from "./services/twitch.js";
import rutube from "./services/rutube.js"; import rutube from "./services/rutube.js";
import dailymotion from "./services/dailymotion.js"; import dailymotion from "./services/dailymotion.js";
import loom from "./services/loom.js";
let freebind; let freebind;
@ -186,6 +187,11 @@ export default async function(host, patternMatch, lang, obj) {
case "dailymotion": case "dailymotion":
r = await dailymotion(patternMatch); r = await dailymotion(patternMatch);
break; break;
case "loom":
r = await loom({
id: patternMatch.id
});
break;
default: default:
return createResponse("error", { return createResponse("error", {
t: loc(lang, 'ErrorUnsupported') t: loc(lang, 'ErrorUnsupported')

View File

@ -129,6 +129,7 @@ export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, di
case "tumblr": case "tumblr":
case "pinterest": case "pinterest":
case "streamable": case "streamable":
case "loom":
responseType = "redirect"; responseType = "redirect";
break; break;
} }

View File

@ -0,0 +1,39 @@
import { genericUserAgent } from "../../config.js";
export default async function({ id }) {
const gql = await fetch(`https://www.loom.com/api/campaigns/sessions/${id}/transcoded-url`, {
method: "POST",
headers: {
"user-agent": genericUserAgent,
origin: "https://www.loom.com",
referer: `https://www.loom.com/share/${id}`,
cookie: `loom_referral_video=${id};`,
"apollographql-client-name": "web",
"apollographql-client-version": "14c0b42",
"x-loom-request-source": "loom_web_14c0b42",
},
body: {
force_original: false,
password: null,
anonID: null,
deviceID: null
}
})
.then(r => r.status === 200 ? r.json() : false)
.catch(() => {});
if (!gql) return { error: 'ErrorEmptyDownload' };
const videoUrl = gql?.url;
if (videoUrl?.includes('.mp4?')) {
return {
urls: videoUrl,
filename: `loom_${id}.mp4`,
audioFilename: `loom_${id}_audio`
}
}
return { error: 'ErrorEmptyDownload' }
}

View File

@ -1,5 +1,5 @@
{ {
"audioIgnore": ["vk", "ok"], "audioIgnore": ["vk", "ok", "loom"],
"hlsExceptions": ["dailymotion", "vimeo", "rutube"], "hlsExceptions": ["dailymotion", "vimeo", "rutube"],
"config": { "config": {
"bilibili": { "bilibili": {
@ -112,6 +112,11 @@
"alias": "dailymotion videos", "alias": "dailymotion videos",
"patterns": ["video/:id"], "patterns": ["video/:id"],
"enabled": true "enabled": true
},
"loom": {
"alias": "loom videos",
"patterns": ["share/:id"],
"enabled": true
} }
} }
} }

View File

@ -9,6 +9,9 @@ export const testers = {
patternMatch.postId?.length <= 12 patternMatch.postId?.length <= 12
|| (patternMatch.username?.length <= 30 && patternMatch.storyId?.length <= 24), || (patternMatch.username?.length <= 30 && patternMatch.storyId?.length <= 24),
"loom": (patternMatch) =>
patternMatch.id?.length <= 32,
"ok": (patternMatch) => "ok": (patternMatch) =>
patternMatch.id?.length <= 16, patternMatch.id?.length <= 16,