RenaiApp/src/main/modules/nhentai/nhentai-ipc-controller.ts

52 lines
1.7 KiB
TypeScript
Raw Normal View History

import path from 'path';
import { createWriteStream } from 'fs-extra';
import { container } from '../../core/container';
import { IDialog } from '../dialog/i-dialog';
import { II18nTranslator } from '../i18n/i-i18n-translator';
import { answer } from '../ipc/annotations/answer';
import { INhentaiApi } from './i-nhentai-api';
import { IFavorite } from './nhentai';
export class NhentaiIpcController implements IIpcController {
private readonly nhentaiApi: INhentaiApi;
private readonly translator: II18nTranslator;
private readonly dialog: IDialog;
private constructor(nhentaiApi: INhentaiApi, translator: II18nTranslator, dialog: IDialog) {
this.nhentaiApi = nhentaiApi;
this.translator = translator;
this.dialog = dialog;
}
@answer(IpcChannel.NHENTAI_SAVE_FAVORITES)
public async nhentaiSaveFavorites(): Promise<void> {
const result = await this.dialog.selectFolder({
title: this.translator.t('Select torrent file save location'),
});
if (result.canceled) {
return;
}
const favoritesStream = await this.nhentaiApi.getFavorites();
return new Promise((resolve) => {
favoritesStream.on('data', (favorite: IFavorite) => {
const writable = createWriteStream(path.resolve(result.filePaths[0], favorite.name));
favorite.torrentFile.pipe(writable);
});
favoritesStream.once('end', resolve);
});
}
public get(): NhentaiIpcController {
const nhentaiApi: INhentaiApi = container.get('nhentai-api');
const translator: II18nTranslator = container.get('i18n-translator');
const dialog: IDialog = container.get('dialog');
return new NhentaiIpcController(nhentaiApi, translator, dialog);
}
}