diff --git a/server/src/enrichment/anime-enricher.service.spec.ts b/server/src/enrichment/anime-enricher.service.spec.ts index 9c662c5..11df383 100644 --- a/server/src/enrichment/anime-enricher.service.spec.ts +++ b/server/src/enrichment/anime-enricher.service.spec.ts @@ -60,10 +60,33 @@ describe('AnimeEnricherbService', () => { it('should enrich anime', async () => { const anime: Anime = { ...emptyAnime, - sources: [`${ProviderDomain.Anilist}/1234`], + sources: [ + `${ProviderDomain.Anilist}/1234`, + `${ProviderDomain.MyAnimeList}/12345`, + ], }; const enrichedAnime = await animeEnricherService.enrichAnime(anime); expect(enrichedAnime.description).toEqual('test'); + expect(enrichedAnime.providerMapping).toEqual({ + [Provider.Anilist]: '1234', + [Provider.MyAnimeList]: '12345', + }); + }); + + it('should not enrich anime with existing providerMapping', async () => { + const anime: Anime = { + ...emptyAnime, + sources: [`${ProviderDomain.Anilist}/1234`], + providerMapping: { + [Provider.Anilist]: '1234', + [Provider.AniDB]: '12345', + }, + }; + const enrichedAnime = await animeEnricherService.enrichAnime(anime); + expect(enrichedAnime.providerMapping).toEqual({ + [Provider.Anilist]: '1234', + [Provider.AniDB]: '12345', + }); }); it('should enrich anime with anilist', async () => { @@ -97,7 +120,12 @@ describe('AnimeEnricherbService', () => { const enrichedAnime = await animeEnricherService.enrichAnime(anime, [ Provider.MyAnimeList, ]); - expect(enrichedAnime).toEqual(anime); + expect(enrichedAnime).toEqual({ + ...anime, + providerMapping: { + [Provider.MyAnimeList]: '1234', + }, + }); expect(enrichedAnime.description).toBeUndefined(); }); @@ -121,7 +149,12 @@ describe('AnimeEnricherbService', () => { const enrichedAnime = await animeEnricherService.enrichAnime(anime, [ Provider.AniDB, ]); - expect(enrichedAnime).toEqual(anime); + expect(enrichedAnime).toEqual({ + ...anime, + providerMapping: { + [Provider.AniDB]: '1234', + }, + }); expect(enrichedAnime.description).toBeUndefined(); }); @@ -239,5 +272,13 @@ describe('AnimeEnricherbService', () => { }; expect(animeEnricherService.needsEnrichment(anime)).toBeTruthy(); }); + + it('should return true if the anime has no providerMapping', () => { + const anime: Anime = { + ...emptyAnime, + sources: [`${ProviderDomain.Anilist}/1234`], + }; + expect(animeEnricherService.needsEnrichment(anime)).toBeTruthy(); + }); }); }); diff --git a/server/src/enrichment/anime-enricher.service.ts b/server/src/enrichment/anime-enricher.service.ts index 3a3398b..49c6a84 100644 --- a/server/src/enrichment/anime-enricher.service.ts +++ b/server/src/enrichment/anime-enricher.service.ts @@ -40,6 +40,9 @@ export class AnimeEnricherService { ): Promise { let enrichedAnime = { ...anime }; const providersToUse = providers || getProviders(anime); + + enrichedAnime = this.getProviderMappingEnrichedAnime(enrichedAnime); + if (providersToUse.includes(Provider.Anilist)) { enrichedAnime = await this.getAnilistEnrichedAnime(enrichedAnime); } @@ -56,7 +59,24 @@ export class AnimeEnricherService { } public needsEnrichment(anime: Anime): boolean { - return !anime.description; + return !anime.description || !anime.providerMapping; + } + + private getProviderMappingEnrichedAnime(anime: Anime): Anime { + if (anime.providerMapping) { + return anime; + } + + const providers = getProviders(anime); + + anime.providerMapping = providers.reduce((acc, provider) => { + const providerId = getProviderIdOfAnime(anime, provider); + return { + ...acc, + [provider]: providerId, + }; + }, {}); + return anime; } private async getAnidbEnrichedAnime(anime: Anime): Promise { diff --git a/shared/interfaces/AnimeDb.ts b/shared/interfaces/AnimeDb.ts index 9b51bbb..bbea1c6 100644 --- a/shared/interfaces/AnimeDb.ts +++ b/shared/interfaces/AnimeDb.ts @@ -38,6 +38,9 @@ export interface Anime { tags: string[]; description?: string; provider?: Provider; + providerMapping?: { + [key in Provider]?: string; + }; } export interface AnimeSeason {