修复filesystem模式取消下载不删除文件
This commit is contained in:
@@ -304,6 +304,21 @@ export async function DELETE(request: NextRequest) {
|
|||||||
|
|
||||||
const downloader = getDownloader();
|
const downloader = getDownloader();
|
||||||
|
|
||||||
|
// 如果任务正在下载,先标记为取消状态,等待下载停止
|
||||||
|
const downloadPromise = activeDownloads.get(taskId);
|
||||||
|
if (downloadPromise) {
|
||||||
|
// 将任务状态设置为 error,这样下载器会停止下载
|
||||||
|
task.status = 'error';
|
||||||
|
task.errorMessage = '任务已被删除';
|
||||||
|
tasks.set(taskId, task);
|
||||||
|
|
||||||
|
// 从活跃下载列表中移除
|
||||||
|
activeDownloads.delete(taskId);
|
||||||
|
|
||||||
|
// 等待一小段时间,让下载操作有机会停止
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 500));
|
||||||
|
}
|
||||||
|
|
||||||
// 删除文件
|
// 删除文件
|
||||||
await downloader.deleteTask(task);
|
await downloader.deleteTask(task);
|
||||||
|
|
||||||
@@ -311,12 +326,6 @@ export async function DELETE(request: NextRequest) {
|
|||||||
tasks.delete(taskId);
|
tasks.delete(taskId);
|
||||||
saveTasks(); // 持久化任务
|
saveTasks(); // 持久化任务
|
||||||
|
|
||||||
// 如果正在下载,等待下载完成后再删除
|
|
||||||
const downloadPromise = activeDownloads.get(taskId);
|
|
||||||
if (downloadPromise) {
|
|
||||||
activeDownloads.delete(taskId);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NextResponse.json({ message: '任务已删除' });
|
return NextResponse.json({ message: '任务已删除' });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('删除任务失败:', error);
|
console.error('删除任务失败:', error);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ interface DownloadContextType {
|
|||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
startTask: (taskId: string) => void;
|
startTask: (taskId: string) => void;
|
||||||
pauseTask: (taskId: string) => void;
|
pauseTask: (taskId: string) => void;
|
||||||
cancelTask: (taskId: string) => void;
|
cancelTask: (taskId: string) => Promise<void>;
|
||||||
retryFailedSegments: (taskId: string) => void;
|
retryFailedSegments: (taskId: string) => void;
|
||||||
getProgress: (taskId: string) => number;
|
getProgress: (taskId: string) => number;
|
||||||
downloadingCount: number;
|
downloadingCount: number;
|
||||||
@@ -509,8 +509,8 @@ export function DownloadProvider({ children }: { children: React.ReactNode }) {
|
|||||||
startNextPendingTask(downloader);
|
startNextPendingTask(downloader);
|
||||||
}, [downloader, startNextPendingTask]);
|
}, [downloader, startNextPendingTask]);
|
||||||
|
|
||||||
const cancelTask = useCallback((taskId: string) => {
|
const cancelTask = useCallback(async (taskId: string) => {
|
||||||
downloader.cancelTask(taskId);
|
await downloader.cancelTask(taskId);
|
||||||
setTasks(downloader.getAllTasks());
|
setTasks(downloader.getAllTasks());
|
||||||
// 保存任务状态到 IndexedDB(删除被取消的任务)
|
// 保存任务状态到 IndexedDB(删除被取消的任务)
|
||||||
saveTasks(downloader.getAllTasks());
|
saveTasks(downloader.getAllTasks());
|
||||||
|
|||||||
@@ -241,11 +241,17 @@ export class M3U8Downloader {
|
|||||||
/**
|
/**
|
||||||
* 取消任务
|
* 取消任务
|
||||||
*/
|
*/
|
||||||
cancelTask(taskId: string): void {
|
async cancelTask(taskId: string): Promise<void> {
|
||||||
const task = this.tasks.get(taskId);
|
const task = this.tasks.get(taskId);
|
||||||
if (!task) return;
|
if (!task) return;
|
||||||
|
|
||||||
this.abortRequests(task);
|
this.abortRequests(task);
|
||||||
|
|
||||||
|
// 如果是 filesystem 模式且任务未完成,删除已下载的文件
|
||||||
|
if (task.downloadMode === 'filesystem' && task.status !== 'done' && task.filesystemDirHandle) {
|
||||||
|
await this.deleteFilesystemTask(task);
|
||||||
|
}
|
||||||
|
|
||||||
this.tasks.delete(taskId);
|
this.tasks.delete(taskId);
|
||||||
|
|
||||||
if (this.currentTask?.id === taskId) {
|
if (this.currentTask?.id === taskId) {
|
||||||
@@ -253,6 +259,30 @@ export class M3U8Downloader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除 filesystem 模式下的任务文件
|
||||||
|
*/
|
||||||
|
private async deleteFilesystemTask(task: M3U8DownloadTask): Promise<void> {
|
||||||
|
if (!task.filesystemDirHandle || !task.source || !task.videoId || task.episodeIndex === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 获取目标目录
|
||||||
|
const sourceDirHandle = await task.filesystemDirHandle.getDirectoryHandle(task.source, { create: false });
|
||||||
|
const videoIdDirHandle = await sourceDirHandle.getDirectoryHandle(task.videoId, { create: false });
|
||||||
|
|
||||||
|
// 删除 ep{n} 目录
|
||||||
|
const epDirName = `ep${task.episodeIndex + 1}`;
|
||||||
|
await videoIdDirHandle.removeEntry(epDirName, { recursive: true });
|
||||||
|
|
||||||
|
console.log(`已删除未完成的下载文件: ${task.source}/${task.videoId}/${epDirName}`);
|
||||||
|
} catch (error) {
|
||||||
|
// 如果目录不存在或删除失败,忽略错误
|
||||||
|
console.warn('删除文件失败(可能目录不存在):', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取任务信息
|
* 获取任务信息
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user