From 1b812ebed5a6961680c62791199624ed68d88b6e Mon Sep 17 00:00:00 2001 From: Sim <32626992+simn03@users.noreply.github.com> Date: Mon, 2 Jun 2025 04:21:50 -0700 Subject: [PATCH] fix: Recently Added isn't updating correctly. (#686) --- app/(auth)/(tabs)/(libraries)/[libraryId].tsx | 10 +++- components/posters/SeriesPoster.tsx | 1 + components/settings/HomeIndex.tsx | 58 +++++++++++++------ utils/atoms/filters.ts | 2 + 4 files changed, 53 insertions(+), 18 deletions(-) diff --git a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx index 63dcf453..929c098a 100644 --- a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx +++ b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx @@ -367,7 +367,15 @@ const Page = () => { className='mr-1' id={libraryId} queryKey='sortBy' - queryFn={async () => sortOptions.map((s) => s.key)} + queryFn={async () => + sortOptions + .filter( + (s) => + library?.CollectionType !== "movies" || + s.key !== SortByOption.DateLastContentAdded, + ) + .map((s) => s.key) + } set={setSortBy} values={sortBy} title={t("library.filters.sort_by")} diff --git a/components/posters/SeriesPoster.tsx b/components/posters/SeriesPoster.tsx index 2deba076..fd9466cd 100644 --- a/components/posters/SeriesPoster.tsx +++ b/components/posters/SeriesPoster.tsx @@ -53,6 +53,7 @@ const SeriesPoster: React.FC = ({ item }) => { width: "100%", }} /> + {} ); }; diff --git a/components/settings/HomeIndex.tsx b/components/settings/HomeIndex.tsx index eb4f85b3..2949eaa3 100644 --- a/components/settings/HomeIndex.tsx +++ b/components/settings/HomeIndex.tsx @@ -206,19 +206,43 @@ export const HomeIndex = () => { queryKey, queryFn: async () => { if (!api) return []; - return ( - ( - await getUserLibraryApi(api).getLatestMedia({ - userId: user?.Id, - limit: 20, - fields: ["PrimaryImageAspectRatio", "Path"], - imageTypeLimit: 1, - enableImageTypes: ["Primary", "Backdrop", "Thumb"], - includeItemTypes, - parentId, - }) - ).data || [] - ); + + const response = await getItemsApi(api).getItems({ + userId: user?.Id, + limit: 40, + recursive: true, + includeItemTypes, + sortBy: ["DateCreated"], + sortOrder: ["Descending"], + fields: ["PrimaryImageAspectRatio", "Path"], + parentId, + enableImageTypes: ["Primary", "Backdrop", "Thumb"], + }); + + let items = response.data.Items || []; + + if (includeItemTypes.includes("Episode")) { + // Removes individual episodes from the list if they are part of a series + // and only keeps the series item + // Note: The 'Latest' API endpoint does not work well with combining batch episode imports + // and will either only show the series or the episodes, not both. + // This is a workaround to filter out the episodes from the list + const seriesIds = new Set( + items.filter((i) => i.Type === "Series").map((i) => i.Id), + ); + + items = items.filter( + (i) => + i.Type === "Series" || + (i.Type === "Episode" && !seriesIds.has(i.SeriesId!)), + ); + } + + if (items.length > 20) { + items = items.slice(0, 20); + } + + return items; }, type: "ScrollingCollectionList", }), @@ -232,7 +256,7 @@ export const HomeIndex = () => { const latestMediaViews = collections.map((c) => { const includeItemTypes: BaseItemKind[] = - c.CollectionType === "tvshows" ? ["Series"] : ["Movie"]; + c.CollectionType === "tvshows" ? ["Episode", "Series"] : ["Movie"]; const title = t("home.recently_added_in", { libraryName: c.Name }); const queryKey = [ "home", @@ -358,10 +382,10 @@ export const HomeIndex = () => { const response = await getTvShowsApi(api).getNextUp({ userId: user?.Id, fields: ["MediaSourceCount"], - limit: section.items?.limit || 25, + limit: section.nextUp?.limit || 25, enableImageTypes: ["Primary", "Backdrop", "Thumb"], - enableResumable: section.items?.enableResumable, - enableRewatching: section.items?.enableRewatching, + enableResumable: section.nextUp?.enableResumable, + enableRewatching: section.nextUp?.enableRewatching, }); return response.data.Items || []; } diff --git a/utils/atoms/filters.ts b/utils/atoms/filters.ts index df9c5c78..4ce23122 100644 --- a/utils/atoms/filters.ts +++ b/utils/atoms/filters.ts @@ -8,6 +8,7 @@ export enum SortByOption { CommunityRating = "CommunityRating", CriticRating = "CriticRating", DateCreated = "DateCreated", + DateLastContentAdded = "DateLastContentAdded", DatePlayed = "DatePlayed", PlayCount = "PlayCount", ProductionYear = "ProductionYear", @@ -37,6 +38,7 @@ export const sortOptions: { { key: SortByOption.CommunityRating, value: "Community Rating" }, { key: SortByOption.CriticRating, value: "Critics Rating" }, { key: SortByOption.DateCreated, value: "Date Added" }, + { key: SortByOption.DateLastContentAdded, value: "Date Episode Added" }, { key: SortByOption.DatePlayed, value: "Date Played" }, { key: SortByOption.PlayCount, value: "Play Count" }, { key: SortByOption.ProductionYear, value: "Production Year" },