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 };