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

This commit is contained in:
mtvpls
2026-05-28 21:56:46 +08:00
parent 93ea31b546
commit 4b79152fa6
3 changed files with 60 additions and 0 deletions
+6
View File
@@ -3,6 +3,7 @@
import React, { useEffect, useMemo, useRef, useState } from 'react'; import React, { useEffect, useMemo, useRef, useState } from 'react';
import { import {
clearBangumiImageFallbackCacheIfFailed,
processImageUrl, processImageUrl,
tryApplyBangumiImageFallback, tryApplyBangumiImageFallback,
tryApplyDoubanImageFallback, tryApplyDoubanImageFallback,
@@ -65,6 +66,11 @@ const ProxyImage: React.FC<ProxyImageProps> = ({
return; return;
} }
if (clearBangumiImageFallbackCacheIfFailed(img, originalSrc)) {
setCurrentSrc(processImageUrl(originalSrc));
return;
}
if (retryOnError && !img.dataset.retried) { if (retryOnError && !img.dataset.retried) {
img.dataset.retried = 'true'; img.dataset.retried = 'true';
window.setTimeout(() => { window.setTimeout(() => {
+9
View File
@@ -35,6 +35,7 @@ import {
import { isNetdiskSource } from '@/lib/netdisk/source'; import { isNetdiskSource } from '@/lib/netdisk/source';
import { import {
base58Decode, base58Decode,
clearBangumiImageFallbackCacheIfFailed,
getBangumiImageFallbackUrl, getBangumiImageFallbackUrl,
getDoubanImageFallbackUrl, getDoubanImageFallbackUrl,
markBangumiImageFallbackActive, markBangumiImageFallbackActive,
@@ -981,6 +982,14 @@ const VideoCard = forwardRef<VideoCardHandle, VideoCardProps>(
return; return;
} }
if (
clearBangumiImageFallbackCacheIfFailed(img, actualPoster)
) {
clearBangumiImageTimeout();
setDisplayPoster(processedPoster);
return;
}
// 图片加载失败时的重试机制 // 图片加载失败时的重试机制
if (!img.dataset.retried) { if (!img.dataset.retried) {
img.dataset.retried = 'true'; img.dataset.retried = 'true';
+45
View File
@@ -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 { function isBangumiImageFallbackActive(): boolean {
if (typeof window === 'undefined') return false; if (typeof window === 'undefined') return false;
@@ -329,6 +370,10 @@ export function tryApplyBangumiImageFallback(
return false; return false;
} }
if (target.dataset.bangumiBackupFailed === 'true') {
return false;
}
const fallbackUrl = getBangumiImageFallbackUrl(originalUrl); const fallbackUrl = getBangumiImageFallbackUrl(originalUrl);
if ( if (
!fallbackUrl || !fallbackUrl ||