UNPKG

playable

Version:

Video player based on HTML5Video

100 lines (86 loc) 3.13 kB
import { create, registerModule, registerPlaybackAdapter, IPlayerInstance, PRELOAD_TYPES, } from '..'; import { DEFAULT_URLS, DEFAUTL_CONFIG, MODE_OPTIONS } from './constants'; import { MediaStreamType } from '../constants'; import { StoryProps } from './types'; import Subtitles from '../modules/ui/subtitles/subtitles'; import ChromecastManager from '../modules/chromecast-manager/chromecast-manager'; import ChromecastButton from '../modules/ui/controls/chromecast/chromecast'; import HLSAdapter from '../adapters/hls'; import DASHAdapter from '../adapters/dash'; registerModule('subtitles', Subtitles); registerModule('chromecastManager', ChromecastManager); registerModule('chromecastButton', ChromecastButton); registerPlaybackAdapter(HLSAdapter); registerPlaybackAdapter(DASHAdapter); const processProps = (props: StoryProps, playerInstance: IPlayerInstance) => { const propsToMethod: { [i in keyof StoryProps]: (value: any) => any } = { fillAllSpace: (value: boolean) => playerInstance.setFillAllSpace(value), rtl: (value: boolean) => playerInstance.setRtl(value), width: (value: number) => playerInstance.setWidth(value), height: (value: number) => playerInstance.setHeight(value), videoType: (value: string) => { const type = (value === 'LIVE' ? MediaStreamType.HLS : value === 'MP4-VERTICAL' ? MediaStreamType.MP4 : value) as MediaStreamType; playerInstance.setSrc({ type, url: DEFAULT_URLS[value], }); playerInstance.setTitle(`${value} format`); }, color: (value: string) => playerInstance.updateTheme({ progressColor: value, color: value }), progressBarMode: (value: string) => { if (value === MODE_OPTIONS.REGULAR) { playerInstance.seekOnProgressDrag(); } else if (value === 'PREVIEW') { playerInstance.showPreviewOnProgressDrag(); } }, }; Object.entries(props).forEach( ([propKey, propValue]: [keyof typeof propsToMethod, any]) => { propsToMethod[propKey](propValue); }, ); }; let currentStoryId: string; let prevPlayerProps: StoryProps = {}; let rootContainer: HTMLDivElement; let player: IPlayerInstance; export const createPlayerStory = (storyId: string, playerProps: StoryProps) => { if (storyId !== currentStoryId) { currentStoryId = storyId; prevPlayerProps = {}; rootContainer = document.createElement('div'); player = create({ preload: PRELOAD_TYPES.METADATA, playsinline: true, }); player.showLogo(); player.attachToElement(rootContainer); player.setFramesMap(DEFAUTL_CONFIG); } const updatedProps = Object.keys(playerProps).reduce( (acc, property: keyof StoryProps) => { const newValue = playerProps[property]; const oldValue = prevPlayerProps[property]; if (newValue !== oldValue) { (acc[property] as any) = newValue; } return acc; }, {} as StoryProps, ); processProps(updatedProps, player); prevPlayerProps = { ...playerProps, ...updatedProps }; return { storyContainer: rootContainer, player }; };