Merge pull request #310 from dermotduffy/unmute
Don't autoplay on visibility unless autoplay option is enabled
This commit is contained in:
+18
-10
@@ -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,
|
||||||
@@ -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',
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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,
|
||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
: []),
|
: []),
|
||||||
|
|||||||
Reference in New Issue
Block a user