From 584afc3a18e2887ca1ee120b3954c15e9926547c Mon Sep 17 00:00:00 2001 From: Benjababe Date: Tue, 24 Oct 2023 02:03:57 +0800 Subject: [PATCH 01/27] add description option to hiding channels --- .../distraction-settings.js | 21 +++++++++++- .../distraction-settings.vue | 5 ++- .../components/ft-input-tags/ft-input-tags.js | 34 +++++++++++++++---- .../ft-input-tags/ft-input-tags.vue | 18 ++++++---- static/locales/en-US.yaml | 1 + 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 7f5e3741fc962..bab138b7bb7d9 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -4,6 +4,8 @@ import FtSettingsSection from '../ft-settings-section/ft-settings-section.vue' import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue' import FtInputTags from '../../components/ft-input-tags/ft-input-tags.vue' import FtFlexBox from '../ft-flex-box/ft-flex-box.vue' +import { invidiousAPICall } from '../../helpers/api/invidious' +import { getLocalChannel } from '../../helpers/api/local' export default defineComponent({ name: 'PlayerSettings', @@ -14,6 +16,9 @@ export default defineComponent({ 'ft-flex-box': FtFlexBox, }, computed: { + backendPreference: function () { + return this.$store.getters.getBackendPreference + }, hideVideoViews: function () { return this.$store.getters.getHideVideoViews }, @@ -92,7 +97,7 @@ export default defineComponent({ hideSubscriptionsLive: function () { return this.$store.getters.getHideSubscriptionsLive }, - hideSubscriptionsCommunity: function() { + hideSubscriptionsCommunity: function () { return this.$store.getters.getHideSubscriptionsCommunity }, showDistractionFreeTitles: function () { @@ -126,6 +131,20 @@ export default defineComponent({ handleChannelsHidden: function (value) { this.updateChannelsHidden(JSON.stringify(value)) }, + findChannelNameById: async function (text) { + if (this.backendPreference === 'invidious') { + const channelPayload = { + resource: 'channels', + id: text, + params: {} + } + const res = await invidiousAPICall(channelPayload) + return res.author + } else { + const channel = await getLocalChannel(text) + return channel.header.author.name + } + }, ...mapActions([ 'updateHideVideoViews', diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index 5b6f06db4a4a1..d7e1c82dcbd1e 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -238,10 +238,13 @@ diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index a621b47216757..5ceb6c61aa2a1 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -1,15 +1,21 @@ import { defineComponent } from 'vue' +import FtButton from '../ft-button/ft-button.vue' import FtInput from '../ft-input/ft-input.vue' import FtTooltip from '../ft-tooltip/ft-tooltip.vue' export default defineComponent({ name: 'FtInputTags', components: { + 'ft-button': FtButton, 'ft-input': FtInput, 'ft-tooltip': FtTooltip }, props: { - placeholder: { + tagNamePlaceholder: { + type: String, + required: true + }, + tagDescPlaceholder: { type: String, required: true }, @@ -28,24 +34,38 @@ export default defineComponent({ tooltip: { type: String, default: '' + }, + includeTagDesc: { + type: Boolean, + default: false + }, + findSecondaryName: { + type: Function, + default: async (_) => '', } }, methods: { - updateTags: function (text, e) { + updateTags: async function (text, _) { // text entered add tag and update tag list - const trimmedText = text.trim() - if (!this.tagList.includes(trimmedText)) { + const name = text.trim() + + if (!this.tagList.some((tag) => tag.name === name)) { + const secondaryName = await this.findSecondaryName(name) + const description = this.$refs.tagDescInput.inputData.trim() + const newList = this.tagList.slice(0) - newList.push(trimmedText) + newList.push({ name, secondaryName, description }) this.$emit('change', newList) } + // clear input box - this.$refs.childinput.handleClearTextClick() + this.$refs.tagNameInput.handleClearTextClick() + this.$refs.tagDescInput.handleClearTextClick() }, removeTag: function (tag) { // Remove tag from list const tagName = tag.trim() - if (this.tagList.includes(tagName)) { + if (this.tagList.some((tag) => tag.name === tagName)) { const newList = this.tagList.slice(0) const index = newList.indexOf(tagName) newList.splice(index, 1) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index 5e4e33e89a70f..6ed83cfc4e55b 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -3,8 +3,8 @@ class="ft-input-tags-component" > - +
  • - {{ tag }} + {{ tag.name }} + {{ tag.secondaryName }}
