File size: 2,227 Bytes
d7ade7a
 
 
 
1ab3fc9
d7ade7a
f44bab2
d7ade7a
 
 
 
 
 
 
 
 
 
1ab3fc9
 
 
 
 
d7ade7a
 
 
 
f44bab2
d7ade7a
1ab3fc9
d7ade7a
 
f44bab2
1ab3fc9
f44bab2
1ab3fc9
d7ade7a
 
 
 
f44bab2
d7ade7a
 
 
 
 
1ab3fc9
f44bab2
1ab3fc9
f44bab2
d7ade7a
 
 
 
 
 
1ab3fc9
f44bab2
 
1ab3fc9
 
d7ade7a
 
 
f44bab2
d7ade7a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import got from "got";
import * as cheerio from "cheerio";
import { FacebookDlArgsSchema, FacebookDlSchema } from "../lib/types/facebook-v1.js";
import { DEFAULT_HEADERS } from "./constant.js";

export default 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);
}

export 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" },
    });
}