From e979b185b0d12292b52bc63610a3ac7c32a95101 Mon Sep 17 00:00:00 2001 From: Botzy Date: Tue, 25 Feb 2025 17:26:20 +0200 Subject: [PATCH 01/23] feat(Player): handle touch events when sliding volume slider on mobile --- src/components/Slider/Slider.js | 36 ++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/components/Slider/Slider.js b/src/components/Slider/Slider.js index 0e5c96c97..d0d4721b8 100644 --- a/src/components/Slider/Slider.js +++ b/src/components/Slider/Slider.js @@ -31,14 +31,18 @@ const Slider = ({ className, value, buffered, minimumValue, maximumValue, disabl const retainThumb = React.useCallback(() => { window.addEventListener('blur', onBlur); window.addEventListener('mouseup', onMouseUp); + window.addEventListener('touchend', onTouchEnd); window.addEventListener('mousemove', onMouseMove); + window.addEventListener('touchmove', onTouchMove); document.documentElement.className = classnames(document.documentElement.className, styles['active-slider-within']); }, []); const releaseThumb = React.useCallback(() => { cancelThumbAnimation(); window.removeEventListener('blur', onBlur); window.removeEventListener('mouseup', onMouseUp); + window.removeEventListener('touchend', onTouchEnd); window.removeEventListener('mousemove', onMouseMove); + window.removeEventListener('touchmove', onTouchMove); const classList = document.documentElement.className.split(' '); const classIndex = classList.indexOf(styles['active-slider-within']); if (classIndex !== -1) { @@ -85,6 +89,36 @@ const Slider = ({ className, value, buffered, minimumValue, maximumValue, disabl retainThumb(); }, []); + const onTouchStart = React.useCallback((event) => { + const touch = event.touches[0]; + const value = calculateValueForMouseX(touch.clientX); + if (typeof onSlideRef.current === 'function') { + onSlideRef.current(value); + } + + retainThumb(); + event.preventDefault(); + }, []); + const onTouchMove = React.useCallback((event) => { + requestThumbAnimation(() => { + const touch = event.touches[0]; + const value = calculateValueForMouseX(touch.clientX); + if (typeof onSlideRef.current === 'function') { + onSlideRef.current(value); + } + }); + + event.preventDefault(); + }, []); + const onTouchEnd = React.useCallback((event) => { + const touch = event.changedTouches[0]; + const value = calculateValueForMouseX(touch.clientX); + if (typeof onCompleteRef.current === 'function') { + onCompleteRef.current(value); + } + + releaseThumb(); + }, []); React.useLayoutEffect(() => { if (!routeFocused || disabled) { releaseThumb(); @@ -98,7 +132,7 @@ const Slider = ({ className, value, buffered, minimumValue, maximumValue, disabl const thumbPosition = Math.max(0, Math.min(1, (valueRef.current - minimumValueRef.current) / (maximumValueRef.current - minimumValueRef.current))); const bufferedPosition = Math.max(0, Math.min(1, (bufferedRef.current - minimumValueRef.current) / (maximumValueRef.current - minimumValueRef.current))); return ( -
+
From eb192997d97853d36d87cc727568e38754994944 Mon Sep 17 00:00:00 2001 From: Botzy Date: Wed, 26 Feb 2025 15:24:17 +0200 Subject: [PATCH 02/23] feat(Player): prevent immersing while volume slider is in use --- src/routes/Player/ControlBar/ControlBar.js | 6 +++++- src/routes/Player/Player.js | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 745e2bd49..956425973 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -40,6 +40,7 @@ const ControlBar = ({ onToggleSideDrawer, onToggleOptionsMenu, onToggleStatisticsMenu, + onTouchEnd, ...props }) => { const { chromecast } = useServices(); @@ -103,7 +104,7 @@ const ControlBar = ({ }; }, []); return ( -
+
{ onToggleSideDrawer={toggleSideDrawer} onMouseMove={onBarMouseMove} onMouseOver={onBarMouseMove} + onTouchEnd={onContainerMouseLeave} /> { nextVideoPopupOpen ? From f2f99fcedd3860cf30a10ea1b452e144d7c8fbc7 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 5 Mar 2025 15:33:34 +0100 Subject: [PATCH 03/23] fix(Slider): seekbar background style --- src/components/Slider/styles.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Slider/styles.less b/src/components/Slider/styles.less index 2bdbbfe72..41478924e 100644 --- a/src/components/Slider/styles.less +++ b/src/components/Slider/styles.less @@ -46,7 +46,8 @@ html.active-slider-within { width: 100%; height: var(--track-size); border-radius: var(--track-size); - background-color: var(--overlay-color); + background-color: var(--primary-accent-color); + opacity: 0.2; &.audio-boost { opacity: 0.3; From 94f12540f5b0abd8ba0e1ebe7dfb562b13dca9ab Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Wed, 5 Mar 2025 16:35:47 +0100 Subject: [PATCH 04/23] fix(Settings): use correct prop for button --- src/routes/Settings/URLsManager/URLsManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Settings/URLsManager/URLsManager.tsx b/src/routes/Settings/URLsManager/URLsManager.tsx index b43232f4e..46e57020d 100644 --- a/src/routes/Settings/URLsManager/URLsManager.tsx +++ b/src/routes/Settings/URLsManager/URLsManager.tsx @@ -46,7 +46,7 @@ const URLsManager = () => { }
- From 54b0afb075523e5998d55b7ba5e1ad52412be682 Mon Sep 17 00:00:00 2001 From: Botzy Date: Thu, 13 Mar 2025 18:43:20 +0200 Subject: [PATCH 05/23] fix(Player): remove volume slider on mobile device --- src/routes/Player/ControlBar/ControlBar.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 956425973..1db82338c 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -9,7 +9,7 @@ const { useServices } = require('stremio/services'); const SeekBar = require('./SeekBar'); const VolumeSlider = require('./VolumeSlider'); const styles = require('./styles'); -const { useBinaryState } = require('stremio/common'); +const { useBinaryState, usePlatform } = require('stremio/common'); const { t } = require('i18next'); const ControlBar = ({ @@ -44,6 +44,7 @@ const ControlBar = ({ ...props }) => { const { chromecast } = useServices(); + const platform = usePlatform(); const [chromecastServiceActive, setChromecastServiceActive] = React.useState(() => chromecast.active); const [buttonsMenuOpen, , , toggleButtonsMenu] = useBinaryState(false); const onSubtitlesButtonMouseDown = React.useCallback((event) => { @@ -136,12 +137,16 @@ const ControlBar = ({ } /> - + { + !platform.isMobile ? + + : null + }
+
+
+
{ t('SETTINGS_BLUR_UNWATCHED_IMAGE') }
+
+ +
{ shell.active &&
diff --git a/src/routes/Settings/useProfileSettingsInputs.js b/src/routes/Settings/useProfileSettingsInputs.js index c193c6eaf..41d294a45 100644 --- a/src/routes/Settings/useProfileSettingsInputs.js +++ b/src/routes/Settings/useProfileSettingsInputs.js @@ -32,6 +32,22 @@ const useProfileSettingsInputs = (profile) => { } }), [profile.settings]); + const blurUnwatchedImageToggle = React.useMemo(() => ({ + checked: profile.settings.blurUnwatchedImage, + onClick: () => { + core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'UpdateSettings', + args: { + ...profile.settings, + blurUnwatchedImage: !profile.settings.blurUnwatchedImage + } + } + }); + } + }), [profile.settings]); + const quitOnCloseToggle = React.useMemo(() => ({ checked: profile.settings.quitOnClose, onClick: () => { @@ -325,6 +341,7 @@ const useProfileSettingsInputs = (profile) => { }), [profile.settings]); return { interfaceLanguageSelect, + blurUnwatchedImageToggle, subtitlesLanguageSelect, subtitlesSizeSelect, subtitlesTextColorInput, diff --git a/src/types/models/Ctx.d.ts b/src/types/models/Ctx.d.ts index a86fd60fa..61b33dfdd 100644 --- a/src/types/models/Ctx.d.ts +++ b/src/types/models/Ctx.d.ts @@ -21,6 +21,7 @@ type Settings = { hardwareDecoding: boolean, escExitFullscreen: boolean, interfaceLanguage: string, + blurUnwatchedImage: boolean, nextVideoNotificationDuration: number, playInBackground: boolean, playerType: string | null, From 7adfa8ff39e34c3c78cbfe8addeb825f02e93cc5 Mon Sep 17 00:00:00 2001 From: Botzy Date: Fri, 14 Mar 2025 18:20:16 +0200 Subject: [PATCH 07/23] refactor(Settings): rename blurUnwatchedImage to hideSpoilers --- src/routes/Settings/Settings.js | 4 ++-- src/routes/Settings/useProfileSettingsInputs.js | 8 ++++---- src/types/models/Ctx.d.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 141b6e576..bd26c53f1 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -31,7 +31,7 @@ const Settings = () => { const toast = useToast(); const { interfaceLanguageSelect, - blurUnwatchedImageToggle, + hideSpoilersToggle, subtitlesLanguageSelect, subtitlesSizeSelect, subtitlesTextColorInput, @@ -510,7 +510,7 @@ const Settings = () => {
{ diff --git a/src/routes/Settings/useProfileSettingsInputs.js b/src/routes/Settings/useProfileSettingsInputs.js index 41d294a45..afad298ed 100644 --- a/src/routes/Settings/useProfileSettingsInputs.js +++ b/src/routes/Settings/useProfileSettingsInputs.js @@ -32,8 +32,8 @@ const useProfileSettingsInputs = (profile) => { } }), [profile.settings]); - const blurUnwatchedImageToggle = React.useMemo(() => ({ - checked: profile.settings.blurUnwatchedImage, + const hideSpoilersToggle = React.useMemo(() => ({ + checked: profile.settings.hideSpoilers, onClick: () => { core.transport.dispatch({ action: 'Ctx', @@ -41,7 +41,7 @@ const useProfileSettingsInputs = (profile) => { action: 'UpdateSettings', args: { ...profile.settings, - blurUnwatchedImage: !profile.settings.blurUnwatchedImage + hideSpoilers: !profile.settings.hideSpoilers } } }); @@ -341,7 +341,7 @@ const useProfileSettingsInputs = (profile) => { }), [profile.settings]); return { interfaceLanguageSelect, - blurUnwatchedImageToggle, + hideSpoilersToggle, subtitlesLanguageSelect, subtitlesSizeSelect, subtitlesTextColorInput, diff --git a/src/types/models/Ctx.d.ts b/src/types/models/Ctx.d.ts index 61b33dfdd..47f18749f 100644 --- a/src/types/models/Ctx.d.ts +++ b/src/types/models/Ctx.d.ts @@ -21,7 +21,7 @@ type Settings = { hardwareDecoding: boolean, escExitFullscreen: boolean, interfaceLanguage: string, - blurUnwatchedImage: boolean, + hideSpoilers: boolean, nextVideoNotificationDuration: number, playInBackground: boolean, playerType: string | null, From 5cb557842047d0d2a227139d373513c24a73942b Mon Sep 17 00:00:00 2001 From: AlvinHV Date: Mon, 17 Mar 2025 16:53:25 +0400 Subject: [PATCH 08/23] feat: Associate site with the iOS app --- .well-known/apple-app-site-association | 57 ++++++++++++++++++++++++++ webpack.config.js | 1 + 2 files changed, 58 insertions(+) create mode 100644 .well-known/apple-app-site-association diff --git a/.well-known/apple-app-site-association b/.well-known/apple-app-site-association new file mode 100644 index 000000000..931a44760 --- /dev/null +++ b/.well-known/apple-app-site-association @@ -0,0 +1,57 @@ +{ + "applinks": { + "apps": [], + "details": [ + { + "appID": "9EWRZ4QP3J.com.stremio.one", + "components": [ + { + "/": "/", + "#": "/player", + "comment": "Matches deep link for player" + }, + { + "/": "/", + "#": "/discover", + "comment": "Matches deep link for discover" + }, + { + "/": "/", + "#": "/detail", + "comment": "Matches deep link for detail" + }, + { + "/": "/", + "#": "/library", + "comment": "Matches deep link for library" + }, + { + "/": "/", + "#": "/addons", + "comment": "Matches deep link for addons" + }, + { + "/": "/", + "#": "/settings", + "comment": "Matches deep link for settings" + }, + { + "/": "/", + "#": "/search", + "comment": "Matches deep link for search" + } + ] + } + ] + }, + "activitycontinuation": { + "apps": [ + "9EWRZ4QP3J.com.stremio.one" + ] + }, + "webcredentials": { + "apps": [ + "9EWRZ4QP3J.com.stremio.one" + ] + } +} diff --git a/webpack.config.js b/webpack.config.js index 36f6b6e50..ea1685592 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -234,6 +234,7 @@ module.exports = (env, argv) => ({ { from: 'favicons', to: 'favicons' }, { from: 'images', to: 'images' }, { from: 'screenshots/*.webp', to: './' }, + { from: '.well-known', to: '.well-known' }, ] }), new MiniCssExtractPlugin({ From 2b069ecd3dce305c02d6d1484a06a29a5a71af1c Mon Sep 17 00:00:00 2001 From: AlvinHV Date: Mon, 17 Mar 2025 18:00:05 +0400 Subject: [PATCH 09/23] fix/apple-app-site-association --- .well-known/apple-app-site-association | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/.well-known/apple-app-site-association b/.well-known/apple-app-site-association index 931a44760..256de1ae6 100644 --- a/.well-known/apple-app-site-association +++ b/.well-known/apple-app-site-association @@ -4,25 +4,35 @@ "details": [ { "appID": "9EWRZ4QP3J.com.stremio.one", + "paths": [ + "/", + "#/player/*", + "#/discover/*", + "#/detail/*", + "#/library/*", + "#/addons", + "#/settings", + "#/search/*" + ], "components": [ { "/": "/", - "#": "/player", + "#": "/player/*", "comment": "Matches deep link for player" }, { "/": "/", - "#": "/discover", + "#": "/discover/*", "comment": "Matches deep link for discover" }, { "/": "/", - "#": "/detail", + "#": "/detail/*", "comment": "Matches deep link for detail" }, { "/": "/", - "#": "/library", + "#": "/library/*", "comment": "Matches deep link for library" }, { @@ -37,7 +47,7 @@ }, { "/": "/", - "#": "/search", + "#": "/search/*", "comment": "Matches deep link for search" } ] From eb9ab7d453e163fe42300390dd278fb75cc6ba5f Mon Sep 17 00:00:00 2001 From: AlvinHV Date: Mon, 17 Mar 2025 18:13:05 +0400 Subject: [PATCH 10/23] fix: correct path for site-app association --- .well-known/apple-app-site-association | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.well-known/apple-app-site-association b/.well-known/apple-app-site-association index 256de1ae6..54b0dd1bf 100644 --- a/.well-known/apple-app-site-association +++ b/.well-known/apple-app-site-association @@ -6,13 +6,13 @@ "appID": "9EWRZ4QP3J.com.stremio.one", "paths": [ "/", - "#/player/*", - "#/discover/*", - "#/detail/*", - "#/library/*", - "#/addons", - "#/settings", - "#/search/*" + "/#/player/*", + "/#/discover/*", + "/#/detail/*", + "/#/library/*", + "/#/addons/*", + "/#/settings", + "/#/search/*" ], "components": [ { @@ -37,7 +37,7 @@ }, { "/": "/", - "#": "/addons", + "#": "/addons/*", "comment": "Matches deep link for addons" }, { From d006cae53d397d5f1e1d3c1d102a59dd026cf4d3 Mon Sep 17 00:00:00 2001 From: Botzy Date: Mon, 17 Mar 2025 19:42:58 +0200 Subject: [PATCH 11/23] feat(Video): blur unwatched episode thumbnail --- src/components/Video/Video.js | 5 ++++- src/components/Video/styles.less | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/Video/Video.js b/src/components/Video/Video.js index 0bcb569a5..8cbc5007b 100644 --- a/src/components/Video/Video.js +++ b/src/components/Video/Video.js @@ -8,11 +8,13 @@ const { useRouteFocused } = require('stremio-router'); const { default: Icon } = require('@stremio/stremio-icons/react'); const { Button, Image, Popup } = require('stremio/components'); const useBinaryState = require('stremio/common/useBinaryState'); +const useProfile = require('stremio/common/useProfile'); const VideoPlaceholder = require('./VideoPlaceholder'); const styles = require('./styles'); const Video = ({ className, id, title, thumbnail, season, episode, released, upcoming, watched, progress, scheduled, seasonWatched, deepLinks, onMarkVideoAsWatched, onMarkSeasonAsWatched, ...props }) => { const routeFocused = useRouteFocused(); + const profile = useProfile(); const [menuOpen, , closeMenu, toggleMenu] = useBinaryState(false); const popupLabelOnMouseUp = React.useCallback((event) => { if (!event.nativeEvent.togglePopupPrevented) { @@ -66,13 +68,14 @@ const Video = ({ className, id, title, thumbnail, season, episode, released, upc } }, [deepLinks]); const renderLabel = React.useMemo(() => function renderLabel({ className, id, title, thumbnail, episode, released, upcoming, watched, progress, scheduled, children, ...props }) { + const blurThumbnail = profile.settings.hideSpoilers && !watched; return (
} +
+
+
{ t('SETTINGS_BLUR_UNWATCHED_IMAGE') }
+
+ +
{ t('SETTINGS_NAV_PLAYER') }
@@ -503,16 +513,6 @@ const Settings = () => { {...playInExternalPlayerSelect} />
-
-
-
{ t('SETTINGS_BLUR_UNWATCHED_IMAGE') }
-
- -
{ shell.active &&
From 5eb173a3dfa005476ff597e73008a307b13b02aa Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 19 Mar 2025 15:14:57 +0100 Subject: [PATCH 17/23] fix: hide overflow on nav-content-container --- src/components/MainNavBars/MainNavBars.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MainNavBars/MainNavBars.less b/src/components/MainNavBars/MainNavBars.less index ca816a72f..10538cd7c 100644 --- a/src/components/MainNavBars/MainNavBars.less +++ b/src/components/MainNavBars/MainNavBars.less @@ -34,7 +34,7 @@ bottom: 0; left: var(--vertical-nav-bar-size); z-index: 0; - overflow: scroll; + overflow: hidden; } } From 730f7de95499b569849e154dc44daa6578a09a94 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 19 Mar 2025 15:53:35 +0100 Subject: [PATCH 18/23] feat(Settings): display commit hash as build version --- src/routes/Settings/Settings.js | 19 ++++++++++++++++++- src/routes/Settings/styles.less | 5 +++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/routes/Settings/Settings.js b/src/routes/Settings/Settings.js index 9f13f9ade..fbaf32afc 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -182,7 +182,12 @@ const Settings = () => { { t('SETTINGS_NAV_SHORTCUTS') }
-
App Version: {process.env.VERSION}
+
+ App Version: {process.env.VERSION} +
+
+ Build Version: {process.env.COMMIT_HASH} +
{ streamingServer.settings !== null && streamingServer.settings.type === 'Ready' ?
Server Version: {streamingServer.settings.content.serverVersion}
@@ -733,6 +738,18 @@ const Settings = () => {
+
+
+
+ Build Version +
+
+
+
+ {process.env.COMMIT_HASH} +
+
+
{ streamingServer.settings !== null && streamingServer.settings.type === 'Ready' ?
diff --git a/src/routes/Settings/styles.less b/src/routes/Settings/styles.less index de37d17c2..072dd32a3 100644 --- a/src/routes/Settings/styles.less +++ b/src/routes/Settings/styles.less @@ -64,8 +64,11 @@ .version-info-label { flex: 0 1 auto; margin: 0.5rem 0; + white-space: nowrap; + text-overflow: ellipsis; color: var(--primary-foreground-color); opacity: 0.3; + overflow: hidden; } } @@ -242,6 +245,8 @@ flex-shrink: 1; flex-basis: auto; line-height: 1.5rem; + white-space: nowrap; + text-overflow: ellipsis; color: var(--primary-foreground-color); } From 53ffa321d84551be251d116717253b5ab9d62836 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 20 Mar 2025 11:00:30 +0100 Subject: [PATCH 19/23] feat(App): handle shell open-media event to open addons --- src/App/App.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/App/App.js b/src/App/App.js index d3a1ce188..d4c55be32 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -100,14 +100,26 @@ const App = () => { }; }, []); - // Handle shell window visibility changed event + // Handle shell events React.useEffect(() => { const onWindowVisibilityChanged = (state) => { setWindowHidden(state.visible === false && state.visibility === 0); }; + const onOpenMedia = (data) => { + if (data.startsWith('stremio://')) { + const transportUrl = data.replace('stremio://', 'https://'); + window.location.href = `#/addons?addon=${encodeURIComponent(transportUrl)}`; + } + }; + shell.on('win-visibility-changed', onWindowVisibilityChanged); - return () => shell.off('win-visibility-changed', onWindowVisibilityChanged); + shell.on('open-media', onOpenMedia); + + return () => { + shell.off('win-visibility-changed', onWindowVisibilityChanged); + shell.off('open-media', onOpenMedia); + }; }, []); React.useEffect(() => { From eb3fad32f18ed58b1ef26127a48e636528497d86 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 20 Mar 2025 11:17:10 +0100 Subject: [PATCH 20/23] fix(App): check if transportUrl is valid before opening it --- src/App/App.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/App/App.js b/src/App/App.js index d4c55be32..b5f8eb045 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -109,7 +109,9 @@ const App = () => { const onOpenMedia = (data) => { if (data.startsWith('stremio://')) { const transportUrl = data.replace('stremio://', 'https://'); - window.location.href = `#/addons?addon=${encodeURIComponent(transportUrl)}`; + if (URL.canParse(transportUrl)) { + window.location.href = `#/addons?addon=${encodeURIComponent(transportUrl)}`; + } } }; From 383928e7923f56083f83f3e75658d34ae1106251 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 20 Mar 2025 11:22:27 +0100 Subject: [PATCH 21/23] fix(App): ignore 3 slashes deeplinks for shell open-media --- src/App/App.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App/App.js b/src/App/App.js index b5f8eb045..803515b09 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -107,6 +107,7 @@ const App = () => { }; const onOpenMedia = (data) => { + if (data.startsWith('stremio:///')) return; if (data.startsWith('stremio://')) { const transportUrl = data.replace('stremio://', 'https://'); if (URL.canParse(transportUrl)) { From 3c5bc1a12c064e7914637622d4c86293308abfcb Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Fri, 21 Mar 2025 20:55:34 +0200 Subject: [PATCH 22/23] chore: ControlBar & VolumeChangeIndicator show volume=0 with muted icon Signed-off-by: Lachezar Lechev --- src/routes/Player/ControlBar/ControlBar.js | 7 ++++--- .../VolumeChangeIndicator/VolumeChangeIndicator.js | 9 +++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 745e2bd49..f31c708ac 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -129,9 +129,10 @@ const ControlBar = ({ name={ (typeof muted === 'boolean' && muted) ? 'volume-mute' : (volume === null || isNaN(volume)) ? 'volume-off' : - volume < 30 ? 'volume-low' : - volume < 70 ? 'volume-medium' : - 'volume-high' + volume === 0 ? 'volume-mute' : + volume < 30 ? 'volume-low' : + volume < 70 ? 'volume-medium' : + 'volume-high' } /> diff --git a/src/routes/Player/VolumeChangeIndicator/VolumeChangeIndicator.js b/src/routes/Player/VolumeChangeIndicator/VolumeChangeIndicator.js index cfba89c59..979106a55 100644 --- a/src/routes/Player/VolumeChangeIndicator/VolumeChangeIndicator.js +++ b/src/routes/Player/VolumeChangeIndicator/VolumeChangeIndicator.js @@ -14,11 +14,12 @@ const VolumeChangeIndicator = React.memo(({ muted, volume }) => { const prevVolume = React.useRef(volume); const iconName = React.useMemo(() => { - return typeof muted === 'boolean' && muted ? 'volume-mute' : + return (typeof muted === 'boolean' && muted) ? 'volume-mute' : volume === null || isNaN(volume) ? 'volume-off' : - volume < 30 ? 'volume-low' : - volume < 70 ? 'volume-medium' : - 'volume-high'; + volume === 0 ? 'volume-mute' : + volume < 30 ? 'volume-low' : + volume < 70 ? 'volume-medium' : + 'volume-high'; }, [muted, volume]); React.useEffect(() => { From add4c30af9bc27db2d425ddd06f63b59269304cb Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Mon, 24 Mar 2025 14:48:48 +0200 Subject: [PATCH 23/23] fix(Settings): wrong subs label --- 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 fbaf32afc..bddbcbe2a 100644 --- a/src/routes/Settings/Settings.js +++ b/src/routes/Settings/Settings.js @@ -357,7 +357,7 @@ const Settings = () => {
{ t('SETTINGS_NAV_PLAYER') }
-
{t('SETTINGS_CLOSE_WINDOW')}
+
{t('SETTINGS_SECTION_SUBTITLES')}