diff --git a/src/extractor/Extractor.ts b/src/extractor/Extractor.ts index ba1b8f3..84f111c 100644 --- a/src/extractor/Extractor.ts +++ b/src/extractor/Extractor.ts @@ -32,6 +32,7 @@ export abstract class Extractor { ...urlResult, label: this.formatLabel(urlResult.label ?? this.label), ttl: this.ttl, + }), ); } catch (error) { diff --git a/src/extractor/ExtractorRegistry.test.ts b/src/extractor/ExtractorRegistry.test.ts index 61d2f1f..2f54843 100644 --- a/src/extractor/ExtractorRegistry.test.ts +++ b/src/extractor/ExtractorRegistry.test.ts @@ -49,6 +49,11 @@ describe('ExtractorRegistry', () => { expect(urlResults).toMatchSnapshot(); }); + test('empty results are cached', async () => { + const urlResults = await extractorRegistry.handle(ctx, new URL('https://dropload.io/asdfghijklmn.html'), { title: 'title' }); + expect(urlResults).toMatchSnapshot(); + }); + test('stats returns something', async () => { const stats = extractorRegistry.stats(); diff --git a/src/extractor/ExtractorRegistry.ts b/src/extractor/ExtractorRegistry.ts index 4927535..f273576 100644 --- a/src/extractor/ExtractorRegistry.ts +++ b/src/extractor/ExtractorRegistry.ts @@ -79,17 +79,11 @@ export class ExtractorRegistry { this.logger.info(`Extract ${url} using ${extractor.id} extractor`, ctx); - const urlResults = await extractor.extract( - ctx, - normalizedUrl, - { - ...meta, - ...lazyUrlResults[0]?.meta, - extractorId: meta?.extractorId ?? extractor.id, - }, - ); + const mergedMeta: Meta = { ...meta, ...lazyUrlResults[0]?.meta }; + const urlResults = await extractor.extract(ctx, normalizedUrl, { extractorId: extractor.id, ...mergedMeta }); - if (urlResults.some(urlResult => urlResult.error)) { + if (!Object.keys(mergedMeta).length || urlResults.some(urlResult => urlResult.error)) { + await this.urlResultCache.delete(cacheKey); await this.lazyUrlResultCache.delete(normalizedUrl.href); return urlResults; diff --git a/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap b/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap index 330294e..cc11a1c 100644 --- a/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap +++ b/src/extractor/__snapshots__/ExtractorRegistry.test.ts.snap @@ -1,5 +1,7 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +exports[`ExtractorRegistry empty results are cached 1`] = `[]`; + exports[`ExtractorRegistry returns error result from extractor 1`] = `[]`; exports[`ExtractorRegistry returns external URLs if enabled by config 1`] = ` diff --git a/src/utils/StreamResolver.ts b/src/utils/StreamResolver.ts index d5317c0..0023a6b 100644 --- a/src/utils/StreamResolver.ts +++ b/src/utils/StreamResolver.ts @@ -54,7 +54,7 @@ export class StreamResolver { try { const sourceResults = await source.handle(ctx, type, id); const sourceUrlResults = await Promise.all( - sourceResults.map(({ url, meta }) => this.extractorRegistry.handle(ctx, url, { ...meta, sourceLabel: source.label, sourceId: source.id, priority: source.priority }, true)), + sourceResults.map(({ url, meta }) => this.extractorRegistry.handle(ctx, url, { sourceLabel: source.label, sourceId: source.id, priority: source.priority, ...meta }, true)), ); for (const urlResult of sourceUrlResults.flat()) {