mirror of
https://github.com/imputnet/cobalt.git
synced 2025-07-18 11:18:28 +00:00
Merge b730d9ac08
into 31e1fa5c5c
This commit is contained in:
commit
c864081d3a
@ -19,6 +19,7 @@ this list is not final and keeps expanding over time. if support for a service y
|
|||||||
| bilibili.com & bilibili.tv | ✅ | ✅ | ✅ | ➖ | ➖ |
|
| bilibili.com & bilibili.tv | ✅ | ✅ | ✅ | ➖ | ➖ |
|
||||||
| dailymotion | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| dailymotion | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| instagram posts & reels | ✅ | ✅ | ✅ | ➖ | ➖ |
|
| instagram posts & reels | ✅ | ✅ | ✅ | ➖ | ➖ |
|
||||||
|
| linkedin | ✅ | ✅ | ✅ | ❌ | ❌ |
|
||||||
| loom | ✅ | ❌ | ✅ | ✅ | ➖ |
|
| loom | ✅ | ❌ | ✅ | ✅ | ➖ |
|
||||||
| ok video | ✅ | ❌ | ✅ | ✅ | ✅ |
|
| ok video | ✅ | ❌ | ✅ | ✅ | ✅ |
|
||||||
| pinterest | ✅ | ✅ | ✅ | ➖ | ➖ |
|
| pinterest | ✅ | ✅ | ✅ | ➖ | ➖ |
|
||||||
@ -45,6 +46,7 @@ this list is not final and keeps expanding over time. if support for a service y
|
|||||||
| service | notes or features |
|
| service | notes or features |
|
||||||
| :-------- | :----- |
|
| :-------- | :----- |
|
||||||
| instagram | supports reels, photos, and videos. lets you pick what to save from multi-media posts. |
|
| instagram | supports reels, photos, and videos. lets you pick what to save from multi-media posts. |
|
||||||
|
| linkedin | supports post and feed links. |
|
||||||
| pinterest | supports photos, gifs, videos and stories. |
|
| pinterest | supports photos, gifs, videos and stories. |
|
||||||
| reddit | supports gifs and videos. |
|
| reddit | supports gifs and videos. |
|
||||||
| rutube | supports yappy & private links. |
|
| rutube | supports yappy & private links. |
|
||||||
|
@ -25,6 +25,7 @@ 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";
|
import loom from "./services/loom.js";
|
||||||
|
import linkedin from "./services/linkedin.js";
|
||||||
|
|
||||||
let freebind;
|
let freebind;
|
||||||
|
|
||||||
@ -193,6 +194,12 @@ export default async function(host, patternMatch, lang, obj) {
|
|||||||
id: patternMatch.id
|
id: patternMatch.id
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case "linkedin":
|
||||||
|
r = await linkedin({
|
||||||
|
postId: patternMatch.id,
|
||||||
|
quality: obj.vQuality
|
||||||
|
});
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return createResponse("error", {
|
return createResponse("error", {
|
||||||
t: loc(lang, 'ErrorUnsupported')
|
t: loc(lang, 'ErrorUnsupported')
|
||||||
|
62
src/modules/processing/services/linkedin.js
Normal file
62
src/modules/processing/services/linkedin.js
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import { genericUserAgent } from "../../config.js";
|
||||||
|
|
||||||
|
const qualityMatch = {
|
||||||
|
"mp4-640p-30fp-crf28": 640,
|
||||||
|
"mp4-720p-30fp-crf28": 720
|
||||||
|
};
|
||||||
|
|
||||||
|
export default async function (obj) {
|
||||||
|
const html = await fetch(
|
||||||
|
`https://www.linkedin.com/feed/update/urn:li:activity:${obj.postId}`,
|
||||||
|
{ headers: { "user-agent": genericUserAgent } }
|
||||||
|
)
|
||||||
|
.then((res) => res.text())
|
||||||
|
.catch(() => {});
|
||||||
|
|
||||||
|
if (!html) {
|
||||||
|
return { error: "ErrorCouldntFetch" };
|
||||||
|
}
|
||||||
|
|
||||||
|
let data;
|
||||||
|
try {
|
||||||
|
const json = html
|
||||||
|
.split('data-sources="')[1]
|
||||||
|
.split('" data-poster-url="')[0]
|
||||||
|
.replaceAll(""", '"')
|
||||||
|
.replaceAll("&", "&");
|
||||||
|
data = JSON.parse(json);
|
||||||
|
} catch (error) {
|
||||||
|
return { error: "ErrorCouldntFetch" };
|
||||||
|
}
|
||||||
|
|
||||||
|
let fallbackUrl;
|
||||||
|
const quality = obj.quality === "max" || obj.quality >= 720 ? 720 : 640;
|
||||||
|
const filenameBase = `linkedin_${obj.postId}`;
|
||||||
|
|
||||||
|
for (const source of data) {
|
||||||
|
const videoQuality = qualityMatch[source.src.split("/")[6]];
|
||||||
|
|
||||||
|
if (videoQuality === quality) {
|
||||||
|
return {
|
||||||
|
urls: source.src,
|
||||||
|
filename: `${filenameBase}.mp4`,
|
||||||
|
audioFilename: `${filenameBase}_audio`
|
||||||
|
};
|
||||||
|
// will prioritize using known quality over unknown quality if no matching quality
|
||||||
|
} else if (!videoQuality && !fallbackUrl) {
|
||||||
|
fallbackUrl = source.src;
|
||||||
|
} else {
|
||||||
|
fallbackUrl = source.src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fallbackUrl) {
|
||||||
|
return {
|
||||||
|
urls: fallbackUrl,
|
||||||
|
filename: `${filenameBase}.mp4`,
|
||||||
|
audioFilename: `${filenameBase}_audio`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return { error: "ErrorEmptyDownload" };
|
||||||
|
}
|
@ -33,7 +33,6 @@
|
|||||||
"vk": {
|
"vk": {
|
||||||
"alias": "vk video & clips",
|
"alias": "vk video & clips",
|
||||||
"patterns": ["video:userId_:videoId", "clip:userId_:videoId", "clips:duplicate?z=clip:userId_:videoId"],
|
"patterns": ["video:userId_:videoId", "clip:userId_:videoId", "clips:duplicate?z=clip:userId_:videoId"],
|
||||||
"subdomains": ["m"],
|
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
"ok": {
|
"ok": {
|
||||||
@ -118,6 +117,11 @@
|
|||||||
"alias": "loom videos",
|
"alias": "loom videos",
|
||||||
"patterns": ["share/:id"],
|
"patterns": ["share/:id"],
|
||||||
"enabled": true
|
"enabled": true
|
||||||
|
},
|
||||||
|
"linkedin": {
|
||||||
|
"alias": "linkedin videos",
|
||||||
|
"patterns": ["feed/update/urn\\:li\\:activity\\:(:id)"],
|
||||||
|
"enabled": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
|
|
||||||
|
"linkedin": (patternMatch) =>
|
||||||
|
patternMatch.id?.length === 19,
|
||||||
|
|
||||||
"loom": (patternMatch) =>
|
"loom": (patternMatch) =>
|
||||||
patternMatch.id?.length <= 32,
|
patternMatch.id?.length <= 32,
|
||||||
|
|
||||||
|
@ -70,6 +70,12 @@ function aliasURL(url) {
|
|||||||
url.hostname = 'instagram.com';
|
url.hostname = 'instagram.com';
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "linkedin":
|
||||||
|
if (parts[1] === "posts") {
|
||||||
|
const postId = parts.pop().split("-").at(-2)
|
||||||
|
url = new URL(`https://linkedin.com/feed/update/urn:li:activity:${postId}`)
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return url
|
return url
|
||||||
|
@ -1160,5 +1160,42 @@
|
|||||||
"code": 400,
|
"code": 400,
|
||||||
"status": "error"
|
"status": "error"
|
||||||
}
|
}
|
||||||
|
}],
|
||||||
|
"linkedin": [{
|
||||||
|
"name": "regular video (share link)",
|
||||||
|
"url": "https://www.linkedin.com/posts/jasonyoong_in-the-early-days-of-a-startup-sam-altman-activity-7211912701411827712-oR9m?utm_source=share",
|
||||||
|
"params": {},
|
||||||
|
"expected": {
|
||||||
|
"code": 200,
|
||||||
|
"status": "stream"
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"name": "regular video (feed link)",
|
||||||
|
"url": "https://www.linkedin.com/feed/update/urn:li:activity:7211912701411827712/",
|
||||||
|
"params": {},
|
||||||
|
"expected": {
|
||||||
|
"code": 200,
|
||||||
|
"status": "stream"
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"name": "regular video (isAudioMuted)",
|
||||||
|
"url": "https://www.linkedin.com/feed/update/urn:li:activity:7211912701411827712/",
|
||||||
|
"params": {
|
||||||
|
"isAudioMuted": true
|
||||||
|
},
|
||||||
|
"expected": {
|
||||||
|
"code": 200,
|
||||||
|
"status": "stream"
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"name": "regular video (isAudioOnly)",
|
||||||
|
"url": "https://www.linkedin.com/feed/update/urn:li:activity:7211912701411827712/",
|
||||||
|
"params": {
|
||||||
|
"isAudioOnly": true
|
||||||
|
},
|
||||||
|
"expected": {
|
||||||
|
"code": 200,
|
||||||
|
"status": "stream"
|
||||||
|
}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user