换源集数不一致时清空弹幕缓存
This commit is contained in:
@@ -9,6 +9,7 @@ import { Suspense, useEffect, useRef, useState } from 'react';
|
|||||||
import { getAuthInfoFromBrowserCookie } from '@/lib/auth';
|
import { getAuthInfoFromBrowserCookie } from '@/lib/auth';
|
||||||
import {
|
import {
|
||||||
convertDanmakuFormat,
|
convertDanmakuFormat,
|
||||||
|
clearDanmakuCacheByTitle,
|
||||||
getDanmakuById,
|
getDanmakuById,
|
||||||
getDanmakuFromCache,
|
getDanmakuFromCache,
|
||||||
getEpisodes,
|
getEpisodes,
|
||||||
@@ -4255,6 +4256,17 @@ function PlayPageClient() {
|
|||||||
// 尝试跳转到当前正在播放的集数
|
// 尝试跳转到当前正在播放的集数
|
||||||
let targetIndex = currentEpisodeIndex;
|
let targetIndex = currentEpisodeIndex;
|
||||||
|
|
||||||
|
// 如果新源的集数跟旧源的集数不一致,清除当前剧集的所有弹幕缓存
|
||||||
|
const oldEpisodeCount = detail?.episodes?.length || 0;
|
||||||
|
const newEpisodeCount = newDetail.episodes?.length || 0;
|
||||||
|
if (oldEpisodeCount > 0 && newEpisodeCount > 0 && oldEpisodeCount !== newEpisodeCount) {
|
||||||
|
const titleForCache = detail?.title || videoTitle;
|
||||||
|
console.log(`换源集数不一致 (${oldEpisodeCount} -> ${newEpisodeCount}),清除弹幕缓存: ${titleForCache}`);
|
||||||
|
clearDanmakuCacheByTitle(titleForCache).catch((err) => {
|
||||||
|
console.error('清除弹幕缓存失败:', err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 如果当前集数超出新源的范围,则跳转到第一集
|
// 如果当前集数超出新源的范围,则跳转到第一集
|
||||||
if (!newDetail.episodes || targetIndex >= newDetail.episodes.length) {
|
if (!newDetail.episodes || targetIndex >= newDetail.episodes.length) {
|
||||||
targetIndex = 0;
|
targetIndex = 0;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import {
|
import {
|
||||||
clearAllDanmakuCache,
|
clearAllDanmakuCache,
|
||||||
clearDanmakuCache,
|
clearDanmakuCache,
|
||||||
|
clearDanmakuCacheByTitle,
|
||||||
clearExpiredDanmakuCache,
|
clearExpiredDanmakuCache,
|
||||||
generateCacheKey,
|
generateCacheKey,
|
||||||
getDanmakuCacheStats,
|
getDanmakuCacheStats,
|
||||||
@@ -43,6 +44,7 @@ export function initDanmakuModule(): void {
|
|||||||
export {
|
export {
|
||||||
clearAllDanmakuCache,
|
clearAllDanmakuCache,
|
||||||
clearDanmakuCache,
|
clearDanmakuCache,
|
||||||
|
clearDanmakuCacheByTitle,
|
||||||
clearExpiredDanmakuCache,
|
clearExpiredDanmakuCache,
|
||||||
generateCacheKey,
|
generateCacheKey,
|
||||||
getDanmakuCacheStats,
|
getDanmakuCacheStats,
|
||||||
|
|||||||
@@ -276,6 +276,51 @@ export async function clearDanmakuCache(title: string, episodeIndex: number): Pr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清除指定标题的所有弹幕缓存(所有集数)
|
||||||
|
export async function clearDanmakuCacheByTitle(title: string): Promise<number> {
|
||||||
|
try {
|
||||||
|
const db = await openDB();
|
||||||
|
const transaction = db.transaction([STORE_NAME], 'readwrite');
|
||||||
|
const objectStore = transaction.objectStore(STORE_NAME);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const request = objectStore.openCursor();
|
||||||
|
let deletedCount = 0;
|
||||||
|
|
||||||
|
request.onsuccess = (event) => {
|
||||||
|
const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;
|
||||||
|
|
||||||
|
if (cursor) {
|
||||||
|
const data = cursor.value as DanmakuCacheData;
|
||||||
|
|
||||||
|
if (data.title === title) {
|
||||||
|
cursor.delete();
|
||||||
|
deletedCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor.continue();
|
||||||
|
} else {
|
||||||
|
if (deletedCount > 0) {
|
||||||
|
console.log(`已清除标题"${title}"的 ${deletedCount} 个弹幕缓存`);
|
||||||
|
}
|
||||||
|
resolve(deletedCount);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
request.onerror = () => {
|
||||||
|
reject(new Error('清除弹幕缓存失败'));
|
||||||
|
};
|
||||||
|
|
||||||
|
transaction.oncomplete = () => {
|
||||||
|
db.close();
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('清除弹幕缓存失败:', error);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 清除所有过期缓存
|
// 清除所有过期缓存
|
||||||
export async function clearExpiredDanmakuCache(): Promise<number> {
|
export async function clearExpiredDanmakuCache(): Promise<number> {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user