File size: 1,830 Bytes
447b34c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import got from 'got';
import * as cheerio from 'cheerio';
import { TiktokDlArgsSchema, TiktokDlSchema } from '../types/tiktok-v1.js';
import { DEFAULT_HEADERS } from '../constant.js';

export async function tiktokdl(url) {
    TiktokDlArgsSchema.parse(arguments);

    const html = await got.post('https://ttsave.app/download', {
        headers: {
            ...DEFAULT_HEADERS,
            origin: 'https://ttsave.app'
        },
        json: {
            language_id: '1',
            query: url
        }
    }).text();

    const $ = cheerio.load(html);
    const $div = $('div.flex');

    const nickname = $div.find('h2').text()?.trim() || null;
    const username = $div.find('a.font-extrabold').text()?.trim() || null;
    const avatar = $div.find('a > img').attr('src') || null;
    const description = $div.find('p').text()?.trim() || null;

    const $span = $div.find('div.flex > div.flex > span');
    const played = $span.eq(0).text()?.trim() || null;
    const commented = $span.eq(1).text()?.trim() || null;
    const saved = $span.eq(2).text()?.trim() || null;
    const shared = $span.eq(3).text()?.trim() || null;
    const song = $div.find('div.flex > span').eq(4).text()?.trim() || null;

    const $a = $('#button-download-ready > a');
    const noWatermark = $a.eq(0).attr('href') || null;
    const withWatermark = $a.eq(1).attr('href') || null;
    const audio = $a.eq(2).attr('href') || null;
    const thumbnail = $a.eq(3).attr('href') || null;  // Fixed index

    const result = {
        nickname,
        username,
        avatar,
        description,
        thumbnail,
        played,
        commented,
        saved,
        shared,
        song,
        video: {
            noWatermark,
            withWatermark
        },
        audio
    };

    return TiktokDlSchema.parse(result);
}