diff --git a/static/locales/en-US.yaml b/static/locales/en-US.yaml index b1b6a720a6e2f..a2631856c31df 100644 --- a/static/locales/en-US.yaml +++ b/static/locales/en-US.yaml @@ -365,6 +365,7 @@ Settings: Hide Chapters: Hide Chapters Hide Channels: Hide Videos From Channels Hide Channels Placeholder: Channel Name or ID + Hide Channels Description Placeholder: Description for Hiding Hide Featured Channels: Hide Featured Channels Hide Channel Playlists: Hide Channel Playlists Hide Channel Community: Hide Channel Community From 353df407e3d261cfa55b1d44b04884012b6dcc83 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Tue, 24 Oct 2023 02:17:08 +0800 Subject: [PATCH 02/27] does channel id search --- .../distraction-settings.js | 25 +++++++++++-------- .../components/ft-input-tags/ft-input-tags.js | 2 +- .../ft-list-lazy-wrapper.js | 15 ++++++++--- .../ft-list-video-lazy/ft-list-video-lazy.js | 13 +++++++--- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index bab138b7bb7d9..3e1188178bec9 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -132,17 +132,22 @@ export default defineComponent({ this.updateChannelsHidden(JSON.stringify(value)) }, findChannelNameById: async function (text) { - if (this.backendPreference === 'invidious') { - const channelPayload = { - resource: 'channels', - id: text, - params: {} + try { + if (this.backendPreference === 'invidious') { + const channelPayload = { + resource: 'channels', + id: text, + params: {} + } + const res = await invidiousAPICall(channelPayload) + return res.author + } else { + const channel = await getLocalChannel(text) + return channel.header.author.name } - const res = await invidiousAPICall(channelPayload) - return res.author - } else { - const channel = await getLocalChannel(text) - return channel.header.author.name + } catch (_) { + // Will generally throw errors if a non channel ID is provided + return '' } }, diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 5ceb6c61aa2a1..615eee4331fd2 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -58,7 +58,7 @@ export default defineComponent({ this.$emit('change', newList) } - // clear input box + // clear input boxes this.$refs.tagNameInput.handleClearTextClick() this.$refs.tagDescInput.handleClearTextClick() }, diff --git a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js index 5d65aa2c8ded0..9f832f19b214b 100644 --- a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js +++ b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js @@ -53,7 +53,14 @@ export default defineComponent({ // Some component users like channel view will have this disabled if (!this.useChannelsHiddenPreference) { return [] } - return JSON.parse(this.$store.getters.getChannelsHidden) + let hidden = JSON.parse(this.$store.getters.getChannelsHidden) + hidden = hidden.map((ch) => { + if (ch instanceof String) { + return { name: ch, secondaryName: '', description: '' } + } + return ch + }) + return hidden }, hideUpcomingPremieres: function () { return this.$store.getters.getHideUpcomingPremieres @@ -87,7 +94,7 @@ export default defineComponent({ // hide upcoming return false } - if (this.channelsHidden.includes(data.authorId) || this.channelsHidden.includes(data.author)) { + if (this.channelsHidden.some(ch => ch.name === data.authorId) || this.channelsHidden.some(ch => ch.name === data.author)) { // hide videos by author return false } @@ -101,7 +108,7 @@ export default defineComponent({ data.author, data.authorId, ] - if (attrsToCheck.some(a => a != null && this.channelsHidden.includes(a))) { + if (attrsToCheck.some(a => a != null && this.channelsHidden.some(ch => ch.name === a))) { // hide channels by author return false } @@ -115,7 +122,7 @@ export default defineComponent({ data.author, data.authorId, ] - if (attrsToCheck.some(a => a != null && this.channelsHidden.includes(a))) { + if (attrsToCheck.some(a => a != null && this.channelsHidden.some(ch => ch.name === a))) { // hide playlists by author return false } diff --git a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js index c255110b4b3a8..0bff210248e38 100644 --- a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js +++ b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js @@ -58,12 +58,19 @@ export default defineComponent({ // Some component users like channel view will have this disabled if (!this.useChannelsHiddenPreference) { return [] } - return JSON.parse(this.$store.getters.getChannelsHidden) + let hidden = JSON.parse(this.$store.getters.getChannelsHidden) + hidden = hidden.map((ch) => { + if (ch instanceof String) { + return { name: ch, secondaryName: '', description: '' } + } + return ch + }) + return hidden }, shouldBeVisible() { - return !(this.channelsHidden.includes(this.data.authorId) || - this.channelsHidden.includes(this.data.author)) + return !(this.channelsHidden.some(ch => ch.name === this.data.authorId) || + this.channelsHidden.some(ch => ch.name === this.data.author)) } }, created() { From e9fc20d1378fd9413aa7e6043b3418d2b5d3f38a Mon Sep 17 00:00:00 2001 From: Benjababe Date: Tue, 24 Oct 2023 02:41:04 +0800 Subject: [PATCH 03/27] add tag tooltip --- src/renderer/components/ft-input-tags/ft-input-tags.css | 6 +++++- src/renderer/components/ft-input-tags/ft-input-tags.vue | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.css b/src/renderer/components/ft-input-tags/ft-input-tags.css index f32f00ca0d300..f64642e7579be 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.css +++ b/src/renderer/components/ft-input-tags/ft-input-tags.css @@ -8,7 +8,7 @@ } .ft-tag-box ul { - overflow: auto; + overflow: visible; display: block; padding: 0; margin: 0; @@ -32,6 +32,10 @@ hyphens: auto; } +.ft-tag-box li .tooltip { + margin-inline-start: 5px; + padding-block: 10px; +} .removeTagButton { color: var(--primary-text-color); diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index 6ed83cfc4e55b..e6e219bd5ac8b 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -27,6 +27,11 @@ > {{ tag.name }} {{ tag.secondaryName }} + Date: Wed, 25 Oct 2023 13:15:00 +0800 Subject: [PATCH 04/27] legacy support for hidden channels --- .../distraction-settings.js | 10 ++++++- .../components/ft-input-tags/ft-input-tags.js | 4 +-- .../ft-list-lazy-wrapper.js | 27 ++++++++++--------- .../ft-list-video-lazy/ft-list-video-lazy.js | 3 ++- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 3e1188178bec9..e13271721ff3f 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -110,7 +110,15 @@ export default defineComponent({ return this.$store.getters.getBlurThumbnails }, channelsHidden: function () { - return JSON.parse(this.$store.getters.getChannelsHidden) + let hidden = JSON.parse(this.$store.getters.getChannelsHidden) + hidden = hidden.map((ch) => { + // Legacy support + if (typeof ch === 'string') { + return { name: ch, secondaryName: '', description: '' } + } + return ch + }) + return hidden }, hideSubscriptionsLiveTooltip: function () { return this.$t('Tooltips.Distraction Free Settings.Hide Subscriptions Live', { diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 615eee4331fd2..7a49bc6e3060b 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -66,9 +66,7 @@ export default defineComponent({ // Remove tag from list const tagName = tag.trim() if (this.tagList.some((tag) => tag.name === tagName)) { - const newList = this.tagList.slice(0) - const index = newList.indexOf(tagName) - newList.splice(index, 1) + const newList = this.tagList.filter((tag) => tag.name !== tagName) this.$emit('change', newList) } } diff --git a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js index 9f832f19b214b..845270e0ca1f7 100644 --- a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js +++ b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js @@ -46,16 +46,17 @@ export default defineComponent({ } }, computed: { - hideLiveStreams: function() { + hideLiveStreams: function () { return this.$store.getters.getHideLiveStreams }, - channelsHidden: function() { + channelsHidden: function () { // Some component users like channel view will have this disabled if (!this.useChannelsHiddenPreference) { return [] } let hidden = JSON.parse(this.$store.getters.getChannelsHidden) hidden = hidden.map((ch) => { - if (ch instanceof String) { + // Legacy support + if (typeof ch === 'string') { return { name: ch, secondaryName: '', description: '' } } return ch @@ -81,16 +82,16 @@ export default defineComponent({ return false } if (this.hideUpcomingPremieres && - // Observed for premieres in Local API Channels. - (data.premiereDate != null || - // Invidious API - // `premiereTimestamp` only available on premiered videos - // https://docs.invidious.io/api/common_types/#videoobject - data.premiereTimestamp != null || - // viewCount is our only method of detecting premieres in RSS - // data without sending an additional request. - // If we ever get a better flag, use it here instead. - (data.isRSS && data.viewCount === '0'))) { + // Observed for premieres in Local API Channels. + (data.premiereDate != null || + // Invidious API + // `premiereTimestamp` only available on premiered videos + // https://docs.invidious.io/api/common_types/#videoobject + data.premiereTimestamp != null || + // viewCount is our only method of detecting premieres in RSS + // data without sending an additional request. + // If we ever get a better flag, use it here instead. + (data.isRSS && data.viewCount === '0'))) { // hide upcoming return false } diff --git a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js index 0bff210248e38..ad66093837e00 100644 --- a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js +++ b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js @@ -60,7 +60,8 @@ export default defineComponent({ let hidden = JSON.parse(this.$store.getters.getChannelsHidden) hidden = hidden.map((ch) => { - if (ch instanceof String) { + // Legacy support + if (typeof ch === 'string') { return { name: ch, secondaryName: '', description: '' } } return ch From 784a21e087a76dd0be62f5eb4fecff4099a6875b Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 13:19:07 +0800 Subject: [PATCH 05/27] update removeTag --- src/renderer/components/ft-input-tags/ft-input-tags.js | 6 +++--- src/renderer/components/ft-input-tags/ft-input-tags.vue | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 7a49bc6e3060b..e2deaa4cafa52 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -50,6 +50,7 @@ export default defineComponent({ const name = text.trim() if (!this.tagList.some((tag) => tag.name === name)) { + // secondary name assumes an api call may be used const secondaryName = await this.findSecondaryName(name) const description = this.$refs.tagDescInput.inputData.trim() @@ -64,9 +65,8 @@ export default defineComponent({ }, removeTag: function (tag) { // Remove tag from list - const tagName = tag.trim() - if (this.tagList.some((tag) => tag.name === tagName)) { - const newList = this.tagList.filter((tag) => tag.name !== tagName) + if (this.tagList.some((tmpTag) => tmpTag.name === tag.name)) { + const newList = this.tagList.filter((tmpTag) => tmpTag.name !== tag.name) this.$emit('change', newList) } } diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index e6e219bd5ac8b..ad38b86f4f3e3 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -37,8 +37,8 @@ class="removeTagButton" tabindex="0" role="button" - @click="removeTag(tag.name)" - @keydown.enter.prevent="removeTag(tag.name)" + @click="removeTag(tag)" + @keydown.enter.prevent="removeTag(tag)" /> From 351ff8e6fc093a2521b24f8dcaa761d38293fae8 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 14:44:08 +0800 Subject: [PATCH 06/27] add parenthesis to id name --- src/renderer/components/ft-input-tags/ft-input-tags.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index ad38b86f4f3e3..e052ef4ca4e7d 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -26,7 +26,7 @@ :key="tag.id" > {{ tag.name }} - {{ tag.secondaryName }} + ({{ tag.secondaryName }}) Date: Wed, 25 Oct 2023 15:57:12 +0800 Subject: [PATCH 07/27] add icon and id checking before requesting --- .../distraction-settings.js | 48 ++++++++++++++----- .../distraction-settings.vue | 1 + .../ft-input-tags/ft-input-tags.css | 11 ++++- .../components/ft-input-tags/ft-input-tags.js | 16 +++++-- .../ft-input-tags/ft-input-tags.vue | 17 ++++--- static/locales/en-US.yaml | 1 + 6 files changed, 67 insertions(+), 27 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index e13271721ff3f..86be6d80e3d62 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -4,7 +4,7 @@ import FtSettingsSection from '../ft-settings-section/ft-settings-section.vue' import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue' import FtInputTags from '../../components/ft-input-tags/ft-input-tags.vue' import FtFlexBox from '../ft-flex-box/ft-flex-box.vue' -import { invidiousAPICall } from '../../helpers/api/invidious' +import { invidiousGetChannelInfo } from '../../helpers/api/invidious' import { getLocalChannel } from '../../helpers/api/local' export default defineComponent({ @@ -19,6 +19,9 @@ export default defineComponent({ backendPreference: function () { return this.$store.getters.getBackendPreference }, + backendFallback: function () { + return this.$store.getters.getBackendFallback + }, hideVideoViews: function () { return this.$store.getters.getHideVideoViews }, @@ -139,22 +142,45 @@ export default defineComponent({ handleChannelsHidden: function (value) { this.updateChannelsHidden(JSON.stringify(value)) }, + findChannelById: async function (id) { + try { + if (this.backendPreference === 'invidious') { + return await invidiousGetChannelInfo(id) + } else { + return await getLocalChannel(id) + } + } catch (err) { + if (this.backendFallback && this.backendPreference === 'invidious') { + return await getLocalChannel(id) + } + if (this.backendFallback && this.backendPreference === 'local') { + return await invidiousGetChannelInfo(id) + } + } + }, findChannelNameById: async function (text) { + if (!/UC.{22}/.test(text)) return '' try { + const channel = await this.findChannelById(text) if (this.backendPreference === 'invidious') { - const channelPayload = { - resource: 'channels', - id: text, - params: {} - } - const res = await invidiousAPICall(channelPayload) - return res.author + return channel.author } else { - const channel = await getLocalChannel(text) return channel.header.author.name } - } catch (_) { - // Will generally throw errors if a non channel ID is provided + } catch (err) { + return '' + } + }, + findChannelIconById: async function (text) { + if (!/UC.{22}/.test(text)) return '' + try { + const channel = await this.findChannelById(text) + if (this.backendPreference === 'invidious') { + return channel.authorThumbnails[0].url + } else { + return channel.header.author.thumbnails.pop().url + } + } catch (err) { return '' } }, diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index d7e1c82dcbd1e..e6648384ff793 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -245,6 +245,7 @@ :tooltip="$t('Tooltips.Distraction Free Settings.Hide Channels')" :include-tag-desc="true" :find-secondary-name="findChannelNameById" + :find-icon="findChannelIconById" @change="handleChannelsHidden" /> diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.css b/src/renderer/components/ft-input-tags/ft-input-tags.css index f64642e7579be..83ecd450c03e7 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.css +++ b/src/renderer/components/ft-input-tags/ft-input-tags.css @@ -19,7 +19,7 @@ background-color: var(--card-bg-color); margin: 5px; border-radius: 5px; - display:flex; + display: flex; float: var(--float-left-ltr-rtl-value); } @@ -37,6 +37,13 @@ padding-block: 10px; } +.tag-icon { + border-radius: 50%; + block-size: 24px; + margin: auto; + margin-inline-start: 10px; +} + .removeTagButton { color: var(--primary-text-color); opacity: 0.5; @@ -55,4 +62,4 @@ .ft-input-tags-component { inline-size: 100%; } -} +} \ No newline at end of file diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index e2deaa4cafa52..1c2a92ac1c678 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -2,6 +2,7 @@ import { defineComponent } from 'vue' import FtButton from '../ft-button/ft-button.vue' import FtInput from '../ft-input/ft-input.vue' import FtTooltip from '../ft-tooltip/ft-tooltip.vue' +import { showToast } from '../../helpers/utils' export default defineComponent({ name: 'FtInputTags', @@ -42,6 +43,10 @@ export default defineComponent({ findSecondaryName: { type: Function, default: async (_) => '', + }, + findIcon: { + type: Function, + default: async (_) => '', } }, methods: { @@ -50,18 +55,19 @@ export default defineComponent({ const name = text.trim() if (!this.tagList.some((tag) => tag.name === name)) { - // secondary name assumes an api call may be used - const secondaryName = await this.findSecondaryName(name) - const description = this.$refs.tagDescInput.inputData.trim() + // secondary name and icon assumes an api call may be used + const secondaryName = await this.findSecondaryName(name) ?? '' + const icon = await this.findIcon(name) ?? '' const newList = this.tagList.slice(0) - newList.push({ name, secondaryName, description }) + newList.push({ name, secondaryName, icon }) this.$emit('change', newList) + } else { + showToast(this.$t('Settings.Distraction Free Settings.Hide Channels Already Exists')) } // clear input boxes this.$refs.tagNameInput.handleClearTextClick() - this.$refs.tagDescInput.handleClearTextClick() }, removeTag: function (tag) { // Remove tag from list diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index e052ef4ca4e7d..f9945753c2b47 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -13,24 +13,23 @@ :force-action-button-icon-name="['fas', 'arrow-right']" @click="updateTags" /> -
  • + icon {{ tag.name }} - ({{ tag.secondaryName }}) Date: Wed, 25 Oct 2023 15:58:05 +0800 Subject: [PATCH 08/27] update id regex --- .../components/distraction-settings/distraction-settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 86be6d80e3d62..d1417b139b1d1 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -159,7 +159,7 @@ export default defineComponent({ } }, findChannelNameById: async function (text) { - if (!/UC.{22}/.test(text)) return '' + if (!/UC\S{22}/.test(text)) return '' try { const channel = await this.findChannelById(text) if (this.backendPreference === 'invidious') { @@ -172,7 +172,7 @@ export default defineComponent({ } }, findChannelIconById: async function (text) { - if (!/UC.{22}/.test(text)) return '' + if (!/UC\S{22}/.test(text)) return '' try { const channel = await this.findChannelById(text) if (this.backendPreference === 'invidious') { From 1903b6f6590ede74ad1dc73c13a30610e28c7193 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 16:05:38 +0800 Subject: [PATCH 09/27] decouple channel hidden from tags --- .../distraction-settings/distraction-settings.js | 4 ++++ .../distraction-settings/distraction-settings.vue | 1 + .../components/ft-input-tags/ft-input-tags.js | 11 +++++------ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index d1417b139b1d1..ceab17340f75a 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -6,6 +6,7 @@ import FtInputTags from '../../components/ft-input-tags/ft-input-tags.vue' import FtFlexBox from '../ft-flex-box/ft-flex-box.vue' import { invidiousGetChannelInfo } from '../../helpers/api/invidious' import { getLocalChannel } from '../../helpers/api/local' +import { showToast } from '../../helpers/utils' export default defineComponent({ name: 'PlayerSettings', @@ -142,6 +143,9 @@ export default defineComponent({ handleChannelsHidden: function (value) { this.updateChannelsHidden(JSON.stringify(value)) }, + handleChannelsExists: function () { + showToast(this.$t('Settings.Distraction Free Settings.Hide Channels Already Exists')) + }, findChannelById: async function (id) { try { if (this.backendPreference === 'invidious') { diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index e6648384ff793..8524e21006544 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -247,6 +247,7 @@ :find-secondary-name="findChannelNameById" :find-icon="findChannelIconById" @change="handleChannelsHidden" + @already-exists="handleChannelsExists" /> diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 1c2a92ac1c678..3fae3316c80ed 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -2,7 +2,6 @@ import { defineComponent } from 'vue' import FtButton from '../ft-button/ft-button.vue' import FtInput from '../ft-input/ft-input.vue' import FtTooltip from '../ft-tooltip/ft-tooltip.vue' -import { showToast } from '../../helpers/utils' export default defineComponent({ name: 'FtInputTags', @@ -42,20 +41,20 @@ export default defineComponent({ }, findSecondaryName: { type: Function, - default: async (_) => '', + default: (_) => '', }, findIcon: { type: Function, - default: async (_) => '', + default: (_) => '', } }, methods: { - updateTags: async function (text, _) { + updateTags: async function (text, _e) { // text entered add tag and update tag list const name = text.trim() if (!this.tagList.some((tag) => tag.name === name)) { - // secondary name and icon assumes an api call may be used + // secondary name and icon searching allow api calls to be used const secondaryName = await this.findSecondaryName(name) ?? '' const icon = await this.findIcon(name) ?? '' @@ -63,7 +62,7 @@ export default defineComponent({ newList.push({ name, secondaryName, icon }) this.$emit('change', newList) } else { - showToast(this.$t('Settings.Distraction Free Settings.Hide Channels Already Exists')) + this.$emit('already-exists') } // clear input boxes From 25bfb90aef8160c5cf2a608888803668f56c86bf Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 16:11:26 +0800 Subject: [PATCH 10/27] update handling for legacy hidden channels --- .../components/distraction-settings/distraction-settings.js | 2 +- .../components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js | 2 +- .../components/ft-list-video-lazy/ft-list-video-lazy.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index ceab17340f75a..8303c54d56283 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -118,7 +118,7 @@ export default defineComponent({ hidden = hidden.map((ch) => { // Legacy support if (typeof ch === 'string') { - return { name: ch, secondaryName: '', description: '' } + return { name: ch, secondaryName: '', icon: '' } } return ch }) diff --git a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js index 845270e0ca1f7..d60ab51a96643 100644 --- a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js +++ b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js @@ -57,7 +57,7 @@ export default defineComponent({ hidden = hidden.map((ch) => { // Legacy support if (typeof ch === 'string') { - return { name: ch, secondaryName: '', description: '' } + return { name: ch, secondaryName: '', icon: '' } } return ch }) diff --git a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js index ad66093837e00..9ceb857324c50 100644 --- a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js +++ b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js @@ -62,7 +62,7 @@ export default defineComponent({ hidden = hidden.map((ch) => { // Legacy support if (typeof ch === 'string') { - return { name: ch, secondaryName: '', description: '' } + return { name: ch, secondaryName: '', icon: '' } } return ch }) From a44ad48b5bc6a8811a77583efbaf767cd06fb3c9 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 16:13:20 +0800 Subject: [PATCH 11/27] remove tag description --- .../distraction-settings/distraction-settings.vue | 2 -- src/renderer/components/ft-input-tags/ft-input-tags.js | 8 -------- static/locales/en-US.yaml | 1 - 3 files changed, 11 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index 8524e21006544..24e3177a2698f 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -239,11 +239,9 @@ '', diff --git a/static/locales/en-US.yaml b/static/locales/en-US.yaml index 6028d16ea73d3..dec9c5ce2cbc5 100644 --- a/static/locales/en-US.yaml +++ b/static/locales/en-US.yaml @@ -365,7 +365,6 @@ Settings: Hide Chapters: Hide Chapters Hide Channels: Hide Videos From Channels Hide Channels Placeholder: Channel Name or ID - Hide Channels Description Placeholder: Description for Hiding Hide Channels Already Exists: Channel Name or ID already exists Hide Featured Channels: Hide Featured Channels Hide Channel Playlists: Hide Channel Playlists From ad42cbc0cb06f4b7d5bb9d67e37fde24a2d66ac9 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 16:21:09 +0800 Subject: [PATCH 12/27] formatting --- .../distraction-settings.js | 2 +- .../components/ft-input-tags/ft-input-tags.js | 4 +--- .../ft-list-lazy-wrapper.js | 24 +++++++++---------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 8303c54d56283..25222609af285 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -101,7 +101,7 @@ export default defineComponent({ hideSubscriptionsLive: function () { return this.$store.getters.getHideSubscriptionsLive }, - hideSubscriptionsCommunity: function () { + hideSubscriptionsCommunity: function() { return this.$store.getters.getHideSubscriptionsCommunity }, showDistractionFreeTitles: function () { diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 6acddcde2068b..a147bede351d6 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -1,12 +1,10 @@ import { defineComponent } from 'vue' -import FtButton from '../ft-button/ft-button.vue' import FtInput from '../ft-input/ft-input.vue' import FtTooltip from '../ft-tooltip/ft-tooltip.vue' export default defineComponent({ name: 'FtInputTags', components: { - 'ft-button': FtButton, 'ft-input': FtInput, 'ft-tooltip': FtTooltip }, @@ -57,7 +55,7 @@ export default defineComponent({ this.$emit('already-exists') } - // clear input boxes + // clear input box this.$refs.tagNameInput.handleClearTextClick() }, removeTag: function (tag) { diff --git a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js index d60ab51a96643..76ef521af3695 100644 --- a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js +++ b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js @@ -46,10 +46,10 @@ export default defineComponent({ } }, computed: { - hideLiveStreams: function () { + hideLiveStreams: function() { return this.$store.getters.getHideLiveStreams }, - channelsHidden: function () { + channelsHidden: function() { // Some component users like channel view will have this disabled if (!this.useChannelsHiddenPreference) { return [] } @@ -82,16 +82,16 @@ export default defineComponent({ return false } if (this.hideUpcomingPremieres && - // Observed for premieres in Local API Channels. - (data.premiereDate != null || - // Invidious API - // `premiereTimestamp` only available on premiered videos - // https://docs.invidious.io/api/common_types/#videoobject - data.premiereTimestamp != null || - // viewCount is our only method of detecting premieres in RSS - // data without sending an additional request. - // If we ever get a better flag, use it here instead. - (data.isRSS && data.viewCount === '0'))) { + // Observed for premieres in Local API Channels. + (data.premiereDate != null || + // Invidious API + // `premiereTimestamp` only available on premiered videos + // https://docs.invidious.io/api/common_types/#videoobject + data.premiereTimestamp != null || + // viewCount is our only method of detecting premieres in RSS + // data without sending an additional request. + // If we ever get a better flag, use it here instead. + (data.isRSS && data.viewCount === '0'))) { // hide upcoming return false } From b19aed8fa3b50306a37010e1f148496a94eae5d3 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 16:22:06 +0800 Subject: [PATCH 13/27] newline --- src/renderer/components/ft-input-tags/ft-input-tags.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.css b/src/renderer/components/ft-input-tags/ft-input-tags.css index 83ecd450c03e7..94e40dde1e7c0 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.css +++ b/src/renderer/components/ft-input-tags/ft-input-tags.css @@ -62,4 +62,4 @@ .ft-input-tags-component { inline-size: 100%; } -} \ No newline at end of file +} From ec8163fecaf223aa8e9828b2291e1985cda664a7 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 17:45:09 +0800 Subject: [PATCH 14/27] shorten retrieving hidden channels --- .../components/distraction-settings/distraction-settings.js | 4 +--- .../components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js | 4 +--- .../components/ft-list-video-lazy/ft-list-video-lazy.js | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 25222609af285..2d2198f4d9ac7 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -114,15 +114,13 @@ export default defineComponent({ return this.$store.getters.getBlurThumbnails }, channelsHidden: function () { - let hidden = JSON.parse(this.$store.getters.getChannelsHidden) - hidden = hidden.map((ch) => { + return JSON.parse(this.$store.getters.getChannelsHidden).map((ch) => { // Legacy support if (typeof ch === 'string') { return { name: ch, secondaryName: '', icon: '' } } return ch }) - return hidden }, hideSubscriptionsLiveTooltip: function () { return this.$t('Tooltips.Distraction Free Settings.Hide Subscriptions Live', { diff --git a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js index 76ef521af3695..491409c56c853 100644 --- a/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js +++ b/src/renderer/components/ft-list-lazy-wrapper/ft-list-lazy-wrapper.js @@ -53,15 +53,13 @@ export default defineComponent({ // Some component users like channel view will have this disabled if (!this.useChannelsHiddenPreference) { return [] } - let hidden = JSON.parse(this.$store.getters.getChannelsHidden) - hidden = hidden.map((ch) => { + return JSON.parse(this.$store.getters.getChannelsHidden).map((ch) => { // Legacy support if (typeof ch === 'string') { return { name: ch, secondaryName: '', icon: '' } } return ch }) - return hidden }, hideUpcomingPremieres: function () { return this.$store.getters.getHideUpcomingPremieres diff --git a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js index 9ceb857324c50..0364b1966ac84 100644 --- a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js +++ b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js @@ -58,15 +58,13 @@ export default defineComponent({ // Some component users like channel view will have this disabled if (!this.useChannelsHiddenPreference) { return [] } - let hidden = JSON.parse(this.$store.getters.getChannelsHidden) - hidden = hidden.map((ch) => { + return JSON.parse(this.$store.getters.getChannelsHidden).map((ch) => { // Legacy support if (typeof ch === 'string') { return { name: ch, secondaryName: '', icon: '' } } return ch }) - return hidden }, shouldBeVisible() { From 272866faed123e81f55211ff49377b26dee028ee Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 18:54:12 +0800 Subject: [PATCH 15/27] separate channel api requests --- .../distraction-settings.js | 53 +++----------- src/renderer/helpers/channels.js | 70 +++++++++++++++++++ 2 files changed, 78 insertions(+), 45 deletions(-) create mode 100644 src/renderer/helpers/channels.js diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 2d2198f4d9ac7..c91d81ebd2aba 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -4,9 +4,8 @@ import FtSettingsSection from '../ft-settings-section/ft-settings-section.vue' import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue' import FtInputTags from '../../components/ft-input-tags/ft-input-tags.vue' import FtFlexBox from '../ft-flex-box/ft-flex-box.vue' -import { invidiousGetChannelInfo } from '../../helpers/api/invidious' -import { getLocalChannel } from '../../helpers/api/local' import { showToast } from '../../helpers/utils' +import { findChannelIconById, findChannelNameById } from '../../helpers/channels' export default defineComponent({ name: 'PlayerSettings', @@ -17,11 +16,11 @@ export default defineComponent({ 'ft-flex-box': FtFlexBox, }, computed: { - backendPreference: function () { - return this.$store.getters.getBackendPreference - }, - backendFallback: function () { - return this.$store.getters.getBackendFallback + backendOptions: function () { + return { + preference: this.$store.getters.getBackendPreference, + fallback: this.$store.getters.getBackendFallback + } }, hideVideoViews: function () { return this.$store.getters.getHideVideoViews @@ -144,47 +143,11 @@ export default defineComponent({ handleChannelsExists: function () { showToast(this.$t('Settings.Distraction Free Settings.Hide Channels Already Exists')) }, - findChannelById: async function (id) { - try { - if (this.backendPreference === 'invidious') { - return await invidiousGetChannelInfo(id) - } else { - return await getLocalChannel(id) - } - } catch (err) { - if (this.backendFallback && this.backendPreference === 'invidious') { - return await getLocalChannel(id) - } - if (this.backendFallback && this.backendPreference === 'local') { - return await invidiousGetChannelInfo(id) - } - } - }, findChannelNameById: async function (text) { - if (!/UC\S{22}/.test(text)) return '' - try { - const channel = await this.findChannelById(text) - if (this.backendPreference === 'invidious') { - return channel.author - } else { - return channel.header.author.name - } - } catch (err) { - return '' - } + return await findChannelNameById(text, this.backendOptions) }, findChannelIconById: async function (text) { - if (!/UC\S{22}/.test(text)) return '' - try { - const channel = await this.findChannelById(text) - if (this.backendPreference === 'invidious') { - return channel.authorThumbnails[0].url - } else { - return channel.header.author.thumbnails.pop().url - } - } catch (err) { - return '' - } + return await findChannelIconById(text, this.backendOptions) }, ...mapActions([ diff --git a/src/renderer/helpers/channels.js b/src/renderer/helpers/channels.js new file mode 100644 index 0000000000000..f13ae223c3b08 --- /dev/null +++ b/src/renderer/helpers/channels.js @@ -0,0 +1,70 @@ +import { invidiousGetChannelInfo } from './api/invidious' +import { getLocalChannel } from './api/local' + +/** + * @param {string} id + * @param {{ +* preference: string, +* fallback: boolean, +* }} backendOptions +*/ +async function findChannelById(id, backendOptions) { + try { + if (backendOptions.preference === 'invidious') { + return await invidiousGetChannelInfo(id) + } else { + return await getLocalChannel(id) + } + } catch (err) { + if (backendOptions.fallback && backendOptions.preference === 'invidious') { + return await getLocalChannel(id) + } + if (backendOptions.fallback && backendOptions.preference === 'local') { + return await invidiousGetChannelInfo(id) + } + } +} + +/** + * @param {string} id + * @param {{ +* preference: string, +* fallback: boolean, +* }} backendOptions +* @returns {Promise} +*/ +export async function findChannelNameById(id, backendOptions) { + if (!/UC\S{22}/.test(id)) return '' + try { + const channel = await findChannelById(id, backendOptions) + if (backendOptions.preference === 'invidious') { + return channel.author + } else { + return channel.header.author.name + } + } catch (err) { + return '' + } +} + +/** + * @param {string} id + * @param {{ + * preference: string, + * fallback: boolean, + * }} backendOptions + * @returns {Promise} + */ +export async function findChannelIconById(id, backendOptions) { + if (!/UC\S{22}/.test(id)) return '' + try { + const channel = await findChannelById(id, backendOptions) + if (backendOptions.preference === 'invidious') { + return channel.authorThumbnails[0].url + } else { + return channel.header.author.thumbnails.pop().url + } + } catch (err) { + return '' + } +} From 83ed3c82688e63c74e9299ae98bbad77d489e149 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 25 Oct 2023 18:54:29 +0800 Subject: [PATCH 16/27] refractor ft-input-tags.js --- src/renderer/components/ft-input-tags/ft-input-tags.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index a147bede351d6..32f0c21796b2f 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -47,10 +47,8 @@ export default defineComponent({ // secondary name and icon searching allow api calls to be used const secondaryName = await this.findSecondaryName(name) ?? '' const icon = await this.findIcon(name) ?? '' - - const newList = this.tagList.slice(0) - newList.push({ name, secondaryName, icon }) - this.$emit('change', newList) + const newTag = { name, secondaryName, icon } + this.$emit('change', [...this.tagList, newTag]) } else { this.$emit('already-exists') } From 54615c1162df6aa1841476bc3ebaa99d9e7f1514 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Sat, 28 Oct 2023 17:45:33 +0800 Subject: [PATCH 17/27] replace secondaryName with preferredName for tags --- .../distraction-settings/distraction-settings.js | 2 +- .../distraction-settings/distraction-settings.vue | 2 +- src/renderer/components/ft-input-tags/ft-input-tags.js | 6 +++--- src/renderer/components/ft-input-tags/ft-input-tags.vue | 7 +------ .../ft-list-lazy-wrapper/ft-list-lazy-wrapper.js | 2 +- .../components/ft-list-video-lazy/ft-list-video-lazy.js | 2 +- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index c91d81ebd2aba..c5957bb36a56d 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -116,7 +116,7 @@ export default defineComponent({ return JSON.parse(this.$store.getters.getChannelsHidden).map((ch) => { // Legacy support if (typeof ch === 'string') { - return { name: ch, secondaryName: '', icon: '' } + return { name: ch, preferredName: '', icon: '' } } return ch }) diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index 24e3177a2698f..a0b5ba46f940d 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -242,7 +242,7 @@ :show-action-button="true" :tag-list="channelsHidden" :tooltip="$t('Tooltips.Distraction Free Settings.Hide Channels')" - :find-secondary-name="findChannelNameById" + :find-preferred-name="findChannelNameById" :find-icon="findChannelIconById" @change="handleChannelsHidden" @already-exists="handleChannelsExists" diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 32f0c21796b2f..0cafdb139279d 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -29,7 +29,7 @@ export default defineComponent({ type: String, default: '' }, - findSecondaryName: { + findPreferredName: { type: Function, default: (_) => '', }, @@ -45,9 +45,9 @@ export default defineComponent({ if (!this.tagList.some((tag) => tag.name === name)) { // secondary name and icon searching allow api calls to be used - const secondaryName = await this.findSecondaryName(name) ?? '' + const preferredName = await this.findPreferredName(name) ?? '' const icon = await this.findIcon(name) ?? '' - const newTag = { name, secondaryName, icon } + const newTag = { name, preferredName, icon } this.$emit('change', [...this.tagList, newTag]) } else { this.$emit('already-exists') diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index f9945753c2b47..140d1603e96a5 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -25,12 +25,7 @@ alt="icon" class="tag-icon" > - {{ tag.name }} - + {{ (tag.preferredName) ? tag.preferredName : tag.name }} { // Legacy support if (typeof ch === 'string') { - return { name: ch, secondaryName: '', icon: '' } + return { name: ch, preferredName: '', icon: '' } } return ch }) diff --git a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js index 0364b1966ac84..3a4f3b6780054 100644 --- a/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js +++ b/src/renderer/components/ft-list-video-lazy/ft-list-video-lazy.js @@ -61,7 +61,7 @@ export default defineComponent({ return JSON.parse(this.$store.getters.getChannelsHidden).map((ch) => { // Legacy support if (typeof ch === 'string') { - return { name: ch, secondaryName: '', icon: '' } + return { name: ch, preferredName: '', icon: '' } } return ch }) From ee2f96d76259ee184ae1d2884defa9d2d7a2a8f3 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Sat, 28 Oct 2023 18:43:46 +0800 Subject: [PATCH 18/27] unify hidden channel name/icon retrieval function --- .../distraction-settings.js | 9 ++--- .../distraction-settings.vue | 3 +- .../components/ft-input-tags/ft-input-tags.js | 14 ++----- src/renderer/helpers/channels.js | 39 ++++++------------- 4 files changed, 20 insertions(+), 45 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index c5957bb36a56d..ba74aea0ce608 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -5,7 +5,7 @@ import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue' import FtInputTags from '../../components/ft-input-tags/ft-input-tags.vue' import FtFlexBox from '../ft-flex-box/ft-flex-box.vue' import { showToast } from '../../helpers/utils' -import { findChannelIconById, findChannelNameById } from '../../helpers/channels' +import { findChannelTagInfo } from '../../helpers/channels' export default defineComponent({ name: 'PlayerSettings', @@ -143,11 +143,8 @@ export default defineComponent({ handleChannelsExists: function () { showToast(this.$t('Settings.Distraction Free Settings.Hide Channels Already Exists')) }, - findChannelNameById: async function (text) { - return await findChannelNameById(text, this.backendOptions) - }, - findChannelIconById: async function (text) { - return await findChannelIconById(text, this.backendOptions) + findChannelTagInfo: async function (text) { + return await findChannelTagInfo(text, this.backendOptions) }, ...mapActions([ diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index a0b5ba46f940d..edcbdc8ffba29 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -242,8 +242,7 @@ :show-action-button="true" :tag-list="channelsHidden" :tooltip="$t('Tooltips.Distraction Free Settings.Hide Channels')" - :find-preferred-name="findChannelNameById" - :find-icon="findChannelIconById" + :find-tag-info="findChannelTagInfo" @change="handleChannelsHidden" @already-exists="handleChannelsExists" /> diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 0cafdb139279d..c637b152a86fc 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -6,7 +6,6 @@ export default defineComponent({ name: 'FtInputTags', components: { 'ft-input': FtInput, - 'ft-tooltip': FtTooltip }, props: { tagNamePlaceholder: { @@ -29,13 +28,9 @@ export default defineComponent({ type: String, default: '' }, - findPreferredName: { + findTagInfo: { type: Function, - default: (_) => '', - }, - findIcon: { - type: Function, - default: (_) => '', + default: (_) => ({ preferredName: '', icon: '' }), } }, methods: { @@ -44,9 +39,8 @@ export default defineComponent({ const name = text.trim() if (!this.tagList.some((tag) => tag.name === name)) { - // secondary name and icon searching allow api calls to be used - const preferredName = await this.findPreferredName(name) ?? '' - const icon = await this.findIcon(name) ?? '' + // tag info searching allow api calls to be used + const { preferredName, icon } = await this.findTagInfo(name) const newTag = { name, preferredName, icon } this.$emit('change', [...this.tagList, newTag]) } else { diff --git a/src/renderer/helpers/channels.js b/src/renderer/helpers/channels.js index f13ae223c3b08..31138868d3881 100644 --- a/src/renderer/helpers/channels.js +++ b/src/renderer/helpers/channels.js @@ -31,40 +31,25 @@ async function findChannelById(id, backendOptions) { * preference: string, * fallback: boolean, * }} backendOptions -* @returns {Promise} +* @returns {Promise<{icon: string, preferredName: string}>} */ -export async function findChannelNameById(id, backendOptions) { +export async function findChannelTagInfo(id, backendOptions) { if (!/UC\S{22}/.test(id)) return '' try { const channel = await findChannelById(id, backendOptions) if (backendOptions.preference === 'invidious') { - return channel.author + return { + preferredName: channel.author, + icon: channel.authorThumbnails[0].url + } } else { - return channel.header.author.name + return { + preferredName: channel.header.author.name, + icon: channel.header.author.thumbnails.pop().url + } } } catch (err) { - return '' - } -} - -/** - * @param {string} id - * @param {{ - * preference: string, - * fallback: boolean, - * }} backendOptions - * @returns {Promise} - */ -export async function findChannelIconById(id, backendOptions) { - if (!/UC\S{22}/.test(id)) return '' - try { - const channel = await findChannelById(id, backendOptions) - if (backendOptions.preference === 'invidious') { - return channel.authorThumbnails[0].url - } else { - return channel.header.author.thumbnails.pop().url - } - } catch (err) { - return '' + console.error(err) + return { preferredName: '', icon: '' } } } From 370315d294dbb1d507f39a33f81352b527ef73ab Mon Sep 17 00:00:00 2001 From: Benjababe Date: Sat, 28 Oct 2023 18:44:47 +0800 Subject: [PATCH 19/27] remove tooltip from ft-input-tags --- src/renderer/components/ft-input-tags/ft-input-tags.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index c637b152a86fc..c9df2db1de358 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -1,6 +1,5 @@ import { defineComponent } from 'vue' import FtInput from '../ft-input/ft-input.vue' -import FtTooltip from '../ft-tooltip/ft-tooltip.vue' export default defineComponent({ name: 'FtInputTags', From d9e52234f80ad779a8bd848da6eb23abf64b632a Mon Sep 17 00:00:00 2001 From: Benjababe Date: Sat, 28 Oct 2023 19:50:50 +0800 Subject: [PATCH 20/27] auto update hidden channel if ID was used --- .../distraction-settings.js | 30 +++++++++++++++++-- .../distraction-settings.vue | 1 + .../ft-input-tags/ft-input-tags.css | 15 +++++----- .../components/ft-input-tags/ft-input-tags.js | 4 +++ .../ft-input-tags/ft-input-tags.vue | 9 ++++++ src/renderer/helpers/channels.js | 11 ++++++- 6 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index ba74aea0ce608..740ccf18104f3 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -5,7 +5,7 @@ import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue' import FtInputTags from '../../components/ft-input-tags/ft-input-tags.vue' import FtFlexBox from '../ft-flex-box/ft-flex-box.vue' import { showToast } from '../../helpers/utils' -import { findChannelTagInfo } from '../../helpers/channels' +import { checkYoutubeId, findChannelTagInfo } from '../../helpers/channels' export default defineComponent({ name: 'PlayerSettings', @@ -15,6 +15,11 @@ export default defineComponent({ 'ft-input-tags': FtInputTags, 'ft-flex-box': FtFlexBox, }, + data: function () { + return { + channelHiderDisabled: false, + } + }, computed: { backendOptions: function () { return { @@ -100,7 +105,7 @@ export default defineComponent({ hideSubscriptionsLive: function () { return this.$store.getters.getHideSubscriptionsLive }, - hideSubscriptionsCommunity: function() { + hideSubscriptionsCommunity: function () { return this.$store.getters.getHideSubscriptionsCommunity }, showDistractionFreeTitles: function () { @@ -129,6 +134,9 @@ export default defineComponent({ }) } }, + mounted: function () { + this.verifyChannelsHidden() + }, methods: { handleHideRecommendedVideos: function (value) { if (value) { @@ -146,6 +154,24 @@ export default defineComponent({ findChannelTagInfo: async function (text) { return await findChannelTagInfo(text, this.backendOptions) }, + verifyChannelsHidden: async function () { + const channelsHiddenCpy = [...this.channelsHidden] + + for (let i = 0; i < channelsHiddenCpy.length; i++) { + const tag = this.channelsHidden[i] + if (tag.preferredName === '' && checkYoutubeId(tag.name)) { + this.channelHiderDisabled = true + + const { preferredName, icon, err } = await this.findChannelTagInfo(tag.name) + if (err) continue + const newTag = { name: tag.name, preferredName, icon } + channelsHiddenCpy[i] = newTag + + // update on every tag in case it closes + this.handleChannelsHidden(channelsHiddenCpy) + } + } + }, ...mapActions([ 'updateHideVideoViews', diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index edcbdc8ffba29..f0cf30c5cf204 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -237,6 +237,7 @@
    span { padding-block: 10px; - padding-inline-start: 10px; + padding-inline: 10px; overflow-wrap: break-word; word-wrap: break-word; word-break: break-all; hyphens: auto; } -.ft-tag-box li .tooltip { - margin-inline-start: 5px; - padding-block: 10px; -} - .tag-icon { border-radius: 50%; block-size: 24px; @@ -48,6 +48,7 @@ color: var(--primary-text-color); opacity: 0.5; padding: 10px; + padding-inline-start: 0px; } .removeTagButton:hover { @@ -62,4 +63,4 @@ .ft-input-tags-component { inline-size: 100%; } -} +} \ No newline at end of file diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index c9df2db1de358..24d6cf492033d 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -7,6 +7,10 @@ export default defineComponent({ 'ft-input': FtInput, }, props: { + disabled: { + type: Boolean, + default: false + }, tagNamePlaceholder: { type: String, required: true diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index 140d1603e96a5..57f29e5d4adca 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -2,8 +2,16 @@
    +
    + Some channels were blocked using ID and weren't processed. + Feature is blocked while those IDs are updating +
    {{ (tag.preferredName) ? tag.preferredName : tag.name }} Date: Sat, 28 Oct 2023 20:09:32 +0800 Subject: [PATCH 21/27] remove hiding channel by name --- .../distraction-settings.js | 13 +++++++++++++ .../distraction-settings.vue | 3 +++ .../components/ft-input-tags/ft-input-tags.css | 2 +- .../components/ft-input-tags/ft-input-tags.js | 17 ++++++++++++++++- static/locales/en-US.yaml | 10 ++++++---- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 740ccf18104f3..9839c46e047ce 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -145,12 +145,21 @@ export default defineComponent({ this.updateHideRecommendedVideos(value) }, + handleInvalidChannel: function () { + showToast(this.$t('Settings.Distraction Free Settings.Hide Channels Invalid')) + }, + handleChannelAPIError: function () { + showToast(this.$t('Settings.Distraction Free Settings.Hide Channels API Error')) + }, handleChannelsHidden: function (value) { this.updateChannelsHidden(JSON.stringify(value)) }, handleChannelsExists: function () { showToast(this.$t('Settings.Distraction Free Settings.Hide Channels Already Exists')) }, + validateChannelId: function (text) { + return checkYoutubeId(text) + }, findChannelTagInfo: async function (text) { return await findChannelTagInfo(text, this.backendOptions) }, @@ -159,6 +168,8 @@ export default defineComponent({ for (let i = 0; i < channelsHiddenCpy.length; i++) { const tag = this.channelsHidden[i] + + // process if no preferred name and is possibly a YouTube ID if (tag.preferredName === '' && checkYoutubeId(tag.name)) { this.channelHiderDisabled = true @@ -171,6 +182,8 @@ export default defineComponent({ this.handleChannelsHidden(channelsHiddenCpy) } } + + this.channelHiderDisabled = false }, ...mapActions([ diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index f0cf30c5cf204..7286c5ffd5048 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -243,7 +243,10 @@ :show-action-button="true" :tag-list="channelsHidden" :tooltip="$t('Tooltips.Distraction Free Settings.Hide Channels')" + :validate-tag-name="validateChannelId" :find-tag-info="findChannelTagInfo" + @invalid-name="handleInvalidChannel" + @error-find-tag-info="handleChannelAPIError" @change="handleChannelsHidden" @already-exists="handleChannelsExists" /> diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.css b/src/renderer/components/ft-input-tags/ft-input-tags.css index fc5f92c476d63..9266017e8586c 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.css +++ b/src/renderer/components/ft-input-tags/ft-input-tags.css @@ -63,4 +63,4 @@ .ft-input-tags-component { inline-size: 100%; } -} \ No newline at end of file +} diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 24d6cf492033d..6632a1eb7eaa9 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -31,6 +31,10 @@ export default defineComponent({ type: String, default: '' }, + validateTagName: { + type: Function, + default: (_) => true + }, findTagInfo: { type: Function, default: (_) => ({ preferredName: '', icon: '' }), @@ -41,9 +45,20 @@ export default defineComponent({ // text entered add tag and update tag list const name = text.trim() + if (!this.validateTagName(name)) { + this.$emit('invalid-name') + return + } + if (!this.tagList.some((tag) => tag.name === name)) { // tag info searching allow api calls to be used - const { preferredName, icon } = await this.findTagInfo(name) + const { preferredName, icon, err } = await this.findTagInfo(name) + + if (err) { + this.$emit('error-find-tag-info') + return + } + const newTag = { name, preferredName, icon } this.$emit('change', [...this.tagList, newTag]) } else { diff --git a/static/locales/en-US.yaml b/static/locales/en-US.yaml index dec9c5ce2cbc5..96723948e81aa 100644 --- a/static/locales/en-US.yaml +++ b/static/locales/en-US.yaml @@ -364,8 +364,10 @@ Settings: Hide Sharing Actions: Hide Sharing Actions Hide Chapters: Hide Chapters Hide Channels: Hide Videos From Channels - Hide Channels Placeholder: Channel Name or ID - Hide Channels Already Exists: Channel Name or ID already exists + Hide Channels Placeholder: Channel ID + Hide Channels Invalid: Channel ID provided was invalid + Hide Channels API Error: Error retrieving user with the ID provided. Please check again if the ID is correct. + Hide Channels Already Exists: Channel ID already exists Hide Featured Channels: Hide Featured Channels Hide Channel Playlists: Hide Channel Playlists Hide Channel Community: Hide Channel Community @@ -866,8 +868,8 @@ Tooltips: you want to be passed to the external player. DefaultCustomArgumentsTemplate: "(Default: '{defaultCustomArguments}')" Distraction Free Settings: - Hide Channels: Enter a channel name or channel ID to hide all videos, playlists and the channel itself from appearing in search, trending, most popular and recommended. - The channel name entered must be a complete match and is case sensitive. + Hide Channels: Enter a channel ID to hide all videos, playlists and the channel itself from appearing in search, trending, most popular and recommended. + The channel ID entered must be a complete match and is case sensitive. Hide Subscriptions Live: 'This setting is overridden by the app-wide "{appWideSetting}" setting, in the "{subsection}" section of the "{settingsSection}"' Subscription Settings: Fetch Feeds from RSS: When enabled, FreeTube will use RSS instead of its default From d354523e4c4bf85243cb824d4d853f5ededc840d Mon Sep 17 00:00:00 2001 From: Benjababe Date: Sat, 28 Oct 2023 20:21:08 +0800 Subject: [PATCH 22/27] i18n channels hidden disabled message --- .../components/distraction-settings/distraction-settings.vue | 1 + src/renderer/components/ft-input-tags/ft-input-tags.js | 4 ++++ src/renderer/components/ft-input-tags/ft-input-tags.vue | 3 +-- static/locales/en-US.yaml | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.vue b/src/renderer/components/distraction-settings/distraction-settings.vue index 7286c5ffd5048..b30e8fd68bef7 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.vue +++ b/src/renderer/components/distraction-settings/distraction-settings.vue @@ -238,6 +238,7 @@ - Some channels were blocked using ID and weren't processed. - Feature is blocked while those IDs are updating + {{ disabledMsg }}
    Date: Sat, 28 Oct 2023 21:06:03 +0800 Subject: [PATCH 23/27] run auto hidden channel id update once --- .../distraction-settings/distraction-settings.js | 13 +++++++++---- src/renderer/helpers/channels.js | 9 ++++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 9839c46e047ce..77bf4c56797f7 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -169,14 +169,19 @@ export default defineComponent({ for (let i = 0; i < channelsHiddenCpy.length; i++) { const tag = this.channelsHidden[i] + // if channel has been processed and confirmed as non existent, skip + if (tag.invalid) continue + // process if no preferred name and is possibly a YouTube ID if (tag.preferredName === '' && checkYoutubeId(tag.name)) { this.channelHiderDisabled = true - const { preferredName, icon, err } = await this.findChannelTagInfo(tag.name) - if (err) continue - const newTag = { name: tag.name, preferredName, icon } - channelsHiddenCpy[i] = newTag + const { preferredName, icon, invalidId } = await this.findChannelTagInfo(tag.name) + if (invalidId) { + channelsHiddenCpy[i] = { name: tag.name, invalid: invalidId } + } else { + channelsHiddenCpy[i] = { name: tag.name, preferredName, icon } + } // update on every tag in case it closes this.handleChannelsHidden(channelsHiddenCpy) diff --git a/src/renderer/helpers/channels.js b/src/renderer/helpers/channels.js index c13fd84bcecbf..e63de55374f70 100644 --- a/src/renderer/helpers/channels.js +++ b/src/renderer/helpers/channels.js @@ -6,6 +6,7 @@ import { getLocalChannel } from './api/local' * @param {{ * preference: string, * fallback: boolean, +* invalid: boolean, * }} backendOptions */ async function findChannelById(id, backendOptions) { @@ -16,6 +17,10 @@ async function findChannelById(id, backendOptions) { return await getLocalChannel(id) } } catch (err) { + // don't bother with fallback if channel doesn't exist + if (err.message && err.message === 'This channel does not exist.') { + return { invalid: true } + } if (backendOptions.fallback && backendOptions.preference === 'invidious') { return await getLocalChannel(id) } @@ -31,18 +36,20 @@ async function findChannelById(id, backendOptions) { * preference: string, * fallback: boolean, * }} backendOptions -* @returns {Promise<{icon: string, preferredName: string}>} +* @returns {Promise<{icon: string, preferredName: string, invalidId: boolean}>} */ export async function findChannelTagInfo(id, backendOptions) { if (!/UC\S{22}/.test(id)) return '' try { const channel = await findChannelById(id, backendOptions) if (backendOptions.preference === 'invidious') { + if (channel.invalid) return { invalidId: true } return { preferredName: channel.author, icon: channel.authorThumbnails[0].url } } else { + if (channel.alert) return { invalidId: true } return { preferredName: channel.header.author.name, icon: channel.header.author.thumbnails.pop().url From 2d177bbad1c4dfe5a4a93c044475453bfe23e7fd Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 8 Nov 2023 18:34:33 +0800 Subject: [PATCH 24/27] Update src/renderer/components/ft-input-tags/ft-input-tags.vue Co-authored-by: Jason <84899178+jasonhenriquez@users.noreply.github.com> --- src/renderer/components/ft-input-tags/ft-input-tags.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index 8920db4e84f50..e21101a5d31ed 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -29,7 +29,7 @@ icon {{ (tag.preferredName) ? tag.preferredName : tag.name }} From c31cb18efd50cd0db3eafd40949c65f0a89fd67b Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 8 Nov 2023 18:38:05 +0800 Subject: [PATCH 25/27] add text selection for ft tags --- src/renderer/components/ft-input-tags/ft-input-tags.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.css b/src/renderer/components/ft-input-tags/ft-input-tags.css index 9266017e8586c..7060dd6e9dc12 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.css +++ b/src/renderer/components/ft-input-tags/ft-input-tags.css @@ -35,6 +35,7 @@ word-wrap: break-word; word-break: break-all; hyphens: auto; + user-select: text; } .tag-icon { From 09bc6d9e92e78fb3f9d79a6f7e9dc814471a1393 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 8 Nov 2023 19:01:41 +0800 Subject: [PATCH 26/27] add ft-input-tags icon url --- .../distraction-settings/distraction-settings.js | 4 ++-- .../components/ft-input-tags/ft-input-tags.css | 4 ++++ .../components/ft-input-tags/ft-input-tags.js | 4 ++-- .../components/ft-input-tags/ft-input-tags.vue | 15 ++++++++++----- src/renderer/helpers/channels.js | 9 +++++---- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/renderer/components/distraction-settings/distraction-settings.js b/src/renderer/components/distraction-settings/distraction-settings.js index 77bf4c56797f7..0c7ce3efa06cd 100644 --- a/src/renderer/components/distraction-settings/distraction-settings.js +++ b/src/renderer/components/distraction-settings/distraction-settings.js @@ -176,11 +176,11 @@ export default defineComponent({ if (tag.preferredName === '' && checkYoutubeId(tag.name)) { this.channelHiderDisabled = true - const { preferredName, icon, invalidId } = await this.findChannelTagInfo(tag.name) + const { preferredName, icon, iconHref, invalidId } = await this.findChannelTagInfo(tag.name) if (invalidId) { channelsHiddenCpy[i] = { name: tag.name, invalid: invalidId } } else { - channelsHiddenCpy[i] = { name: tag.name, preferredName, icon } + channelsHiddenCpy[i] = { name: tag.name, preferredName, icon, iconHref } } // update on every tag in case it closes diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.css b/src/renderer/components/ft-input-tags/ft-input-tags.css index 7060dd6e9dc12..c1a81925adc13 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.css +++ b/src/renderer/components/ft-input-tags/ft-input-tags.css @@ -41,6 +41,10 @@ .tag-icon { border-radius: 50%; block-size: 24px; + vertical-align: middle; +} + +.tag-icon-link { margin: auto; margin-inline-start: 10px; } diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.js b/src/renderer/components/ft-input-tags/ft-input-tags.js index 07a83b5db46c5..f517159959424 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.js +++ b/src/renderer/components/ft-input-tags/ft-input-tags.js @@ -56,14 +56,14 @@ export default defineComponent({ if (!this.tagList.some((tag) => tag.name === name)) { // tag info searching allow api calls to be used - const { preferredName, icon, err } = await this.findTagInfo(name) + const { preferredName, icon, iconHref, err } = await this.findTagInfo(name) if (err) { this.$emit('error-find-tag-info') return } - const newTag = { name, preferredName, icon } + const newTag = { name, preferredName, icon, iconHref } this.$emit('change', [...this.tagList, newTag]) } else { this.$emit('already-exists') diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index e21101a5d31ed..1e8a5d577065a 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -26,12 +26,17 @@ v-for="tag in tagList" :key="tag.id" > - + + {{ (tag.preferredName) ? tag.preferredName : tag.name }} } +* @returns {Promise<{icon: string, iconHref: string, preferredName: string, invalidId: boolean}>} */ export async function findChannelTagInfo(id, backendOptions) { - if (!/UC\S{22}/.test(id)) return '' + if (!/UC\S{22}/.test(id)) return { invalidId: true } try { const channel = await findChannelById(id, backendOptions) if (backendOptions.preference === 'invidious') { @@ -52,12 +52,13 @@ export async function findChannelTagInfo(id, backendOptions) { if (channel.alert) return { invalidId: true } return { preferredName: channel.header.author.name, - icon: channel.header.author.thumbnails.pop().url + icon: channel.header.author.thumbnails.pop().url, + iconHref: `/channel/${id}` } } } catch (err) { console.error(err) - return { preferredName: '', icon: '', err } + return { preferredName: '', icon: '', iconHref: '', err } } } From 7272fc478c9c8a5d6a17f54660a1e93ba20ca943 Mon Sep 17 00:00:00 2001 From: Benjababe Date: Wed, 8 Nov 2023 23:06:19 +0800 Subject: [PATCH 27/27] fix icon link --- src/renderer/components/ft-input-tags/ft-input-tags.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/ft-input-tags/ft-input-tags.vue b/src/renderer/components/ft-input-tags/ft-input-tags.vue index 1e8a5d577065a..6b236e937ca77 100644 --- a/src/renderer/components/ft-input-tags/ft-input-tags.vue +++ b/src/renderer/components/ft-input-tags/ft-input-tags.vue @@ -27,11 +27,11 @@ :key="tag.id" >