fix: disambiguate tmdb ids by media type across lookups (#2577)

This commit is contained in:
fallenbagel
2026-03-14 23:47:21 +05:00
committed by GitHub
parent d25d0ca570
commit 0be18968b4
22 changed files with 479 additions and 70 deletions

View File

@@ -18,7 +18,7 @@ import {
import type { ZodNumber, ZodOptional, ZodString } from 'zod';
@Entity()
@Unique(['tmdbId'])
@Unique(['tmdbId', 'mediaType'])
export class Blocklist implements BlocklistItem {
@PrimaryGeneratedColumn()
public id: number;
@@ -77,6 +77,7 @@ export class Blocklist implements BlocklistItem {
let media = await mediaRepository.findOne({
where: {
tmdbId: blocklistRequest.tmdbId,
mediaType: blocklistRequest.mediaType,
},
});

View File

@@ -30,22 +30,17 @@ import Season from './Season';
class Media {
public static async getRelatedMedia(
user: User | undefined,
tmdbIds: number | number[]
items: { tmdbId: number; mediaType: string }[]
): Promise<Media[]> {
const mediaRepository = getRepository(Media);
try {
let finalIds: number[];
if (!Array.isArray(tmdbIds)) {
finalIds = [tmdbIds];
} else {
finalIds = tmdbIds;
}
if (finalIds.length === 0) {
if (items.length === 0) {
return [];
}
const finalIds = [...new Set(items.map((i) => i.tmdbId))];
const media = await mediaRepository
.createQueryBuilder('media')
.leftJoinAndSelect(
@@ -57,7 +52,9 @@ class Media {
.where(' media.tmdbId in (:...finalIds)', { finalIds })
.getMany();
return media;
return media.filter((m) =>
items.some((i) => i.tmdbId === m.tmdbId && i.mediaType === m.mediaType)
);
} catch (e) {
logger.error(e.message);
return [];

View File

@@ -25,7 +25,7 @@ export class NotFoundError extends Error {
}
@Entity()
@Unique('UNIQUE_USER_DB', ['tmdbId', 'requestedBy'])
@Unique('UNIQUE_USER_DB', ['tmdbId', 'mediaType', 'requestedBy'])
export class Watchlist implements WatchlistItem {
@PrimaryGeneratedColumn()
id: number;
@@ -142,11 +142,13 @@ export class Watchlist implements WatchlistItem {
public static async deleteWatchlist(
tmdbId: Watchlist['tmdbId'],
mediaType: MediaType,
user: User
): Promise<Watchlist | null> {
const watchlistRepository = getRepository(this);
const watchlist = await watchlistRepository.findOneBy({
tmdbId,
mediaType,
requestedBy: { id: user.id },
});
if (!watchlist) {