douban源搜索接口增加公开api兜底

This commit is contained in:
huangxd- committed 2026-04-18 11:58:44 +08:00
1 parent 59fff265cd
commit 028835c2c4
3 files changed
+78 -4

No files matched your search

+1 -1
View File
@@ -13,7 +13,7 @@ export const Globals = {
accessedEnvVars: {},
// 静态常量
VERSION: '1.18.7',
VERSION: '1.18.8',
MAX_LOGS: 1000, // 日志存储,最多保存 1000 行
MAX_RECORDS: 100, // 请求记录最大数量
+70 -3
View File
@@ -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) {
+7
View File
@@ -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`;