refactor: implement safe download method for url app window
This commit is contained in:
parent
02df7e739a
commit
72bac8e06a
|
@ -2,5 +2,7 @@ import { LoadURLOptions } from 'electron';
|
||||||
import { IAppWindow } from './i-app-window';
|
import { IAppWindow } from './i-app-window';
|
||||||
|
|
||||||
export interface IUrlAppWindow extends IAppWindow {
|
export interface IUrlAppWindow extends IAppWindow {
|
||||||
|
downloadUrlSafe(url: string, savePath: string, options?: LoadURLOptions): Promise<void>;
|
||||||
|
|
||||||
loadUrlSafe(url: string, options?: LoadURLOptions): Promise<void>;
|
loadUrlSafe(url: string, options?: LoadURLOptions): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,33 @@ export abstract class UrlAppWindow extends AppWindow implements IUrlAppWindow {
|
||||||
this.loadOptions = loadOptions;
|
this.loadOptions = loadOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public downloadUrlSafe(url: string, savePath: string, options?: LoadURLOptions): Promise<void> {
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
|
if (!this._window) {
|
||||||
|
throw new WindowClosedError();
|
||||||
|
}
|
||||||
|
this._window.webContents.session.once('will-download', (event, item) => {
|
||||||
|
item.setSavePath(savePath);
|
||||||
|
item.once('done', (doneEvent, state) => {
|
||||||
|
switch (state) {
|
||||||
|
case 'completed':
|
||||||
|
resolve();
|
||||||
|
break;
|
||||||
|
case 'cancelled':
|
||||||
|
case 'interrupted':
|
||||||
|
default:
|
||||||
|
reject(new Error(state));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
item.on('updated', () => {
|
||||||
|
item.resume();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
void this.loadUrlSafe(url, options);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public async loadUrlSafe(url: string, options?: LoadURLOptions): Promise<void> {
|
public async loadUrlSafe(url: string, options?: LoadURLOptions): Promise<void> {
|
||||||
if (!this._window) {
|
if (!this._window) {
|
||||||
throw new WindowClosedError();
|
throw new WindowClosedError();
|
||||||
|
|
|
@ -190,30 +190,7 @@ export class NhentaiAppWindow extends UrlAppWindow implements INhentaiAppWindow
|
||||||
const downloadLink: string = (await this._window.webContents.executeJavaScript(
|
const downloadLink: string = (await this._window.webContents.executeJavaScript(
|
||||||
`document.getElementById('${downloadLinkId}').href`
|
`document.getElementById('${downloadLinkId}').href`
|
||||||
)) as string;
|
)) as string;
|
||||||
await new Promise<void>((resolve, reject) => {
|
await this.downloadUrlSafe(downloadLink, filePath);
|
||||||
if (!this._window) {
|
|
||||||
throw new WindowClosedError();
|
|
||||||
}
|
|
||||||
this._window.webContents.session.once('will-download', (event, item) => {
|
|
||||||
item.setSavePath(filePath);
|
|
||||||
item.once('done', (doneEvent, state) => {
|
|
||||||
switch (state) {
|
|
||||||
case 'completed':
|
|
||||||
resolve();
|
|
||||||
break;
|
|
||||||
case 'cancelled':
|
|
||||||
case 'interrupted':
|
|
||||||
default:
|
|
||||||
reject(new Error(state));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
item.on('updated', () => {
|
|
||||||
item.resume();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
void this.loadUrlSafe(downloadLink);
|
|
||||||
});
|
|
||||||
|
|
||||||
const readable = createReadStream(filePath, { emitClose: true });
|
const readable = createReadStream(filePath, { emitClose: true });
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue