fix: Allow multiple date parsers to apply at the same folder hierarchy level (#2090)

- For: #1748
This commit is contained in:
Dermot Duffy
2025-06-06 14:30:55 -07:00
committed by GitHub
parent 3d9499ed8c
commit f5918738e4
2 changed files with 43 additions and 3 deletions
@@ -51,8 +51,11 @@ export class MetadataGenerator {
} }
if (parser.type === 'startdate' || parser.type === 'date') { if (parser.type === 'startdate' || parser.type === 'date') {
metadata.startDate = metadata.startDate =
this._parseDate(parser, valueToParse, parent?._metadata?.startDate) ?? this._parseDate(
undefined; parser,
valueToParse,
metadata.startDate ?? parent?._metadata?.startDate,
) ?? undefined;
} }
} }
@@ -83,7 +86,7 @@ export class MetadataGenerator {
if (!Object.keys(result).length) { if (!Object.keys(result).length) {
return undefined; return undefined;
} }
return this._anyDateParser.fromObject({ const candidate = this._anyDateParser.fromObject({
...(base && { ...(base && {
year: base.getFullYear(), year: base.getFullYear(),
month: base.getMonth() + 1, month: base.getMonth() + 1,
@@ -95,5 +98,6 @@ export class MetadataGenerator {
}), }),
...result, ...result,
}); });
return isValidDate(candidate) ? candidate : undefined;
} }
} }
@@ -115,6 +115,19 @@ describe('MetadataGenerator', () => {
).toBeUndefined(); ).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 () => { it('should incorporate parent metadata without a date format', async () => {
const parentBrowseMedia = createRichBrowseMedia({ const parentBrowseMedia = createRichBrowseMedia({
title: '2025-05-26', title: '2025-05-26',
@@ -164,6 +177,29 @@ describe('MetadataGenerator', () => {
).toBeUndefined(); ).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: '-(?<value>\\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 () => { it('should incorporate parent metadata with a date format', async () => {
const parentBrowseMedia = createRichBrowseMedia({ const parentBrowseMedia = createRichBrowseMedia({
title: '2025-05-26', title: '2025-05-26',