Spaces:
Paused
Paused
import got from 'got' | |
import * as cheerio from 'cheerio' | |
import { FacebookDlArgsSchema, FacebookDlMediaSchema, FacebookDlSchema } from '../types/facebook-v1.js' | |
import { DEFAULT_HEADERS } from './constant.js' | |
export 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] | |
const k_exp = /k_exp="(.*?)"/.exec(html)![1] | |
const k_token = /k_token="(.*?)"/.exec(html)![1] | |
const k_prefix_name = /k_prefix_name="(.*?)"/.exec(html)![1] | |
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<{ data: string }>() | |
const $ = cheerio.load(data.data) | |
const k_url_convert = /k_url_convert = "(.*?)"/.exec($.html())![1] | |
const c_exp = /k_exp = "(.*?)"/.exec($.html())![1] | |
const c_token = /c_token = "(.*?)"/.exec($.html())![1] | |
const thumbnail = $('.thumbnail > .image-fb > img').attr('src') | |
const duration = $('.content > .clearfix > p').text() || undefined | |
const video = $('table.table').eq(0).find('tbody > tr').map((_, el) => { | |
const $el = $(el) | |
const $td = $el.find('td') | |
const quality = $td.eq(0).text() | |
const url = $td.eq(2).find('a').attr('href') | |
if (url) { | |
return { | |
quality, | |
download: () => Promise.resolve(url) | |
} | |
} | |
// TODO: | |
return false | |
const $button = $td.eq(2).find('button') | |
const ftype = 'mp4' | |
const v_id = $('#FbId').attr('value') | |
const videoUrl = $button.attr('data-videourl') | |
const videoType = $button.attr('data-videotype') | |
const videoCodec = $button.attr('data-videocodec') | |
const fquality = $button.attr('data-fquality') | |
const audioUrl = $('#audioUrl').attr('value') | |
const audioType = $('#audioType').attr('value') | |
}).toArray().filter(Boolean) | |
const audio: FacebookDlMediaSchema = [] | |
const audioUrl = $('#audioUrl').attr('value')! | |
audio.push({ | |
quality: '7kbps', | |
download: () => Promise.resolve(audioUrl) | |
}) | |
const result = { | |
thumbnail, | |
duration, | |
video, | |
audio | |
} | |
console.log(result) | |
return FacebookDlSchema.parse(result) | |
} | |
export async function convert( | |
url: string, | |
v_id: string, | |
ftype: string, | |
videoUrl: string, | |
videoType: string, | |
videoCodec: string, | |
audioUrl: string, | |
audioType: string, | |
fquality: string, | |
fname: string, | |
exp: string, | |
token: string, | |
) { | |
const data = await got.post(url, { | |
form: { | |
ftype, | |
v_id, | |
videoUrl, | |
videoType, | |
videoCodec, | |
audioUrl, | |
audioType, | |
fquality, | |
fname, | |
exp, | |
token, | |
cv: 'v2' | |
} | |
}) | |
} |