You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
6.1 KiB
226 lines
6.1 KiB
import { Loader } from 'features/Loader'
|
|
import { VolumeBar } from 'features/StreamPlayer/components/VolumeBar'
|
|
import {
|
|
PlayerWrapper,
|
|
Controls,
|
|
ControlsRow,
|
|
ControlsGroup,
|
|
CenterControls,
|
|
PlayStop,
|
|
Fullscreen,
|
|
LoaderWrapper,
|
|
Backward,
|
|
Forward,
|
|
PlaybackTime,
|
|
ControlsGradient,
|
|
} from 'features/StreamPlayer/styled'
|
|
import { VideoPlayer } from 'features/VideoPlayer'
|
|
|
|
import { secondsToHms } from 'helpers'
|
|
|
|
import { isMobileDevice } from 'config/userAgent'
|
|
import { HOUR_IN_MILLISECONDS, REWIND_SECONDS } from './config'
|
|
|
|
import { ProgressBar } from './components/ProgressBar'
|
|
import { Settings } from './components/Settings'
|
|
|
|
import type { Props } from './hooks'
|
|
import { useMultiSourcePlayer } from './hooks'
|
|
import { Players } from './types'
|
|
import {
|
|
ChaptersText,
|
|
Next,
|
|
Prev,
|
|
} from './styled'
|
|
|
|
export const MultiSourcePlayer = (props: Props) => {
|
|
const {
|
|
activeChapterIndex,
|
|
activePlayer,
|
|
activeSrc,
|
|
allPlayedProgress,
|
|
chapters,
|
|
controlsVisible,
|
|
duration,
|
|
isFirstChapterPlaying,
|
|
isFullscreen,
|
|
isLastChapterPlaying,
|
|
loadedProgress,
|
|
muted,
|
|
nextSrc,
|
|
numberOfChapters,
|
|
onEnded,
|
|
onError,
|
|
onFullscreenClick,
|
|
onLoadedProgress,
|
|
onMouseEnter,
|
|
onMouseLeave,
|
|
onMouseMove,
|
|
onPause,
|
|
onPlayedProgress,
|
|
onPlayerClick,
|
|
onProgressChange,
|
|
onQualitySelect,
|
|
onReady,
|
|
onTouchEnd,
|
|
onTouchStart,
|
|
onVolumeChange,
|
|
onVolumeClick,
|
|
playedProgress,
|
|
playing,
|
|
playNextChapter,
|
|
playPrevChapter,
|
|
ready,
|
|
rewindBackward,
|
|
rewindForward,
|
|
seek,
|
|
selectedQuality,
|
|
togglePlaying,
|
|
video1Ref,
|
|
video2Ref,
|
|
videoQualities,
|
|
volume,
|
|
volumeInPercent,
|
|
wrapperRef,
|
|
} = useMultiSourcePlayer(props)
|
|
|
|
const firstPlayerActive = activePlayer === Players.PLAYER1
|
|
|
|
return (
|
|
<PlayerWrapper
|
|
ref={wrapperRef}
|
|
playing={playing}
|
|
onClick={onPlayerClick}
|
|
onMouseMove={onMouseMove}
|
|
onMouseEnter={onMouseEnter}
|
|
onMouseLeave={onMouseLeave}
|
|
onTouchStart={onTouchStart}
|
|
onTouchEnd={onTouchEnd}
|
|
>
|
|
{
|
|
!ready && (
|
|
<LoaderWrapper>
|
|
<Loader color='#515151' />
|
|
</LoaderWrapper>
|
|
)
|
|
}
|
|
<VideoPlayer
|
|
src={firstPlayerActive ? activeSrc : nextSrc}
|
|
playing={firstPlayerActive ? playing : false}
|
|
hidden={!firstPlayerActive}
|
|
muted={muted}
|
|
volume={volume}
|
|
ref={video1Ref}
|
|
seek={seek[Players.PLAYER1]}
|
|
isFullscreen={isFullscreen}
|
|
onLoadedProgress={firstPlayerActive ? onLoadedProgress : undefined}
|
|
onPlayedProgress={firstPlayerActive ? onPlayedProgress : undefined}
|
|
onEnded={onEnded}
|
|
onPause={firstPlayerActive ? onPause : undefined}
|
|
onError={onError}
|
|
onReady={onReady}
|
|
/>
|
|
<VideoPlayer
|
|
src={!firstPlayerActive ? activeSrc : nextSrc}
|
|
playing={!firstPlayerActive ? playing : false}
|
|
hidden={firstPlayerActive}
|
|
muted={muted}
|
|
volume={volume}
|
|
ref={video2Ref}
|
|
seek={seek[Players.PLAYER2]}
|
|
isFullscreen={isFullscreen}
|
|
onLoadedProgress={!firstPlayerActive ? onLoadedProgress : undefined}
|
|
onPlayedProgress={!firstPlayerActive ? onPlayedProgress : undefined}
|
|
onEnded={onEnded}
|
|
onPause={!firstPlayerActive ? onPause : undefined}
|
|
onError={onError}
|
|
onReady={onReady}
|
|
/>
|
|
{ready && (
|
|
<CenterControls playing={playing}>
|
|
<Backward size='lg' onClick={rewindBackward}>{REWIND_SECONDS}</Backward>
|
|
<PlayStop
|
|
size='lg'
|
|
marginRight={0}
|
|
playing={playing}
|
|
onClickCapture={togglePlaying}
|
|
/>
|
|
<Forward size='lg' onClick={rewindForward}>{REWIND_SECONDS}</Forward>
|
|
</CenterControls>
|
|
)}
|
|
<Controls visible={controlsVisible}>
|
|
<ControlsRow>
|
|
<ProgressBar
|
|
activeChapterIndex={activeChapterIndex}
|
|
allPlayedProgress={allPlayedProgress}
|
|
duration={duration}
|
|
chapters={chapters}
|
|
onTouchEnd={onTouchEnd}
|
|
onTouchStart={onTouchStart}
|
|
onPlayedProgressChange={onProgressChange}
|
|
playedProgress={playedProgress}
|
|
loadedProgress={loadedProgress}
|
|
/>
|
|
</ControlsRow>
|
|
|
|
<ControlsRow>
|
|
<ControlsGroup>
|
|
<PlayStop
|
|
playing={playing}
|
|
onClickCapture={togglePlaying}
|
|
/>
|
|
<Prev
|
|
disabled={isFirstChapterPlaying}
|
|
onClick={() => playPrevChapter()}
|
|
/>
|
|
<ChaptersText>
|
|
{activeChapterIndex + 1} / {numberOfChapters}
|
|
</ChaptersText>
|
|
<Next
|
|
disabled={isLastChapterPlaying}
|
|
onClick={() => playNextChapter()}
|
|
/>
|
|
{
|
|
!isMobileDevice && (
|
|
<VolumeBar
|
|
value={volumeInPercent}
|
|
muted={muted}
|
|
onChange={onVolumeChange}
|
|
onClick={onVolumeClick}
|
|
/>
|
|
)
|
|
}
|
|
<PlaybackTime width={duration > HOUR_IN_MILLISECONDS ? 150 : 130}>
|
|
{secondsToHms(allPlayedProgress / 1000)}
|
|
{' / '}
|
|
{secondsToHms(duration / 1000)}
|
|
</PlaybackTime>
|
|
<Backward
|
|
onClick={rewindBackward}
|
|
isHidden={isMobileDevice}
|
|
>{REWIND_SECONDS}
|
|
</Backward>
|
|
<Forward
|
|
onClick={rewindForward}
|
|
isHidden={isMobileDevice}
|
|
>{REWIND_SECONDS}
|
|
</Forward>
|
|
</ControlsGroup>
|
|
|
|
<ControlsGroup>
|
|
<Settings
|
|
onSelect={onQualitySelect}
|
|
selectedQuality={selectedQuality}
|
|
videoQualities={videoQualities}
|
|
/>
|
|
<Fullscreen
|
|
onClick={onFullscreenClick}
|
|
isFullscreen={isFullscreen}
|
|
/>
|
|
</ControlsGroup>
|
|
</ControlsRow>
|
|
</Controls>
|
|
<ControlsGradient />
|
|
</PlayerWrapper>
|
|
)
|
|
}
|
|
|