动漫备用源失败时清除默认备用源设置

This commit is contained in:
mtvpls
2026-05-28 21:56:46 +08:00
rodzic 93ea31b546
commit 4b79152fa6
3 zmienionych plików z 60 dodań i 0 usunięć
+6
Wyświetl plik
@@ -3,6 +3,7 @@
import React, { useEffect, useMemo, useRef, useState } from 'react';
import {
clearBangumiImageFallbackCacheIfFailed,
processImageUrl,
tryApplyBangumiImageFallback,
tryApplyDoubanImageFallback,
@@ -65,6 +66,11 @@ const ProxyImage: React.FC<ProxyImageProps> = ({
return;
}
if (clearBangumiImageFallbackCacheIfFailed(img, originalSrc)) {
setCurrentSrc(processImageUrl(originalSrc));
return;
}
if (retryOnError && !img.dataset.retried) {
img.dataset.retried = 'true';
window.setTimeout(() => {
+9
Wyświetl plik
@@ -35,6 +35,7 @@ import {
import { isNetdiskSource } from '@/lib/netdisk/source';
import {
base58Decode,
clearBangumiImageFallbackCacheIfFailed,
getBangumiImageFallbackUrl,
getDoubanImageFallbackUrl,
markBangumiImageFallbackActive,
@@ -981,6 +982,14 @@ const VideoCard = forwardRef<VideoCardHandle, VideoCardProps>(
return;
}
if (
clearBangumiImageFallbackCacheIfFailed(img, actualPoster)
) {
clearBangumiImageTimeout();
setDisplayPoster(processedPoster);
return;
}
// 图片加载失败时的重试机制
if (!img.dataset.retried) {
img.dataset.retried = 'true';
+45
Wyświetl plik
@@ -233,6 +233,47 @@ export function markBangumiImageFallbackActive(): void {
);
}
function normalizeComparableUrl(url: string): string {
if (typeof window === 'undefined') return url;
try {
return new URL(url, window.location.href).href;
} catch {
return url;
}
}
export function clearBangumiImageFallbackCacheIfFailed(
target: HTMLImageElement,
originalUrl: string
): boolean {
if (!originalUrl || !isBangumiImageUrl(originalUrl)) {
return false;
}
const fallbackUrl = getBangumiImageFallbackUrl(originalUrl);
if (!fallbackUrl) {
return false;
}
const normalizedFallbackUrl = normalizeComparableUrl(fallbackUrl);
const failedUrls = [target.currentSrc, target.src]
.filter(Boolean)
.map(normalizeComparableUrl);
const isFallbackFailure =
target.dataset.bangumiBackupTried === 'true' ||
failedUrls.includes(normalizedFallbackUrl);
if (!isFallbackFailure) {
return false;
}
target.dataset.bangumiBackupFailed = 'true';
delete target.dataset.bangumiBackupTried;
clearBangumiImageFallbackCache();
return true;
}
function isBangumiImageFallbackActive(): boolean {
if (typeof window === 'undefined') return false;
@@ -329,6 +370,10 @@ export function tryApplyBangumiImageFallback(
return false;
}
if (target.dataset.bangumiBackupFailed === 'true') {
return false;
}
const fallbackUrl = getBangumiImageFallbackUrl(originalUrl);
if (
!fallbackUrl ||