From 9e41b1277ce8c065f1482ce497177e02f5a8a469 Mon Sep 17 00:00:00 2001 From: TomekR Date: Wed, 5 Oct 2022 17:52:50 +0100 Subject: [PATCH 01/32] Add subscribe to calendar --- src/routes/Settings/Settings.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 44550794e..5fba06287 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -76,7 +76,14 @@ const Settings = () => { // TODO }, []); const subscribeCalendarOnClick = React.useCallback(() => { - // TODO + const url = `webcal://www.strem.io/calendar/${profile.auth.user._id}.ics` + window.open(url); + toast.show({ + type: 'success', + title: 'Calendar has been added to your default caldendar app', + timeout: 25000 + }) + //Stremio 4 emits not documented event subscribeCalendar }, []); const exportDataOnClick = React.useCallback(() => { // TODO @@ -226,7 +233,7 @@ const Settings = () => {
Calendar
- From 63ba29f38a229bc16dc643feb3bd6114b824066f Mon Sep 17 00:00:00 2001 From: TomekR Date: Wed, 5 Oct 2022 17:53:53 +0100 Subject: [PATCH 02/32] Add useToast --- src/routes/Settings/Settings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 5fba06287..ea756bd22 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -6,7 +6,7 @@ const throttle = require('lodash.throttle'); const Icon = require('@stremio/stremio-icons/dom'); const { useRouteFocused } = require('stremio-router'); const { useServices } = require('stremio/services'); -const { Button, Checkbox, MainNavBars, Multiselect, ColorInput, TextInput, ModalDialog, useProfile, useStreamingServer, useBinaryState, withCoreSuspender } = require('stremio/common'); +const { Button, Checkbox, MainNavBars, Multiselect, ColorInput, TextInput, ModalDialog, useProfile, useStreamingServer, useBinaryState, withCoreSuspender, useToast } = require('stremio/common'); const useProfileSettingsInputs = require('./useProfileSettingsInputs'); const useStreamingServerSettingsInputs = require('./useStreamingServerSettingsInputs'); const styles = require('./styles'); @@ -20,6 +20,7 @@ const Settings = () => { const { routeFocused } = useRouteFocused(); const profile = useProfile(); const streamingServer = useStreamingServer(); + const toast = useToast(); const { interfaceLanguageSelect, subtitlesLanguageSelect, From 3ff7a67fe583d52c31eda8be3a6699c8a0bc597d Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 31 Oct 2022 18:22:55 +0100 Subject: [PATCH 03/32] feat(Player): add options menu --- src/routes/Player/ControlBar/ControlBar.js | 15 +++- src/routes/Player/OptionsMenu/OptionsMenu.js | 86 ++++++++++++++++++++ src/routes/Player/OptionsMenu/index.js | 5 ++ src/routes/Player/OptionsMenu/styles.less | 37 +++++++++ src/routes/Player/Player.js | 20 ++++- 5 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 src/routes/Player/OptionsMenu/OptionsMenu.js create mode 100644 src/routes/Player/OptionsMenu/index.js create mode 100644 src/routes/Player/OptionsMenu/styles.less diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index b63c453f4..d8fbdb1a8 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -29,6 +29,7 @@ const ControlBar = ({ onSeekRequested, onToggleSubtitlesMenu, onToggleInfoMenu, + onToggleOptionsMenu, ...props }) => { const { chromecast } = useServices(); @@ -40,6 +41,9 @@ const ControlBar = ({ const onInfoButtonMouseDown = React.useCallback((event) => { event.nativeEvent.infoMenuClosePrevented = true; }, []); + const onOptionsButtonMouseDown = React.useCallback((event) => { + event.nativeEvent.optionsMenuClosePrevented = true; + }, []); const onPlayPauseButtonClick = React.useCallback(() => { if (paused) { if (typeof onPlayRequested === 'function') { @@ -72,6 +76,11 @@ const ControlBar = ({ onToggleInfoMenu(); } }, [onToggleInfoMenu]); + const onOptionsButtonClick = React.useCallback(() => { + if (typeof onToggleOptionsMenu === 'function') { + onToggleOptionsMenu(); + } + }, [onToggleOptionsMenu]); const onChromecastButtonClick = React.useCallback(() => { chromecast.transport.requestSession(); }, []); @@ -133,6 +142,9 @@ const ControlBar = ({ + @@ -156,7 +168,8 @@ ControlBar.propTypes = { onVolumeChangeRequested: PropTypes.func, onSeekRequested: PropTypes.func, onToggleSubtitlesMenu: PropTypes.func, - onToggleInfoMenu: PropTypes.func + onToggleInfoMenu: PropTypes.func, + onToggleOptionsMenu: PropTypes.func }; module.exports = ControlBar; diff --git a/src/routes/Player/OptionsMenu/OptionsMenu.js b/src/routes/Player/OptionsMenu/OptionsMenu.js new file mode 100644 index 000000000..83ba37e9c --- /dev/null +++ b/src/routes/Player/OptionsMenu/OptionsMenu.js @@ -0,0 +1,86 @@ +// Copyright (C) 2017-2022 Smart code 203358507 + +const React = require('react'); +const PropTypes = require('prop-types'); +const classnames = require('classnames'); +const Icon = require('@stremio/stremio-icons/dom'); +const { Button, useStreamingServer, useToast } = require('stremio/common'); +const styles = require('./styles'); + +const OptionsMenu = ({ className, stream }) => { + const streamingServer = useStreamingServer(); + const toast = useToast(); + const streamUrl = React.useMemo(() => { + return stream !== null ? + typeof stream.url === 'string' ? + stream.url + : + typeof stream.infoHash === 'string' && + typeof stream.fileIdx === 'number' && + typeof streamingServer.selected === 'object' && + typeof streamingServer.selected.transportUrl === 'string' ? + `${streamingServer.selected.transportUrl}${stream.infoHash}/${stream.fileIdx}` + : + null + : + null; + }, [stream, streamingServer]); + const onCopyStreamButtonClick = React.useCallback(() => { + if (streamUrl !== null) { + navigator.clipboard.writeText(streamUrl) + .then(() => { + toast.show({ + type: 'success', + title: 'Copied', + message: 'Stream link was copied to your clipboard', + timeout: 3000 + }); + }) + .catch((e) => { + console.error(e); + toast.show({ + type: 'error', + title: 'Error', + message: 'Failed to copy stream link. Try to enable your browser permission.', + timeout: 3000 + }); + }); + } + }, [streamUrl]); + const onDownloadVideoButtonClick = React.useCallback(() => { + if (streamUrl !== null) { + window.open(streamUrl); + } + }, [streamUrl]); + const onExternalPlayerButtonClick = React.useCallback(() => { + if (streamUrl !== null) { + window.open(`vlc://${encodeURIComponent(streamUrl)}`); + } + }, [streamUrl]); + const onMouseDown = React.useCallback((event) => { + event.nativeEvent.optionsMenuClosePrevented = true; + }, []); + return ( +
+ + + +
+ ); +}; + +OptionsMenu.propTypes = { + className: PropTypes.string, + stream: PropTypes.object +}; + +module.exports = OptionsMenu; diff --git a/src/routes/Player/OptionsMenu/index.js b/src/routes/Player/OptionsMenu/index.js new file mode 100644 index 000000000..069b002b3 --- /dev/null +++ b/src/routes/Player/OptionsMenu/index.js @@ -0,0 +1,5 @@ +// Copyright (C) 2017-2022 Smart code 203358507 + +const OptionsMenu = require('./OptionsMenu'); + +module.exports = OptionsMenu; diff --git a/src/routes/Player/OptionsMenu/styles.less b/src/routes/Player/OptionsMenu/styles.less new file mode 100644 index 000000000..54ebd0368 --- /dev/null +++ b/src/routes/Player/OptionsMenu/styles.less @@ -0,0 +1,37 @@ +// Copyright (C) 2017-2022 Smart code 203358507 + +@import (reference) '~@stremio/stremio-colors/less/stremio-colors.less'; + +.options-menu-container { + width: 15rem; + + .option-container { + display: flex; + flex-direction: row; + align-items: center; + height: 4rem; + + .icon { + flex: none; + width: 1.4rem; + height: 1.4rem; + margin: 1.3rem; + fill: @color-surface-light5-90; + } + + .label { + flex: 1; + max-height: 2.4em; + font-weight: 400; + color: @color-surface-light5-90; + } + + &:hover { + background-color: @color-background-light2; + } + + &:global(.disabled) { + opacity: 0.5; + } + } +} \ No newline at end of file diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index b16334c49..07914b63d 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -11,6 +11,7 @@ const Icon = require('@stremio/stremio-icons/dom'); const BufferingLoader = require('./BufferingLoader'); const ControlBar = require('./ControlBar'); const InfoMenu = require('./InfoMenu'); +const OptionsMenu = require('./OptionsMenu'); const SubtitlesMenu = require('./SubtitlesMenu'); const Video = require('./Video'); const usePlayer = require('./usePlayer'); @@ -38,6 +39,7 @@ const Player = ({ urlParams, queryParams }) => { const setImmersedDebounced = React.useCallback(debounce(setImmersed, 3000), []); const [subtitlesMenuOpen, , closeSubtitlesMenu, toggleSubtitlesMenu] = useBinaryState(false); const [infoMenuOpen, , closeInfoMenu, toggleInfoMenu] = useBinaryState(false); + const [optionsMenuOpen, , closeOptionsMenu, toggleOptionsMenu] = useBinaryState(false); const [error, setError] = React.useState(null); const [videoState, setVideoState] = React.useReducer( (videoState, nextVideoState) => ({ ...videoState, ...nextVideoState }), @@ -198,6 +200,9 @@ const Player = ({ urlParams, queryParams }) => { if (!event.nativeEvent.infoMenuClosePrevented) { closeInfoMenu(); } + if (!event.nativeEvent.optionsMenuClosePrevented) { + closeOptionsMenu(); + } }, []); const onContainerMouseMove = React.useCallback((event) => { setImmersed(false); @@ -399,6 +404,7 @@ const Player = ({ urlParams, queryParams }) => { } case 'KeyS': { closeInfoMenu(); + closeOptionsMenu(); if ((Array.isArray(videoState.subtitlesTracks) && videoState.subtitlesTracks.length > 0) || (Array.isArray(videoState.extraSubtitlesTracks) && videoState.extraSubtitlesTracks.length > 0) || (Array.isArray(videoState.audioTracks) && videoState.audioTracks.length > 0)) { @@ -409,6 +415,7 @@ const Player = ({ urlParams, queryParams }) => { } case 'KeyI': { closeSubtitlesMenu(); + closeOptionsMenu(); if (player.metaItem !== null && player.metaItem.type === 'Ready') { toggleInfoMenu(); } @@ -418,6 +425,7 @@ const Player = ({ urlParams, queryParams }) => { case 'Escape': { closeSubtitlesMenu(); closeInfoMenu(); + closeOptionsMenu(); break; } } @@ -437,7 +445,7 @@ const Player = ({ urlParams, queryParams }) => { }; }, []); return ( -
{ onSeekRequested={onSeekRequested} onToggleSubtitlesMenu={toggleSubtitlesMenu} onToggleInfoMenu={toggleInfoMenu} + onToggleOptionsMenu={toggleOptionsMenu} onMouseMove={onBarMouseMove} onMouseOver={onBarMouseMove} /> @@ -554,6 +563,15 @@ const Player = ({ urlParams, queryParams }) => { : null } + { + optionsMenuOpen ? + + : + null + }
); }; From 3b5ab5fc0f7ebe65f1ca37bbdc905cf78cb85e9e Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 31 Oct 2022 23:50:19 +0100 Subject: [PATCH 04/32] refactor(Player): open in external player via core transport --- src/routes/Player/OptionsMenu/OptionsMenu.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/OptionsMenu/OptionsMenu.js b/src/routes/Player/OptionsMenu/OptionsMenu.js index 83ba37e9c..52f58a7ef 100644 --- a/src/routes/Player/OptionsMenu/OptionsMenu.js +++ b/src/routes/Player/OptionsMenu/OptionsMenu.js @@ -5,10 +5,12 @@ const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('@stremio/stremio-icons/dom'); const { Button, useStreamingServer, useToast } = require('stremio/common'); +const { useServices } = require('stremio/services'); const styles = require('./styles'); const OptionsMenu = ({ className, stream }) => { const streamingServer = useStreamingServer(); + const { core } = useServices(); const toast = useToast(); const streamUrl = React.useMemo(() => { return stream !== null ? @@ -54,7 +56,16 @@ const OptionsMenu = ({ className, stream }) => { }, [streamUrl]); const onExternalPlayerButtonClick = React.useCallback(() => { if (streamUrl !== null) { - window.open(`vlc://${encodeURIComponent(streamUrl)}`); + core.transport.dispatch({ + action: 'StreamingServer', + args: { + action: 'PlayOnDevice', + args: { + device: 'vlc', + source: streamUrl, + } + } + }); } }, [streamUrl]); const onMouseDown = React.useCallback((event) => { From b15e8863832d8e340fb13ed5a4fc07f6264e0e1e Mon Sep 17 00:00:00 2001 From: TomekR Date: Thu, 17 Nov 2022 12:46:59 +0000 Subject: [PATCH 05/32] Fix lint issues --- src/routes/Settings/Settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index ea756bd22..4038fe708 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -77,13 +77,13 @@ const Settings = () => { // TODO }, []); const subscribeCalendarOnClick = React.useCallback(() => { - const url = `webcal://www.strem.io/calendar/${profile.auth.user._id}.ics` + const url = `webcal://www.strem.io/calendar/${profile.auth.user._id}.ics`; window.open(url); toast.show({ type: 'success', title: 'Calendar has been added to your default caldendar app', timeout: 25000 - }) + }); //Stremio 4 emits not documented event subscribeCalendar }, []); const exportDataOnClick = React.useCallback(() => { From e68a0a7c7718ad16146ccc86d6435eec758b5688 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 28 Nov 2022 13:28:32 +0100 Subject: [PATCH 06/32] refactor(Player): disable play in external player on options menu --- src/routes/Player/OptionsMenu/OptionsMenu.js | 36 ++++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/routes/Player/OptionsMenu/OptionsMenu.js b/src/routes/Player/OptionsMenu/OptionsMenu.js index 52f58a7ef..431ba57e1 100644 --- a/src/routes/Player/OptionsMenu/OptionsMenu.js +++ b/src/routes/Player/OptionsMenu/OptionsMenu.js @@ -5,12 +5,12 @@ const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('@stremio/stremio-icons/dom'); const { Button, useStreamingServer, useToast } = require('stremio/common'); -const { useServices } = require('stremio/services'); +// const { useServices } = require('stremio/services'); const styles = require('./styles'); const OptionsMenu = ({ className, stream }) => { const streamingServer = useStreamingServer(); - const { core } = useServices(); + // const { core } = useServices(); const toast = useToast(); const streamUrl = React.useMemo(() => { return stream !== null ? @@ -54,20 +54,20 @@ const OptionsMenu = ({ className, stream }) => { window.open(streamUrl); } }, [streamUrl]); - const onExternalPlayerButtonClick = React.useCallback(() => { - if (streamUrl !== null) { - core.transport.dispatch({ - action: 'StreamingServer', - args: { - action: 'PlayOnDevice', - args: { - device: 'vlc', - source: streamUrl, - } - } - }); - } - }, [streamUrl]); + // const onExternalPlayerButtonClick = React.useCallback(() => { + // if (streamUrl !== null) { + // core.transport.dispatch({ + // action: 'StreamingServer', + // args: { + // action: 'PlayOnDevice', + // args: { + // device: 'vlc', + // source: streamUrl, + // } + // } + // }); + // } + // }, [streamUrl]); const onMouseDown = React.useCallback((event) => { event.nativeEvent.optionsMenuClosePrevented = true; }, []); @@ -81,10 +81,10 @@ const OptionsMenu = ({ className, stream }) => {
Download Video
- + */} ); }; From 87733e6e1fff0c72bcd7857fc904f594b80389f0 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 28 Nov 2022 13:32:02 +0100 Subject: [PATCH 07/32] fix(Player): display layer also for options menu --- src/routes/Player/Player.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 63523311c..1ce59f7a3 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -578,7 +578,7 @@ const Player = ({ urlParams, queryParams }) => { null } { - subtitlesMenuOpen || infoMenuOpen || videosMenuOpen || speedMenuOpen ? + subtitlesMenuOpen || infoMenuOpen || videosMenuOpen || speedMenuOpen || optionsMenuOpen ?
: null From d090ac59526146e86fc018cacb8d1c3927affbd3 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 28 Nov 2022 13:35:17 +0100 Subject: [PATCH 08/32] fix(Player): disble play shortcuts when options menu is open --- src/routes/Player/Player.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 1ce59f7a3..842b21b57 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -422,7 +422,7 @@ const Player = ({ urlParams, queryParams }) => { const onKeyDown = (event) => { switch (event.code) { case 'Space': { - if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen&& videoState.paused !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && !optionsMenuOpen && videoState.paused !== null) { if (videoState.paused) { onPlayRequested(); } else { @@ -433,7 +433,7 @@ const Player = ({ urlParams, queryParams }) => { break; } case 'ArrowRight': { - if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && videoState.time !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && !optionsMenuOpen && videoState.time !== null) { const seekTimeMultiplier = event.shiftKey ? 3 : 1; onSeekRequested(videoState.time + (settings.seekTimeDuration * seekTimeMultiplier)); } @@ -441,7 +441,7 @@ const Player = ({ urlParams, queryParams }) => { break; } case 'ArrowLeft': { - if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && videoState.time !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && !optionsMenuOpen && videoState.time !== null) { const seekTimeMultiplier = event.shiftKey ? 3 : 1; onSeekRequested(videoState.time - (settings.seekTimeDuration * seekTimeMultiplier)); } @@ -449,14 +449,14 @@ const Player = ({ urlParams, queryParams }) => { break; } case 'ArrowUp': { - if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && videoState.volume !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && !optionsMenuOpen && videoState.volume !== null) { onVolumeChangeRequested(videoState.volume + 5); } break; } case 'ArrowDown': { - if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && videoState.volume !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && !speedMenuOpen && !optionsMenuOpen && videoState.volume !== null) { onVolumeChangeRequested(videoState.volume - 5); } @@ -524,7 +524,7 @@ const Player = ({ urlParams, queryParams }) => { return () => { window.removeEventListener('keydown', onKeyDown); }; - }, [player.metaItem, settings.seekTimeDuration, routeFocused, subtitlesMenuOpen, infoMenuOpen, videosMenuOpen, speedMenuOpen, videoState.paused, videoState.time, videoState.volume, videoState.audioTracks, videoState.subtitlesTracks, videoState.extraSubtitlesTracks, videoState.playbackSpeed, toggleSubtitlesMenu, toggleInfoMenu, toggleVideosMenu]); + }, [player.metaItem, settings.seekTimeDuration, routeFocused, subtitlesMenuOpen, infoMenuOpen, videosMenuOpen, speedMenuOpen, optionsMenuOpen, videoState.paused, videoState.time, videoState.volume, videoState.audioTracks, videoState.subtitlesTracks, videoState.extraSubtitlesTracks, videoState.playbackSpeed, toggleSubtitlesMenu, toggleInfoMenu, toggleVideosMenu]); React.useLayoutEffect(() => { return () => { setImmersedDebounced.cancel(); From f7a2fdc40488b899f02296c7e14b199ae4c31e67 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 28 Nov 2022 13:37:43 +0100 Subject: [PATCH 09/32] fix(Player): use player.selected.stream instead of videoState.stream for options menu --- src/routes/Player/Player.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 842b21b57..1c29fcef0 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -679,7 +679,7 @@ const Player = ({ urlParams, queryParams }) => { optionsMenuOpen ? : null From 825102bb0f63952bef73fa3a9f0c33dd3e980c01 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Dec 2022 12:59:32 +0100 Subject: [PATCH 10/32] chore: update stremio-core-web --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef6320fc5..b5d8bcef8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.7", + "@stremio/stremio-core-web": "0.44.8", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", @@ -2699,9 +2699,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "node_modules/@stremio/stremio-core-web": { - "version": "0.44.7", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.7.tgz", - "integrity": "sha512-hkeYLfL1On4TMBHn87Onrp93aeRuTh4YXMKdDR1Vz5YikPOiPEq/JRoLLmmSSsFEdifs6Egu+A0qiggTttepOA==", + "version": "0.44.8", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.8.tgz", + "integrity": "sha512-c7ARfOxf0yy73b6sZauCLPUjpNYacF9tZXW7bxxg18IBGv7kXDBvLnk1rc54XKhJfHRgAPJuY5I1ijA0bM4nBQ==", "dependencies": { "@babel/runtime": "7.16.0" } @@ -16716,9 +16716,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "@stremio/stremio-core-web": { - "version": "0.44.7", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.7.tgz", - "integrity": "sha512-hkeYLfL1On4TMBHn87Onrp93aeRuTh4YXMKdDR1Vz5YikPOiPEq/JRoLLmmSSsFEdifs6Egu+A0qiggTttepOA==", + "version": "0.44.8", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.8.tgz", + "integrity": "sha512-c7ARfOxf0yy73b6sZauCLPUjpNYacF9tZXW7bxxg18IBGv7kXDBvLnk1rc54XKhJfHRgAPJuY5I1ijA0bM4nBQ==", "requires": { "@babel/runtime": "7.16.0" } diff --git a/package.json b/package.json index 2242f5f80..b998ad00e 100755 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.7", + "@stremio/stremio-core-web": "0.44.8", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", From 117dd30c76df215c8da8ad73c97b24177a5101eb Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Dec 2022 13:00:52 +0100 Subject: [PATCH 11/32] refactor(OptionsMenu): use download prop from external deeplinks for streamUrl --- src/routes/Player/OptionsMenu/OptionsMenu.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/routes/Player/OptionsMenu/OptionsMenu.js b/src/routes/Player/OptionsMenu/OptionsMenu.js index 431ba57e1..898bbb32d 100644 --- a/src/routes/Player/OptionsMenu/OptionsMenu.js +++ b/src/routes/Player/OptionsMenu/OptionsMenu.js @@ -14,16 +14,12 @@ const OptionsMenu = ({ className, stream }) => { const toast = useToast(); const streamUrl = React.useMemo(() => { return stream !== null ? - typeof stream.url === 'string' ? - stream.url + stream.deepLinks && + stream.deepLinks.externalPlayer && + typeof stream.deepLinks.externalPlayer.download === 'string' ? + stream.deepLinks.externalPlayer.download : - typeof stream.infoHash === 'string' && - typeof stream.fileIdx === 'number' && - typeof streamingServer.selected === 'object' && - typeof streamingServer.selected.transportUrl === 'string' ? - `${streamingServer.selected.transportUrl}${stream.infoHash}/${stream.fileIdx}` - : - null + null : null; }, [stream, streamingServer]); From 879118b09860664db62234190bdbc01df0691dfa Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Dec 2022 13:03:56 +0100 Subject: [PATCH 12/32] refactor(OptionsMenu): add streamUrl to toast error message --- src/routes/Player/OptionsMenu/OptionsMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/OptionsMenu/OptionsMenu.js b/src/routes/Player/OptionsMenu/OptionsMenu.js index 898bbb32d..77e484b63 100644 --- a/src/routes/Player/OptionsMenu/OptionsMenu.js +++ b/src/routes/Player/OptionsMenu/OptionsMenu.js @@ -39,7 +39,7 @@ const OptionsMenu = ({ className, stream }) => { toast.show({ type: 'error', title: 'Error', - message: 'Failed to copy stream link. Try to enable your browser permission.', + message: `Failed to copy stream link: ${streamUrl}`, timeout: 3000 }); }); From 3b9c52d99ad9eadd3d869356b71382cf3095a3fd Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Dec 2022 14:14:22 +0100 Subject: [PATCH 13/32] refactor(OptionsMenu): remove the need of streamingServer --- src/routes/Player/OptionsMenu/OptionsMenu.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/routes/Player/OptionsMenu/OptionsMenu.js b/src/routes/Player/OptionsMenu/OptionsMenu.js index 77e484b63..a310dc66c 100644 --- a/src/routes/Player/OptionsMenu/OptionsMenu.js +++ b/src/routes/Player/OptionsMenu/OptionsMenu.js @@ -4,12 +4,11 @@ const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const Icon = require('@stremio/stremio-icons/dom'); -const { Button, useStreamingServer, useToast } = require('stremio/common'); +const { Button, useToast } = require('stremio/common'); // const { useServices } = require('stremio/services'); const styles = require('./styles'); const OptionsMenu = ({ className, stream }) => { - const streamingServer = useStreamingServer(); // const { core } = useServices(); const toast = useToast(); const streamUrl = React.useMemo(() => { @@ -22,7 +21,7 @@ const OptionsMenu = ({ className, stream }) => { null : null; - }, [stream, streamingServer]); + }, [stream]); const onCopyStreamButtonClick = React.useCallback(() => { if (streamUrl !== null) { navigator.clipboard.writeText(streamUrl) From 52fdee39e7b7b6c13f02281918cd9969e746397c Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 22 Dec 2022 03:17:27 +0100 Subject: [PATCH 14/32] chore: update stremio-core-web --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b5d8bcef8..928a5a31d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.8", + "@stremio/stremio-core-web": "0.44.9", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", @@ -2699,9 +2699,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "node_modules/@stremio/stremio-core-web": { - "version": "0.44.8", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.8.tgz", - "integrity": "sha512-c7ARfOxf0yy73b6sZauCLPUjpNYacF9tZXW7bxxg18IBGv7kXDBvLnk1rc54XKhJfHRgAPJuY5I1ijA0bM4nBQ==", + "version": "0.44.9", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.9.tgz", + "integrity": "sha512-2ziXDj+lsseegJe8vn4OlkpVccoBZRJMs42a3cV4C0N5CNSXs5A6SxMw/ZTnOzLMnpoHF84q5RUYAxcndUGj6w==", "dependencies": { "@babel/runtime": "7.16.0" } @@ -16716,9 +16716,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "@stremio/stremio-core-web": { - "version": "0.44.8", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.8.tgz", - "integrity": "sha512-c7ARfOxf0yy73b6sZauCLPUjpNYacF9tZXW7bxxg18IBGv7kXDBvLnk1rc54XKhJfHRgAPJuY5I1ijA0bM4nBQ==", + "version": "0.44.9", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.9.tgz", + "integrity": "sha512-2ziXDj+lsseegJe8vn4OlkpVccoBZRJMs42a3cV4C0N5CNSXs5A6SxMw/ZTnOzLMnpoHF84q5RUYAxcndUGj6w==", "requires": { "@babel/runtime": "7.16.0" } diff --git a/package.json b/package.json index b998ad00e..1b3cac17f 100755 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.8", + "@stremio/stremio-core-web": "0.44.9", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", From 9433897b056b1cf86f8c0002f6630df8f562658b Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 22 Dec 2022 03:26:28 +0100 Subject: [PATCH 15/32] feat(Settings): implement data export --- src/routes/Settings/Settings.js | 10 +++++++--- src/routes/Settings/useDataExport.js | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/routes/Settings/useDataExport.js diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 3b99b20fb..d98a24267 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -9,6 +9,7 @@ const { useServices } = require('stremio/services'); const { Button, Checkbox, MainNavBars, Multiselect, ColorInput, TextInput, ModalDialog, useProfile, useStreamingServer, useBinaryState, withCoreSuspender } = require('stremio/common'); const useProfileSettingsInputs = require('./useProfileSettingsInputs'); const useStreamingServerSettingsInputs = require('./useStreamingServerSettingsInputs'); +const useDataExport = require('./useDataExport'); const styles = require('./styles'); const GENERAL_SECTION = 'general'; @@ -20,6 +21,7 @@ const Settings = () => { const { core } = useServices(); const { routeFocused } = useRouteFocused(); const profile = useProfile(); + const dataExport = useDataExport(); const streamingServer = useStreamingServer(); const { interfaceLanguageSelect, @@ -82,8 +84,10 @@ const Settings = () => { // TODO }, []); const exportDataOnClick = React.useCallback(() => { - // TODO - }, []); + if (dataExport.exportUrl !== null && typeof dataExport.exportUrl === 'string') { + window.open(dataExport.exportUrl); + } + }, [dataExport.exportUrl]); const reloadStreamingServer = React.useCallback(() => { core.transport.dispatch({ action: 'StreamingServer', @@ -240,7 +244,7 @@ const Settings = () => {
-
diff --git a/src/routes/Settings/useDataExport.js b/src/routes/Settings/useDataExport.js new file mode 100644 index 000000000..8092d550f --- /dev/null +++ b/src/routes/Settings/useDataExport.js @@ -0,0 +1,24 @@ +// Copyright (C) 2017-2022 Smart code 203358507 + +const React = require('react'); +const { useModelState } = require('stremio/common'); + +const map = (dataExport) => ({ + ...dataExport, + exportUrl: dataExport !== null && dataExport.exportUrl !== null && dataExport.exportUrl.type === 'Ready' ? + dataExport.exportUrl.content + : + null +}); + +const useDataExport = () => { + const action = React.useMemo(() => ({ + action: 'Load', + args: { + model: 'DataExport', + } + }), []); + return useModelState({ model: 'data_export', action, map }); +}; + +module.exports = useDataExport; From 2c3e656eb52ae1a84a9a8262ab487552974dd91e Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 22 Dec 2022 11:22:42 +0100 Subject: [PATCH 16/32] chore: update stremio-core-web --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 928a5a31d..275f9aa31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.9", + "@stremio/stremio-core-web": "0.44.10", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", @@ -2699,9 +2699,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "node_modules/@stremio/stremio-core-web": { - "version": "0.44.9", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.9.tgz", - "integrity": "sha512-2ziXDj+lsseegJe8vn4OlkpVccoBZRJMs42a3cV4C0N5CNSXs5A6SxMw/ZTnOzLMnpoHF84q5RUYAxcndUGj6w==", + "version": "0.44.10", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.10.tgz", + "integrity": "sha512-+AUJ3d5u5SH64lcuQIAtXPfeIaWzSNfdDL92HECXP29qat2TtCyM+ENLhTuMZzrbInD22SQrRhfIS3T8nFVQYg==", "dependencies": { "@babel/runtime": "7.16.0" } @@ -16716,9 +16716,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "@stremio/stremio-core-web": { - "version": "0.44.9", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.9.tgz", - "integrity": "sha512-2ziXDj+lsseegJe8vn4OlkpVccoBZRJMs42a3cV4C0N5CNSXs5A6SxMw/ZTnOzLMnpoHF84q5RUYAxcndUGj6w==", + "version": "0.44.10", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.10.tgz", + "integrity": "sha512-+AUJ3d5u5SH64lcuQIAtXPfeIaWzSNfdDL92HECXP29qat2TtCyM+ENLhTuMZzrbInD22SQrRhfIS3T8nFVQYg==", "requires": { "@babel/runtime": "7.16.0" } diff --git a/package.json b/package.json index 1b3cac17f..6aff4873d 100755 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.9", + "@stremio/stremio-core-web": "0.44.10", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", From 2371ca1d3f0a70a62e7f5d433f41b1ac33c8c3ac Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 23 Dec 2022 06:23:17 +0100 Subject: [PATCH 17/32] refactor(Settings): load data_export model on click --- src/routes/Settings/Settings.js | 15 +++++++++------ src/routes/Settings/useDataExport.js | 22 +++++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index d98a24267..c90b7150e 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -21,7 +21,7 @@ const Settings = () => { const { core } = useServices(); const { routeFocused } = useRouteFocused(); const profile = useProfile(); - const dataExport = useDataExport(); + const [dataExport, loadDataExport] = useDataExport(); const streamingServer = useStreamingServer(); const { interfaceLanguageSelect, @@ -84,10 +84,8 @@ const Settings = () => { // TODO }, []); const exportDataOnClick = React.useCallback(() => { - if (dataExport.exportUrl !== null && typeof dataExport.exportUrl === 'string') { - window.open(dataExport.exportUrl); - } - }, [dataExport.exportUrl]); + loadDataExport(); + }, []); const reloadStreamingServer = React.useCallback(() => { core.transport.dispatch({ action: 'StreamingServer', @@ -132,6 +130,11 @@ const Settings = () => { const sectionsContainerOnScorll = React.useCallback(throttle(() => { updateSelectedSectionId(); }, 50), []); + React.useEffect(() => { + if (dataExport.exportUrl !== null && typeof dataExport.exportUrl === 'string') { + window.open(dataExport.exportUrl); + } + }, [dataExport.exportUrl]); React.useLayoutEffect(() => { if (routeFocused) { updateSelectedSectionId(); @@ -244,7 +247,7 @@ const Settings = () => {
-
diff --git a/src/routes/Settings/useDataExport.js b/src/routes/Settings/useDataExport.js index 8092d550f..d90d2c397 100644 --- a/src/routes/Settings/useDataExport.js +++ b/src/routes/Settings/useDataExport.js @@ -1,6 +1,7 @@ // Copyright (C) 2017-2022 Smart code 203358507 const React = require('react'); +const { useServices } = require('stremio/services'); const { useModelState } = require('stremio/common'); const map = (dataExport) => ({ @@ -12,13 +13,20 @@ const map = (dataExport) => ({ }); const useDataExport = () => { - const action = React.useMemo(() => ({ - action: 'Load', - args: { - model: 'DataExport', - } - }), []); - return useModelState({ model: 'data_export', action, map }); + const { core } = useServices(); + const loadDataExport = React.useCallback(() => { + core.transport.dispatch({ + action: 'Load', + args: { + model: 'DataExport', + } + }, 'data_export'); + }, []); + const dataExport = useModelState({ model: 'data_export', map }); + return [ + dataExport, + loadDataExport + ]; }; module.exports = useDataExport; From 650ada3f8ed80f7f976c9d5a2e2063bf3969fbce Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 26 Dec 2022 17:56:20 +0100 Subject: [PATCH 18/32] feat(Settings): implement trakt auth and install addon --- src/routes/Settings/Settings.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index c90b7150e..fe11e82bd 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -75,8 +75,11 @@ const Settings = () => { }); }, []); const authenticateTraktOnClick = React.useCallback(() => { - // TODO - }, []); + if (profile.auth !== null && profile.auth.user !== null && profile.auth.user.trakt === null && typeof profile.auth.user._id === 'string') { + const auth_url = `https://www.strem.io/trakt/auth/${profile.auth.user._id}`; + window.open(auth_url); + } + }, [profile.auth]); const importFacebookOnClick = React.useCallback(() => { // TODO }, []); @@ -130,6 +133,16 @@ const Settings = () => { const sectionsContainerOnScorll = React.useCallback(throttle(() => { updateSelectedSectionId(); }, 50), []); + React.useEffect(() => { + if (profile.auth !== null && profile.auth.user !== null && profile.auth.user.trakt !== null) { + core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'InstallTraktAddon' + } + }); + } + }, [profile.auth]); React.useEffect(() => { if (dataExport.exportUrl !== null && typeof dataExport.exportUrl === 'string') { window.open(dataExport.exportUrl); @@ -223,9 +236,10 @@ const Settings = () => {
Trakt Scrobbling
-
From b9e826553ccdd22fee2f4aa7405a627cbd1fa4b2 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 26 Dec 2022 17:57:03 +0100 Subject: [PATCH 19/32] refactor(ServicesToaster): prevent installed trakt addon toast error --- src/App/ServicesToaster.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/App/ServicesToaster.js b/src/App/ServicesToaster.js index 43b076c9a..6ae2c7107 100644 --- a/src/App/ServicesToaster.js +++ b/src/App/ServicesToaster.js @@ -19,6 +19,10 @@ const ServicesToaster = () => { break; } + if (args.source.event === 'AddonInstalled' && args.source.args.transport_url.startsWith('https://www.strem.io/trakt/addon')) { + break; + } + toast.show({ type: 'error', title: args.source.event, From 08c024f63286678f8ddd0f684b1cc8cb74c178c7 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 27 Dec 2022 08:28:25 +0100 Subject: [PATCH 20/32] refactor(Settings): remove facebook import setting --- src/routes/Settings/Settings.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index c90b7150e..732601f7a 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -77,9 +77,6 @@ const Settings = () => { const authenticateTraktOnClick = React.useCallback(() => { // TODO }, []); - const importFacebookOnClick = React.useCallback(() => { - // TODO - }, []); const subscribeCalendarOnClick = React.useCallback(() => { // TODO }, []); @@ -228,15 +225,6 @@ const Settings = () => {
Authenticate
-
-
-
Facebook
-
- -
Calendar
From 998cd7d9e032697b2940ccf076a96d04854b735d Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Dec 2022 08:48:33 +0100 Subject: [PATCH 21/32] refactor(Settings): improve trakt auth logic --- src/routes/Settings/Settings.js | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index fe11e82bd..6ad3ea941 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -49,6 +49,10 @@ const Settings = () => { streamingServerUrlInput.onChange(configureServerUrlInputRef.current.value); closeConfigureServerUrlModal(); }, [streamingServerUrlInput]); + const [traktAuthStarted, setTraktAuthStarted] = React.useState(false); + const isTraktAuthenticated = React.useMemo(() => { + return profile.auth !== null && profile.auth.user !== null && profile.auth.user.trakt !== null; + }, [profile.auth]); const configureServerUrlModalButtons = React.useMemo(() => { return [ { @@ -75,11 +79,11 @@ const Settings = () => { }); }, []); const authenticateTraktOnClick = React.useCallback(() => { - if (profile.auth !== null && profile.auth.user !== null && profile.auth.user.trakt === null && typeof profile.auth.user._id === 'string') { - const auth_url = `https://www.strem.io/trakt/auth/${profile.auth.user._id}`; - window.open(auth_url); + if (!isTraktAuthenticated && profile.auth !== null && profile.auth.user !== null && typeof profile.auth.user._id === 'string') { + window.open(`https://www.strem.io/trakt/auth/${profile.auth.user._id}`); + setTraktAuthStarted(true); } - }, [profile.auth]); + }, [isTraktAuthenticated, profile.auth]); const importFacebookOnClick = React.useCallback(() => { // TODO }, []); @@ -134,15 +138,16 @@ const Settings = () => { updateSelectedSectionId(); }, 50), []); React.useEffect(() => { - if (profile.auth !== null && profile.auth.user !== null && profile.auth.user.trakt !== null) { + if (isTraktAuthenticated && traktAuthStarted) { core.transport.dispatch({ action: 'Ctx', args: { action: 'InstallTraktAddon' } }); + setTraktAuthStarted(false); } - }, [profile.auth]); + }, [isTraktAuthenticated, traktAuthStarted]); React.useEffect(() => { if (dataExport.exportUrl !== null && typeof dataExport.exportUrl === 'string') { window.open(dataExport.exportUrl); @@ -153,7 +158,19 @@ const Settings = () => { updateSelectedSectionId(); } closeConfigureServerUrlModal(); - }, [routeFocused]); + const onWindowFocus = () => { + if (!isTraktAuthenticated && traktAuthStarted) { + core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'PullUserFromAPI' + } + }); + } + }; + window.addEventListener('focus', onWindowFocus); + return () => window.removeEventListener('focus', onWindowFocus); + }, [routeFocused, isTraktAuthenticated, traktAuthStarted]); return (
From f57a053b1ef009b41355ecd0b7c1b957c57b1381 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Dec 2022 09:06:36 +0100 Subject: [PATCH 22/32] chore: update stremio-core-web --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 275f9aa31..8959f8609 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.10", + "@stremio/stremio-core-web": "0.44.11", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", @@ -2699,9 +2699,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "node_modules/@stremio/stremio-core-web": { - "version": "0.44.10", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.10.tgz", - "integrity": "sha512-+AUJ3d5u5SH64lcuQIAtXPfeIaWzSNfdDL92HECXP29qat2TtCyM+ENLhTuMZzrbInD22SQrRhfIS3T8nFVQYg==", + "version": "0.44.11", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.11.tgz", + "integrity": "sha512-KkNEZenQ+94ylYEMl/AqvL1Md4p+xwqg/02FKuVxjFBEoKyXEDXCgOKOI7wbbXdZJe8tnvk+XFq39jzAiTinSw==", "dependencies": { "@babel/runtime": "7.16.0" } @@ -16716,9 +16716,9 @@ "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "@stremio/stremio-core-web": { - "version": "0.44.10", - "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.10.tgz", - "integrity": "sha512-+AUJ3d5u5SH64lcuQIAtXPfeIaWzSNfdDL92HECXP29qat2TtCyM+ENLhTuMZzrbInD22SQrRhfIS3T8nFVQYg==", + "version": "0.44.11", + "resolved": "https://registry.npmjs.org/@stremio/stremio-core-web/-/stremio-core-web-0.44.11.tgz", + "integrity": "sha512-KkNEZenQ+94ylYEMl/AqvL1Md4p+xwqg/02FKuVxjFBEoKyXEDXCgOKOI7wbbXdZJe8tnvk+XFq39jzAiTinSw==", "requires": { "@babel/runtime": "7.16.0" } diff --git a/package.json b/package.json index 6aff4873d..f570411c1 100755 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", "@stremio/stremio-colors": "5.0.1", - "@stremio/stremio-core-web": "0.44.10", + "@stremio/stremio-core-web": "0.44.11", "@stremio/stremio-icons": "4.0.0", "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", From 0a55c3bdf815b86d984db28b9896b5bcc28ca976 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Dec 2022 09:07:12 +0100 Subject: [PATCH 23/32] feat(Settings): implement trakt logout --- src/routes/Settings/Settings.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 6ad3ea941..807658fd2 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -78,10 +78,17 @@ const Settings = () => { } }); }, []); - const authenticateTraktOnClick = React.useCallback(() => { + const toggleTraktOnClick = React.useCallback(() => { if (!isTraktAuthenticated && profile.auth !== null && profile.auth.user !== null && typeof profile.auth.user._id === 'string') { window.open(`https://www.strem.io/trakt/auth/${profile.auth.user._id}`); setTraktAuthStarted(true); + } else { + core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'LogoutTrakt' + } + }); } }, [isTraktAuthenticated, profile.auth]); const importFacebookOnClick = React.useCallback(() => { @@ -253,10 +260,11 @@ const Settings = () => {
Trakt Scrobbling
-
From 43f3481632e42fe7c5fe2408ea33702279668556 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Dec 2022 09:31:01 +0100 Subject: [PATCH 24/32] refactor: dispatch ctx api actions on window focus instead --- src/App/App.js | 44 ++++++++++++++++++--------------- src/routes/Settings/Settings.js | 14 +---------- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/src/App/App.js b/src/App/App.js index c0a79b727..124e4f53d 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -90,26 +90,30 @@ const App = () => { }; }, []); React.useEffect(() => { - if (services.core.active) { - services.core.transport.dispatch({ - action: 'Ctx', - args: { - action: 'PullAddonsFromAPI' - } - }); - services.core.transport.dispatch({ - action: 'Ctx', - args: { - action: 'PullUserFromAPI' - } - }); - services.core.transport.dispatch({ - action: 'Ctx', - args: { - action: 'SyncLibraryWithAPI' - } - }); - } + const onWindowFocus = () => { + if (services.core.active) { + services.core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'PullAddonsFromAPI' + } + }); + services.core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'PullUserFromAPI' + } + }); + services.core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'SyncLibraryWithAPI' + } + }); + } + }; + window.addEventListener('focus', onWindowFocus); + return () => window.removeEventListener('focus', onWindowFocus); }, [initialized]); return ( diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 3ee6a2ed2..a4820c132 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -162,19 +162,7 @@ const Settings = () => { updateSelectedSectionId(); } closeConfigureServerUrlModal(); - const onWindowFocus = () => { - if (!isTraktAuthenticated && traktAuthStarted) { - core.transport.dispatch({ - action: 'Ctx', - args: { - action: 'PullUserFromAPI' - } - }); - } - }; - window.addEventListener('focus', onWindowFocus); - return () => window.removeEventListener('focus', onWindowFocus); - }, [routeFocused, isTraktAuthenticated, traktAuthStarted]); + }, [routeFocused]); return (
From 2beaffc9ab6cf7213b97765cb7485ffdffc9dbf7 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Dec 2022 09:38:11 +0100 Subject: [PATCH 25/32] fix(App): update ctx api actions hook logic --- src/App/App.js | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/App/App.js b/src/App/App.js index 124e4f53d..1735cee0d 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -91,28 +91,29 @@ const App = () => { }, []); React.useEffect(() => { const onWindowFocus = () => { - if (services.core.active) { - services.core.transport.dispatch({ - action: 'Ctx', - args: { - action: 'PullAddonsFromAPI' - } - }); - services.core.transport.dispatch({ - action: 'Ctx', - args: { - action: 'PullUserFromAPI' - } - }); - services.core.transport.dispatch({ - action: 'Ctx', - args: { - action: 'SyncLibraryWithAPI' - } - }); - } + services.core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'PullAddonsFromAPI' + } + }); + services.core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'PullUserFromAPI' + } + }); + services.core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'SyncLibraryWithAPI' + } + }); }; - window.addEventListener('focus', onWindowFocus); + if (services.core.active) { + onWindowFocus(); + window.addEventListener('focus', onWindowFocus); + } return () => window.removeEventListener('focus', onWindowFocus); }, [initialized]); return ( From 758347076a5f8cb983e5330e9996c3fb161a2271 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Dec 2022 10:11:29 +0100 Subject: [PATCH 26/32] fix(Settings): check for trakt token expires --- src/routes/Settings/Settings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index a4820c132..fb891a404 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -51,7 +51,8 @@ const Settings = () => { }, [streamingServerUrlInput]); const [traktAuthStarted, setTraktAuthStarted] = React.useState(false); const isTraktAuthenticated = React.useMemo(() => { - return profile.auth !== null && profile.auth.user !== null && profile.auth.user.trakt !== null; + return profile.auth !== null && profile.auth.user !== null && profile.auth.user.trakt !== null && + (Date.now() / 1000) < (profile.auth.user.trakt.created_at + profile.auth.user.trakt.expires_in); }, [profile.auth]); const configureServerUrlModalButtons = React.useMemo(() => { return [ From d1819f4bd68bebf286d2538bf3d06ba2736c1353 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 29 Dec 2022 10:11:35 +0100 Subject: [PATCH 27/32] refactor(ServicesToaster): add more checks when suppressing trakt addon installed error --- src/App/ServicesToaster.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App/ServicesToaster.js b/src/App/ServicesToaster.js index 6ae2c7107..d3fdd3461 100644 --- a/src/App/ServicesToaster.js +++ b/src/App/ServicesToaster.js @@ -19,7 +19,7 @@ const ServicesToaster = () => { break; } - if (args.source.event === 'AddonInstalled' && args.source.args.transport_url.startsWith('https://www.strem.io/trakt/addon')) { + if (args.error.type === 'Other' && args.error.code === 3 && args.source.event === 'AddonInstalled' && args.source.args.transport_url.startsWith('https://www.strem.io/trakt/addon')) { break; } From 4401157e21077a16556cb97cfdd7508ac3e83696 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Tue, 3 Jan 2023 11:45:05 +0200 Subject: [PATCH 28/32] Add Video Params for Subs Requests --- src/routes/Player/Player.js | 65 +++++++++++++++++----------------- src/routes/Player/usePlayer.js | 5 +-- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index dacf654b7..be7d9fc1e 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -30,7 +30,39 @@ const Player = ({ urlParams, queryParams }) => { queryParams.has('maxAudioChannels') ? parseInt(queryParams.get('maxAudioChannels'), 10) : null ]; }, [queryParams]); - const [player, timeChanged, pausedChanged, ended, pushToLibrary] = usePlayer(urlParams); + const [videoState, setVideoState] = React.useReducer( + (videoState, nextVideoState) => ({ ...videoState, ...nextVideoState }), + { + manifest: null, + stream: null, + paused: null, + time: null, + duration: null, + buffering: null, + volume: null, + muted: null, + playbackSpeed: null, + videoParams: null, + audioTracks: [], + selectedAudioTrackId: null, + subtitlesTracks: [], + selectedSubtitlesTrackId: null, + subtitlesOffset: null, + subtitlesSize: null, + subtitlesTextColor: null, + subtitlesBackgroundColor: null, + subtitlesOutlineColor: null, + extraSubtitlesTracks: [], + selectedExtraSubtitlesTrackId: null, + extraSubtitlesSize: null, + extraSubtitlesDelay: null, + extraSubtitlesOffset: null, + extraSubtitlesTextColor: null, + extraSubtitlesBackgroundColor: null, + extraSubtitlesOutlineColor: null + } + ); + const [player, timeChanged, pausedChanged, ended, pushToLibrary] = usePlayer(urlParams, videoState.videoParams); const [settings, updateSettings] = useSettings(); const streamingServer = useStreamingServer(); const routeFocused = useRouteFocused(); @@ -51,37 +83,6 @@ const Player = ({ urlParams, queryParams }) => { const defaultSubtitlesSelected = React.useRef(false); const defaultAudioTrackSelected = React.useRef(false); const [error, setError] = React.useState(null); - const [videoState, setVideoState] = React.useReducer( - (videoState, nextVideoState) => ({ ...videoState, ...nextVideoState }), - { - manifest: null, - stream: null, - paused: null, - time: null, - duration: null, - buffering: null, - volume: null, - muted: null, - playbackSpeed: null, - audioTracks: [], - selectedAudioTrackId: null, - subtitlesTracks: [], - selectedSubtitlesTrackId: null, - subtitlesOffset: null, - subtitlesSize: null, - subtitlesTextColor: null, - subtitlesBackgroundColor: null, - subtitlesOutlineColor: null, - extraSubtitlesTracks: [], - selectedExtraSubtitlesTrackId: null, - extraSubtitlesSize: null, - extraSubtitlesDelay: null, - extraSubtitlesOffset: null, - extraSubtitlesTextColor: null, - extraSubtitlesBackgroundColor: null, - extraSubtitlesOutlineColor: null - } - ); const videoRef = React.useRef(null); const dispatch = React.useCallback((action, options) => { if (videoRef.current !== null) { diff --git a/src/routes/Player/usePlayer.js b/src/routes/Player/usePlayer.js index 9acd16396..632cf81b5 100644 --- a/src/routes/Player/usePlayer.js +++ b/src/routes/Player/usePlayer.js @@ -32,7 +32,7 @@ const map = (player) => ({ player.metaItem, }); -const usePlayer = (urlParams) => { +const usePlayer = (urlParams, videoParams) => { const { core } = useServices(); const { decodeStream } = useCoreSuspender(); const stream = decodeStream(urlParams.stream); @@ -44,6 +44,7 @@ const usePlayer = (urlParams) => { model: 'Player', args: { stream, + videoParams, streamRequest: typeof urlParams.streamTransportUrl === 'string' && typeof urlParams.type === 'string' && typeof urlParams.videoId === 'string' ? { base: urlParams.streamTransportUrl, @@ -85,7 +86,7 @@ const usePlayer = (urlParams) => { action: 'Unload' }; } - }, [urlParams]); + }, [urlParams, videoParams]); const timeChanged = React.useCallback((time, duration, device) => { core.transport.dispatch({ action: 'Player', From b680f22b9e7fb19a76fc265186fc0b20eb607278 Mon Sep 17 00:00:00 2001 From: Vinicius Zucatti Date: Sun, 5 Feb 2023 18:55:59 -0300 Subject: [PATCH 29/32] fix: Add autofocus to server url input on settings modal --- src/routes/Settings/Settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 4bcee1a00..870e70e64 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -594,6 +594,7 @@ const Settings = () => { onCloseRequest={closeConfigureServerUrlModal}> Date: Sun, 5 Mar 2023 14:20:33 +0100 Subject: [PATCH 30/32] fix(Settings): profile auth condition issue --- src/routes/Settings/Settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 870e70e64..5dcf697fa 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -257,7 +257,7 @@ const Settings = () => {
From 13fa0d8d4efa7ebfec1510f4c48fc17698b4a9ce Mon Sep 17 00:00:00 2001 From: Tim Date: Sun, 5 Mar 2023 14:39:47 +0100 Subject: [PATCH 31/32] fix(Player): props issue on open in external player button --- src/routes/Player/Player.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index be7d9fc1e..3d516db9d 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -589,8 +589,8 @@ const Player = ({ urlParams, queryParams }) => {
{error.message}
{ - player.selected !== null ? - From 5428e30d7453e98da583c816b9b04801a5c5944d Mon Sep 17 00:00:00 2001 From: Tim Date: Sun, 5 Mar 2023 14:46:52 +0100 Subject: [PATCH 32/32] refactor(Player): remove unecessary checks --- src/routes/Player/Player.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index 3d516db9d..6f27e0b11 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -589,7 +589,7 @@ const Player = ({ urlParams, queryParams }) => {
{error.message}
{ - player.selected !== null && player.selected.stream && player.selected.stream.deepLinks && player.selected.stream.deepLinks.externalPlayer ? + player.selected !== null ?