Spaces:
Paused
Paused
import got from "got"; | |
import * as cheerio from "cheerio"; | |
import { FacebookDlArgsSchema, FacebookDlSchema } from "../lib/types/facebook-v1.js"; | |
import { DEFAULT_HEADERS } from "./constant.js"; | |
async function facebookdl(url) { | |
FacebookDlArgsSchema.parse(arguments); | |
const html = await got("https://fdownloader.net/en", { headers: { ...DEFAULT_HEADERS } }).text(); | |
const k_url_search = /k_url_search="(.*?)"/.exec(html)?.[1] || null; | |
const k_exp = /k_exp="(.*?)"/.exec(html)?.[1] || null; | |
const k_token = /k_token="(.*?)"/.exec(html)?.[1] || null; | |
if (!k_url_search || !k_exp || !k_token) { | |
throw new Error("Failed to extract necessary tokens."); | |
} | |
const form = { | |
k_exp, | |
k_token, | |
q: url, | |
lang: "en", | |
web: "fdownloader.net", | |
v: "v2", | |
w: "", | |
}; | |
const data = await got.post(k_url_search, { | |
headers: { ...DEFAULT_HEADERS, referer: "https://fdownloader.net/" }, | |
form, | |
}).json(); | |
const $ = cheerio.load(data.data); | |
const thumbnail = $(".thumbnail > .image-fb > img").attr("src") || null; | |
const duration = $(".content > .clearfix > p").text() || null; | |
const video = $("table.table").eq(0).find("tbody > tr").map((_, el) => { | |
const $el = $(el); | |
const quality = $el.find("td").eq(0).text().trim(); | |
const downloadUrl = $el.find("td").eq(2).find("a").attr("href"); | |
if (downloadUrl) { | |
return { quality, download: () => Promise.resolve(downloadUrl) }; | |
} | |
}).toArray().filter(Boolean); | |
const audio = []; | |
const audioUrl = $("#audioUrl").attr("value") || null; | |
if (audioUrl) { | |
audio.push({ quality: "128kbps", download: () => Promise.resolve(audioUrl) }); | |
} | |
const result = { thumbnail, duration, video, audio }; | |
console.log(result); | |
return FacebookDlSchema.parse(result); | |
} | |
async function convert(url, v_id, ftype, videoUrl, videoType, videoCodec, audioUrl, audioType, fquality, fname, exp, token) { | |
return got.post(url, { | |
form: { ftype, v_id, videoUrl, videoType, videoCodec, audioUrl, audioType, fquality, fname, exp, token, cv: "v2" }, | |
}); | |
} | |
export { facebookdl, convert }; |