Don't autoplay on visibility unless autoplay is enabled.

This commit is contained in:
Dermot Duffy
2022-01-31 20:12:48 -08:00
parent 26ada48c59
commit f46a15d76e
4 changed files with 26 additions and 17 deletions
@@ -1,19 +1,27 @@
import { EmblaCarouselType, EmblaPluginType } from 'embla-carousel'; import { EmblaCarouselType, EmblaPluginType } from 'embla-carousel';
import { FrigateCardMediaPlayer } from '../../types.js'; import { FrigateCardMediaPlayer } from '../../types.js';
export type MediaAutoPlayPauseOptionsType = { export type AutoMediaPluginOptionsType = {
playerSelector: string; playerSelector: string;
autoplayWhenVisible?: boolean;
}; };
export const defaultOptions: Partial<MediaAutoPlayPauseOptionsType> = {}; export const defaultOptions: Partial<AutoMediaPluginOptionsType> = {
autoplayWhenVisible: true,
};
export type MediaAutoPlayPauseType = EmblaPluginType<MediaAutoPlayPauseOptionsType> & { export type AutoMediaPluginType = EmblaPluginType<AutoMediaPluginOptionsType> & {
play: () => void; play: () => void;
} }
export function MediaAutoPlayPause( /**
userOptions?: MediaAutoPlayPauseOptionsType, * An Embla plugin to take automated actions on media (e.g. pause, unmute, etc).
): MediaAutoPlayPauseType { * @param userOptions
* @returns
*/
export function AutoMediaPlugin(
userOptions?: AutoMediaPluginOptionsType,
): AutoMediaPluginType {
const options = Object.assign({}, defaultOptions, userOptions); const options = Object.assign({}, defaultOptions, userOptions);
let carousel: EmblaCarouselType; let carousel: EmblaCarouselType;
@@ -50,7 +58,7 @@ export function MediaAutoPlayPause(
function visibilityHandler(): void { function visibilityHandler(): void {
if (document.visibilityState == 'hidden') { if (document.visibilityState == 'hidden') {
pause(); pause();
} else if (document.visibilityState == 'visible') { } else if (document.visibilityState == 'visible' && options.autoplayWhenVisible) {
play(); play();
} }
} }
@@ -65,7 +73,7 @@ export function MediaAutoPlayPause(
} }
/** /**
* Pause all clips. * Pause all slides.
*/ */
function pauseAllHandler(): void { function pauseAllHandler(): void {
slides.forEach((slide) => getPlayer(slide)?.pause()); slides.forEach((slide) => getPlayer(slide)?.pause());
@@ -92,8 +100,8 @@ export function MediaAutoPlayPause(
getPlayer(slides[carousel.previousScrollSnap()])?.pause(); getPlayer(slides[carousel.previousScrollSnap()])?.pause();
} }
const self: MediaAutoPlayPauseType = { const self: AutoMediaPluginType = {
name: 'MediaAutoPlayPause', name: 'AutoMediaPlugin',
options, options,
init, init,
destroy, destroy,
+2 -2
View File
@@ -27,12 +27,12 @@ import { Task } from '@lit-labs/task';
import { customElement, property, state } from 'lit/decorators.js'; import { customElement, property, state } from 'lit/decorators.js';
import { until } from 'lit/directives/until.js'; import { until } from 'lit/directives/until.js';
import { AutoMediaPlugin } from './embla-plugins/automedia.js';
import { BrowseMediaUtil } from '../browse-media-util.js'; import { BrowseMediaUtil } from '../browse-media-util.js';
import { ConditionState, getOverriddenConfig } from '../card-condition.js'; import { ConditionState, getOverriddenConfig } from '../card-condition.js';
import { FrigateCardMediaCarousel } from './media-carousel.js'; import { FrigateCardMediaCarousel } from './media-carousel.js';
import { FrigateCardNextPreviousControl } from './next-prev-control.js'; import { FrigateCardNextPreviousControl } from './next-prev-control.js';
import { Lazyload } from './embla-plugins/lazyload.js'; import { Lazyload } from './embla-plugins/lazyload.js';
import { MediaAutoPlayPause } from './embla-plugins/media-autoplay.js';
import { ThumbnailCarouselTap } from './thumbnail-carousel.js'; import { ThumbnailCarouselTap } from './thumbnail-carousel.js';
import { View } from '../view.js'; import { View } from '../view.js';
import { localize } from '../localize/localize.js'; import { localize } from '../localize/localize.js';
@@ -308,7 +308,7 @@ export class FrigateCardLiveCarousel extends FrigateCardMediaCarousel {
? (...args) => this._lazyloadOrUnloadSlide('unload', ...args) ? (...args) => this._lazyloadOrUnloadSlide('unload', ...args)
: undefined, : undefined,
}), }),
MediaAutoPlayPause({ AutoMediaPlugin({
playerSelector: 'frigate-card-live-provider', playerSelector: 'frigate-card-live-provider',
}), }),
]; ];
+2 -2
View File
@@ -16,7 +16,7 @@ import mediaCarouselStyle from '../scss/media-carousel.scss';
import { FrigateCardNextPreviousControl } from './next-prev-control.js'; import { FrigateCardNextPreviousControl } from './next-prev-control.js';
import { FrigateCardTitleControl } from './title-control.js'; import { FrigateCardTitleControl } from './title-control.js';
import { MediaAutoPlayPauseType } from './embla-plugins/media-autoplay.js'; import { AutoMediaPluginType } from './embla-plugins/automedia.js';
const getEmptyImageSrc = (width: number, height: number) => const getEmptyImageSrc = (width: number, height: number) =>
`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}"%3E%3C/svg%3E`; `data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}"%3E%3C/svg%3E`;
@@ -35,7 +35,7 @@ export class FrigateCardMediaCarousel extends FrigateCardCarousel {
* autoplay should happen. * autoplay should happen.
*/ */
protected _autoplayHandler(): void { protected _autoplayHandler(): void {
(this._plugins['MediaAutoPlayPause'] as MediaAutoPlayPauseType | undefined)?.play(); (this._plugins['MediaAutoPlayPause'] as AutoMediaPluginType | undefined)?.play();
} }
/** /**
+3 -2
View File
@@ -14,6 +14,7 @@ import { createRef, Ref, ref } from 'lit/directives/ref.js';
import { customElement, property } from 'lit/decorators.js'; import { customElement, property } from 'lit/decorators.js';
import { ifDefined } from 'lit/directives/if-defined.js'; import { ifDefined } from 'lit/directives/if-defined.js';
import { AutoMediaPlugin } from './embla-plugins/automedia.js';
import type { import type {
BrowseMediaNeighbors, BrowseMediaNeighbors,
BrowseMediaQueryParameters, BrowseMediaQueryParameters,
@@ -29,7 +30,6 @@ import {
FrigateCardThumbnailCarousel, FrigateCardThumbnailCarousel,
ThumbnailCarouselTap, ThumbnailCarouselTap,
} from './thumbnail-carousel.js'; } from './thumbnail-carousel.js';
import { MediaAutoPlayPause } from './embla-plugins/media-autoplay.js';
import { Lazyload, LazyloadType } from './embla-plugins/lazyload.js'; import { Lazyload, LazyloadType } from './embla-plugins/lazyload.js';
import { ResolvedMediaCache, ResolvedMediaUtil } from '../resolved-media.js'; import { ResolvedMediaCache, ResolvedMediaUtil } from '../resolved-media.js';
import { View } from '../view.js'; import { View } from '../view.js';
@@ -320,8 +320,9 @@ export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel {
// Don't need autoplay/pause for snapshots. // Don't need autoplay/pause for snapshots.
...(this.view?.is('clip') ...(this.view?.is('clip')
? [ ? [
MediaAutoPlayPause({ AutoMediaPlugin({
playerSelector: 'frigate-card-ha-hls-player', playerSelector: 'frigate-card-ha-hls-player',
autoplayWhenVisible: !!this.viewerConfig?.autoplay_clip,
}), }),
] ]
: []), : []),