From 8025d387667edd44eb81789a5e9011a9ab695932 Mon Sep 17 00:00:00 2001 From: developerwill Date: Tue, 11 Nov 2025 20:46:05 -0100 Subject: [PATCH 1/5] feat: add filter by original language support for search #1687 --- server/lib/settings/index.ts | 22 ++++++- src/components/Search/index.tsx | 11 +++- .../Settings/SettingsMain/index.tsx | 57 +++++++++++++++++++ src/hooks/useFilterByLanguages.ts | 57 +++++++++++++++++++ src/types/filters.ts | 21 +++++++ 5 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 src/hooks/useFilterByLanguages.ts create mode 100644 src/types/filters.ts diff --git a/server/lib/settings/index.ts b/server/lib/settings/index.ts index e37eccc948..cb647a4e92 100644 --- a/server/lib/settings/index.ts +++ b/server/lib/settings/index.ts @@ -121,6 +121,15 @@ export interface ProxySettings { bypassLocalAddresses: boolean; } +interface FilterSettings { + filterSearch: boolean; + filterTrending: boolean; + filterSimilarSeries: boolean; + filterTvRecommendations: boolean; + filterSimilarMovies: boolean; + filterMovieRecommendations: boolean; +} + export interface MainSettings { apiKey: string; applicationTitle: string; @@ -146,6 +155,7 @@ export interface MainSettings { enableSpecialEpisodes: boolean; locale: string; youtubeUrl: string; + filters: FilterSettings; } export interface ProxySettings { @@ -177,7 +187,7 @@ interface PublicSettings { initialized: boolean; } -interface FullPublicSettings extends PublicSettings { +export interface FullPublicSettings extends PublicSettings { applicationTitle: string; applicationUrl: string; hideAvailable: boolean; @@ -203,6 +213,7 @@ interface FullPublicSettings extends PublicSettings { userEmailRequired: boolean; newPlexLogin: boolean; youtubeUrl: string; + filters: FilterSettings; } export interface NotificationAgentConfig { @@ -403,6 +414,14 @@ class Settings { enableSpecialEpisodes: false, locale: 'en', youtubeUrl: '', + filters: { + filterSearch: false, + filterTrending: false, + filterSimilarSeries: false, + filterTvRecommendations: false, + filterSimilarMovies: false, + filterMovieRecommendations: false, + }, }, plex: { name: '', @@ -697,6 +716,7 @@ class Settings { this.data.notifications.agents.email.options.userEmailRequired, newPlexLogin: this.data.main.newPlexLogin, youtubeUrl: this.data.main.youtubeUrl, + filters: this.data.main.filters, }; } diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index a0fae3864b..6842bdc930 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { MovieResult, @@ -37,6 +39,13 @@ const Search = () => { { hideAvailable: false, hideBlacklisted: false } ); + const filteredTitles = useFilterByLanguages({ + titles, + movie: true, + tv: true, + key: FilterByLanguage.SEARCH, + }); + if (error) { return ; } @@ -48,7 +57,7 @@ const Search = () => {
{intl.formatMessage(messages.searchresults)}
0) diff --git a/src/components/Settings/SettingsMain/index.tsx b/src/components/Settings/SettingsMain/index.tsx index 7de8f83785..a59010f4ee 100644 --- a/src/components/Settings/SettingsMain/index.tsx +++ b/src/components/Settings/SettingsMain/index.tsx @@ -6,11 +6,13 @@ import SensitiveInput from '@app/components/Common/SensitiveInput'; import LanguageSelector from '@app/components/LanguageSelector'; import RegionSelector from '@app/components/RegionSelector'; import CopyButton from '@app/components/Settings/CopyButton'; +import LibraryItem from '@app/components/Settings/LibraryItem'; import SettingsBadge from '@app/components/Settings/SettingsBadge'; import { availableLanguages } from '@app/context/LanguageContext'; import useLocale from '@app/hooks/useLocale'; import { Permission, useUser } from '@app/hooks/useUser'; import globalMessages from '@app/i18n/globalMessages'; +import type { FilterItem } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import { isValidURL } from '@app/utils/urlValidationHelper'; import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline'; @@ -70,8 +72,23 @@ const messages = defineMessages('components.Settings.SettingsMain', { 'Base URL for YouTube videos if a self-hosted YouTube instance is used.', validationUrl: 'You must provide a valid URL', validationUrlTrailingSlash: 'URL must not end in a trailing slash', + filterSearch: 'Search', + filterTrending: 'Trending', + filterSimilarSeries: 'Similar Series', + filterTvRecommendations: 'Tv Recommendations', + filterSimilarMovies: 'Similar Movies', + filterMovieRecommendations: 'Movie Recommendations', }); +const filters: FilterItem[] = [ + { key: 'filterSearch', name: 'Search' }, + { key: 'filterTrending', name: 'Trending' }, + { key: 'filterSimilarSeries', name: 'Similar Series' }, + { key: 'filterSimilarMovies', name: 'Similar Movies' }, + { key: 'filterTvRecommendations', name: 'TV Recommendations' }, + { key: 'filterMovieRecommendations', name: 'Movie Recommendations' }, +]; + const SettingsMain = () => { const { addToast } = useToasts(); const { user: currentUser, hasPermission: userHasPermission } = useUser(); @@ -175,6 +192,13 @@ const SettingsMain = () => { enableSpecialEpisodes: data?.enableSpecialEpisodes, cacheImages: data?.cacheImages, youtubeUrl: data?.youtubeUrl, + filterSearch: data?.filters?.filterSearch, + filterTrending: data?.filters?.filterTrending, + filterSimilarSeries: data?.filters?.filterSimilarSeries, + filterTvRecommendations: data?.filters?.filterTvRecommendations, + filterSimilarMovies: data?.filters?.filterSimilarMovies, + filterMovieRecommendations: + data?.filters?.filterMovieRecommendations, }} enableReinitialize validationSchema={MainSettingsSchema} @@ -195,6 +219,14 @@ const SettingsMain = () => { enableSpecialEpisodes: values.enableSpecialEpisodes, cacheImages: values.cacheImages, youtubeUrl: values.youtubeUrl, + filters: { + filterSearch: values.filterSearch, + filterTrending: values.filterTrending, + filterSimilarSeries: values.filterSimilarSeries, + filterTvRecommendations: values.filterTvRecommendations, + filterSimilarMovies: values.filterSimilarMovies, + filterMovieRecommendations: values.filterMovieRecommendations, + }, }); mutate('/api/v1/settings/public'); mutate('/api/v1/status'); @@ -383,6 +415,31 @@ const SettingsMain = () => { +
+ + Filter by Original Language + + Filter content by their original language. This will take + the values from the Discover Language setting. + + + +
    + {filters.map(({ key, name }) => ( + setFieldValue(key, !values[key])} + /> + ))} +
