feat: Add new casting profile (#1575)
* feat: Add new `casting` profile * Set some additional flags for casting
This commit is contained in:
@@ -14,10 +14,21 @@ the user.
|
|||||||
|
|
||||||
?> Profiles are applied top to bottom. If multiple profiles change a configuration default, then the last one "wins"
|
?> Profiles are applied top to bottom. If multiple profiles change a configuration default, then the last one "wins"
|
||||||
|
|
||||||
| Profile name | Purpose |
|
| Profile name | Purpose |
|
||||||
| ----------------- | -------------------------- |
|
| ----------------- | ---------------------------------------------- |
|
||||||
| `low-performance` | Increase card performance. |
|
| `casting` | Configure the card to be casted. |
|
||||||
| `scrubbing` | Allow media "scrubbing". |
|
| `low-performance` | Configure the card for lower end devices. |
|
||||||
|
| `scrubbing` | Configure the card to allow "video scrubbing". |
|
||||||
|
|
||||||
|
## `casting`
|
||||||
|
|
||||||
|
To aid casting the card to Chromecast devices, the `casting` profile will adjust card defaults to better suit casting. You may wish to combine this the `low-performance` profile below, since Chromecast devices tend to lower performance. To combine, list `low-performance` first, to allow `casting` to take precedence:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
profiles:
|
||||||
|
- low-performance
|
||||||
|
- casting
|
||||||
|
```
|
||||||
|
|
||||||
## `low-performance`
|
## `low-performance`
|
||||||
|
|
||||||
@@ -42,6 +53,7 @@ See the [source code](https://github.com/dermotduffy/frigate-hass-card/blob/dev/
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
profiles:
|
profiles:
|
||||||
|
- casting
|
||||||
- low-performance
|
- low-performance
|
||||||
- scrubbing
|
- scrubbing
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import {
|
||||||
|
CONF_CAMERAS_GLOBAL_IMAGE_REFRESH_SECONDS,
|
||||||
|
CONF_DIMENSIONS_ASPECT_RATIO,
|
||||||
|
CONF_LIVE_AUTO_UNMUTE,
|
||||||
|
CONF_LIVE_CONTROLS_BUILTIN,
|
||||||
|
CONF_LIVE_SHOW_IMAGE_DURING_LOAD,
|
||||||
|
CONF_MEDIA_VIEWER_CONTROLS_BUILTIN,
|
||||||
|
CONF_MENU_STYLE,
|
||||||
|
} from '../../const.js';
|
||||||
|
|
||||||
|
export const CASTING_PROFILE = {
|
||||||
|
[CONF_MENU_STYLE]: 'none' as const,
|
||||||
|
[CONF_LIVE_AUTO_UNMUTE]: ['selected', 'visible'],
|
||||||
|
[CONF_DIMENSIONS_ASPECT_RATIO]: '16:9',
|
||||||
|
[CONF_LIVE_CONTROLS_BUILTIN]: false,
|
||||||
|
[CONF_MEDIA_VIEWER_CONTROLS_BUILTIN]: false,
|
||||||
|
|
||||||
|
// These values are defaults anyway unless another profile (e.g.
|
||||||
|
// low-performance) is also selected, but at pretty important to a good
|
||||||
|
// experience so are reset here.
|
||||||
|
[CONF_CAMERAS_GLOBAL_IMAGE_REFRESH_SECONDS]: 1,
|
||||||
|
[CONF_LIVE_SHOW_IMAGE_DURING_LOAD]: true,
|
||||||
|
};
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
|
import { deepRemoveDefaults } from '../../utils/zod.js';
|
||||||
import { getConfigValue, setConfigValue } from '../management.js';
|
import { getConfigValue, setConfigValue } from '../management.js';
|
||||||
import { ProfileType, RawFrigateCardConfig, frigateCardConfigSchema } from '../types.js';
|
import { ProfileType, RawFrigateCardConfig, frigateCardConfigSchema } from '../types.js';
|
||||||
import { deepRemoveDefaults } from '../../utils/zod.js';
|
import { CASTING_PROFILE } from './casting.js';
|
||||||
import { LOW_PERFORMANCE_PROFILE } from './low-performance.js';
|
import { LOW_PERFORMANCE_PROFILE } from './low-performance.js';
|
||||||
import { SCRUBBING_PROFILE } from './scrubbing.js';
|
import { SCRUBBING_PROFILE } from './scrubbing.js';
|
||||||
|
|
||||||
const PROFILES = {
|
const PROFILES = {
|
||||||
|
casting: CASTING_PROFILE,
|
||||||
'low-performance': LOW_PERFORMANCE_PROFILE,
|
'low-performance': LOW_PERFORMANCE_PROFILE,
|
||||||
scrubbing: SCRUBBING_PROFILE,
|
scrubbing: SCRUBBING_PROFILE,
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-1
@@ -1973,7 +1973,7 @@ export interface CardWideConfig {
|
|||||||
// *************************************************************************
|
// *************************************************************************
|
||||||
// *** Profile Configuration ***
|
// *** Profile Configuration ***
|
||||||
// *************************************************************************
|
// *************************************************************************
|
||||||
const PROFILES = ['low-performance', 'scrubbing'] as const;
|
const PROFILES = ['casting', 'low-performance', 'scrubbing'] as const;
|
||||||
export type ProfileType = (typeof PROFILES)[number];
|
export type ProfileType = (typeof PROFILES)[number];
|
||||||
export const profilesSchema = z.enum(PROFILES).array().optional();
|
export const profilesSchema = z.enum(PROFILES).array().optional();
|
||||||
|
|
||||||
|
|||||||
@@ -611,6 +611,7 @@ export class FrigateCardEditor extends LitElement implements LovelaceCardEditor
|
|||||||
|
|
||||||
protected _profiles: EditorSelectOption[] = [
|
protected _profiles: EditorSelectOption[] = [
|
||||||
{ value: '', label: '' },
|
{ value: '', label: '' },
|
||||||
|
{ value: 'casting', label: localize('config.profiles.casting') },
|
||||||
{ value: 'low-performance', label: localize('config.profiles.low-performance') },
|
{ value: 'low-performance', label: localize('config.profiles.low-performance') },
|
||||||
{ value: 'scrubbing', label: localize('config.profiles.scrubbing') },
|
{ value: 'scrubbing', label: localize('config.profiles.scrubbing') },
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -413,6 +413,7 @@
|
|||||||
"warning": "Aquesta targeta està en mode de perfil baix, de manera que els valors predeterminats han canviat per optimitzar el rendiment"
|
"warning": "Aquesta targeta està en mode de perfil baix, de manera que els valors predeterminats han canviat per optimitzar el rendiment"
|
||||||
},
|
},
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"casting": "",
|
||||||
"editor_label": "",
|
"editor_label": "",
|
||||||
"low-performance": "",
|
"low-performance": "",
|
||||||
"scrubbing": ""
|
"scrubbing": ""
|
||||||
|
|||||||
@@ -413,6 +413,7 @@
|
|||||||
"warning": "This card is in low profile mode so defaults have changed to optimize performance"
|
"warning": "This card is in low profile mode so defaults have changed to optimize performance"
|
||||||
},
|
},
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"casting": "Casting",
|
||||||
"editor_label": "Configuration profiles",
|
"editor_label": "Configuration profiles",
|
||||||
"low-performance": "Low performance",
|
"low-performance": "Low performance",
|
||||||
"scrubbing": "Video scrubbing"
|
"scrubbing": "Video scrubbing"
|
||||||
|
|||||||
@@ -413,6 +413,7 @@
|
|||||||
"warning": "Cette carte est en mode profil bas, les paramètres par défaut ont donc été modifiés pour optimiser les performances."
|
"warning": "Cette carte est en mode profil bas, les paramètres par défaut ont donc été modifiés pour optimiser les performances."
|
||||||
},
|
},
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"casting": "",
|
||||||
"editor_label": "Configuration des profils",
|
"editor_label": "Configuration des profils",
|
||||||
"low-performance": "Basse performance",
|
"low-performance": "Basse performance",
|
||||||
"scrubbing": "Balayage vidéo"
|
"scrubbing": "Balayage vidéo"
|
||||||
|
|||||||
@@ -413,6 +413,7 @@
|
|||||||
"warning": "Questa scheda è in modalità basso profilo, quindi le impostazioni predefinite sono state modificate per ottimizzare le prestazioni"
|
"warning": "Questa scheda è in modalità basso profilo, quindi le impostazioni predefinite sono state modificate per ottimizzare le prestazioni"
|
||||||
},
|
},
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"casting": "",
|
||||||
"editor_label": "",
|
"editor_label": "",
|
||||||
"low-performance": "",
|
"low-performance": "",
|
||||||
"scrubbing": ""
|
"scrubbing": ""
|
||||||
|
|||||||
@@ -413,6 +413,7 @@
|
|||||||
"warning": "Este cartão está no modo de baixo desempenho, então os padrões foram alterados para otimizar o desempenho"
|
"warning": "Este cartão está no modo de baixo desempenho, então os padrões foram alterados para otimizar o desempenho"
|
||||||
},
|
},
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"casting": "",
|
||||||
"editor_label": "",
|
"editor_label": "",
|
||||||
"low-performance": "",
|
"low-performance": "",
|
||||||
"scrubbing": ""
|
"scrubbing": ""
|
||||||
|
|||||||
@@ -413,6 +413,7 @@
|
|||||||
"warning": "Avisos"
|
"warning": "Avisos"
|
||||||
},
|
},
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"casting": "",
|
||||||
"editor_label": "",
|
"editor_label": "",
|
||||||
"low-performance": "",
|
"low-performance": "",
|
||||||
"scrubbing": ""
|
"scrubbing": ""
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { expect, it } from 'vitest';
|
||||||
|
import { setProfiles } from '../../../src/config/profiles';
|
||||||
|
import { frigateCardConfigSchema } from '../../../src/config/types';
|
||||||
|
import { createRawConfig } from '../../test-utils';
|
||||||
|
import { CASTING_PROFILE } from '../../../src/config/profiles/casting';
|
||||||
|
|
||||||
|
it('should contain expected defaults', () => {
|
||||||
|
expect(CASTING_PROFILE).toEqual({
|
||||||
|
'cameras_global.image.refresh_seconds': 1,
|
||||||
|
'dimensions.aspect_ratio': '16:9',
|
||||||
|
'live.auto_unmute': ['selected', 'visible'],
|
||||||
|
'live.controls.builtin': false,
|
||||||
|
'live.show_image_during_load': true,
|
||||||
|
'media_viewer.controls.builtin': false,
|
||||||
|
'menu.style': 'none',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be parseable after application', () => {
|
||||||
|
const rawInputConfig = createRawConfig();
|
||||||
|
const parsedConfig = frigateCardConfigSchema.parse(rawInputConfig);
|
||||||
|
|
||||||
|
setProfiles(rawInputConfig, parsedConfig, ['casting']);
|
||||||
|
|
||||||
|
// Reparse the config to ensure the profile did not introduce errors.
|
||||||
|
const parseResult = frigateCardConfigSchema.safeParse(parsedConfig);
|
||||||
|
expect(parseResult.success, parseResult.error?.toString()).toBeTruthy();
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user