(''); // 当前数据源
const touchStartX = useRef(0);
const touchEndX = useRef(0);
const isManualChange = useRef(false); // 标记是否为手动切换
@@ -45,14 +49,29 @@ export default function BannerCarousel({ autoPlayInterval = 5000 }: BannerCarous
// 获取图片URL(处理TX完整URL和TMDB路径)
const getImageUrl = (path: string | null) => {
if (!path) return '';
- // 如果是完整URL(TX数据源),直接返回
+ // 如果是完整URL(TX数据源或豆瓣),需要判断是否需要代理
if (path.startsWith('http://') || path.startsWith('https://')) {
+ // 豆瓣图片需要通过代理
+ if (path.includes('doubanio.com')) {
+ return processImageUrl(path);
+ }
+ // TX等其他完整URL直接返回
return path;
}
// 否则使用TMDB的URL拼接
return getTMDBImageUrl(path, 'original');
};
+ // 获取视频URL(处理豆瓣视频代理)
+ const getVideoUrl = (url: string | null) => {
+ if (!url) return null;
+ // 豆瓣视频需要通过域名替换代理
+ if (url.includes('doubanio.com')) {
+ return processVideoUrl(url);
+ }
+ return url;
+ };
+
// 读取本地设置
useEffect(() => {
const setting = localStorage.getItem('enableTrailers');
@@ -61,10 +80,10 @@ export default function BannerCarousel({ autoPlayInterval = 5000 }: BannerCarous
}
}, []);
- // 检测YouTube连通性 - 仅在启用预告片时检测
+ // 检测YouTube连通性 - 仅在启用预告片且数据源为TMDB时检测
useEffect(() => {
- // 如果未启用预告片,不进行检测
- if (!enableTrailers) {
+ // 如果未启用预告片或数据源不是TMDB,不进行检测
+ if (!enableTrailers || dataSource !== 'TMDB') {
setIsYouTubeAccessible(false);
return;
}
@@ -91,14 +110,14 @@ export default function BannerCarousel({ autoPlayInterval = 5000 }: BannerCarous
};
checkYouTubeAccess();
- }, [enableTrailers]);
+ }, [enableTrailers, dataSource]);
// 获取热门内容
useEffect(() => {
const fetchTrending = async () => {
try {
// 先尝试从所有可能的数据源缓存中读取
- const sources = ['TMDB', 'TX'];
+ const sources = ['TMDB', 'TX', 'Douban'];
let cachedData = null;
let validSource = null;
@@ -126,6 +145,7 @@ export default function BannerCarousel({ autoPlayInterval = 5000 }: BannerCarous
// 如果有有效的缓存,直接使用,不请求API
if (cachedData) {
setItems(cachedData);
+ setDataSource(validSource || ''); // 设置数据源
setIsLoading(false);
return;
}
@@ -139,6 +159,7 @@ export default function BannerCarousel({ autoPlayInterval = 5000 }: BannerCarous
const cacheKey = getLocalStorageKey(dataSource);
setItems(result.list);
+ setDataSource(dataSource); // 设置数据源
// 保存到 localStorage(使用数据源特定的key)
try {
@@ -285,7 +306,20 @@ export default function BannerCarousel({ autoPlayInterval = 5000 }: BannerCarous
index === currentIndex ? 'opacity-100' : 'opacity-0'
}`}
>
- {item.video_key && isYouTubeAccessible && enableTrailers ? (
+ {item.trailer_url && enableTrailers ? (
+ /* 显示豆瓣直链视频 */
+
+
+
+ ) : item.video_key && isYouTubeAccessible && enableTrailers ? (
/* 显示YouTube视频 */