+
+
0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } isReachingEnd={isReachingEnd} onScrollBottom={fetchMore} diff --git a/src/components/Discover/DiscoverTv/index.tsx b/src/components/Discover/DiscoverTv/index.tsx index 9d11eeffda..b429a63b07 100644 --- a/src/components/Discover/DiscoverTv/index.tsx +++ b/src/components/Discover/DiscoverTv/index.tsx @@ -9,8 +9,10 @@ import { } from '@app/components/Discover/constants'; import FilterSlideover from '@app/components/Discover/FilterSlideover'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import { useUpdateQueryParams } from '@app/hooks/useUpdateQueryParams'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import { BarsArrowDownIcon, FunnelIcon } from '@heroicons/react/24/solid'; import type { SortOptions as TMDBSortOptions } from '@server/api/themoviedb'; @@ -63,6 +65,13 @@ const DiscoverTv = () => { ...preparedFilters, }); + const filteredTitles = useFilterByLanguages({ + titles, + movie: false, + tv: true, + key: FilterByLanguage.TV_DISCOVER, + }); + if (error) { return ; } @@ -131,11 +140,12 @@ const DiscoverTv = () => { 0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } onScrollBottom={fetchMore} /> diff --git a/src/components/Discover/DiscoverTvKeyword/index.tsx b/src/components/Discover/DiscoverTvKeyword/index.tsx index a9719fd2d8..8ab0e9c29e 100644 --- a/src/components/Discover/DiscoverTvKeyword/index.tsx +++ b/src/components/Discover/DiscoverTvKeyword/index.tsx @@ -2,8 +2,10 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover, { encodeURIExtraParams } from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import globalMessages from '@app/i18n/globalMessages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { TmdbKeyword } from '@server/api/themoviedb/interfaces'; import type { TvResult } from '@server/models/Search'; @@ -34,6 +36,13 @@ const DiscoverTvKeyword = () => { } ); + const filteredTitles = useFilterByLanguages({ + titles, + movie: false, + tv: true, + key: FilterByLanguage.TV_DISCOVER, + }); + if (error) { return ; } @@ -53,10 +62,11 @@ const DiscoverTvKeyword = () => {
{title}
0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } isReachingEnd={isReachingEnd} onScrollBottom={fetchMore} diff --git a/src/components/Discover/DiscoverTvUpcoming.tsx b/src/components/Discover/DiscoverTvUpcoming.tsx index a6a3be170c..3cccfda143 100644 --- a/src/components/Discover/DiscoverTvUpcoming.tsx +++ b/src/components/Discover/DiscoverTvUpcoming.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { TvResult } from '@server/models/Search'; import { useIntl } from 'react-intl'; @@ -24,6 +26,13 @@ const DiscoverTvUpcoming = () => { error, } = useDiscover('/api/v1/discover/tv/upcoming'); + const filteredTitles = useFilterByLanguages({ + titles, + movie: false, + tv: true, + key: FilterByLanguage.TV_UPCOMING, + }); + if (error) { return ; } @@ -35,11 +44,12 @@ const DiscoverTvUpcoming = () => {
{intl.formatMessage(messages.upcomingtv)}
0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } onScrollBottom={fetchMore} /> diff --git a/src/components/Discover/Trending.tsx b/src/components/Discover/Trending.tsx index fc6e90902a..9dfba358cb 100644 --- a/src/components/Discover/Trending.tsx +++ b/src/components/Discover/Trending.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { MovieResult, @@ -29,6 +31,13 @@ const Trending = () => { '/api/v1/discover/trending' ); + const filteredTitles = useFilterByLanguages({ + titles, + movie: true, + tv: true, + key: FilterByLanguage.TRENDING, + }); + if (error) { return ; } @@ -40,10 +49,11 @@ const Trending = () => {
{intl.formatMessage(messages.trending)}
0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } isReachingEnd={isReachingEnd} onScrollBottom={fetchMore} diff --git a/src/components/Discover/Upcoming.tsx b/src/components/Discover/Upcoming.tsx index a358e995bd..b084d9b4c9 100644 --- a/src/components/Discover/Upcoming.tsx +++ b/src/components/Discover/Upcoming.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { MovieResult } from '@server/models/Search'; import { useIntl } from 'react-intl'; @@ -24,6 +26,13 @@ const UpcomingMovies = () => { error, } = useDiscover('/api/v1/discover/movies/upcoming'); + const filteredTitles = useFilterByLanguages({ + titles, + movie: true, + tv: false, + key: FilterByLanguage.UPCOMING_MOVIES, + }); + if (error) { return ; } @@ -35,10 +44,11 @@ const UpcomingMovies = () => {
{intl.formatMessage(messages.upcomingmovies)}
0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } isReachingEnd={isReachingEnd} onScrollBottom={fetchMore} diff --git a/src/components/MediaSlider/index.tsx b/src/components/MediaSlider/index.tsx index 634feeb4cb..6979b7590a 100644 --- a/src/components/MediaSlider/index.tsx +++ b/src/components/MediaSlider/index.tsx @@ -104,6 +104,36 @@ const MediaSlider = ({ return FilterByLanguage.TRENDING; } + if (sliderKey === 'popular-movies') { + isMovies = true; + isSeries = false; + return FilterByLanguage.POPULAR_MOVIES; + } + + if (sliderKey === 'upcoming') { + isMovies = true; + isSeries = false; + return FilterByLanguage.UPCOMING_MOVIES; + } + + if (sliderKey === 'popular-tv') { + isMovies = false; + isSeries = true; + return FilterByLanguage.TV_POPULAR; + } + + if (sliderKey === 'upcoming-tv') { + isMovies = false; + isSeries = true; + return FilterByLanguage.TV_UPCOMING; + } + + if (sliderKey === 'custom') { + isMovies = true; + isSeries = true; + return FilterByLanguage.CUSTOM_SLIDERS; + } + return undefined; }; diff --git a/src/components/MovieDetails/MovieRecommendations.tsx b/src/components/MovieDetails/MovieRecommendations.tsx index 4cbd607b99..162eae1554 100644 --- a/src/components/MovieDetails/MovieRecommendations.tsx +++ b/src/components/MovieDetails/MovieRecommendations.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { MovieDetails } from '@server/models/Movie'; import type { MovieResult } from '@server/models/Search'; @@ -33,6 +35,13 @@ const MovieRecommendations = () => { `/api/v1/movie/${router.query.movieId}/recommendations` ); + const filteredTitles = useFilterByLanguages({ + titles, + movie: true, + tv: false, + key: FilterByLanguage.MOVIE_RECOMMENDATIONS, + }); + if (error) { return ; } @@ -54,11 +63,12 @@ const MovieRecommendations = () => { 0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } onScrollBottom={fetchMore} /> diff --git a/src/components/MovieDetails/MovieSimilar.tsx b/src/components/MovieDetails/MovieSimilar.tsx index fbb2274ac8..1068399c26 100644 --- a/src/components/MovieDetails/MovieSimilar.tsx +++ b/src/components/MovieDetails/MovieSimilar.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { MovieDetails } from '@server/models/Movie'; import type { MovieResult } from '@server/models/Search'; @@ -31,6 +33,13 @@ const MovieSimilar = () => { error, } = useDiscover(`/api/v1/movie/${router.query.movieId}/similar`); + const filteredTitles = useFilterByLanguages({ + titles, + movie: true, + tv: false, + key: FilterByLanguage.SIMILAR_MOVIES, + }); + if (error) { return ; } @@ -52,10 +61,11 @@ const MovieSimilar = () => { 0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } isReachingEnd={isReachingEnd} onScrollBottom={fetchMore} diff --git a/src/components/Settings/SettingsMain/index.tsx b/src/components/Settings/SettingsMain/index.tsx index a59010f4ee..1e90e5a69c 100644 --- a/src/components/Settings/SettingsMain/index.tsx +++ b/src/components/Settings/SettingsMain/index.tsx @@ -72,12 +72,6 @@ const messages = defineMessages('components.Settings.SettingsMain', { 'Base URL for YouTube videos if a self-hosted YouTube instance is used.', validationUrl: 'You must provide a valid URL', validationUrlTrailingSlash: 'URL must not end in a trailing slash', - filterSearch: 'Search', - filterTrending: 'Trending', - filterSimilarSeries: 'Similar Series', - filterTvRecommendations: 'Tv Recommendations', - filterSimilarMovies: 'Similar Movies', - filterMovieRecommendations: 'Movie Recommendations', }); const filters: FilterItem[] = [ @@ -87,6 +81,13 @@ const filters: FilterItem[] = [ { key: 'filterSimilarMovies', name: 'Similar Movies' }, { key: 'filterTvRecommendations', name: 'TV Recommendations' }, { key: 'filterMovieRecommendations', name: 'Movie Recommendations' }, + { key: 'filterTvUpcoming', name: 'Upcoming Series' }, + { key: 'filterUpcomingMovies', name: 'Upcoming Movies' }, + { key: 'filterDiscoverMovies', name: 'Discover Movies' }, + { key: 'filterTvDiscover', name: 'Discover Series' }, + { key: 'filterPopularMovies', name: 'Popular Movies' }, + { key: 'filterTvPopular', name: 'Popular Series' }, + { key: 'filterCustomSliders', name: 'Custom Sliders' }, ]; const SettingsMain = () => { @@ -199,6 +200,13 @@ const SettingsMain = () => { filterSimilarMovies: data?.filters?.filterSimilarMovies, filterMovieRecommendations: data?.filters?.filterMovieRecommendations, + filterTvUpcoming: data?.filters?.filterTvUpcoming, + filterUpcomingMovies: data?.filters?.filterUpcomingMovies, + filterDiscoverMovies: data?.filters?.filterDiscoverMovies, + filterTvDiscover: data?.filters?.filterTvDiscover, + filterPopularMovies: data?.filters?.filterPopularMovies, + filterTvPopular: data?.filters?.filterTvPopular, + filterCustomSliders: data?.filters?.filterCustomSliders, }} enableReinitialize validationSchema={MainSettingsSchema} @@ -226,6 +234,13 @@ const SettingsMain = () => { filterTvRecommendations: values.filterTvRecommendations, filterSimilarMovies: values.filterSimilarMovies, filterMovieRecommendations: values.filterMovieRecommendations, + filterTvUpcoming: values.filterTvUpcoming, + filterUpcomingMovies: values.filterUpcomingMovies, + filterDiscoverMovies: values.filterDiscoverMovies, + filterTvDiscover: values.filterTvDiscover, + filterPopularMovies: values.filterPopularMovies, + filterTvPopular: values.filterTvPopular, + filterCustomSliders: values.filterCustomSliders, }, }); mutate('/api/v1/settings/public'); diff --git a/src/components/TvDetails/TvRecommendations.tsx b/src/components/TvDetails/TvRecommendations.tsx index 4ecde5cfb0..738c96233a 100644 --- a/src/components/TvDetails/TvRecommendations.tsx +++ b/src/components/TvDetails/TvRecommendations.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { TvResult } from '@server/models/Search'; import type { TvDetails } from '@server/models/Tv'; @@ -29,6 +31,13 @@ const TvRecommendations = () => { error, } = useDiscover(`/api/v1/tv/${router.query.tvId}/recommendations`); + const filteredTitles = useFilterByLanguages({ + titles, + movie: true, + tv: false, + key: FilterByLanguage.TV_RECOMMENDATIONS, + }); + if (error) { return ; } @@ -50,11 +59,12 @@ const TvRecommendations = () => { 0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } onScrollBottom={fetchMore} /> diff --git a/src/components/TvDetails/TvSimilar.tsx b/src/components/TvDetails/TvSimilar.tsx index c6afd9b3c9..db68687ca8 100644 --- a/src/components/TvDetails/TvSimilar.tsx +++ b/src/components/TvDetails/TvSimilar.tsx @@ -2,7 +2,9 @@ import Header from '@app/components/Common/Header'; import ListView from '@app/components/Common/ListView'; import PageTitle from '@app/components/Common/PageTitle'; import useDiscover from '@app/hooks/useDiscover'; +import useFilterByLanguages from '@app/hooks/useFilterByLanguages'; import Error from '@app/pages/_error'; +import { FilterByLanguage } from '@app/types/filters'; import defineMessages from '@app/utils/defineMessages'; import type { TvResult } from '@server/models/Search'; import type { TvDetails } from '@server/models/Tv'; @@ -29,6 +31,13 @@ const TvSimilar = () => { error, } = useDiscover(`/api/v1/tv/${router.query.tvId}/similar`); + const filteredTitles = useFilterByLanguages({ + titles, + movie: true, + tv: false, + key: FilterByLanguage.SIMILAR_SERIES, + }); + if (error) { return ; } @@ -48,11 +57,12 @@ const TvSimilar = () => { 0) + isLoadingInitialData || + (isLoadingMore && (filteredTitles?.length ?? 0) > 0) } onScrollBottom={fetchMore} /> diff --git a/src/types/filters.ts b/src/types/filters.ts index f29cb2b3cc..e1df05762c 100644 --- a/src/types/filters.ts +++ b/src/types/filters.ts @@ -5,6 +5,13 @@ export enum FilterByLanguage { TV_RECOMMENDATIONS = 'filterTvRecommendations', SIMILAR_MOVIES = 'filterSimilarMovies', MOVIE_RECOMMENDATIONS = 'filterMovieRecommendations', + TV_UPCOMING = 'filterTvUpcoming', + UPCOMING_MOVIES = 'filterUpcomingMovies', + DISCOVER_MOVIES = 'filterDiscoverMovies', + TV_DISCOVER = 'filterTvDiscover', + POPULAR_MOVIES = 'filterPopularMovies', + TV_POPULAR = 'filterTvPopular', + CUSTOM_SLIDERS = 'filterCustomSliders', } type FilterKey = @@ -13,7 +20,14 @@ type FilterKey = | 'filterSimilarSeries' | 'filterSimilarMovies' | 'filterTvRecommendations' - | 'filterMovieRecommendations'; + | 'filterMovieRecommendations' + | 'filterTvUpcoming' + | 'filterUpcomingMovies' + | 'filterDiscoverMovies' + | 'filterTvDiscover' + | 'filterPopularMovies' + | 'filterTvPopular' + | 'filterCustomSliders'; export interface FilterItem { key: FilterKey; From f3a8077042d6b310e6202d132d683b5206164485 Mon Sep 17 00:00:00 2001 From: developerwill Date: Wed, 19 Nov 2025 11:23:09 -0100 Subject: [PATCH 5/5] fix(mediaslider.tsx): switch isSeries and isMovies flags to accomudate homepage scenario Switch isSeries and isMovies flags to accomudate homepage scenario --- src/components/MediaSlider/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MediaSlider/index.tsx b/src/components/MediaSlider/index.tsx index 6979b7590a..96019535b0 100644 --- a/src/components/MediaSlider/index.tsx +++ b/src/components/MediaSlider/index.tsx @@ -47,8 +47,8 @@ const MediaSlider = ({ const settings = useSettings(); const { hasPermission } = useUser(); - let isSeries = url.includes('tv'); - let isMovies = url.includes('movie'); + let isSeries = !sliderKey ? url.includes('tv') : true; + let isMovies = !sliderKey ? url.includes('movie') : true; const { data, error, setSize, size } = useSWRInfinite( (pageIndex: number, previousPageData: MixedResult | null) => {