From 58fa3dfdf6289a63e05bffa3b6b33d9380caaf3f Mon Sep 17 00:00:00 2001 From: Jason Henriquez Date: Thu, 16 Nov 2023 14:16:11 -0600 Subject: [PATCH 1/7] Replace certain labels with clearer values, & a bit more Also makes Playlist Autoplay disabled as an option if Autoplay is enabled. This makes the relationship between the two far clearer. --- .../distraction-settings.js | 4 +-- .../ft-video-player/ft-video-player.js | 16 ++++++------ .../parental-control-settings.js | 6 ++--- .../parental-control-settings.vue | 4 +-- .../player-settings/player-settings.js | 24 +++++++++--------- .../player-settings/player-settings.vue | 25 ++++++++++--------- .../watch-video-info/watch-video-info.js | 4 +-- .../watch-video-info/watch-video-info.vue | 2 +- .../watch-video-playlist.js | 4 +-- .../watch-video-playlist.vue | 6 ++--- .../watch-video-recommendations.js | 6 ++--- .../watch-video-recommendations.vue | 4 +-- src/renderer/store/modules/settings.js | 10 ++++---- src/renderer/views/Channel/Channel.js | 4 +-- src/renderer/views/Channel/Channel.vue | 2 +- .../SubscribedChannels/SubscribedChannels.js | 4 +-- .../SubscribedChannels/SubscribedChannels.vue | 2 +- src/renderer/views/Watch/Watch.js | 14 +++++------ static/locales/en-US.yaml | 16 ++++++------ 19 files changed, 79 insertions(+), 78 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 6b3c82aca431b..bdf79282facf8 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -134,7 +134,7 @@ export default defineComponent({ methods: { handleHideRecommendedVideos: function (value) { if (value) { - this.updatePlayNextVideo(false) + this.updateEnableAutoplay(false) } this.updateHideRecommendedVideos(value) @@ -196,7 +196,7 @@ export default defineComponent({ 'updateHidePlaylists', 'updateHideLiveChat', 'updateHideActiveSubscriptions', - 'updatePlayNextVideo', + 'updateEnableAutoplay', 'updateDefaultTheatreMode', 'updateHideVideoDescription', 'updateHideComments', diff --git a/src/renderer/components/ft-video-player/ft-video-player.js b/src/renderer/components/ft-video-player/ft-video-player.js index d3ca362bd8716..0bc52de584f9f 100644 --- a/src/renderer/components/ft-video-player/ft-video-player.js +++ b/src/renderer/components/ft-video-player/ft-video-player.js @@ -212,8 +212,8 @@ export default defineComponent({ } }, - autoplayVideos: function () { - return this.$store.getters.getAutoplayVideos + startVideosAutomatically: function () { + return this.$store.getters.getStartVideosAutomatically }, videoVolumeMouseScroll: function () { @@ -321,8 +321,8 @@ export default defineComponent({ return playbackRates }, - enableScreenshot: function () { - return this.$store.getters.getEnableScreenshot + enableVideoScreenshot: function () { + return this.$store.getters.getEnableVideoScreenshot }, screenshotFormat: function () { @@ -350,7 +350,7 @@ export default defineComponent({ this.player.trigger(this.statsModalEventName) }, - enableScreenshot: function () { + enableVideoScreenshot: function () { this.toggleScreenshotButton() } }, @@ -589,7 +589,7 @@ export default defineComponent({ }) } - if (this.autoplayVideos) { + if (this.startVideosAutomatically) { // Calling play() won't happen right away, so a quick timeout will make it function properly. setTimeout(() => { // `this.player` can be destroyed before this runs @@ -1570,7 +1570,7 @@ export default defineComponent({ toggleScreenshotButton: function () { const button = document.getElementById('screenshotButton').parentNode - if (this.enableScreenshot && this.format !== 'audio') { + if (this.enableVideoScreenshot && this.format !== 'audio') { button.classList.remove('vjs-hidden') } else { button.classList.add('vjs-hidden') @@ -1578,7 +1578,7 @@ export default defineComponent({ }, takeScreenshot: async function () { - if (!this.enableScreenshot || this.format === 'audio') { + if (!this.enableVideoScreenshot || this.format === 'audio') { return } diff --git a/src/renderer/components/parental-control-settings/parental-control-settings.js b/src/renderer/components/parental-control-settings/parental-control-settings.js index fd064ae635dae..67d817f88be06 100644 --- a/src/renderer/components/parental-control-settings/parental-control-settings.js +++ b/src/renderer/components/parental-control-settings/parental-control-settings.js @@ -13,8 +13,8 @@ export default defineComponent({ hideSearchBar: function () { return this.$store.getters.getHideSearchBar }, - hideUnsubscribeButton: function() { - return this.$store.getters.getHideUnsubscribeButton + hideSubscribeButton: function() { + return this.$store.getters.getHideSubscribeButton }, showFamilyFriendlyOnly: function() { return this.$store.getters.getShowFamilyFriendlyOnly @@ -23,7 +23,7 @@ export default defineComponent({ methods: { ...mapActions([ 'updateHideSearchBar', - 'updateHideUnsubscribeButton', + 'updateHideSubscribeButton', 'updateShowFamilyFriendlyOnly' ]) } diff --git a/src/renderer/components/parental-control-settings/parental-control-settings.vue b/src/renderer/components/parental-control-settings/parental-control-settings.vue index 2d5485c48e982..68540711b0dcf 100644 --- a/src/renderer/components/parental-control-settings/parental-control-settings.vue +++ b/src/renderer/components/parental-control-settings/parental-control-settings.vue @@ -7,8 +7,8 @@ -
+
/*****/ const state = { - autoplayPlaylists: true, - autoplayVideos: true, + enablePlaylistAutoplay: true, + startVideosAutomatically: true, backendFallback: process.env.IS_ELECTRON, backendPreference: !process.env.IS_ELECTRON ? 'invidious' : 'local', barColor: false, @@ -218,7 +218,7 @@ const state = { hideSubscriptionsLive: false, hideSubscriptionsCommunity: false, hideTrendingVideos: false, - hideUnsubscribeButton: false, + hideSubscribeButton: false, hideUpcomingPremieres: false, hideVideoLikesAndDislikes: false, hideVideoViews: false, @@ -229,7 +229,7 @@ const state = { landingPage: 'subscriptions', listType: 'grid', maxVideoPlaybackRate: 3, - playNextVideo: false, + enableAutoplay: false, proxyHostname: '127.0.0.1', proxyPort: '9050', proxyProtocol: 'socks5', @@ -286,7 +286,7 @@ const state = { downloadAskPath: true, downloadFolderPath: '', downloadBehavior: 'download', - enableScreenshot: false, + enableVideoScreenshot: false, screenshotFormat: 'png', screenshotQuality: 95, screenshotAskPath: false, diff --git a/src/renderer/views/Channel/Channel.js b/src/renderer/views/Channel/Channel.js index af5f1f815eb03..59dfd7e18c2b6 100644 --- a/src/renderer/views/Channel/Channel.js +++ b/src/renderer/views/Channel/Channel.js @@ -147,8 +147,8 @@ export default defineComponent({ return this.$store.getters.getBackendFallback }, - hideUnsubscribeButton: function() { - return this.$store.getters.getHideUnsubscribeButton + hideSubscribeButton: function() { + return this.$store.getters.getHideSubscribeButton }, showFamilyFriendlyOnly: function() { diff --git a/src/renderer/views/Channel/Channel.vue b/src/renderer/views/Channel/Channel.vue index f8cfb0b5c6ed8..078c24ab21bd4 100644 --- a/src/renderer/views/Channel/Channel.vue +++ b/src/renderer/views/Channel/Channel.vue @@ -66,7 +66,7 @@ />
Date: Thu, 16 Nov 2023 14:26:26 -0600 Subject: [PATCH 2/7] Change theater mode spelling throughout code --- .../distraction-settings.js | 2 +- .../ft-video-player/ft-video-player.js | 44 +++++++++---------- .../player-settings/player-settings.js | 6 +-- .../player-settings/player-settings.vue | 4 +- src/renderer/store/modules/settings.js | 2 +- src/renderer/views/Watch/Watch.js | 10 ++--- src/renderer/views/Watch/Watch.scss | 12 ++--- src/renderer/views/Watch/Watch.vue | 26 +++++------ 8 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index bdf79282facf8..e12c9d596cb2f 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -197,7 +197,7 @@ export default defineComponent({ 'updateHideLiveChat', 'updateHideActiveSubscriptions', 'updateEnableAutoplay', - 'updateDefaultTheatreMode', + 'updateDefaultTheaterMode', 'updateHideVideoDescription', 'updateHideComments', 'updateHideCommentPhotos', diff --git a/src/renderer/components/ft-video-player/ft-video-player.js b/src/renderer/components/ft-video-player/ft-video-player.js index 0bc52de584f9f..e56b42a5b61c1 100644 --- a/src/renderer/components/ft-video-player/ft-video-player.js +++ b/src/renderer/components/ft-video-player/ft-video-player.js @@ -108,11 +108,11 @@ export default defineComponent({ type: Array, default: () => ([]) }, - theatrePossible: { + theaterPossible: { type: Boolean, default: false }, - useTheatreMode: { + useTheaterMode: { type: Boolean, default: false } @@ -174,7 +174,7 @@ export default defineComponent({ 'descriptionsButton', 'subsCapsButton', 'pictureInPictureToggle', - 'toggleTheatreModeButton', + 'toggleTheaterModeButton', 'fullWindowButton', 'qualitySelector', 'fullscreenToggle' @@ -392,7 +392,7 @@ export default defineComponent({ this.createFullWindowButton() this.createLoopButton() - this.createToggleTheatreModeButton() + this.createToggleTheaterModeButton() this.createScreenshotButton() this.determineFormatType() @@ -1494,28 +1494,28 @@ export default defineComponent({ videojs.registerComponent('fullWindowButton', fullWindowButton) }, - createToggleTheatreModeButton: function () { - if (!this.theatrePossible) { + createToggleTheaterModeButton: function () { + if (!this.theaterPossible) { return } - const theatreModeActive = this.useTheatreMode ? ' vjs-icon-theatre-active' : '' + const theaterModeActive = this.useTheaterMode ? ' vjs-icon-theatre-active' : '' - const toggleTheatreMode = this.toggleTheatreMode + const toggleTheaterMode = this.toggleTheaterMode const VjsButton = videojs.getComponent('Button') - class toggleTheatreModeButton extends VjsButton { + class toggleTheaterModeButton extends VjsButton { handleClick() { - toggleTheatreMode() + toggleTheaterMode() } createControlTextEl(button) { button.classList.add('vjs-button-theatre') - button.title = 'Toggle Theatre Mode' + button.title = 'Toggle Theater Mode' const div = document.createElement('div') - div.id = 'toggleTheatreModeButton' - div.className = `vjs-icon-theatre-inactive${theatreModeActive} vjs-button` + div.id = 'toggleTheaterModeButton' + div.className = `vjs-icon-theatre-inactive${theaterModeActive} vjs-button` button.appendChild(div) @@ -1523,20 +1523,20 @@ export default defineComponent({ } } - videojs.registerComponent('toggleTheatreModeButton', toggleTheatreModeButton) + videojs.registerComponent('toggleTheaterModeButton', toggleTheaterModeButton) }, - toggleTheatreMode: function () { + toggleTheaterMode: function () { if (!this.player.isFullscreen_) { - const toggleTheatreModeButton = document.getElementById('toggleTheatreModeButton') - if (!this.useTheatreMode) { - toggleTheatreModeButton.classList.add('vjs-icon-theatre-active') + const toggleTheaterModeButton = document.getElementById('toggleTheaterModeButton') + if (!this.useTheaterMode) { + toggleTheaterModeButton.classList.add('vjs-icon-theatre-active') } else { - toggleTheatreModeButton.classList.remove('vjs-icon-theatre-active') + toggleTheaterModeButton.classList.remove('vjs-icon-theatre-active') } } - this.$emit('toggle-theatre-mode') + this.$emit('toggle-theater-mode') }, createScreenshotButton: function () { @@ -2231,8 +2231,8 @@ export default defineComponent({ break case 'T': case 't': - // Toggle Theatre Mode - this.toggleTheatreMode() + // Toggle Theater Mode + this.toggleTheaterMode() break case 'U': case 'u': diff --git a/src/renderer/components/player-settings/player-settings.js b/src/renderer/components/player-settings/player-settings.js index 5eef4dd0fb1be..188340edae7dc 100644 --- a/src/renderer/components/player-settings/player-settings.js +++ b/src/renderer/components/player-settings/player-settings.js @@ -120,8 +120,8 @@ export default defineComponent({ return this.$store.getters.getAllowDashAv1Formats }, - defaultTheatreMode: function () { - return this.$store.getters.getDefaultTheatreMode + defaultTheaterMode: function () { + return this.$store.getters.getDefaultTheaterMode }, hideRecommendedVideos: function () { @@ -298,7 +298,7 @@ export default defineComponent({ 'updateEnableSubtitles', 'updateForceLocalBackendForLegacy', 'updateProxyVideos', - 'updateDefaultTheatreMode', + 'updateDefaultTheaterMode', 'updateDefaultSkipInterval', 'updateDefaultInterval', 'updateDefaultVolume', diff --git a/src/renderer/components/player-settings/player-settings.vue b/src/renderer/components/player-settings/player-settings.vue index c7748e6f24231..824f791ab843c 100644 --- a/src/renderer/components/player-settings/player-settings.vue +++ b/src/renderer/components/player-settings/player-settings.vue @@ -29,8 +29,8 @@
Date: Thu, 16 Nov 2023 15:53:36 -0600 Subject: [PATCH 3/7] Implement easy way to change variable names of old & existing settings --- src/renderer/store/modules/settings.js | 42 ++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/renderer/store/modules/settings.js b/src/renderer/store/modules/settings.js index fb7f47d3bf60d..f757ffe89d17e 100644 --- a/src/renderer/store/modules/settings.js +++ b/src/renderer/store/modules/settings.js @@ -162,8 +162,8 @@ const defaultSideEffectsTriggerId = settingId => /*****/ const state = { - enablePlaylistAutoplay: true, - startVideosAutomatically: true, + autoplayPlaylists: true, + autoplayVideos: true, backendFallback: process.env.IS_ELECTRON, backendPreference: !process.env.IS_ELECTRON ? 'invidious' : 'local', barColor: false, @@ -178,7 +178,7 @@ const state = { defaultProfile: MAIN_PROFILE_ID, defaultQuality: '720', defaultSkipInterval: 5, - defaultTheaterMode: false, + defaultTheatreMode: false, defaultVideoFormat: 'dash', disableSmoothScrolling: false, displayVideoPlayButton: true, @@ -218,7 +218,7 @@ const state = { hideSubscriptionsLive: false, hideSubscriptionsCommunity: false, hideTrendingVideos: false, - hideSubscribeButton: false, + hideUnsubscribeButton: false, hideUpcomingPremieres: false, hideVideoLikesAndDislikes: false, hideVideoViews: false, @@ -229,7 +229,7 @@ const state = { landingPage: 'subscriptions', listType: 'grid', maxVideoPlaybackRate: 3, - enableAutoplay: false, + playNextVideo: false, proxyHostname: '127.0.0.1', proxyPort: '9050', proxyProtocol: 'socks5', @@ -286,7 +286,7 @@ const state = { downloadAskPath: true, downloadFolderPath: '', downloadBehavior: 'download', - enableVideoScreenshot: false, + enableScreenshot: false, screenshotFormat: 'png', screenshotQuality: 95, screenshotAskPath: false, @@ -299,6 +299,18 @@ const state = { useDeArrowTitles: false, } +// NOTE: when an old setting's variable name is changed, place the new value here as the key +// and keep the original key in the state object above. This preserves users' settings selections +// even after these variable names are altered, and even in older versions of FreeTube. +const aliasToOriginal = { + defaultTheaterMode: 'defaultTheatreMode', + enableAutoplay: 'playNextVideo', + enablePlaylistAutoplay: 'autoplayPlaylists', + enableVideoScreenshot: 'enableScreenshot', + hideSubscribeButton: 'hideUnsubscribeButton', + startVideosAutomatically: 'autoplayVideos' +} + const stateWithSideEffects = { currentLocale: { defaultValue: 'en-US', @@ -542,6 +554,24 @@ Object.assign( // Build default getters, mutations and actions for every setting id for (const settingId of Object.keys(state)) { + buildSettingsStoreMethods(settingId) +} + +// point alias keys to their original values +for (const alias of Object.keys(aliasToOriginal)) { + const aliasFor = aliasToOriginal[alias] + const originalGetter = getters[defaultGetterId(aliasFor)] + const originalMutation = mutations[defaultMutationId(aliasFor)] + const originalTrigger = actions[defaultSideEffectsTriggerId(aliasFor)] + const originalAction = actions[defaultUpdaterId(aliasFor)] + + if (originalGetter) getters[defaultGetterId(alias)] = originalGetter + if (originalMutation) mutations[defaultMutationId(alias)] = originalMutation + if (originalTrigger) actions[defaultSideEffectsTriggerId(alias)] = originalTrigger + if (originalAction) actions[defaultUpdaterId(alias)] = originalAction +} + +function buildSettingsStoreMethods(settingId) { const getterId = defaultGetterId(settingId) const mutationId = defaultMutationId(settingId) const updaterId = defaultUpdaterId(settingId) From 38328d94a456bf1216102e9baf6e6724f4473735 Mon Sep 17 00:00:00 2001 From: Jason Henriquez Date: Thu, 16 Nov 2023 16:26:18 -0600 Subject: [PATCH 4/7] Remove enableVideoScreenshot alias, as it's not strictly needed --- .../components/ft-video-player/ft-video-player.js | 10 +++++----- .../components/player-settings/player-settings.js | 6 +++--- .../components/player-settings/player-settings.vue | 6 +++--- src/renderer/store/modules/settings.js | 1 - 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/renderer/components/ft-video-player/ft-video-player.js b/src/renderer/components/ft-video-player/ft-video-player.js index e56b42a5b61c1..ce63edf4979b0 100644 --- a/src/renderer/components/ft-video-player/ft-video-player.js +++ b/src/renderer/components/ft-video-player/ft-video-player.js @@ -321,8 +321,8 @@ export default defineComponent({ return playbackRates }, - enableVideoScreenshot: function () { - return this.$store.getters.getEnableVideoScreenshot + enableScreenshot: function () { + return this.$store.getters.getEnableScreenshot }, screenshotFormat: function () { @@ -350,7 +350,7 @@ export default defineComponent({ this.player.trigger(this.statsModalEventName) }, - enableVideoScreenshot: function () { + enableScreenshot: function () { this.toggleScreenshotButton() } }, @@ -1570,7 +1570,7 @@ export default defineComponent({ toggleScreenshotButton: function () { const button = document.getElementById('screenshotButton').parentNode - if (this.enableVideoScreenshot && this.format !== 'audio') { + if (this.enableScreenshot && this.format !== 'audio') { button.classList.remove('vjs-hidden') } else { button.classList.add('vjs-hidden') @@ -1578,7 +1578,7 @@ export default defineComponent({ }, takeScreenshot: async function () { - if (!this.enableVideoScreenshot || this.format === 'audio') { + if (!this.enableScreenshot || this.format === 'audio') { return } diff --git a/src/renderer/components/player-settings/player-settings.js b/src/renderer/components/player-settings/player-settings.js index 188340edae7dc..ac88f2a3faa00 100644 --- a/src/renderer/components/player-settings/player-settings.js +++ b/src/renderer/components/player-settings/player-settings.js @@ -176,8 +176,8 @@ export default defineComponent({ ] }, - enableVideoScreenshot: function() { - return this.$store.getters.getEnableVideoScreenshot + enableScreenshot: function() { + return this.$store.getters.getEnableScreenshot }, screenshotFormat: function() { @@ -313,7 +313,7 @@ export default defineComponent({ 'updateEnterFullscreenOnDisplayRotate', 'updateMaxVideoPlaybackRate', 'updateVideoPlaybackRateInterval', - 'updateEnableVideoScreenshot', + 'updateEnableScreenshot', 'updateScreenshotFormat', 'updateScreenshotQuality', 'updateScreenshotAskPath', diff --git a/src/renderer/components/player-settings/player-settings.vue b/src/renderer/components/player-settings/player-settings.vue index 824f791ab843c..5c743816ee7b4 100644 --- a/src/renderer/components/player-settings/player-settings.vue +++ b/src/renderer/components/player-settings/player-settings.vue @@ -175,11 +175,11 @@ > -
+
Date: Thu, 16 Nov 2023 18:55:44 -0600 Subject: [PATCH 5/7] Update incorrect label --- static/locales/en-US.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/locales/en-US.yaml b/static/locales/en-US.yaml index 0299fb5501252..962a7f1cc2ab1 100644 --- a/static/locales/en-US.yaml +++ b/static/locales/en-US.yaml @@ -253,7 +253,7 @@ Settings: Player Settings: Player Settings: Player Settings Force Local Backend for Legacy Formats: Force Local Backend for Legacy Formats - Play Next Video: Autoplay (Recommended Channels and Playlists) + Play Next Video: Autoplay (Recommended Videos and Playlists) Turn on Subtitles by Default: Turn on Subtitles by Default Autoplay Videos: Start Videos Automatically Proxy Videos Through Invidious: Proxy Videos Through Invidious From 475cddb8ff6fde9c65c4e14b9a21fad022ea1fd3 Mon Sep 17 00:00:00 2001 From: Jason Henriquez Date: Fri, 17 Nov 2023 08:38:57 -0600 Subject: [PATCH 6/7] Implement settings logic change --- src/datastores/handlers/base.js | 4 ++ src/datastores/handlers/electron.js | 7 +++ src/datastores/handlers/web.js | 4 ++ src/main/index.js | 9 +++- src/renderer/store/modules/settings.js | 61 +++++++++++++------------- 5 files changed, 54 insertions(+), 31 deletions(-) diff --git a/src/datastores/handlers/base.js b/src/datastores/handlers/base.js index 71e1ca3889682..921c4405c4332 100644 --- a/src/datastores/handlers/base.js +++ b/src/datastores/handlers/base.js @@ -13,6 +13,10 @@ class Settings { return db.settings.compactDatafileAsync() } + static delete(setting) { + return db.settings.removeAsync({ _id: setting }) + } + // ******************** // // Unique Electron main process handlers static _findAppReadyRelatedSettings() { diff --git a/src/datastores/handlers/electron.js b/src/datastores/handlers/electron.js index ddb90ff82434e..b4e8402d35c56 100644 --- a/src/datastores/handlers/electron.js +++ b/src/datastores/handlers/electron.js @@ -15,6 +15,13 @@ class Settings { { action: DBActions.GENERAL.UPSERT, data: { _id, value } } ) } + + static delete(setting) { + return ipcRenderer.invoke( + IpcChannels.DB_SETTINGS, + { action: DBActions.GENERAL.DELETE, data: setting } + ) + } } class History { diff --git a/src/datastores/handlers/web.js b/src/datastores/handlers/web.js index a81eb305d1dd9..d9892b42e154b 100644 --- a/src/datastores/handlers/web.js +++ b/src/datastores/handlers/web.js @@ -18,6 +18,10 @@ class Settings { static upsert(_id, value) { return baseHandlers.settings.upsert(_id, value) } + + static delete(setting) { + return baseHandlers.settings.delete(setting) + } } class History { diff --git a/src/main/index.js b/src/main/index.js index 63e7abb15d789..e1bcdd997ac26 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -805,7 +805,14 @@ function runApp() { // Do nothing for unmatched settings } return null - + case DBActions.GENERAL.DELETE: + await baseHandlers.settings.delete(data) + syncOtherWindows( + IpcChannels.SYNC_SETTINGS, + event, + { event: SyncEvents.GENERAL.DELETE, data } + ) + return null default: // eslint-disable-next-line no-throw-literal throw 'invalid settings db action' diff --git a/src/renderer/store/modules/settings.js b/src/renderer/store/modules/settings.js index 4a250018be88f..74118f683f528 100644 --- a/src/renderer/store/modules/settings.js +++ b/src/renderer/store/modules/settings.js @@ -162,8 +162,8 @@ const defaultSideEffectsTriggerId = settingId => /*****/ const state = { - autoplayPlaylists: true, - autoplayVideos: true, + enablePlaylistAutoplay: true, + startVideosAutomatically: true, backendFallback: process.env.IS_ELECTRON, backendPreference: !process.env.IS_ELECTRON ? 'invidious' : 'local', barColor: false, @@ -178,7 +178,7 @@ const state = { defaultProfile: MAIN_PROFILE_ID, defaultQuality: '720', defaultSkipInterval: 5, - defaultTheatreMode: false, + defaultTheaterMode: false, defaultVideoFormat: 'dash', disableSmoothScrolling: false, displayVideoPlayButton: true, @@ -218,7 +218,7 @@ const state = { hideSubscriptionsLive: false, hideSubscriptionsCommunity: false, hideTrendingVideos: false, - hideUnsubscribeButton: false, + hideSubscribeButton: false, hideUpcomingPremieres: false, hideVideoLikesAndDislikes: false, hideVideoViews: false, @@ -229,7 +229,7 @@ const state = { landingPage: 'subscriptions', listType: 'grid', maxVideoPlaybackRate: 3, - playNextVideo: false, + enableAutoplay: false, proxyHostname: '127.0.0.1', proxyPort: '9050', proxyProtocol: 'socks5', @@ -299,15 +299,13 @@ const state = { useDeArrowTitles: false, } -// NOTE: when an old setting's variable name is changed, place the new value here as the key -// and keep the original key in the state object above. This preserves users' settings selections -// even after these variable names are altered, and even in older versions of FreeTube. -const aliasToOriginal = { - defaultTheaterMode: 'defaultTheatreMode', - enableAutoplay: 'playNextVideo', - enablePlaylistAutoplay: 'autoplayPlaylists', - hideSubscribeButton: 'hideUnsubscribeButton', - startVideosAutomatically: 'autoplayVideos' +/* Mapping of older settings whose variable names have changed to their newer values */ +const outdatedSettings = { + defaultTheatreMode: 'defaultTheaterMode', + playNextVideo: 'enableAutoplay', + autoplayPlaylists: 'enablePlaylistAutoplay', + hideUnsubscribeButton: 'hideSubscribeButton', + autoplayVideos: 'startVideosAutomatically' } const stateWithSideEffects = { @@ -429,8 +427,7 @@ const customActions = { Object.fromEntries((await DBSettingHandlers.find()).map(({ _id, value }) => { return [_id, value] }))) ) - for (const setting of userSettings) { - const [_id, value] = setting + const loadSetting = (_id, value) => { if (getters.settingHasSideEffects(_id)) { dispatch(defaultSideEffectsTriggerId(_id), value) } @@ -439,6 +436,24 @@ const customActions = { commit(defaultMutationId(_id), value) } } + + for (const setting of userSettings) { + const [_id, value] = setting + loadSetting(_id, value) + } + + // Apply existing values of outdated setting variables in the DB to their newer equivalents, + // then delete those older settings + for (const outdatedSetting of Object.keys(outdatedSettings)) { + const outdatedSettingInDB = userSettings.find((setting) => setting[0] === outdatedSetting) + if (!outdatedSettingInDB) { + return + } + const newSetting = outdatedSettings[outdatedSetting] + const oldValue = outdatedSettingInDB[1] + loadSetting(newSetting, oldValue) + await DBSettingHandlers.delete(outdatedSetting) + } } catch (errMessage) { console.error(errMessage) } @@ -556,20 +571,6 @@ for (const settingId of Object.keys(state)) { buildSettingsStoreMethods(settingId) } -// point alias keys to their original values -for (const alias of Object.keys(aliasToOriginal)) { - const aliasFor = aliasToOriginal[alias] - const originalGetter = getters[defaultGetterId(aliasFor)] - const originalMutation = mutations[defaultMutationId(aliasFor)] - const originalTrigger = actions[defaultSideEffectsTriggerId(aliasFor)] - const originalAction = actions[defaultUpdaterId(aliasFor)] - - if (originalGetter) getters[defaultGetterId(alias)] = originalGetter - if (originalMutation) mutations[defaultMutationId(alias)] = originalMutation - if (originalTrigger) actions[defaultSideEffectsTriggerId(alias)] = originalTrigger - if (originalAction) actions[defaultUpdaterId(alias)] = originalAction -} - function buildSettingsStoreMethods(settingId) { const getterId = defaultGetterId(settingId) const mutationId = defaultMutationId(settingId) From a75d8d7e4e098b0f86468450e3224751059e0483 Mon Sep 17 00:00:00 2001 From: Jason Henriquez Date: Sat, 20 Apr 2024 13:16:58 -0500 Subject: [PATCH 7/7] Try to implement suggestion --- src/datastores/handlers/base.js | 30 ++++++++++++++++++++++++-- src/renderer/store/modules/settings.js | 22 ------------------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/datastores/handlers/base.js b/src/datastores/handlers/base.js index fd621fd97f8c7..471aab47924a7 100644 --- a/src/datastores/handlers/base.js +++ b/src/datastores/handlers/base.js @@ -1,8 +1,34 @@ import * as db from '../index' +/* Mapping of older settings whose variable names have changed to their newer values */ +const outdatedSettings = { + defaultTheatreMode: 'defaultTheaterMode', + playNextVideo: 'enableAutoplay', + autoplayPlaylists: 'enablePlaylistAutoplay', + hideUnsubscribeButton: 'hideSubscribeButton', + autoplayVideos: 'startVideosAutomatically' +} + class Settings { - static find() { - return db.settings.findAsync({ _id: { $ne: 'bounds' } }) + static async find() { + const settings = await db.settings.findAsync({ _id: { $ne: 'bounds' } }) + // Apply existing values of outdated setting variables in the DB to their newer equivalents, + // then delete those older settings + const parseableSettings = {} + settings.forEach(({ _id, value }) => { parseableSettings[_id] = value }) + for (const outdatedSetting of Object.keys(outdatedSettings)) { + const outdatedSettingInDB = parseableSettings[outdatedSetting] + if (!outdatedSettingInDB) { + return + } + + const newSettingId = outdatedSettings[outdatedSetting] + const outdatedSettingValue = outdatedSettingInDB[1] + await this.upsert(newSettingId, outdatedSettingValue) + await this.delete(outdatedSetting) + } + + return settings } static upsert(_id, value) { diff --git a/src/renderer/store/modules/settings.js b/src/renderer/store/modules/settings.js index 8f99e9464d57c..bb926f2e1e8fb 100644 --- a/src/renderer/store/modules/settings.js +++ b/src/renderer/store/modules/settings.js @@ -308,15 +308,6 @@ const state = { generalAutoLoadMorePaginatedItemsEnabled: false, } -/* Mapping of older settings whose variable names have changed to their newer values */ -const outdatedSettings = { - defaultTheatreMode: 'defaultTheaterMode', - playNextVideo: 'enableAutoplay', - autoplayPlaylists: 'enablePlaylistAutoplay', - hideUnsubscribeButton: 'hideSubscribeButton', - autoplayVideos: 'startVideosAutomatically' -} - const stateWithSideEffects = { currentLocale: { defaultValue: 'en-US', @@ -478,19 +469,6 @@ const customActions = { const [_id, value] = setting loadSetting(_id, value) } - - // Apply existing values of outdated setting variables in the DB to their newer equivalents, - // then delete those older settings - for (const outdatedSetting of Object.keys(outdatedSettings)) { - const outdatedSettingInDB = userSettings.find((setting) => setting[0] === outdatedSetting) - if (!outdatedSettingInDB) { - return - } - const newSetting = outdatedSettings[outdatedSetting] - const oldValue = outdatedSettingInDB[1] - loadSetting(newSetting, oldValue) - await DBSettingHandlers.delete(outdatedSetting) - } } catch (errMessage) { console.error(errMessage) }