douyinVd / cfbuild.js
ZSCGR's picture
Upload folder using huggingface_hub
a1ee9b9 verified
// Users/pwhcoder/WebstormProjects/douyinVd/douyin.ts
var pattern = /"video":{"play_addr":{"uri":"([a-z0-9]+)"/;
var cVUrl = "https://www.iesdouyin.com/aweme/v1/play/?video_id=%s&ratio=1080p&line=0";
var statsRegex = /"statistics"\s*:\s*\{([\s\S]*?)\},/;
var regex = /"nickname":\s*"([^"]+)",\s*"signature":\s*"([^"]+)"/;
var ctRegex = /"create_time":\s*(\d+)/;
var descRegex = /"desc":\s*"([^"]+)"/;
function formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
async function doGet(url) {
const headers = new Headers();
headers.set(
"User-Agent",
"Mozilla/5.0 (Linux; Android 11; SAMSUNG SM-G973U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14.2 Chrome/87.0.4280.141 Mobile Safari/537.36"
);
const resp = await fetch(url, { method: "GET", headers });
return resp;
}
async function parseImgList(body) {
const content = body.replace(/\\u002F/g, "/").replace(/\//g, "/");
const reg = /{"uri":"[^\s"]+","url_list":\["(https:\/\/p\d{1,2}-sign.douyinpic.com\/.*?)"/g;
const urlRet = /"uri":"([^\s"]+)","url_list":/g;
let imgMatch;
const firstUrls = [];
while ((imgMatch = reg.exec(content)) !== null) {
firstUrls.push(imgMatch[1]);
}
let urlMatch;
const urlList = [];
while ((urlMatch = urlRet.exec(content)) !== null) {
urlList.push(urlMatch[1]);
}
const urlSet = new Set(urlList);
const rList = [];
for (let urlSetKey of urlSet) {
let t = firstUrls.find((item) => {
return item.includes(urlSetKey);
});
if (t) {
rList.push(t);
}
}
const filteredRList = rList.filter((url) => !url.includes("/obj/"));
console.log("filteredRList.length:", filteredRList.length);
return filteredRList;
}
async function getVideoInfo(url) {
let type = "video";
let img_list = [];
let video_url = "";
const resp = await doGet(url);
const body = await resp.text();
const match = pattern.exec(body);
if (!match || !match[1]) {
type = "img";
}
if (type == "video") {
video_url = cVUrl.replace("%s", match[1]);
} else {
img_list = await parseImgList(body);
}
const auMatch = body.match(regex);
const ctMatch = body.match(ctRegex);
const descMatch = body.match(descRegex);
const statsMatch = body.match(statsRegex);
if (statsMatch) {
const innerContent = statsMatch[0];
const awemeIdMatch = innerContent.match(/"aweme_id"\s*:\s*"([^"]+)"/);
const commentCountMatch = innerContent.match(/"comment_count"\s*:\s*(\d+)/);
const diggCountMatch = innerContent.match(/"digg_count"\s*:\s*(\d+)/);
const playCountMatch = innerContent.match(/"play_count"\s*:\s*(\d+)/);
const shareCountMatch = innerContent.match(/"share_count"\s*:\s*(\d+)/);
const collectCountMatch = innerContent.match(/"collect_count"\s*:\s*(\d+)/);
const douyinVideoInfo = {
aweme_id: awemeIdMatch ? awemeIdMatch[1] : null,
comment_count: commentCountMatch ? parseInt(commentCountMatch[1]) : null,
digg_count: diggCountMatch ? parseInt(diggCountMatch[1]) : null,
share_count: shareCountMatch ? parseInt(shareCountMatch[1]) : null,
collect_count: collectCountMatch ? parseInt(collectCountMatch[1]) : null,
nickname: null,
signature: null,
desc: null,
create_time: null,
video_url,
type,
image_url_list: img_list
};
if (auMatch) {
douyinVideoInfo.nickname = auMatch[1];
douyinVideoInfo.signature = auMatch[2];
}
if (ctMatch) {
const date = new Date(parseInt(ctMatch[1]) * 1e3);
douyinVideoInfo.create_time = formatDate(date);
}
if (descMatch) {
douyinVideoInfo.desc = descMatch[1];
}
console.log(douyinVideoInfo);
return douyinVideoInfo;
} else {
throw new Error("No stats found in the response.");
}
}
async function getVideoId(url) {
const resp = await doGet(url);
const body = await resp.text();
const match = pattern.exec(body);
if (!match || !match[1]) throw new Error("Video ID not found in URL");
return match[1];
}
async function getVideoUrl(url) {
const id = await getVideoId(url);
const downloadUrl = cVUrl.replace("%s", id);
return downloadUrl;
}
// Users/pwhcoder/WebstormProjects/douyinVd/serve.ts
var handler = async (req) => {
console.log("Method:", req.method);
const url = new URL(req.url);
if (url.searchParams.has("url")) {
const inputUrl = url.searchParams.get("url");
console.log("inputUrl:", inputUrl);
if (url.searchParams.has("data")) {
const videoInfo = await getVideoInfo(inputUrl);
return new Response(JSON.stringify(videoInfo));
}
const videoUrl = await getVideoUrl(inputUrl);
return new Response(videoUrl);
} else {
return new Response("\u8BF7\u63D0\u4F9Burl\u53C2\u6570");
}
};
// Users/pwhcoder/WebstormProjects/douyinVd/cfworker.ts
var cfworker_default = {
fetch: handler
};
export {
cfworker_default as default
};