This repository has been archived by the owner on Sep 2, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathapp.js
63 lines (56 loc) · 1.94 KB
/
app.js
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
require("dotenv").config();
const puppeteer = require('puppeteer');
const fs = require('fs');
const rp = require('request-promise-native');
const low = require('lowdb')
const FileSync = require('lowdb/adapters/FileSync')
var path = require('path');
const downloadedVideosJson = './downloadedVideos.json';
const downloadDir = './videos';
const adapter = new FileSync(downloadedVideosJson);
const db = low(adapter)
db.defaults({ videos: [] })
.write()
function processItemsObject(itemApiResponse) {
console.log("Processing video information");
let items = itemApiResponse.body.itemListData;
for (var i = items.length - 1; i >= 0; i--) {
if (db.get('videos').find({ id: items[i].itemInfos.id }).value() || db.get('videos').find({ url: items[i].itemInfos.video.urls[0] }).value()){
console.log(`${items[i].itemInfos.id} is already downloaded. skipping...`);
}else{
downloadVideo(items[i]);
}
//console.log(items[i].itemInfos.video.urls[0])
}
}
async function downloadVideo(item){
let itemInfo = item.itemInfos;
console.log('Starting download for ' + itemInfo.id);
let video = await rp(itemInfo.video.urls[0],{'encoding':null});
let savePath = path.join(downloadDir, `${itemInfo.id}.mp4`)
fs.writeFileSync(savePath,video);
await db.get('videos').push({
id: itemInfo.id,
url: itemInfo.video.urls[0]
}).write();
console.log(`Downloaded ${itemInfo.id} at ${savePath}`);
}
function checkDownloadDir() {
if (!fs.existsSync(downloadDir)) {
fs.mkdirSync(downloadDir);
}
}
(async () => {
checkDownloadDir();
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on('response', async response => {
if (response.url().startsWith("https://www.tiktok.com/share/item/list")) {
processItemsObject(await response.json());
}
});
console.log("Downloading Webpage");
console.log("Waiting for video information...");
await page.goto(process.env.TIKTOK_URL, { waitUntil: 'load', timeout: 0 });
await browser.close();
})();