feat: Add folder title matching and parsing (#2067)

This is a breaking change for users of the [experimental 'folder'
functionality](https://card.camera/#/configuration/folders).

Related: #1748
This commit is contained in:
Dermot Duffy
2025-05-27 07:50:51 -07:00
committed by GitHub
parent c4400194f5
commit c077f8bf70
35 changed files with 1038 additions and 378 deletions
@@ -13,9 +13,7 @@ export const getViewMediaFromBrowseMediaArray = (
);
};
export const getViewItemsFromBrowseMediaArray = <
M extends BrowseMediaMetadata | undefined,
>(
export const getViewItemsFromBrowseMediaArray = <M extends BrowseMediaMetadata>(
browseMedia: RichBrowseMedia<M>[],
options?: ViewMediaSourceOptions,
): ViewItem[] => {
+1 -1
View File
@@ -9,7 +9,7 @@ import {
export class BrowseMediaViewItemFactory {
static create(
browseMedia: RichBrowseMedia<BrowseMediaMetadata | undefined>,
browseMedia: RichBrowseMedia<BrowseMediaMetadata>,
options?: ViewMediaSourceOptions,
): ViewItem | null {
if (browseMedia.can_expand) {
+9 -2
View File
@@ -10,7 +10,7 @@ import {
ViewMediaSourceOptions,
ViewMediaType,
} from '../../view/item';
import { BrowseMedia, BrowseMediaMetadata, RichBrowseMedia } from './types';
import { BrowseMediaMetadata, RichBrowseMedia } from './types';
interface MediaClassBrowserSetting {
icon: string;
@@ -114,12 +114,19 @@ export class BrowseMediaEventViewMedia extends ViewMedia implements EventViewMed
}
export class BrowseMediaViewFolder extends ViewFolder {
constructor(folder: FolderConfig, browseMedia: BrowseMedia) {
private _browseMedia: RichBrowseMedia<BrowseMediaMetadata>;
constructor(folder: FolderConfig, browseMedia: RichBrowseMedia<BrowseMediaMetadata>) {
super(folder, {
id: browseMedia.media_content_id,
icon: getIcon(browseMedia.children_media_class ?? browseMedia.media_class),
title: browseMedia.title,
thumbnail: browseMedia.thumbnail,
});
this._browseMedia = browseMedia;
}
public getBrowseMedia(): RichBrowseMedia<BrowseMediaMetadata> {
return this._browseMedia;
}
}
@@ -1,8 +0,0 @@
import { orderBy } from 'lodash-es';
import { BrowseMediaMetadata, RichBrowseMedia } from './types';
export const sortMediaByStartDate = (
media: RichBrowseMedia<BrowseMediaMetadata>[],
): RichBrowseMedia<BrowseMediaMetadata>[] => {
return orderBy(media, (media) => media._metadata?.startDate, 'desc');
};
+3 -3
View File
@@ -2,9 +2,9 @@ import { z } from 'zod';
import { ExpiringEqualityCache } from '../../cache/expiring-cache';
export interface BrowseMediaMetadata {
cameraID: string;
startDate: Date;
endDate: Date;
cameraID?: string;
startDate?: Date;
endDate?: Date;
what?: string[];
}
// Recursive type, cannot use type interference:
+1 -1
View File
@@ -16,7 +16,7 @@ export const isMediaWithinDates = (
end?: Date,
): boolean => {
// If there's no metadata, nothing matches.
if (!media._metadata) {
if (!media._metadata?.startDate || !media._metadata?.endDate) {
return false;
}