|
import got from 'got'; |
|
import * as cheerio from 'cheerio'; |
|
import { DEFAULT_HEADERS } from '../constant.js'; |
|
import { SfilemobidlArgsSchema, SfilemobidlSchema } from '../types/sfilemobi-dl-v1.js'; |
|
|
|
export async function sfilemobi(url) { |
|
SfilemobidlArgsSchema.parse({ url }); |
|
|
|
const data = await got(url, { |
|
headers: { ...DEFAULT_HEADERS } |
|
}).text(); |
|
|
|
const $ = cheerio.load(data); |
|
|
|
const dlUrl = $('#download').attr('href') || null; |
|
const filename = $('div.intro-container > img').attr('alt') || $('div.intro-container > h1').text() || null; |
|
const icon = $('div.intro-container > img').attr('src') || null; |
|
|
|
const typeMatch = icon ? /\/smallicon\/(.*?)\.svg/.exec(icon) : null; |
|
const type = typeMatch ? typeMatch[1] : null; |
|
|
|
const $list = $('div.list'); |
|
const mimetype = $list.eq(0).text().split('-')[1]?.trim() || null; |
|
const uploaded = $list.eq(2).text().split('Uploaded:')[1]?.trim() || null; |
|
|
|
const $upload = $list.eq(1).find('a'); |
|
const uploadby = $upload.eq(0).text() || null; |
|
const uploadbyUrl = $upload.eq(0).attr('href') || null; |
|
const uploadon = $upload.eq(1).text() || null; |
|
const uploadonUrl = $upload.eq(1).attr('href') || null; |
|
|
|
const downloadsText = $list.eq(3).text().split('Downloads:')[1]; |
|
const downloads = downloadsText ? parseInt(downloadsText) : null; |
|
|
|
const result = { |
|
url: dlUrl, |
|
filename, |
|
icon, |
|
type, |
|
mimetype, |
|
uploaded, |
|
uploadby, |
|
uploadbyUrl, |
|
uploadon, |
|
uploadonUrl, |
|
downloads |
|
}; |
|
|
|
return SfilemobidlSchema.parse(result); |
|
} |