Skeleton live carousel.
This commit is contained in:
+51
-11
@@ -1,11 +1,17 @@
|
||||
import type { BrowseMediaQueryParameters, BrowseMediaSource, ExtendedHomeAssistant } from './types.js';
|
||||
import type {
|
||||
BrowseMediaQueryParameters,
|
||||
BrowseMediaSource,
|
||||
CameraConfig,
|
||||
ExtendedHomeAssistant,
|
||||
} from './types.js';
|
||||
import { HomeAssistant } from 'custom-card-helpers';
|
||||
import { homeAssistantWSRequest } from './common.js';
|
||||
import { browseMediaSourceSchema } from './types.js';
|
||||
|
||||
import dayjs from 'dayjs';
|
||||
import dayjs_custom_parse_format from 'dayjs/plugin/customParseFormat.js';
|
||||
|
||||
import { View } from './view.js';
|
||||
|
||||
dayjs.extend(dayjs_custom_parse_format);
|
||||
|
||||
export class BrowseMediaUtil {
|
||||
@@ -16,7 +22,8 @@ export class BrowseMediaUtil {
|
||||
*/
|
||||
static extractEventID(media: BrowseMediaSource): string | null {
|
||||
const result = media.media_content_id.match(
|
||||
/^media-source:\/\/frigate\/.*\/(?<id>[.0-9]+-[a-zA-Z0-9]+)$/);
|
||||
/^media-source:\/\/frigate\/.*\/(?<id>[.0-9]+-[a-zA-Z0-9]+)$/,
|
||||
);
|
||||
return result && result.groups ? result.groups['id'] : null;
|
||||
}
|
||||
|
||||
@@ -25,9 +32,7 @@ export class BrowseMediaUtil {
|
||||
* @param browseMedia The media object to extract the start time from.
|
||||
* @returns The start time in unix/epoch time, or null if it cannot be determined.
|
||||
*/
|
||||
static extractEventStartTime(
|
||||
browseMedia: BrowseMediaSource,
|
||||
): number | null {
|
||||
static extractEventStartTime(browseMedia: BrowseMediaSource): number | null {
|
||||
// Example: 2021-08-27 20:57:22 [10s, Person 76%]
|
||||
const result = browseMedia.title.match(/^(?<iso_datetime>.+) \[/);
|
||||
if (result && result.groups) {
|
||||
@@ -57,16 +62,14 @@ export class BrowseMediaUtil {
|
||||
* @param media The media object with children.
|
||||
* @returns The first true media item found.
|
||||
*/
|
||||
static getFirstTrueMediaChildIndex(
|
||||
media: BrowseMediaSource | null,
|
||||
): number | null {
|
||||
static getFirstTrueMediaChildIndex(media: BrowseMediaSource | null): number | null {
|
||||
if (!media || !media.children) {
|
||||
return null;
|
||||
}
|
||||
const index = media.children.findIndex((child) => this.isTrueMedia(child));
|
||||
return index >= 0 ? index : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Browse Frigate media with a media content id. May throw.
|
||||
* @param hass The HomeAssistant object.
|
||||
@@ -86,7 +89,7 @@ export class BrowseMediaUtil {
|
||||
};
|
||||
return homeAssistantWSRequest(hass, browseMediaSourceSchema, request);
|
||||
}
|
||||
|
||||
|
||||
// Browse Frigate media with query parameters.
|
||||
|
||||
/**
|
||||
@@ -117,4 +120,41 @@ export class BrowseMediaUtil {
|
||||
].join('/'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parameters to search for media.
|
||||
* @returns A BrowseMediaQueryParameters object.
|
||||
*/
|
||||
static getBrowseMediaQueryParameters(
|
||||
mediaType: 'clips' | 'snapshots',
|
||||
cameraConfig?: CameraConfig,
|
||||
): BrowseMediaQueryParameters | undefined {
|
||||
if (!cameraConfig || !cameraConfig.camera_name) {
|
||||
return undefined;
|
||||
}
|
||||
return {
|
||||
mediaType: mediaType,
|
||||
clientId: cameraConfig.client_id,
|
||||
cameraName: cameraConfig.camera_name,
|
||||
label: cameraConfig.label,
|
||||
zone: cameraConfig.zone,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parameters to search for media related to the current view.
|
||||
* @returns A BrowseMediaQueryParameters object.
|
||||
*/
|
||||
static getBrowseMediaQueryParametersFromView(
|
||||
view: View,
|
||||
cameraConfig: CameraConfig,
|
||||
): BrowseMediaQueryParameters | undefined {
|
||||
if (!view.isClipRelatedView() && !view.isSnapshotRelatedView()) {
|
||||
return undefined;
|
||||
}
|
||||
return BrowseMediaUtil.getBrowseMediaQueryParameters(
|
||||
view.isClipRelatedView() ? 'clips' : 'snapshots',
|
||||
cameraConfig,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user