Skip to content

Commit 9da8bb6

Browse files
authored
fix: preserve blocklist on media deletion & optimise watchlist-sync (#2478)
1 parent 0e636a3 commit 9da8bb6

3 files changed

Lines changed: 41 additions & 3 deletions

File tree

server/entity/Media.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,19 @@ class Media {
206206
Object.assign(this, init);
207207
}
208208

209+
public resetServiceData(): void {
210+
this.serviceId = null;
211+
this.serviceId4k = null;
212+
this.externalServiceId = null;
213+
this.externalServiceId4k = null;
214+
this.externalServiceSlug = null;
215+
this.externalServiceSlug4k = null;
216+
this.ratingKey = null;
217+
this.ratingKey4k = null;
218+
this.jellyfinMediaId = null;
219+
this.jellyfinMediaId4k = null;
220+
}
221+
209222
@AfterLoad()
210223
public setPlexUrls(): void {
211224
const { machineId, webAppUrl } = getSettings().plex;

server/lib/watchlistsync.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,33 @@ class WatchlistSync {
7070
response.items.map((i) => i.tmdbId)
7171
);
7272

73+
const watchlistTmdbIds = response.items.map((i) => i.tmdbId);
74+
75+
const requestRepository = getRepository(MediaRequest);
76+
const existingAutoRequests = await requestRepository
77+
.createQueryBuilder('request')
78+
.leftJoinAndSelect('request.media', 'media')
79+
.where('request.requestedBy = :userId', { userId: user.id })
80+
.andWhere('request.isAutoRequest = true')
81+
.andWhere('media.tmdbId IN (:...tmdbIds)', { tmdbIds: watchlistTmdbIds })
82+
.getMany();
83+
84+
const autoRequestedTmdbIds = new Set(
85+
existingAutoRequests
86+
.filter((r) => r.media != null)
87+
.map((r) => `${r.media.mediaType}:${r.media.tmdbId}`)
88+
);
89+
7390
const unavailableItems = response.items.filter(
74-
// If we can find watchlist items in our database that are also available, we should exclude them
7591
(i) =>
92+
!autoRequestedTmdbIds.has(
93+
`${i.type === 'show' ? MediaType.TV : MediaType.MOVIE}:${i.tmdbId}`
94+
) &&
7695
!mediaItems.find(
7796
(m) =>
7897
m.tmdbId === i.tmdbId &&
79-
((m.status !== MediaStatus.UNKNOWN && m.mediaType === 'movie') ||
98+
(m.status === MediaStatus.BLOCKLISTED ||
99+
(m.status !== MediaStatus.UNKNOWN && m.mediaType === 'movie') ||
80100
(m.mediaType === 'tv' && m.status === MediaStatus.AVAILABLE))
81101
)
82102
);

server/routes/media.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,12 @@ mediaRoutes.delete(
174174
where: { id: Number(req.params.id) },
175175
});
176176

177-
await mediaRepository.remove(media);
177+
if (media.status === MediaStatus.BLOCKLISTED) {
178+
media.resetServiceData();
179+
await mediaRepository.save(media);
180+
} else {
181+
await mediaRepository.remove(media);
182+
}
178183

179184
return res.status(204).send();
180185
} catch (e) {

0 commit comments

Comments
 (0)