From 0731b9d033ad3e9cba6ee6d296cf3993ea7fcf83 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 14 Jul 2026 18:59:30 +0200 Subject: [PATCH 1/6] Fix hide channel for recommended videos --- src/renderer/components/FtListVideoLazy.vue | 2 +- src/renderer/helpers/api/local.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/FtListVideoLazy.vue b/src/renderer/components/FtListVideoLazy.vue index e3bec8a070d0f..975d1cb056249 100644 --- a/src/renderer/components/FtListVideoLazy.vue +++ b/src/renderer/components/FtListVideoLazy.vue @@ -141,7 +141,7 @@ const shouldBeVisible = computed(() => { const lowerCaseTitle = props.data.title?.toLowerCase() const lowerCaseAuthor = props.data.author?.toLowerCase() - return !(channelsHidden.value.some(ch => ch.name === props.data.authorId) || + return !(channelsHidden.value.some(ch => ch.name === props.data.authorId || (props.data.collaboratorIds.length > 0 && ch.name === props.data.collaboratorIds[0])) || channelsHidden.value.some(ch => ch.name === props.data.author) || (lowerCaseTitle && forbiddenTitles.value.some((text) => lowerCaseTitle.includes(text))) || (hideChannelsBasedOnText.value && lowerCaseAuthor && forbiddenTitles.value.some((text) => lowerCaseAuthor.includes(text)))) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index c32ef7e8359c8..c5b4ff5fc66d8 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -1682,12 +1682,20 @@ function parseLockupView(lockupView, channelId = undefined, channelName = undefi author = maybeAuthorText } + const maybeCollaborators = lockupView.metadata.image?.renderer_context?.command_context?.on_tap?.command?.inline_content?.custom_content?.items + let collaboratorIds = [] + if (maybeCollaborators) { + collaboratorIds = maybeCollaborators.map(item => item.renderer_context?.command_context?.on_tap?.payload?.browseId) + .filter(collabChannelId => collabChannelId) + } + return { type: 'video', videoId: lockupView.content_id, title: lockupView.metadata.title.text?.trim(), author, authorId: lockupView.metadata.image?.renderer_context?.command_context?.on_tap?.payload.browseId ?? channelId, + collaboratorIds, viewCount, published: calculatePublishedDate(publishedText, liveNow, isUpcoming, premiereDate), lengthSeconds, From 79af057302b71430b0154c466f43716037a1e75f Mon Sep 17 00:00:00 2001 From: David Date: Tue, 14 Jul 2026 20:13:19 +0200 Subject: [PATCH 2/6] Fix hide channel for search results --- .../components/FtListLazyWrapper/FtListLazyWrapper.vue | 5 +++-- src/renderer/helpers/api/local.js | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue b/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue index b8dc00324b7fc..00a76ce47bd5f 100644 --- a/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue +++ b/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue @@ -239,8 +239,9 @@ const showResult = computed(() => { } const lowerCaseAuthor = props.data.author?.toLowerCase() - - if (channelsHidden.value.some(ch => ch.name === props.data.authorId) || channelsHidden.value.some(ch => ch.name === props.data.author) || (forbiddenTitles.value.some((text) => lowerCaseAuthor.includes(text)))) { + if (channelsHidden.value.some(ch => ch.name === props.data.authorId || (props.data.collaboratorIds.length > 0 && ch.name === props.data.collaboratorIds[0])) || + channelsHidden.value.some(ch => ch.name === props.data.author) || + forbiddenTitles.value.some((text) => lowerCaseAuthor.includes(text))) { // hide videos by author return false } diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index c5b4ff5fc66d8..26e505e4d5397 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -1514,6 +1514,7 @@ export function parseLocalListVideo(item, channelId, channelName) { title: video.title.text?.trim(), author: video.author.name !== 'N/A' ? video.author.name : channelName, authorId: video.author.id !== 'N/A' ? video.author.id : channelId, + collaboratorIds: video.author.collaborators.map(collaborator => collaborator.id), description: video.description, viewCount, published, From 37e9f9b194c237c2cca70a0eb873ad82b8c28da6 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 14 Jul 2026 20:24:34 +0200 Subject: [PATCH 3/6] Fix hide channel for trending page --- src/renderer/helpers/api/local.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index 26e505e4d5397..b865a17263c55 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -1456,6 +1456,7 @@ export function parseLocalListVideo(item, channelId, channelName) { title: video.title.text?.trim(), author: video.author?.name ?? channelName, authorId: (video.author?.id != null && video.author.id !== 'N/A') ? video.author.id : channelId, + collaboratorIds: video.author?.collaborators ?? [], viewCount: video.views.text == null ? null : extractNumberFromString(video.views.text), published, lengthSeconds: isLive ? '' : Utils.timeToSeconds(video.duration.text), From 6eeef7f74955834f404a104468bca982bd59aa2a Mon Sep 17 00:00:00 2001 From: David Date: Tue, 14 Jul 2026 20:28:10 +0200 Subject: [PATCH 4/6] Fix hide channel for next recommended video --- src/renderer/views/Watch/Watch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/views/Watch/Watch.js b/src/renderer/views/Watch/Watch.js index 34a3742201244..6d7f39cec9bb9 100644 --- a/src/renderer/views/Watch/Watch.js +++ b/src/renderer/views/Watch/Watch.js @@ -1896,7 +1896,7 @@ export default defineComponent({ }, isHiddenVideo: function (forbiddenTitles, channelsHidden, video) { - return channelsHidden.some(ch => ch.name === video.authorId) || + return channelsHidden.some(ch => ch.name === video.authorId && (video.author.collaboratorIds.length > 0 && ch.name === video.author.collaboratorIds[0])) || channelsHidden.some(ch => ch.name === video.author) || forbiddenTitles.some((text) => video.title?.toLowerCase().includes(text)) || forbiddenTitles.some((text) => video.author?.toLowerCase().includes(text)) From 6afccf51ca4baf6c7e7093af1731e2621da23d49 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 15 Jul 2026 13:50:18 +0200 Subject: [PATCH 5/6] Fix exceptions when using Invidious API --- src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue | 2 +- src/renderer/components/FtListVideoLazy.vue | 2 +- src/renderer/views/Watch/Watch.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue b/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue index 00a76ce47bd5f..4ee9f79d358f7 100644 --- a/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue +++ b/src/renderer/components/FtListLazyWrapper/FtListLazyWrapper.vue @@ -239,7 +239,7 @@ const showResult = computed(() => { } const lowerCaseAuthor = props.data.author?.toLowerCase() - if (channelsHidden.value.some(ch => ch.name === props.data.authorId || (props.data.collaboratorIds.length > 0 && ch.name === props.data.collaboratorIds[0])) || + if (channelsHidden.value.some(ch => ch.name === props.data.authorId || (props.data.collaboratorIds?.length > 0 && ch.name === props.data.collaboratorIds[0])) || channelsHidden.value.some(ch => ch.name === props.data.author) || forbiddenTitles.value.some((text) => lowerCaseAuthor.includes(text))) { // hide videos by author diff --git a/src/renderer/components/FtListVideoLazy.vue b/src/renderer/components/FtListVideoLazy.vue index 975d1cb056249..07fd373db7955 100644 --- a/src/renderer/components/FtListVideoLazy.vue +++ b/src/renderer/components/FtListVideoLazy.vue @@ -141,7 +141,7 @@ const shouldBeVisible = computed(() => { const lowerCaseTitle = props.data.title?.toLowerCase() const lowerCaseAuthor = props.data.author?.toLowerCase() - return !(channelsHidden.value.some(ch => ch.name === props.data.authorId || (props.data.collaboratorIds.length > 0 && ch.name === props.data.collaboratorIds[0])) || + return !(channelsHidden.value.some(ch => ch.name === props.data.authorId || (props.data.collaboratorIds?.length > 0 && ch.name === props.data.collaboratorIds[0])) || channelsHidden.value.some(ch => ch.name === props.data.author) || (lowerCaseTitle && forbiddenTitles.value.some((text) => lowerCaseTitle.includes(text))) || (hideChannelsBasedOnText.value && lowerCaseAuthor && forbiddenTitles.value.some((text) => lowerCaseAuthor.includes(text)))) diff --git a/src/renderer/views/Watch/Watch.js b/src/renderer/views/Watch/Watch.js index 6d7f39cec9bb9..bbd5637327fbd 100644 --- a/src/renderer/views/Watch/Watch.js +++ b/src/renderer/views/Watch/Watch.js @@ -1896,7 +1896,7 @@ export default defineComponent({ }, isHiddenVideo: function (forbiddenTitles, channelsHidden, video) { - return channelsHidden.some(ch => ch.name === video.authorId && (video.author.collaboratorIds.length > 0 && ch.name === video.author.collaboratorIds[0])) || + return channelsHidden.some(ch => ch.name === video.authorId && (video.author.collaboratorIds?.length > 0 && ch.name === video.author.collaboratorIds[0])) || channelsHidden.some(ch => ch.name === video.author) || forbiddenTitles.some((text) => video.title?.toLowerCase().includes(text)) || forbiddenTitles.some((text) => video.author?.toLowerCase().includes(text)) From fc3971cfb582fb1de525fdc160995958b945eac8 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 15 Jul 2026 14:03:04 +0200 Subject: [PATCH 6/6] Code clean-up --- src/renderer/helpers/api/local.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/helpers/api/local.js b/src/renderer/helpers/api/local.js index b865a17263c55..0106e2113b0ee 100644 --- a/src/renderer/helpers/api/local.js +++ b/src/renderer/helpers/api/local.js @@ -1688,7 +1688,6 @@ function parseLockupView(lockupView, channelId = undefined, channelName = undefi let collaboratorIds = [] if (maybeCollaborators) { collaboratorIds = maybeCollaborators.map(item => item.renderer_context?.command_context?.on_tap?.payload?.browseId) - .filter(collabChannelId => collabChannelId) } return {