@@ -25,6 +25,7 @@ import {
2525} from '@server/constants/media' ;
2626import { MediaServerType } from '@server/constants/server' ;
2727import type { MediaWatchDataResponse } from '@server/interfaces/api/mediaInterfaces' ;
28+ import { DownloadingItem } from '@server/lib/downloadtracker' ;
2829import type { RadarrSettings , SonarrSettings } from '@server/lib/settings' ;
2930import type { MovieDetails } from '@server/models/Movie' ;
3031import 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+
72116interface 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