tiktok images and crowdin
This commit is contained in:
@@ -4,66 +4,102 @@ import { genericUserAgent } from "../config.js";
|
||||
import { unicodeDecode } from "../sub/utils.js";
|
||||
|
||||
let userAgent = genericUserAgent.split(' Chrome/1')[0]
|
||||
let config = {
|
||||
tiktok: {
|
||||
short: "https://vt.tiktok.com/",
|
||||
api: "https://api.tiktokv.com/aweme/v1/aweme/detail/?aweme_id=",
|
||||
},
|
||||
douyin: {
|
||||
short: "https://v.douyin.com/",
|
||||
api: "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=",
|
||||
}
|
||||
}
|
||||
function selector(j, h) {
|
||||
switch (h) {
|
||||
case "tiktok":
|
||||
return j["aweme_detail"]
|
||||
case "douyin":
|
||||
return j['item_list'][0]
|
||||
}
|
||||
}
|
||||
|
||||
export default async function(obj) {
|
||||
try {
|
||||
if (!obj.postId) {
|
||||
let html = await got.get(`https://vt.tiktok.com/${obj.id}`, { headers: { "user-agent": userAgent } });
|
||||
let html = await got.get(`${config[obj.host]["short"]}${obj.id}`, { followRedirect: false, headers: { "user-agent": userAgent } });
|
||||
html.on('error', (err) => {
|
||||
return { error: loc(obj.lang, 'ErrorCantConnectToServiceAPI', 'tiktok') };
|
||||
});
|
||||
html = html.body
|
||||
if (!html.includes('<!DOCTYPE html>')) {
|
||||
obj.postId = html.split('video/')[1].split('?')[0]
|
||||
} else {
|
||||
obj.postId = html.split('aweme/detail/')[1].split('?')[0]
|
||||
}
|
||||
}
|
||||
if (!obj.noWatermark && !obj.isAudioOnly) {
|
||||
let html = await got.get(`https://tiktok.com/@video/video/${obj.postId}`, { headers: { "user-agent": userAgent } });
|
||||
html.on('error', (err) => {
|
||||
return { error: loc(obj.lang, 'ErrorCantConnectToServiceAPI', 'tiktok') };
|
||||
return { error: loc(obj.lang, 'ErrorCantConnectToServiceAPI', obj.host) };
|
||||
});
|
||||
html = html.body;
|
||||
if (html.includes(',"preloadList":[{"url":"')) {
|
||||
return {
|
||||
urls: unicodeDecode(html.split(',"preloadList":[{"url":"')[1].split('","id":"')[0].trim()),
|
||||
audioFilename: `tiktok_${obj.postId}_audio`,
|
||||
filename: `tiktok_${obj.postId}.mp4`
|
||||
};
|
||||
if (html.slice(0, 17) === '<a href="https://' && html.includes('/video/')) obj.postId = html.split('video/')[1].split('?')[0].replace("/", '')
|
||||
}
|
||||
if (!obj.postId) return { error: loc(obj.lang, 'ErrorCantGetID') };
|
||||
|
||||
let detail = await got.get(`${config[obj.host]["api"]}${obj.postId}`);
|
||||
detail.on('error', (err) => {
|
||||
return { error: loc(obj.lang, 'ErrorCantConnectToServiceAPI', obj.host) };
|
||||
});
|
||||
detail = selector(JSON.parse(detail.body), obj.host);
|
||||
|
||||
let video, videoFilename, audioFilename, isMp3, audio,
|
||||
images = detail["image_post_info"] ? detail["image_post_info"]["images"] : false,
|
||||
filenameBase = `${obj.host}_${obj.postId}`;
|
||||
|
||||
if (!obj.isAudioOnly && !images) {
|
||||
if (obj.host == "tiktok") {
|
||||
video = detail["video"]["play_addr"]["url_list"][0]
|
||||
} else {
|
||||
return { error: loc(obj.lang, 'ErrorEmptyDownload') };
|
||||
video = detail["video"]["play_addr"]["url_list"][0].replace("playwm", "play")
|
||||
}
|
||||
videoFilename = `${filenameBase}_video_nw.mp4` // nw - no watermark
|
||||
if (!obj.noWatermark) {
|
||||
if (obj.host == "tiktok") {
|
||||
let html = await got.get(`https://tiktok.com/@video/video/${obj.postId}`, { headers: { "user-agent": userAgent } });
|
||||
html.on('error', (err) => {
|
||||
return { error: loc(obj.lang, 'ErrorCantConnectToServiceAPI', obj.host) };
|
||||
});
|
||||
html = html.body;
|
||||
if (html.includes(',"preloadList":[{"url":"')) {
|
||||
video = unicodeDecode(html.split(',"preloadList":[{"url":"')[1].split('","id":"')[0].trim())
|
||||
}
|
||||
} else {
|
||||
video = detail['video']['play_addr']['url_list'][0]
|
||||
}
|
||||
videoFilename = `${filenameBase}_video.mp4`
|
||||
}
|
||||
} else {
|
||||
let detail = await got.get(`https://api.tiktokv.com/aweme/v1/aweme/detail/?aweme_id=${obj.postId}`);
|
||||
detail.on('error', (err) => {
|
||||
return { error: loc(obj.lang, 'ErrorCantConnectToServiceAPI', 'tiktok') };
|
||||
});
|
||||
detail = JSON.parse(detail.body);
|
||||
let video = detail["aweme_detail"]["video"]["play_addr"]["url_list"][0];
|
||||
let audio = obj.isAudioOnly ? detail["aweme_detail"]["music"]["play_url"]["url_list"][0] : false;
|
||||
if (audio && obj.fullAudio) {
|
||||
return {
|
||||
urls: audio,
|
||||
audioFilename: `tiktok_${obj.postId}_audio_full`,
|
||||
isAudio: true
|
||||
}
|
||||
} else if (audio && audio.slice(-4) == ".mp3") {
|
||||
return {
|
||||
urls: audio,
|
||||
audioFilename: `tiktok_${obj.postId}_audio`,
|
||||
isAudio: true,
|
||||
isMp3: true,
|
||||
};
|
||||
} else if (video) {
|
||||
return {
|
||||
urls: video,
|
||||
audioFilename: `tiktok_${obj.postId}_audio`,
|
||||
filename: `tiktok_${obj.postId}_nw.mp4`
|
||||
};
|
||||
let fallback = obj.host == "douyin" ? detail["video"]["play_addr"]["url_list"][0].replace("playwm", "play") : detail["video"]["play_addr"]["url_list"][0];
|
||||
if (obj.fullAudio || fallback.includes("music")) {
|
||||
audio = detail["music"]["play_url"]["url_list"][0]
|
||||
audioFilename = `${filenameBase}_audio`
|
||||
} else {
|
||||
return { error: loc(obj.lang, 'ErrorEmptyDownload') };
|
||||
audio = fallback
|
||||
audioFilename = `${filenameBase}_audio_fv` // fv - from video
|
||||
}
|
||||
if (audio.slice(-4) == ".mp3") isMp3 = true;
|
||||
}
|
||||
if (video) return {
|
||||
urls: video,
|
||||
filename: videoFilename
|
||||
}
|
||||
if (images) {
|
||||
let imageLinks = [];
|
||||
for (let i in images) {
|
||||
imageLinks.push(images[i]["display_image"]["url_list"][0])
|
||||
}
|
||||
return {
|
||||
images: imageLinks,
|
||||
urls: audio,
|
||||
audioFilename: audioFilename,
|
||||
isAudioOnly: true,
|
||||
isMp3: isMp3,
|
||||
}
|
||||
}
|
||||
if (audio) return {
|
||||
urls: audio,
|
||||
audioFilename: audioFilename,
|
||||
isAudioOnly: true,
|
||||
isMp3: isMp3,
|
||||
}
|
||||
} catch (e) {
|
||||
return { error: loc(obj.lang, 'ErrorBadFetch') };
|
||||
|
||||
Reference in New Issue
Block a user