douban源搜索接口增加公开api兜底
This commit is contained in:
1 parent
59fff265cd
commit
028835c2c4
3 files changed
+78
-4
No files matched your search
@@ -13,7 +13,7 @@ export const Globals = {
|
||||
accessedEnvVars: {},
|
||||
|
||||
// 静态常量
|
||||
VERSION: '1.18.7',
|
||||
VERSION: '1.18.8',
|
||||
MAX_LOGS: 1000, // 日志存储,最多保存 1000 行
|
||||
MAX_RECORDS: 100, // 请求记录最大数量
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import BaseSource from './base.js';
|
||||
import { log } from "../utils/log-util.js";
|
||||
import { getDoubanDetail, searchDoubanTitles } from "../utils/douban-util.js";
|
||||
import { getDoubanDetail, searchDoubanTitles, searchDoubanTitlesByPublic } from "../utils/douban-util.js";
|
||||
|
||||
// =====================
|
||||
// 获取豆瓣源播放链接
|
||||
@@ -17,9 +17,24 @@ export default class DoubanSource extends BaseSource {
|
||||
|
||||
async search(keyword) {
|
||||
try {
|
||||
const response = await searchDoubanTitles(keyword);
|
||||
let response = await searchDoubanTitles(keyword);
|
||||
let data = response?.data;
|
||||
|
||||
const data = response.data;
|
||||
// 兜底策略:如果 searchDoubanTitles 失败或返回空结果,使用 searchDoubanTitlesByPublic
|
||||
if (!data || (!data?.subjects?.items?.length && !data?.smart_box?.length)) {
|
||||
log("info", "searchDoubanTitles failed or empty, trying searchDoubanTitlesByPublic");
|
||||
const fallbackResponse = await searchDoubanTitlesByPublic(keyword);
|
||||
const fallbackData = fallbackResponse?.data;
|
||||
|
||||
if (fallbackData?.subjects?.length > 0) {
|
||||
// 将 searchDoubanTitlesByPublic 返回的数据转换为原格式
|
||||
data = {
|
||||
subjects: {
|
||||
items: fallbackData.subjects.map(item => this.convertToOriginalFormat(item)),
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let tmpAnimes = [];
|
||||
if (data?.subjects?.items?.length > 0) {
|
||||
@@ -43,6 +58,58 @@ export default class DoubanSource extends BaseSource {
|
||||
}
|
||||
}
|
||||
|
||||
// 将 searchDoubanTitlesByPublic 返回的数据格式转换为原格式
|
||||
convertToOriginalFormat(item) {
|
||||
// subtype: "movie" -> "电影", "tv" -> "电视剧"
|
||||
const typeMap = {
|
||||
'movie': '电影',
|
||||
'tv': '电视剧'
|
||||
};
|
||||
const typeName = typeMap[item.subtype] || item.subtype;
|
||||
|
||||
// 构建 cover_url:从原始图片URL中提取图片ID,然后构造固定格式的URL
|
||||
const originalImageUrl = item.images?.large || item.images?.medium || item.images?.small || '';
|
||||
let coverUrl = '';
|
||||
if (originalImageUrl) {
|
||||
// 从类似 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2887095203.jpg 的URL中提取 p2887095203
|
||||
const match = originalImageUrl.match(/\/(p\d+)\.jpg/);
|
||||
if (match && match[1]) {
|
||||
const imageId = match[1]; // 例如 p2887095203
|
||||
coverUrl = `https://qnmob3.doubanio.com/view/photo/large/public/${imageId}.jpg?imageView2/0/q/80/w/9999/h/120/format/jpg`;
|
||||
}
|
||||
}
|
||||
|
||||
// 构建 card_subtitle,包含地区、类型、导演、演员等信息
|
||||
const directors = item.directors?.map(d => d.name).join(' ') || '';
|
||||
const casts = item.casts?.slice(0, 3).map(c => c.name).join(' ') || '';
|
||||
const cardSubtitle = `${item.year} / ${item.genres?.join(' / ') || ''} / ${directors}${casts ? ' / ' + casts : ''}`;
|
||||
|
||||
return {
|
||||
layout: 'subject',
|
||||
type_name: typeName,
|
||||
target_id: String(item.id),
|
||||
target: {
|
||||
rating: {
|
||||
count: item.collect_count || 0,
|
||||
max: item.rating?.max || 10,
|
||||
star_count: item.rating?.stars ? parseInt(item.rating.stars) / 10 : 0,
|
||||
value: item.rating?.average || 0
|
||||
},
|
||||
controversy_reason: '',
|
||||
title: item.title,
|
||||
abstract: '',
|
||||
has_linewatch: false,
|
||||
uri: `douban://douban.com/${item.subtype === 'movie' ? 'movie' : 'tv'}/${item.id}`,
|
||||
cover_url: coverUrl,
|
||||
year: String(item.year || ''),
|
||||
card_subtitle: cardSubtitle,
|
||||
id: String(item.id),
|
||||
null_rating_reason: ''
|
||||
},
|
||||
target_type: item.subtype === 'movie' ? 'movie' : 'tv'
|
||||
};
|
||||
}
|
||||
|
||||
async getEpisodes(id) {}
|
||||
|
||||
async handleAnimes(sourceAnimes, queryTitle, curAnimes, detailStore = null) {
|
||||
|
||||
@@ -70,6 +70,13 @@ export async function searchDoubanTitles(keyword, count = 20) {
|
||||
return await doubanApiGet(url);
|
||||
}
|
||||
|
||||
// 使用 豆瓣 公开 API 查询片名
|
||||
export async function searchDoubanTitlesByPublic(keyword, count = 20) {
|
||||
const url = `/movie/search`;
|
||||
const data = { q: keyword, start: 0, count: count };
|
||||
return await doubanApiPost(url, data);
|
||||
}
|
||||
|
||||
// 使用 豆瓣 API 查询详情
|
||||
export async function getDoubanDetail(doubanId) {
|
||||
const url = `/movie/${doubanId}?for_mobile=1`;
|
||||
|
||||
Reference in new issue
Block a user