From f5918738e44e97bde786bf541d846587e789d584 Mon Sep 17 00:00:00 2001 From: Dermot Duffy Date: Fri, 6 Jun 2025 14:30:55 -0700 Subject: [PATCH] fix: Allow multiple date parsers to apply at the same folder hierarchy level (#2090) - For: #1748 --- .../folders/ha/metadata-generator.ts | 10 ++++-- .../folders/ha/metadata-generator.test.ts | 36 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/card-controller/folders/ha/metadata-generator.ts b/src/card-controller/folders/ha/metadata-generator.ts index dc322712..e3ed0e7e 100644 --- a/src/card-controller/folders/ha/metadata-generator.ts +++ b/src/card-controller/folders/ha/metadata-generator.ts @@ -51,8 +51,11 @@ export class MetadataGenerator { } if (parser.type === 'startdate' || parser.type === 'date') { metadata.startDate = - this._parseDate(parser, valueToParse, parent?._metadata?.startDate) ?? - undefined; + this._parseDate( + parser, + valueToParse, + metadata.startDate ?? parent?._metadata?.startDate, + ) ?? undefined; } } @@ -83,7 +86,7 @@ export class MetadataGenerator { if (!Object.keys(result).length) { return undefined; } - return this._anyDateParser.fromObject({ + const candidate = this._anyDateParser.fromObject({ ...(base && { year: base.getFullYear(), month: base.getMonth() + 1, @@ -95,5 +98,6 @@ export class MetadataGenerator { }), ...result, }); + return isValidDate(candidate) ? candidate : undefined; } } diff --git a/tests/card-controller/folders/ha/metadata-generator.test.ts b/tests/card-controller/folders/ha/metadata-generator.test.ts index 75c810ff..83c41db9 100644 --- a/tests/card-controller/folders/ha/metadata-generator.test.ts +++ b/tests/card-controller/folders/ha/metadata-generator.test.ts @@ -115,6 +115,19 @@ describe('MetadataGenerator', () => { ).toBeUndefined(); }); + it('should fail to generate start date with invalid date', async () => { + const badBrowseMedia = createBrowseMedia({ + title: '20250507AM', + }); + const generator = new MetadataGenerator(); + await generator.prepare([formatlessDateParser]); + + expect( + generator.generate(badBrowseMedia, undefined, [formatlessDateParser]) + ?.startDate, + ).toBeUndefined(); + }); + it('should incorporate parent metadata without a date format', async () => { const parentBrowseMedia = createRichBrowseMedia({ title: '2025-05-26', @@ -164,6 +177,29 @@ describe('MetadataGenerator', () => { ).toBeUndefined(); }); + it('should use multiple parsed dates together', async () => { + const browseMedia = createBrowseMedia({ + title: 'Foscam C1-20250507-171758-1746631078004-3.mp4', + }); + const parsers: Parser[] = [ + { + type: 'date', + regexp: '\\d{8}', + }, + { + type: 'date', + regexp: '-(?\\d{6})-', + format: 'HHmmss', + }, + ]; + const generator = new MetadataGenerator(); + await generator.prepare(parsers); + + expect(generator.generate(browseMedia, undefined, parsers)?.startDate).toEqual( + new Date('2025-05-07T17:17:58.000Z'), + ); + }); + it('should incorporate parent metadata with a date format', async () => { const parentBrowseMedia = createRichBrowseMedia({ title: '2025-05-26',