|
import got from "got"; |
|
import * as cheerio from "cheerio"; |
|
import { FacebookDlArgsSchema, FacebookDlSchema } from "../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 }; |