ryu-js / lib /snapsave /snapsave.js
randydev's picture
Update lib/snapsave/snapsave.js
26dfb17 verified
raw
history blame
2.61 kB
import got from "got";
import * as cheerio from "cheerio";
import FormData from "form-data";
import { SnapSaveArgsSchema, SnapSaveSchema } from "../types/snapsave-v1.js";
import { DEFAULT_HEADERS } from "../constant.js";
import { decryptSnapSave } from "./util.js";
export async function snapsave(url) {
SnapSaveArgsSchema.parse(arguments);
const form = new FormData();
form.append("url", url);
// Fetch video data
const code = await got
.post("https://snapsave.app/action.php?lang=en", {
headers: {
...DEFAULT_HEADERS,
...form.getHeaders(),
origin: "https://snapsave.app",
referer: "https://snapsave.app/en",
},
body: form.getBuffer(),
})
.text();
const decode = decryptSnapSave(code);
const $ = cheerio.load(decode);
const results = [];
const title = $(".content > p > strong").text() || null;
const description = $("span.video-des").text() || null;
if ($("div.download-items").length) {
// Download items available
$("div.download-items").each((_, el) => {
const $el = $(el);
const url = $el.find(".download-items__btn > a").attr("href") || null;
const thumbUrl = new URL($el.find(".download-items__thumb > img").attr("src") || "");
const thumb = thumbUrl.searchParams.get("photo") || thumbUrl.toString();
if (url) {
results.push({ thumbnail: thumb, url });
}
});
} else if ($("table.table").length) {
const thumbnail = $("figure > .image > img").attr("src") || null;
$("tbody > tr").each((_, el) => {
const $el = $(el);
const $td = $el.find("td");
const resolution = $td.eq(0).text();
let _url = $td.eq(2).find("a").attr("href") || $td.eq(2).find("button").attr("onclick");
const shouldRender = /get_progressApi/gi.test(_url || "");
if (shouldRender) {
_url = /get_progressApi\('(.*?)'\)/.exec(_url || "")?.[1] || _url;
}
if (_url) {
results.push({ resolution, thumbnail, url: _url, shouldRender });
}
});
} else {
const thumbnail = $("figure > .image > img").attr("src") || null;
const url = $("div.column > a").attr("href") || null;
if (url) {
results.push({ thumbnail, url });
}
}
const result = { title, description, results };
return SnapSaveSchema.parse(result);
}