import { injectable } from 'inversify'; import { Database, getConnection } from '../../core/database'; import { inject } from '../../core/inject'; import { Copy } from '../../entities/library/copy'; import { Language } from '../../entities/library/language'; import { Source } from '../../entities/library/source'; import { Work } from '../../entities/library/work'; import { dateObjectToString } from '../date/date-util'; import type { SourceGetterInterface } from '../source/source-getter-interface'; import { isNhentaiRealLanguage, languageToLangCode, NhentaiRealLanguage } from './nhentai-util'; async function getLanguage(nhentaiLanguageIdentifier: NhentaiRealLanguage): Promise { const { manager } = await getConnection(Database.LIBRARY); return manager.getRepository(Language).findOneOrFail(languageToLangCode[nhentaiLanguageIdentifier]); } @injectable() export class NhentaiSourceGetter implements SourceGetterInterface { private nhentaiApi: NhentaiApiInterface; public constructor(@inject('nhentai-api') nhentaiApi: NhentaiApiInterface) { this.nhentaiApi = nhentaiApi; } public async find(identifier: string): Promise { const gallery = await this.nhentaiApi.getGallery(identifier); const work = new Work(); const copy = new Copy(); const source = new Source(); const { manager } = await getConnection(Database.LIBRARY); source.uri = gallery.url; copy.sources = Promise.resolve([source]); work.nameCanonical = gallery.title.main; if (gallery.uploadTime) { work.releaseDate = dateObjectToString(new Date(gallery.uploadTime)); } if (gallery.languages.length) { const filteredLanguages: NhentaiRealLanguage[] = gallery.languages.filter( (language): language is NhentaiRealLanguage => { if (language === 'translated') { // new transformation of type 'translation' here (source getter needs more abstraction before this can be done elegantly) return false; } else if (isNhentaiRealLanguage(language)) { return true; } return false; } ); work.languages = Promise.all(filteredLanguages.map((language) => getLanguage(language))); } work.copies = Promise.resolve([copy]); await manager.save([work, copy, source]); return work; } }