Skip to content

Commit 16aaf5d

Browse files
committed
fix(ui): remove duplicate download items in manage slide over
Prevents duplicate download items from being displayed by filtering based on title uniqueness. This improves UI clarity when the same content appears multiple times in the download status.
1 parent 328517c commit 16aaf5d

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

server/lib/downloadtracker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { uniqWith } from 'lodash';
77

88
interface EpisodeNumberResult {
99
seasonNumber: number;
10-
episodeNumber: number;
10+
episodeNumber: number | number[];
1111
absoluteEpisodeNumber: number;
1212
id: number;
1313
}

src/components/DownloadBlock/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const DownloadBlock = ({
3232
? intl.formatMessage(messages.formattedTitle, {
3333
title,
3434
seasonNumber: downloadItem?.episode?.seasonNumber,
35-
episodeNumber: downloadItem?.episode?.episodeNumber,
35+
episodeNumber: Array.isArray(downloadItem?.episode?.episodeNumber) ? downloadItem?.episode?.episodeNumber.join(', ') : downloadItem?.episode?.episodeNumber,
3636
})
3737
: title}
3838
</div>

src/components/ManageSlideOver/index.tsx

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
} from '@server/constants/media';
2626
import { MediaServerType } from '@server/constants/server';
2727
import type { MediaWatchDataResponse } from '@server/interfaces/api/mediaInterfaces';
28+
import { DownloadingItem } from '@server/lib/downloadtracker';
2829
import type { RadarrSettings, SonarrSettings } from '@server/lib/settings';
2930
import type { MovieDetails } from '@server/models/Movie';
3031
import type { TvDetails } from '@server/models/Tv';
@@ -69,6 +70,49 @@ const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
6970
return (movie as MovieDetails).title !== undefined;
7071
};
7172

73+
const groupDownloadBySeason = (items: DownloadingItem[] | undefined) => {
74+
if (!items || items.length === 0) return [];
75+
76+
const groupedItems: DownloadingItem[] = [];
77+
78+
items.forEach(item => {
79+
// Group by title and season number
80+
const existingIndex = groupedItems.findIndex(grouped =>
81+
grouped.title === item.title &&
82+
grouped.episode?.seasonNumber === item.episode?.seasonNumber
83+
);
84+
85+
if (existingIndex >= 0) {
86+
const existing = groupedItems[existingIndex];
87+
88+
// Merge episodes from same season
89+
if (existing.episode && item.episode) {
90+
const existingEpisodes = existing.episode.episodeNumber
91+
? existing.episode.episodeNumber as number[]
92+
: [];
93+
const newEpisode = item.episode.episodeNumber as number;
94+
95+
if (newEpisode && !existingEpisodes.includes(newEpisode)) {
96+
existingEpisodes.push(newEpisode);
97+
existing.episode.episodeNumber = existingEpisodes.sort((a, b) => a - b);
98+
}
99+
}
100+
} else {
101+
const newItem = {
102+
...item,
103+
episode: item.episode ? {
104+
...item.episode,
105+
episodeNumber: [item.episode.episodeNumber as number],
106+
seasonNumber: item.episode.seasonNumber
107+
} : undefined
108+
};
109+
groupedItems.push(newItem);
110+
}
111+
});
112+
113+
return groupedItems;
114+
};
115+
72116
interface ManageSlideOverProps {
73117
// mediaType: 'movie' | 'tv';
74118
show?: boolean;
@@ -205,7 +249,7 @@ const ManageSlideOver = ({
205249
</h3>
206250
<div className="overflow-hidden rounded-md border border-gray-700 shadow">
207251
<ul>
208-
{data.mediaInfo?.downloadStatus?.map((status, index) => (
252+
{groupDownloadBySeason(data.mediaInfo?.downloadStatus).map((status, index) => (
209253
<Tooltip
210254
key={`dl-status-${status.externalId}-${index}`}
211255
content={status.title}
@@ -215,7 +259,7 @@ const ManageSlideOver = ({
215259
</li>
216260
</Tooltip>
217261
))}
218-
{data.mediaInfo?.downloadStatus4k?.map((status, index) => (
262+
{groupDownloadBySeason(data.mediaInfo?.downloadStatus4k).map((status, index) => (
219263
<Tooltip
220264
key={`dl-status-${status.externalId}-${index}`}
221265
content={status.title}

0 commit comments

Comments
 (0)