TBox/JS/douban.js
2025-02-01 21:28:00 -05:00

153 lines
6.9 KiB
JavaScript

// 下面是发布代码
const webSite = 'https://m.douban.com';
const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36';
//调试完毕后,屏蔽下方测试的代码
//homeContent();
//categoryContent("1", 1, JSON.stringify({类型: "喜剧",地区: "华语",年代: "2020年代", 排序: "近期热度"}));
//获取首页分类和推荐视频
async function homeContent() {
let backData = new RepVideo();
// 定义分类数据
const allClass = [
{ type_id: "1", type_name: "找电视剧" },
{ type_id: "2", type_name: "找电影" },
{ type_id: "3", type_name: "找综艺" }
];
const createLabelOptions = (labels) => labels.map(label => ({ n: label, v: label === "全部" || label === "近期热度" ? "" : label }));
const tvLabels = {
types: ["全部", "喜剧", "爱情", "悬疑", "动画", "武侠", "古装", "家庭", "犯罪", "科幻", "恐怖", "历史", "战争", "动作", "冒险", "传记", "剧情", "奇幻", "惊悚", "灾难", "歌舞", "音乐"],
areas: ["全部", "华语", "欧美", "国外", "韩国", "日本", "中国大陆", "中国香港", "美国", "英国", "泰国", "中国台湾", "意大利", "法国", "德国", "西班牙", "俄罗斯", "瑞典", "巴西", "丹麦", "印度", "加拿大", "爱尔兰", "澳大利亚"],
years: ["全部", "2020年代", "2024", "2023", "2022", "2021", "2020", "2019", "2010年代", "2000年代", "90年代", "80年代", "70年代", "60年代", "更早"],
platforms: ["全部", "腾讯视频", "爱奇艺", "优酷", "湖南卫视", "Netflix", "HBO", "BBC", "NHK", "CBS", "NBC", "tvN"],
sortOptions: [ "近期热度", "综合排序","首播时间", "高分优先"]
};
const movieLabels = {
types: ["全部", "喜剧", "爱情", "动作", "科幻", "动画", "悬疑", "犯罪", "惊悚", "冒险", "音乐", "历史", "奇幻", "恐怖", "战争", "传记", "歌舞", "武侠", "情色", "灾难", "西部", "纪录片", "短片"],
areas: ["全部", "华语", "欧美", "韩国", "日本", "中国大陆", "美国", "中国香港", "中国台湾", "英国", "法国", "德国", "意大利", "西班牙", "印度", "泰国", "俄罗斯", "加拿大", "澳大利亚", "爱尔兰", "瑞典", "巴西", "丹麦"],
years: ["全部", "2020年代", "2024", "2023", "2022", "2021", "2020", "2019", "2010年代", "2000年代", "90年代", "80年代", "70年代", "60年代", "更早"],
platforms: ["全部", "腾讯视频", "爱奇艺", "优酷", "湖南卫视", "Netflix", "HBO", "BBC", "NHK", "CBS", "NBC", "tvN"],
sortOptions: [ "近期热度", "综合排序","首播时间", "高分优先"]
};
const varietyLabels = {
types: ["全部", "真人秀", "脱口秀", "音乐", "歌舞"],
areas: ["全部", "华语", "欧美", "国外", "韩国", "日本", "中国大陆", "中国香港", "美国", "英国", "泰国", "中国台湾", "意大利", "法国", "德国", "西班牙", "俄罗斯", "瑞典", "巴西", "丹麦", "印度", "加拿大", "爱尔兰", "澳大利亚"],
years: ["全部", "2020年代", "2024", "2023", "2022", "2021", "2020", "2019", "2010年代", "2000年代", "90年代", "80年代", "70年代", "60年代", "更早"],
platforms: ["全部", "腾讯视频", "爱奇艺", "优酷", "湖南卫视", "Netflix", "HBO", "BBC", "NHK", "CBS", "NBC", "tvN"],
sortOptions: ["近期热度", "综合排序", "首播时间", "高分优先"]
};
// 生成过滤器数据
const generateFilterData = (labels) => [
{ key: "类型", name: "类型", value: createLabelOptions(labels.types) },
{ key: "地区", name: "地区", value: createLabelOptions(labels.areas) },
{ key: "年代", name: "年代", value: createLabelOptions(labels.years) },
{ key: "平台", name: "平台", value: createLabelOptions(labels.platforms) },
{ key: "排序", name: "排序", value: createLabelOptions(labels.sortOptions) }
];
const filterData = {
"1": generateFilterData(tvLabels),
"2": generateFilterData(movieLabels),
"3": generateFilterData(varietyLabels)
};
backData.filters = filterData;
backData.class = allClass;
console.log(JSON.stringify(backData));
return JSON.stringify(backData);
}
// 获取影视分类列表
async function categoryContent(tid, pg = 1, extend) {
let backData = new RepVideo();
try {
// 初始化参数
let param1 = tid === "1" ? '{"形式":"电视剧",' : tid === "2" ? '{"形式":"电影",' : tid === "3" ? '{"形式":"综艺",' : "{";
let extendObj = extend ? JSON.parse(extend) : null;
let start = (pg - 1) * 20;
let tags = tid === "3" ? '综艺,': '';
let sort = "U";
// 处理扩展参数
if (extendObj) {
for (const [key, value] of Object.entries(extendObj)) {
if (key === "排序") {
const sortMap = {
"综合排序": "",
"近期热度": "U",
"": "U",
"首播时间": "R",
"高分优先": "S",
};
sort = sortMap[value] || "";
} else if (value !== "全部") {
param1 += `"${key}":"${value}",`;
tags += `${value},`;
}
}
param1 = param1.endsWith(",") ? param1.slice(0, -1) + "}" : param1 + "}";
tags = tags.endsWith(",") ? tags.slice(0, -1) : tags;
}
// 构建请求URL
let webUrl = `${webSite}/rexxar/api/v2/${tid === "2" ? "movie" : "tv"}/recommend?refresh=0&start=${start}&count=20&selected_categories=${param1}&uncollect=false&tags=${tags}`;
// 如果 sort 有值,则添加到 URL 中
if (sort) {
webUrl += `&sort=${sort}`;
}
// 发送请求
let pro = await req(webUrl, {
headers: {
'User-Agent': UA,
'Referer': webSite
},
});
// 解析响应数据
let proData = await pro.json();
console.log("Response Data:", proData);
// 处理视频列表
let video = proData?.items?.map((item) => {
let videoDet = new VideoList();
videoDet.vod_id = item.id;
//videoDet.vod_pic = item.pic?.normal || item.pic?.large || "";
//图片加入缓存机制
videoDet.vod_pic = item.pic?.normal
? `https://images.weserv.nl/?url=${item.pic.normal}&w=300&h=300`
: item.pic?.large
? `https://images.weserv.nl/?url=${item.pic.large}&w=300&h=300`
: "";
videoDet.vod_name = item.title;
videoDet.vod_remarks = "豆瓣" + (item.rating?.value || "");
return videoDet;
}) || [];
backData.list = video;
} catch (error) {
console.error('Error fetching the webpage:', error);
backData.msg = error.message || error.statusText || 'Unknown error';
}
console.log(JSON.stringify(backData));
return JSON.stringify(backData);
}
//推荐源,无需下列三个函数。但是也需要在代码中定义
async function detailContent(ids) {
console.log('detailContent');
}
async function searchContent(keyword) {
console.log('searchContent');
}
async function playerContent(vod_id) {
console.log('playerContent');
}