From a96d2f0ef68d64d6343a01463ca11a715188e9b9 Mon Sep 17 00:00:00 2001 From: Hakadao Date: Sun, 8 Sep 2024 17:50:50 +0800 Subject: [PATCH] feat(filters): filter out vertical videos (#991) --- src/_locales/cmn-CN.yml | 1 + src/_locales/cmn-TW.yml | 1 + src/_locales/en.yml | 1 + src/_locales/jyut.yml | 1 + src/components/Settings/Home/Home.vue | 3 +++ src/composables/useFilter.ts | 17 +++++++++++++++-- .../views/Home/components/ForYou.vue | 4 ++-- src/logic/storage.ts | 2 ++ 8 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/_locales/cmn-CN.yml b/src/_locales/cmn-CN.yml index 908b3899..3c65712d 100644 --- a/src/_locales/cmn-CN.yml +++ b/src/_locales/cmn-CN.yml @@ -176,6 +176,7 @@ settings: disable_filters_for_followed_users: 关注的用户不受过滤条件限制 disable_filters_for_followed_users_desc: > 如果启用此选项,您关注的用户不受过滤条件限制。 + filter_out_vertical_videos: 过滤竖屏视频(仅在 app 推荐模式下有效) filter_by_view_count: 按播放数筛选 filter_by_view_count_desc: 筛选掉播放数小于您设置的视频。 filter_by_view_count_unit: 次 diff --git a/src/_locales/cmn-TW.yml b/src/_locales/cmn-TW.yml index 045aa989..fa7bca3b 100644 --- a/src/_locales/cmn-TW.yml +++ b/src/_locales/cmn-TW.yml @@ -177,6 +177,7 @@ settings: disable_filters_for_followed_users: 正在跟隨的使用者不受過濾條件限制 disable_filters_for_followed_users_desc: > 如果啟用此選項,正在跟隨的使用者不受過濾條件限制。 + filter_out_vertical_videos: 過濾直式影片(僅在 app 推薦模式下有效) filter_by_view_count: 按觀看次數篩選 filter_by_view_count_desc: 篩選掉觀看次數少於您設定的影片。 filter_by_view_count_unit: 次 diff --git a/src/_locales/en.yml b/src/_locales/en.yml index e87f9888..32d13b4f 100644 --- a/src/_locales/en.yml +++ b/src/_locales/en.yml @@ -177,6 +177,7 @@ settings: disable_filters_for_followed_users: Disable filters for followed users disable_filters_for_followed_users_desc: > If you enable this option, all filters you set will be disabled for the users you follow. + filter_out_vertical_videos: Filter out vertical videos (only works on the app recommendation mode) filter_by_view_count: Filter by view count filter_by_view_count_desc: Filtered out videos with less than the view count you set. filter_by_view_count_unit: views diff --git a/src/_locales/jyut.yml b/src/_locales/jyut.yml index 4f491dbc..e6aedd42 100644 --- a/src/_locales/jyut.yml +++ b/src/_locales/jyut.yml @@ -177,6 +177,7 @@ settings: disable_filters_for_followed_users: Follow 緊嘅人唔受啲過濾條件限制 disable_filters_for_followed_users_desc: > 開咗呢個功能嘅話,你 Follow 緊嘅人唔會俾啲過濾條件限制。 + filter_out_vertical_videos: 過濾打戙嘅片(淨係得 app 推介模式下有效) filter_by_view_count: 根據觀看次數篩選 filter_by_view_count_desc: 避開啲觀看次數唔夠你設嗰個數嘅片。 filter_by_view_count_unit: 次 diff --git a/src/components/Settings/Home/Home.vue b/src/components/Settings/Home/Home.vue index 6728530b..8abcdc43 100644 --- a/src/components/Settings/Home/Home.vue +++ b/src/components/Settings/Home/Home.vue @@ -211,6 +211,9 @@ function handleToggleHomeTab(tab: any) { + + +
path.reduce((acc, part) => acc && acc[part], obj) export enum FilterType { + filterOutVerticalVideos, viewCount, viewCountStr, duration, @@ -19,6 +21,11 @@ type FuncMap = { [key in FilterType]: { type KeyPath = Array[] export function useFilter(isFollowedKeyPath: string[], filterOpt: FilterType[], keyList: KeyPath) { + function filterOutVerticalVideos(item: any, keyPath: string[], _filterValue: number) { + const value = get(item, keyPath) + return !isVerticalVideo(value) + } + /** * Compares a number value in an object with a filter value. * Return `true` if the number value is greater than the filter value, `false` otherwise. @@ -107,6 +114,11 @@ export function useFilter(isFollowedKeyPath: string[], filterOpt: FilterType[], // #endregion const funcMap: FuncMap = { + [FilterType.filterOutVerticalVideos]: { + func: filterOutVerticalVideos, + enabledKey: 'filterOutVerticalVideos', + valueKey: '', + }, [FilterType.viewCount]: { func: compareNumber, enabledKey: 'enableFilterByViewCount', @@ -137,6 +149,7 @@ export function useFilter(isFollowedKeyPath: string[], filterOpt: FilterType[], const filter = ref(null) watch(() => [ + settings.value.filterOutVerticalVideos, settings.value.enableFilterByDuration, settings.value.enableFilterByViewCount, settings.value.enableFilterByTitle, @@ -145,8 +158,8 @@ export function useFilter(isFollowedKeyPath: string[], filterOpt: FilterType[], settings.value.filterByViewCount, settings.value.filterByTitle, settings.value.filterByUser, - ], ([durationFilter, viewCountFilter, titleFilter, userFilter]) => { - if (!durationFilter && !viewCountFilter && !titleFilter && !userFilter) { + ], ([filterOutVerticalVideos, durationFilter, viewCountFilter, titleFilter, userFilter]) => { + if (!filterOutVerticalVideos && !durationFilter && !viewCountFilter && !titleFilter && !userFilter) { filter.value = null return } diff --git a/src/contentScripts/views/Home/components/ForYou.vue b/src/contentScripts/views/Home/components/ForYou.vue index ae07759b..62a90c82 100644 --- a/src/contentScripts/views/Home/components/ForYou.vue +++ b/src/contentScripts/views/Home/components/ForYou.vue @@ -33,8 +33,8 @@ const filterFunc = useFilter( ) const appFilterFunc = useFilter( ['bottom_rcmd_reason'], - [FilterType.duration, FilterType.viewCountStr, FilterType.title, FilterType.user, FilterType.user], - [['player_args', 'duration'], ['cover_left_text_1'], ['title'], ['mask', 'avatar', 'text'], ['mask', 'avatar', 'up_id']], + [FilterType.filterOutVerticalVideos, FilterType.duration, FilterType.viewCountStr, FilterType.title, FilterType.user, FilterType.user], + [['uri'], ['player_args', 'duration'], ['cover_left_text_1'], ['title'], ['mask', 'avatar', 'text'], ['mask', 'avatar', 'up_id']], ) const { t } = useI18n() diff --git a/src/logic/storage.ts b/src/logic/storage.ts index e9151a24..a4cae5fa 100644 --- a/src/logic/storage.ts +++ b/src/logic/storage.ts @@ -61,6 +61,7 @@ export interface Settings { // filter setting disableFilterForFollowedUser: boolean + filterOutVerticalVideos: boolean enableFilterByViewCount: boolean filterByViewCount: number enableFilterByDuration: boolean @@ -133,6 +134,7 @@ export const settings = useStorageLocal('settings', ref({ // filter setting disableFilterForFollowedUser: false, + filterOutVerticalVideos: false, enableFilterByViewCount: false, filterByViewCount: 10000, enableFilterByDuration: false,