From 5c898567651ad45e7ea153e35e25a313ba8dcf29 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 12:13:58 +0300 Subject: [PATCH 01/27] sample InfoMenu component added --- src/routes/Player/ControlBar/ControlBar.js | 10 ++--- .../InfoMenuButton.js} | 16 +++---- .../Player/ControlBar/InfoMenuButton/index.js | 3 ++ .../ControlBar/MetaPreviewButton/index.js | 3 -- src/routes/Player/InfoMenu/InfoMenu.js | 22 ++++++++++ src/routes/Player/InfoMenu/index.js | 3 ++ src/routes/Player/InfoMenu/styles.less | 3 ++ src/routes/Player/Player.js | 43 ++++++++++--------- 8 files changed, 66 insertions(+), 37 deletions(-) rename src/routes/Player/ControlBar/{MetaPreviewButton/MetaPreviewButton.js => InfoMenuButton/InfoMenuButton.js} (64%) create mode 100644 src/routes/Player/ControlBar/InfoMenuButton/index.js delete mode 100644 src/routes/Player/ControlBar/MetaPreviewButton/index.js create mode 100644 src/routes/Player/InfoMenu/InfoMenu.js create mode 100644 src/routes/Player/InfoMenu/index.js create mode 100644 src/routes/Player/InfoMenu/styles.less diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index cbc37920f..a8be75d45 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -3,7 +3,7 @@ const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('stremio-icons/dom'); const { Button } = require('stremio/common'); -const MetaPreviewButton = require('./MetaPreviewButton'); +const InfoMenuButton = require('./InfoMenuButton'); const MuteButton = require('./MuteButton'); const PlayPauseButton = require('./PlayPauseButton'); const SeekBar = require('./SeekBar'); @@ -27,7 +27,7 @@ const ControlBar = ({ onVolumeChangeRequested, onSeekRequested, onToggleSubtitlesPicker, - onToggleMetaPreview, + onToggleInfoMenu, ...props }) => { return ( @@ -61,10 +61,10 @@ const ControlBar = ({ - ); @@ -22,7 +21,6 @@ const InfoMenuButton = ({ className, metaResource, onToggleInfoMenu }) => { InfoMenuButton.propTypes = { className: PropTypes.string, - metaResource: PropTypes.object, onToggleInfoMenu: PropTypes.func }; diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 458a7c5f3..aad84aaca 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -26,6 +26,9 @@ const Player = ({ urlParams }) => { const [subtitlesPickerOpen, , closeSubtitlesPicker, toggleSubtitlesPicker] = useBinaryState(false); const [infoMenuOpen, , closeInfoMenu, toggleInfoMenu] = useBinaryState(false); const [error, setError] = React.useState(null); + const infoAvailable = React.useMemo(() => { + return player.meta_resource !== null && player.meta_resource.content.type === 'Ready'; + }, [player.meta_resource]); const [videoState, setVideoState] = React.useReducer( (videoState, nextVideoState) => ({ ...videoState, ...nextVideoState }), { @@ -290,7 +293,9 @@ const Player = ({ urlParams }) => { } case 'KeyM': { closeSubtitlesPicker(); - toggleInfoMenu(); + if (infoAvailable) { + toggleInfoMenu(); + } break; } case 'Escape': { @@ -306,7 +311,7 @@ const Player = ({ urlParams }) => { return () => { window.removeEventListener('keydown', onKeyDown); }; - }, [routeFocused, subtitlesPickerOpen, infoMenuOpen, videoState.paused, videoState.time, videoState.volume, toggleSubtitlesPicker, toggleInfoMenu]); + }, [routeFocused, subtitlesPickerOpen, infoAvailable, infoMenuOpen, videoState.paused, videoState.time, videoState.volume, toggleSubtitlesPicker, toggleInfoMenu]); React.useLayoutEffect(() => { return () => { setImmersedDebounced.cancel(); @@ -366,7 +371,7 @@ const Player = ({ urlParams }) => { volume={videoState.volume} muted={videoState.muted} subtitlesTracks={videoState.subtitlesTracks} - metaResource={player.meta_resource} + infoAvailable={infoAvailable} onPlayRequested={onPlayRequested} onPauseRequested={onPauseRequested} onMuteRequested={onMuteRequested} From b0801e6686c58c7aea56ef2f339f3e18870945c8 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 12:54:36 +0300 Subject: [PATCH 04/27] hooks in player optimized --- src/routes/Player/Player.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index aad84aaca..107689ccf 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -4,7 +4,7 @@ const classnames = require('classnames'); const debounce = require('lodash.debounce'); const { useRouteFocused } = require('stremio-router'); const { useServices } = require('stremio/services'); -const { HorizontalNavBar, useDeepEqualEffect, useDeepEqualMemo, useFullscreen, useBinaryState, useToast } = require('stremio/common'); +const { HorizontalNavBar, useDeepEqualEffect, useFullscreen, useBinaryState, useToast } = require('stremio/common'); const BufferingLoader = require('./BufferingLoader'); const ControlBar = require('./ControlBar'); const InfoMenu = require('./InfoMenu'); @@ -28,7 +28,7 @@ const Player = ({ urlParams }) => { const [error, setError] = React.useState(null); const infoAvailable = React.useMemo(() => { return player.meta_resource !== null && player.meta_resource.content.type === 'Ready'; - }, [player.meta_resource]); + }, [player]); const [videoState, setVideoState] = React.useReducer( (videoState, nextVideoState) => ({ ...videoState, ...nextVideoState }), { @@ -67,7 +67,7 @@ const Player = ({ urlParams }) => { const onPropChanged = React.useCallback((propName, propValue) => { setVideoState({ [propName]: propValue }); }, []); - const onEnded = useDeepEqualMemo(() => () => { + const onEnded = React.useCallback(() => { core.dispatch({ action: 'Unload' }, 'player'); if (player.lib_item !== null) { core.dispatch({ @@ -82,7 +82,7 @@ const Player = ({ urlParams }) => { // TODO go to next video } window.history.back(); - }, [player.next_video, player.lib_item]); + }, [player]); const onError = React.useCallback((error) => { if (error.critical) { setError(error); From 816ee24690c71272d339fd0d6a3848b5da548938 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 12:54:48 +0300 Subject: [PATCH 05/27] updateSettings deps fixed --- src/routes/Player/useSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/useSettings.js b/src/routes/Player/useSettings.js index 8ad45791c..7cdb7cdf7 100644 --- a/src/routes/Player/useSettings.js +++ b/src/routes/Player/useSettings.js @@ -16,7 +16,7 @@ const useSettings = () => { } } }); - }, [profile.settings]); + }, [profile]); return [profile.settings, updateSettings]; }; From 43ab0745b568b329864d1910c627206035fdfc4e Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 13:53:27 +0300 Subject: [PATCH 06/27] player related action moved to usePlayer --- src/routes/Player/Player.js | 24 ++++-------------------- src/routes/Player/usePlayer.js | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 107689ccf..90f6d25de 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -16,7 +16,7 @@ const styles = require('./styles'); const Player = ({ urlParams }) => { const { core } = useServices(); - const player = usePlayer(urlParams); + const [player, updateLibraryItemState, pushToLibrary] = usePlayer(urlParams); const [settings, updateSettings] = useSettings(); const routeFocused = useRouteFocused(); const toast = useToast(); @@ -219,29 +219,13 @@ const Player = ({ urlParams }) => { }, [settings.subtitles_offset]); React.useEffect(() => { if (videoState.time !== null && !isNaN(videoState.time) && videoState.duration !== null && !isNaN(videoState.duration)) { - core.dispatch({ - action: 'Player', - args: { - action: 'UpdateLibraryItemState', - args: { - time: videoState.time, - duration: videoState.duration - } - } - }, 'player'); + updateLibraryItemState(videoState.time, videoState.duration); } }, [videoState.time, videoState.duration]); React.useEffect(() => { - const interval = setInterval(() => { - core.dispatch({ - action: 'Player', - args: { - action: 'PushToLibrary' - } - }, 'player'); - }, 30000); + const intervalId = setInterval(pushToLibrary, 30000); return () => { - clearInterval(interval); + clearInterval(intervalId); }; }, []); React.useLayoutEffect(() => { diff --git a/src/routes/Player/usePlayer.js b/src/routes/Player/usePlayer.js index 526d95278..808f86f5f 100644 --- a/src/routes/Player/usePlayer.js +++ b/src/routes/Player/usePlayer.js @@ -1,5 +1,6 @@ const React = require('react'); const pako = require('pako'); +const { useServices } = require('stremio/services'); const { useModelState } = require('stremio/common'); const initPlayerState = () => ({ @@ -82,6 +83,7 @@ const mapPlayerStateWithCtx = (player, ctx) => { }; const usePlayer = (urlParams) => { + const { core } = useServices(); const loadPlayerAction = React.useMemo(() => { try { return { @@ -133,12 +135,30 @@ const usePlayer = (urlParams) => { }; } }, [urlParams]); - return useModelState({ + const updateLibraryItemState = React.useCallback((time, duration) => { + core.dispatch({ + action: 'Player', + args: { + action: 'UpdateLibraryItemState', + args: { time, duration } + } + }, 'player'); + }, []); + const pushToLibrary = React.useCallback(() => { + core.dispatch({ + action: 'Player', + args: { + action: 'PushToLibrary' + } + }, 'player'); + }, []); + const player = useModelState({ model: 'player', action: loadPlayerAction, init: initPlayerState, mapWithCtx: mapPlayerStateWithCtx }); + return [player, updateLibraryItemState, pushToLibrary]; }; module.exports = usePlayer; From 2bdd7eb35f0aef80269f7685e1fa96a700c8b9bc Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 14:02:14 +0300 Subject: [PATCH 07/27] prevent toggle play/pause when closing menu --- src/routes/Player/Player.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 90f6d25de..508330f86 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -333,6 +333,12 @@ const Player = ({ urlParams }) => { onClick={onVideoClick} onDoubleClick={toggleFullscreen} /> + { + subtitlesPickerOpen || infoMenuOpen ? +
+ : + null + } Date: Tue, 31 Mar 2020 16:20:01 +0300 Subject: [PATCH 08/27] playback toggle debounced for clicks on video overlay --- src/routes/Player/Player.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 508330f86..fcc1d0f73 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -106,9 +106,11 @@ const Player = ({ urlParams }) => { const onPlayRequested = React.useCallback(() => { dispatch({ propName: 'paused', propValue: false }); }, []); + const onPlayRequestedDebounced = React.useCallback(debounce(onPlayRequested, 200), []); const onPauseRequested = React.useCallback(() => { dispatch({ propName: 'paused', propValue: true }); }, []); + const onPauseRequestedDebounced = React.useCallback(debounce(onPauseRequested, 200), []); const onMuteRequested = React.useCallback(() => { dispatch({ propName: 'muted', propValue: true }); }, []); @@ -136,12 +138,17 @@ const Player = ({ urlParams }) => { const onVideoClick = React.useCallback(() => { if (videoState.paused !== null) { if (videoState.paused) { - onPlayRequested(); + onPlayRequestedDebounced(); } else { - onPauseRequested(); + onPauseRequestedDebounced(); } } }, [videoState.paused]); + const onVideoDoubleClick = React.useCallback(() => { + onPlayRequestedDebounced.cancel(); + onPauseRequestedDebounced.cancel(); + toggleFullscreen(); + }, [toggleFullscreen]); const onContainerMouseDown = React.useCallback((event) => { if (!event.nativeEvent.subtitlesPickerClosePrevented) { closeSubtitlesPicker(); @@ -299,6 +306,8 @@ const Player = ({ urlParams }) => { React.useLayoutEffect(() => { return () => { setImmersedDebounced.cancel(); + onPlayRequestedDebounced.cancel(); + onPauseRequestedDebounced.cancel(); }; }, []); return ( @@ -331,7 +340,7 @@ const Player = ({ urlParams }) => {
{ subtitlesPickerOpen || infoMenuOpen ? From 89be4e8d1648f1891f73e66bd5a5e679b87a9cae Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 18:19:39 +0300 Subject: [PATCH 09/27] refactor player menus --- src/routes/Player/ControlBar/ControlBar.js | 129 +++++++++++------- .../InfoMenuButton/InfoMenuButton.js | 27 ---- .../Player/ControlBar/InfoMenuButton/index.js | 3 - .../ControlBar/MuteButton/MuteButton.js | 39 ------ .../Player/ControlBar/MuteButton/index.js | 3 - .../PlayPauseButton/PlayPauseButton.js | 36 ----- .../ControlBar/PlayPauseButton/index.js | 3 - .../SubtitlesButton/SubtitlesButton.js | 29 ---- .../ControlBar/SubtitlesButton/index.js | 3 - src/routes/Player/ControlBar/styles.less | 4 +- src/routes/Player/Player.js | 56 +++++--- .../Player/SubtitlesPicker/SubtitlesPicker.js | 2 +- 12 files changed, 120 insertions(+), 214 deletions(-) delete mode 100644 src/routes/Player/ControlBar/InfoMenuButton/InfoMenuButton.js delete mode 100644 src/routes/Player/ControlBar/InfoMenuButton/index.js delete mode 100644 src/routes/Player/ControlBar/MuteButton/MuteButton.js delete mode 100644 src/routes/Player/ControlBar/MuteButton/index.js delete mode 100644 src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js delete mode 100644 src/routes/Player/ControlBar/PlayPauseButton/index.js delete mode 100644 src/routes/Player/ControlBar/SubtitlesButton/SubtitlesButton.js delete mode 100644 src/routes/Player/ControlBar/SubtitlesButton/index.js diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 1b00b5903..7d11ba108 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -3,33 +3,68 @@ const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('stremio-icons/dom'); const { Button } = require('stremio/common'); -const InfoMenuButton = require('./InfoMenuButton'); -const MuteButton = require('./MuteButton'); -const PlayPauseButton = require('./PlayPauseButton'); const SeekBar = require('./SeekBar'); -const SubtitlesButton = require('./SubtitlesButton'); const VolumeSlider = require('./VolumeSlider'); const styles = require('./styles'); const ControlBar = ({ className, - infoAvailable, paused, time, duration, volume, muted, subtitlesTracks, + metaItem, + stream, onPlayRequested, onPauseRequested, onMuteRequested, onUnmuteRequested, onVolumeChangeRequested, onSeekRequested, - onToggleSubtitlesPicker, + onToggleSubtitlesMenu, onToggleInfoMenu, ...props }) => { + const onSubtitlesButtonMouseDown = React.useCallback((event) => { + event.nativeEvent.subtitlesMenuClosePrevented = true; + }, []); + const onInfoButtonMouseDown = React.useCallback((event) => { + event.nativeEvent.infoMenuClosePrevented = true; + }, []); + const onPlayPauseButtonClick = React.useCallback(() => { + if (paused) { + if (typeof onPlayRequested === 'function') { + onPlayRequested(); + } + } else { + if (typeof onPauseRequested === 'function') { + onPauseRequested(); + } + } + }, [paused, onPlayRequested, onPauseRequested]); + const onMuteButtonClick = React.useCallback(() => { + if (muted) { + if (typeof onUnmuteRequested === 'function') { + onUnmuteRequested(); + } + } else { + if (typeof onMuteRequested === 'function') { + onMuteRequested(); + } + } + }, [muted, onMuteRequested, onUnmuteRequested]); + const onSubtitlesButtonClick = React.useCallback(() => { + if (typeof onToggleSubtitlesMenu === 'function') { + onToggleSubtitlesMenu(); + } + }, [onToggleSubtitlesMenu]); + const onInfoButtonClick = React.useCallback(() => { + if (typeof onToggleInfoMenu === 'function') { + onToggleInfoMenu(); + } + }, [onToggleInfoMenu]); return (
- - + +
- - - + +
@@ -83,21 +117,22 @@ const ControlBar = ({ ControlBar.propTypes = { className: PropTypes.string, - infoAvailable: PropTypes.bool, - paused: PropTypes.any, - time: PropTypes.any, - duration: PropTypes.any, - volume: PropTypes.any, - muted: PropTypes.any, - subtitlesTracks: PropTypes.any, - onPlayRequested: PropTypes.any, - onPauseRequested: PropTypes.any, - onMuteRequested: PropTypes.any, - onUnmuteRequested: PropTypes.any, - onVolumeChangeRequested: PropTypes.any, - onSeekRequested: PropTypes.any, - onToggleSubtitlesPicker: PropTypes.any, - onToggleInfoMenu: PropTypes.any + paused: PropTypes.bool, + time: PropTypes.number, + duration: PropTypes.number, + volume: PropTypes.number, + muted: PropTypes.bool, + subtitlesTracks: PropTypes.array, + metaItem: PropTypes.object, + stream: PropTypes.object, + onPlayRequested: PropTypes.func, + onPauseRequested: PropTypes.func, + onMuteRequested: PropTypes.func, + onUnmuteRequested: PropTypes.func, + onVolumeChangeRequested: PropTypes.func, + onSeekRequested: PropTypes.func, + onToggleSubtitlesMenu: PropTypes.func, + onToggleInfoMenu: PropTypes.func }; module.exports = ControlBar; diff --git a/src/routes/Player/ControlBar/InfoMenuButton/InfoMenuButton.js b/src/routes/Player/ControlBar/InfoMenuButton/InfoMenuButton.js deleted file mode 100644 index 2062a2bdd..000000000 --- a/src/routes/Player/ControlBar/InfoMenuButton/InfoMenuButton.js +++ /dev/null @@ -1,27 +0,0 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const Icon = require('stremio-icons/dom'); -const { Button } = require('stremio/common'); - -const InfoMenuButton = ({ className, onToggleInfoMenu }) => { - const onMouseDown = React.useCallback((event) => { - event.nativeEvent.infoMenuClosePrevented = true; - }, []); - const onClick = React.useCallback(() => { - if (typeof onToggleInfoMenu === 'function') { - onToggleInfoMenu(); - } - }, [onToggleInfoMenu]); - return ( - - ); -}; - -InfoMenuButton.propTypes = { - className: PropTypes.string, - onToggleInfoMenu: PropTypes.func -}; - -module.exports = InfoMenuButton; diff --git a/src/routes/Player/ControlBar/InfoMenuButton/index.js b/src/routes/Player/ControlBar/InfoMenuButton/index.js deleted file mode 100644 index 6dfeff76d..000000000 --- a/src/routes/Player/ControlBar/InfoMenuButton/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const InfoMenuButton = require('./InfoMenuButton'); - -module.exports = InfoMenuButton; diff --git a/src/routes/Player/ControlBar/MuteButton/MuteButton.js b/src/routes/Player/ControlBar/MuteButton/MuteButton.js deleted file mode 100644 index 7e3c2b0b5..000000000 --- a/src/routes/Player/ControlBar/MuteButton/MuteButton.js +++ /dev/null @@ -1,39 +0,0 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const classnames = require('classnames'); -const Icon = require('stremio-icons/dom'); -const { Button } = require('stremio/common'); - -const MuteButton = ({ className, muted, volume, onMuteRequested, onUnmuteRequested }) => { - const toggleMuted = React.useCallback(() => { - if (muted) { - if (typeof onUnmuteRequested === 'function') { - onUnmuteRequested(); - } - } else { - if (typeof onMuteRequested === 'function') { - onMuteRequested(); - } - } - }, [muted, onMuteRequested, onUnmuteRequested]); - const icon = (typeof muted === 'boolean' && muted) ? 'ic_volume0' : - (volume === null || isNaN(volume)) ? 'ic_volume3' : - volume < 30 ? 'ic_volume1' : - volume < 70 ? 'ic_volume2' : - 'ic_volume3'; - return ( - - ); -}; - -MuteButton.propTypes = { - className: PropTypes.string, - muted: PropTypes.bool, - volume: PropTypes.number, - onMuteRequested: PropTypes.func, - onUnmuteRequested: PropTypes.func -}; - -module.exports = MuteButton; diff --git a/src/routes/Player/ControlBar/MuteButton/index.js b/src/routes/Player/ControlBar/MuteButton/index.js deleted file mode 100644 index 3bc5c743b..000000000 --- a/src/routes/Player/ControlBar/MuteButton/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const MuteButton = require('./MuteButton'); - -module.exports = MuteButton; diff --git a/src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js b/src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js deleted file mode 100644 index 34d9bbd7f..000000000 --- a/src/routes/Player/ControlBar/PlayPauseButton/PlayPauseButton.js +++ /dev/null @@ -1,36 +0,0 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const classnames = require('classnames'); -const Icon = require('stremio-icons/dom'); -const { Button } = require('stremio/common'); - -const PlayPauseButton = ({ className, paused, onPlayRequested, onPauseRequested }) => { - const togglePaused = React.useCallback(() => { - if (paused) { - if (typeof onPlayRequested === 'function') { - onPlayRequested(); - } - } else { - if (typeof onPauseRequested === 'function') { - onPauseRequested(); - } - } - }, [paused, onPlayRequested, onPauseRequested]); - return ( - - ); -}; - -PlayPauseButton.propTypes = { - className: PropTypes.string, - paused: PropTypes.bool, - onPlayRequested: PropTypes.func, - onPauseRequested: PropTypes.func -}; - -module.exports = PlayPauseButton; diff --git a/src/routes/Player/ControlBar/PlayPauseButton/index.js b/src/routes/Player/ControlBar/PlayPauseButton/index.js deleted file mode 100644 index cdaf43c88..000000000 --- a/src/routes/Player/ControlBar/PlayPauseButton/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const PlayPauseButton = require('./PlayPauseButton'); - -module.exports = PlayPauseButton; diff --git a/src/routes/Player/ControlBar/SubtitlesButton/SubtitlesButton.js b/src/routes/Player/ControlBar/SubtitlesButton/SubtitlesButton.js deleted file mode 100644 index 891247025..000000000 --- a/src/routes/Player/ControlBar/SubtitlesButton/SubtitlesButton.js +++ /dev/null @@ -1,29 +0,0 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const classnames = require('classnames'); -const Icon = require('stremio-icons/dom'); -const { Button } = require('stremio/common'); - -const SubtitlesButton = ({ className, subtitlesTracks, onToggleSubtitlesPicker }) => { - const onMouseDown = React.useCallback((event) => { - event.nativeEvent.subtitlesPickerClosePrevented = true; - }, []); - const onClick = React.useCallback(() => { - if (typeof onToggleSubtitlesPicker === 'function') { - onToggleSubtitlesPicker(); - } - }, [onToggleSubtitlesPicker]); - return ( - - ); -}; - -SubtitlesButton.propTypes = { - className: PropTypes.string, - subtitlesTracks: PropTypes.array, - onToggleSubtitlesPicker: PropTypes.func -}; - -module.exports = SubtitlesButton; diff --git a/src/routes/Player/ControlBar/SubtitlesButton/index.js b/src/routes/Player/ControlBar/SubtitlesButton/index.js deleted file mode 100644 index 53fd48771..000000000 --- a/src/routes/Player/ControlBar/SubtitlesButton/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const SubtitlesButton = require('./SubtitlesButton'); - -module.exports = SubtitlesButton; diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 5fa5ae688..8dd80785f 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -21,12 +21,12 @@ align-items: center; &:global(.disabled) { - :global(.icon) { + .icon { fill: @color-surface; } } - :global(.icon) { + .icon { flex: none; width: 3rem; height: 2rem; diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index fcc1d0f73..4bd2f9390 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -18,17 +18,26 @@ const Player = ({ urlParams }) => { const { core } = useServices(); const [player, updateLibraryItemState, pushToLibrary] = usePlayer(urlParams); const [settings, updateSettings] = useSettings(); + const stream = React.useMemo(() => { + return player.selected !== null ? + player.selected.stream + : + null; + }, [player]); + const metaItem = React.useMemo(() => { + return player.meta_resource !== null && player.meta_resource.content.type === 'Ready' ? + player.meta_resource.content.content + : + null; + }, [player]); const routeFocused = useRouteFocused(); const toast = useToast(); const [, , , toggleFullscreen] = useFullscreen(); const [immersed, setImmersed] = React.useState(true); const setImmersedDebounced = React.useCallback(debounce(setImmersed, 3000), []); - const [subtitlesPickerOpen, , closeSubtitlesPicker, toggleSubtitlesPicker] = useBinaryState(false); + const [subtitlesMenuOpen, , closeSubtitlesMenu, toggleSubtitlesMenu] = useBinaryState(false); const [infoMenuOpen, , closeInfoMenu, toggleInfoMenu] = useBinaryState(false); const [error, setError] = React.useState(null); - const infoAvailable = React.useMemo(() => { - return player.meta_resource !== null && player.meta_resource.content.type === 'Ready'; - }, [player]); const [videoState, setVideoState] = React.useReducer( (videoState, nextVideoState) => ({ ...videoState, ...nextVideoState }), { @@ -150,8 +159,8 @@ const Player = ({ urlParams }) => { toggleFullscreen(); }, [toggleFullscreen]); const onContainerMouseDown = React.useCallback((event) => { - if (!event.nativeEvent.subtitlesPickerClosePrevented) { - closeSubtitlesPicker(); + if (!event.nativeEvent.subtitlesMenuClosePrevented) { + closeSubtitlesMenu(); } if (!event.nativeEvent.infoMenuClosePrevented) { closeInfoMenu(); @@ -239,7 +248,7 @@ const Player = ({ urlParams }) => { const onKeyDown = (event) => { switch (event.code) { case 'Space': { - if (!subtitlesPickerOpen && !infoMenuOpen && videoState.paused !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && videoState.paused !== null) { if (videoState.paused) { onPlayRequested(); } else { @@ -250,28 +259,28 @@ const Player = ({ urlParams }) => { break; } case 'ArrowRight': { - if (!subtitlesPickerOpen && !infoMenuOpen && videoState.time !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && videoState.time !== null) { onSeekRequested(videoState.time + 15000); } break; } case 'ArrowLeft': { - if (!subtitlesPickerOpen && !infoMenuOpen && videoState.time !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && videoState.time !== null) { onSeekRequested(videoState.time - 15000); } break; } case 'ArrowUp': { - if (!subtitlesPickerOpen && !infoMenuOpen && videoState.volume !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && videoState.volume !== null) { onVolumeChangeRequested(videoState.volume + 5); } break; } case 'ArrowDown': { - if (!subtitlesPickerOpen && !infoMenuOpen && videoState.volume !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && videoState.volume !== null) { onVolumeChangeRequested(videoState.volume - 5); } @@ -279,18 +288,22 @@ const Player = ({ urlParams }) => { } case 'KeyS': { closeInfoMenu(); - toggleSubtitlesPicker(); + if (Array.isArray(videoState.subtitlesTracks) && videoState.subtitlesTracks.length > 0) { + toggleSubtitlesMenu(); + } + break; } case 'KeyM': { - closeSubtitlesPicker(); - if (infoAvailable) { + closeSubtitlesMenu(); + if (typeof metaItem === 'object' && metaItem !== null && typeof stream === 'object' && stream !== null) { toggleInfoMenu(); } + break; } case 'Escape': { - closeSubtitlesPicker(); + closeSubtitlesMenu(); closeInfoMenu(); break; } @@ -302,7 +315,7 @@ const Player = ({ urlParams }) => { return () => { window.removeEventListener('keydown', onKeyDown); }; - }, [routeFocused, subtitlesPickerOpen, infoAvailable, infoMenuOpen, videoState.paused, videoState.time, videoState.volume, toggleSubtitlesPicker, toggleInfoMenu]); + }, [routeFocused, subtitlesMenuOpen, infoMenuOpen, stream, metaItem, videoState.paused, videoState.time, videoState.volume, videoState.subtitlesTracks, toggleSubtitlesMenu, toggleInfoMenu]); React.useLayoutEffect(() => { return () => { setImmersedDebounced.cancel(); @@ -311,7 +324,7 @@ const Player = ({ urlParams }) => { }; }, []); return ( -
{ onDoubleClick={onVideoDoubleClick} /> { - subtitlesPickerOpen || infoMenuOpen ? + subtitlesMenuOpen || infoMenuOpen ?
: null @@ -370,20 +383,21 @@ const Player = ({ urlParams }) => { volume={videoState.volume} muted={videoState.muted} subtitlesTracks={videoState.subtitlesTracks} - infoAvailable={infoAvailable} + stream={stream} + metaItem={metaItem} onPlayRequested={onPlayRequested} onPauseRequested={onPauseRequested} onMuteRequested={onMuteRequested} onUnmuteRequested={onUnmuteRequested} onVolumeChangeRequested={onVolumeChangeRequested} onSeekRequested={onSeekRequested} - onToggleSubtitlesPicker={toggleSubtitlesPicker} + onToggleSubtitlesMenu={toggleSubtitlesMenu} onToggleInfoMenu={toggleInfoMenu} onMouseMove={onBarMouseMove} onMouseOver={onBarMouseMove} /> { - subtitlesPickerOpen ? + subtitlesMenuOpen ? { []; }, [props.tracks, selectedLanguage]); const onMouseDown = React.useCallback((event) => { - event.nativeEvent.subtitlesPickerClosePrevented = true; + event.nativeEvent.subtitlesMenuClosePrevented = true; }, []); const languageOnClick = React.useCallback((event) => { const trackId = Array.isArray(props.tracks) ? From 91da0443f626ccaa87f6d74c9cf481e66bc7ac3f Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 18:21:56 +0300 Subject: [PATCH 10/27] rename SubtitlesPicker to SubtitlesMenu --- src/routes/Player/Player.js | 4 ++-- .../DiscreteSelectInput/DiscreteSelectInput.js | 0 .../DiscreteSelectInput/index.js | 0 .../DiscreteSelectInput/styles.less | 0 .../SubtitlesPicker.js => SubtitlesMenu/SubtitlesMenu.js} | 8 ++++---- src/routes/Player/SubtitlesMenu/index.js | 3 +++ .../Player/{SubtitlesPicker => SubtitlesMenu}/styles.less | 2 +- src/routes/Player/SubtitlesPicker/index.js | 3 --- 8 files changed, 10 insertions(+), 10 deletions(-) rename src/routes/Player/{SubtitlesPicker => SubtitlesMenu}/DiscreteSelectInput/DiscreteSelectInput.js (100%) rename src/routes/Player/{SubtitlesPicker => SubtitlesMenu}/DiscreteSelectInput/index.js (100%) rename src/routes/Player/{SubtitlesPicker => SubtitlesMenu}/DiscreteSelectInput/styles.less (100%) rename src/routes/Player/{SubtitlesPicker/SubtitlesPicker.js => SubtitlesMenu/SubtitlesMenu.js} (98%) create mode 100644 src/routes/Player/SubtitlesMenu/index.js rename src/routes/Player/{SubtitlesPicker => SubtitlesMenu}/styles.less (98%) delete mode 100644 src/routes/Player/SubtitlesPicker/index.js diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 4bd2f9390..0b2f20d19 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -8,7 +8,7 @@ const { HorizontalNavBar, useDeepEqualEffect, useFullscreen, useBinaryState, use const BufferingLoader = require('./BufferingLoader'); const ControlBar = require('./ControlBar'); const InfoMenu = require('./InfoMenu'); -const SubtitlesPicker = require('./SubtitlesPicker'); +const SubtitlesMenu = require('./SubtitlesMenu'); const Video = require('./Video'); const usePlayer = require('./usePlayer'); const useSettings = require('./useSettings'); @@ -398,7 +398,7 @@ const Player = ({ urlParams }) => { /> { subtitlesMenuOpen ? - { +const SubtitlesMenu = (props) => { const languages = React.useMemo(() => { return Array.isArray(props.tracks) ? props.tracks @@ -101,7 +101,7 @@ const SubtitlesPicker = (props) => { } }, [props.offset, props.onOffsetChanged]); return ( -
+
Languages
@@ -182,7 +182,7 @@ const SubtitlesPicker = (props) => { ); }; -SubtitlesPicker.propTypes = { +SubtitlesMenu.propTypes = { className: PropTypes.string, tracks: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.string.isRequired, @@ -202,4 +202,4 @@ SubtitlesPicker.propTypes = { onOffsetChanged: PropTypes.func }; -module.exports = SubtitlesPicker; +module.exports = SubtitlesMenu; diff --git a/src/routes/Player/SubtitlesMenu/index.js b/src/routes/Player/SubtitlesMenu/index.js new file mode 100644 index 000000000..17f9571d4 --- /dev/null +++ b/src/routes/Player/SubtitlesMenu/index.js @@ -0,0 +1,3 @@ +const SubtitlesMenu = require('./SubtitlesMenu'); + +module.exports = SubtitlesMenu; diff --git a/src/routes/Player/SubtitlesPicker/styles.less b/src/routes/Player/SubtitlesMenu/styles.less similarity index 98% rename from src/routes/Player/SubtitlesPicker/styles.less rename to src/routes/Player/SubtitlesMenu/styles.less index 3718500ca..d9eb0a214 100644 --- a/src/routes/Player/SubtitlesPicker/styles.less +++ b/src/routes/Player/SubtitlesMenu/styles.less @@ -1,6 +1,6 @@ @import (reference) '~stremio-colors/dist/less/stremio-colors.less'; -.subtitles-picker-container { +.subtitles-menu-container { height: 23rem; display: flex; flex-direction: row; diff --git a/src/routes/Player/SubtitlesPicker/index.js b/src/routes/Player/SubtitlesPicker/index.js deleted file mode 100644 index 0eb5e540e..000000000 --- a/src/routes/Player/SubtitlesPicker/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const SubtitlesPicker = require('./SubtitlesPicker'); - -module.exports = SubtitlesPicker; From 493be95becf3058262848e26dd190d085a30973c Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Tue, 31 Mar 2020 18:26:36 +0300 Subject: [PATCH 11/27] validation of videoid added --- src/routes/Player/usePlayer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/usePlayer.js b/src/routes/Player/usePlayer.js index 808f86f5f..a81688ef6 100644 --- a/src/routes/Player/usePlayer.js +++ b/src/routes/Player/usePlayer.js @@ -125,7 +125,10 @@ const usePlayer = (urlParams) => { } : null, - video_id: urlParams.videoId + video_id: typeof urlParams.videoId === 'string' ? + urlParams.videoId + : + null } } }; From cdb72526ada5cc9a6bf22aa577e12532b1474db5 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Wed, 1 Apr 2020 13:29:23 +0300 Subject: [PATCH 12/27] player background changed --- src/routes/Player/styles.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/styles.less b/src/routes/Player/styles.less index e691dc12e..01aad2eef 100644 --- a/src/routes/Player/styles.less +++ b/src/routes/Player/styles.less @@ -26,7 +26,7 @@ html:not(.active-slider-within) { z-index: 0; width: 100%; height: 100%; - background-color: @color-background-dark2; + background-color: @color-background-dark5; .layer { position: absolute; From 44f98d5f53dee3bd79d75c3243a9a573f47d8f28 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Wed, 1 Apr 2020 14:37:04 +0300 Subject: [PATCH 13/27] default sizes removed from slider --- src/common/Slider/styles.less | 3 --- src/routes/Player/ControlBar/styles.less | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/Slider/styles.less b/src/common/Slider/styles.less index 3f46cba42..30d796423 100644 --- a/src/common/Slider/styles.less +++ b/src/common/Slider/styles.less @@ -9,9 +9,6 @@ html.active-slider-within { } .slider-container { - --track-size: 0.5rem; - --thumb-size: 1.5rem; - position: relative; z-index: 0; overflow: visible; diff --git a/src/routes/Player/ControlBar/styles.less b/src/routes/Player/ControlBar/styles.less index 8dd80785f..6cd36691f 100644 --- a/src/routes/Player/ControlBar/styles.less +++ b/src/routes/Player/ControlBar/styles.less @@ -4,6 +4,9 @@ padding: 0 1.5rem; .seek-bar { + --track-size: 0.5rem; + --thumb-size: 1.5rem; + height: 2.5rem; } From 8d9239acbff08618607faf532945c0662926355a Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Wed, 1 Apr 2020 15:27:49 +0300 Subject: [PATCH 14/27] use 90 alpha in subtitles picker --- .../Player/SubtitlesMenu/DiscreteSelectInput/styles.less | 2 +- src/routes/Player/SubtitlesMenu/styles.less | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/SubtitlesMenu/DiscreteSelectInput/styles.less b/src/routes/Player/SubtitlesMenu/DiscreteSelectInput/styles.less index 0c286ae78..657d46df1 100644 --- a/src/routes/Player/SubtitlesMenu/DiscreteSelectInput/styles.less +++ b/src/routes/Player/SubtitlesMenu/DiscreteSelectInput/styles.less @@ -34,7 +34,7 @@ display: block; width: 100%; height: 100%; - fill: @color-surface-light5; + fill: @color-surface-light5-90; } } diff --git a/src/routes/Player/SubtitlesMenu/styles.less b/src/routes/Player/SubtitlesMenu/styles.less index d9eb0a214..8b60354ab 100644 --- a/src/routes/Player/SubtitlesMenu/styles.less +++ b/src/routes/Player/SubtitlesMenu/styles.less @@ -48,7 +48,7 @@ height: 0.5rem; border-radius: 100%; margin-left: 1rem; - background-color: @color-accent3; + background-color: @color-accent3-90; } } } @@ -99,7 +99,7 @@ } &:global(.disabled) { - color: @color-surface; + color: @color-surface-90; } } } From 5cc640871c75bfbd91715501369f573168c177ff Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Wed, 1 Apr 2020 15:39:36 +0300 Subject: [PATCH 15/27] metaItem not required for InfoMenu --- src/routes/Player/ControlBar/ControlBar.js | 4 +--- src/routes/Player/Player.js | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 7d11ba108..11d1bd108 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -15,7 +15,6 @@ const ControlBar = ({ volume, muted, subtitlesTracks, - metaItem, stream, onPlayRequested, onPauseRequested, @@ -98,7 +97,7 @@ const ControlBar = ({ - : null @@ -149,8 +148,8 @@ const MetaPreview = ({ className, compact, name, logo, background, runtime, rele { Object.keys(linksGroups) .filter((category) => { - return category !== IMDB_LINK_CATEGORY && - category !== SHARE_LINK_CATEGORY; + return category !== CONSTANTS.IMDB_LINK_CATEGORY && + category !== CONSTANTS.SHARE_LINK_CATEGORY; }) .map((category, index) => ( : From 8f9efa2fea25caf3dbd2b07de01dcfdfafa7cc55 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Thu, 2 Apr 2020 12:26:34 +0300 Subject: [PATCH 22/27] share link rendered in compact mode too --- src/common/MetaPreview/MetaPreview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/MetaPreview/MetaPreview.js b/src/common/MetaPreview/MetaPreview.js index 1b3219123..a93cc168d 100644 --- a/src/common/MetaPreview/MetaPreview.js +++ b/src/common/MetaPreview/MetaPreview.js @@ -187,7 +187,7 @@ const MetaPreview = ({ className, compact, name, logo, background, runtime, rele null } { - !compact && typeof linksGroups[CONSTANTS.SHARE_LINK_CATEGORY] === 'object' ? + typeof linksGroups[CONSTANTS.SHARE_LINK_CATEGORY] === 'object' ? Date: Thu, 2 Apr 2020 12:32:56 +0300 Subject: [PATCH 23/27] addon mapped as a stream prop in usePlayer --- src/routes/Player/Player.js | 9 ++++++++- src/routes/Player/usePlayer.js | 22 ++++++---------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index bd295caca..fab0793ea 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -221,7 +221,14 @@ const Player = ({ urlParams }) => { dispatch({ commandName: 'addSubtitlesTracks', commandArgs: { - tracks: player.selected.stream.subtitles + tracks: player.selected.stream.subtitles.map(({ url, lang }) => ({ + url, + lang, + origin: player.selected.stream.addon !== null ? + player.selected.stream.addon.manifest.name + : + 'EMBEDDED IN STREAM' + })) } }); } diff --git a/src/routes/Player/usePlayer.js b/src/routes/Player/usePlayer.js index 82f89dde5..36beda83e 100644 --- a/src/routes/Player/usePlayer.js +++ b/src/routes/Player/usePlayer.js @@ -16,23 +16,13 @@ const mapPlayerStateWithCtx = (player, ctx) => { { stream: { ...player.selected.stream, - subtitles: Array.isArray(player.selected.stream.subtitles) ? - player.selected.stream.subtitles.map(({ url, lang }) => ({ - url, - lang, - origin: ctx.profile.addons.reduce((origin, addon) => { - if (player.selected.stream_resource_request !== null && addon.transportUrl === player.selected.stream_resource_request.base) { - return typeof addon.manifest.name === 'string' && addon.manifest.name.length > 0 ? - addon.manifest.name - : - addon.manifest.id; - } + addon: ctx.profile.addons.reduce((result, addon) => { + if (player.selected.stream_resource_request !== null && addon.transportUrl === player.selected.stream_resource_request.base) { + return addon; + } - return origin; - }, player.selected.stream_resource_request !== null ? player.selected.stream_resource_request.base : 'Stream') - })) - : - [] + return result; + }, null) }, stream_resource_request: player.selected.stream_resource_request, meta_resource_request: player.selected.meta_resource_request, From dabba0f19c852bae455ffce619de8e0af5e24852 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Thu, 2 Apr 2020 12:33:15 +0300 Subject: [PATCH 24/27] origin priorities updated in subs menu --- src/routes/Player/SubtitlesMenu/SubtitlesMenu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js b/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js index a9dcf0dde..b06dacb67 100644 --- a/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js +++ b/src/routes/Player/SubtitlesMenu/SubtitlesMenu.js @@ -6,8 +6,8 @@ const DiscreteSelectInput = require('./DiscreteSelectInput'); const styles = require('./styles'); const ORIGIN_PRIORITIES = { - 'EMBEDDED': 1, - 'Stream': 2 + 'EMBEDDED IN VIDEO': 1, + 'EMBEDDED IN STREAM': 2 }; const LANGUAGE_PRIORITIES = { 'eng': 1 From 19c747f019495ebccde9872d7ce838c47fe3a749 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Thu, 2 Apr 2020 13:41:18 +0300 Subject: [PATCH 25/27] assign addon to every subtitles resouce in usePlayer --- src/routes/Player/Player.js | 6 +++++- src/routes/Player/usePlayer.js | 37 +++++++--------------------------- 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index fab0793ea..e560a8a7b 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -240,7 +240,11 @@ const Player = ({ urlParams }) => { tracks: player.subtitles_resources .filter((subtitles_resource) => subtitles_resource.content.type === 'Ready') .reduce((tracks, subtitles_resource) => { - return tracks.concat(subtitles_resource.content.content); + return tracks.concat(subtitles_resource.content.content.map(({ url, lang }) => ({ + url, + lang, + origin: subtitles_resource.addon !== null ? subtitles_resource.addon.manifest.name : subtitles_resource.request.base + }))); }, []) } }); diff --git a/src/routes/Player/usePlayer.js b/src/routes/Player/usePlayer.js index 36beda83e..b7bb38b2f 100644 --- a/src/routes/Player/usePlayer.js +++ b/src/routes/Player/usePlayer.js @@ -62,42 +62,19 @@ const mapPlayerStateWithCtx = (player, ctx) => { player.meta_resource; const subtitles_resources = player.subtitles_resources.map((subtitles_resource) => { const request = subtitles_resource.request; - const origin = ctx.profile.addons.reduce((origin, addon) => { + const addon = ctx.profile.addons.reduce((result, addon) => { if (addon.transportUrl === subtitles_resource.request.base) { - return typeof addon.manifest.name === 'string' && addon.manifest.name.length > 0 ? - addon.manifest.name - : - addon.manifest.id; + return addon; } - return origin; - }, subtitles_resource.request.base); - const content = subtitles_resource.content.type === 'Ready' ? - { - type: 'Ready', - content: subtitles_resource.content.content.map(({ url, lang }) => ({ - url, - lang, - origin - })) - } - : - subtitles_resource.content; - return { - request, - origin, - content - }; + return result; + }, null); + const content = subtitles_resource.content; + return { request, addon, content }; }); const next_video = player.next_video; const lib_item = player.lib_item; - return { - selected, - meta_resource, - subtitles_resources, - next_video, - lib_item - }; + return { selected, meta_resource, subtitles_resources, next_video, lib_item }; }; const usePlayer = (urlParams) => { From 1ec803b06dfc1e76f5b1139f0e88af524596e5af Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Thu, 2 Apr 2020 18:17:14 +0300 Subject: [PATCH 26/27] basic info menu implemented --- src/routes/Player/ControlBar/ControlBar.js | 6 +-- src/routes/Player/InfoMenu/InfoMenu.js | 26 +++++++++-- src/routes/Player/InfoMenu/styles.less | 2 +- src/routes/Player/Player.js | 54 ++++++---------------- src/routes/Player/useInfo.js | 41 ++++++++++++++++ src/routes/Player/useSettings.js | 4 +- 6 files changed, 83 insertions(+), 50 deletions(-) create mode 100644 src/routes/Player/useInfo.js diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 11d1bd108..7033efa89 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -15,7 +15,7 @@ const ControlBar = ({ volume, muted, subtitlesTracks, - stream, + info, onPlayRequested, onPauseRequested, onMuteRequested, @@ -97,7 +97,7 @@ const ControlBar = ({ -