mirror of
https://github.com/fallenbagel/jellyseerr.git
synced 2026-01-03 13:18:53 -05:00
refactor(jellyfin-scanner): extend BaseScanner for jellyfin scanner (#2226)
* refactor(jellyfin-scanner): extend BaseScanner for jellyfin scanner Refactors JellyfinScanner to extend BaseScanner class to align the jellyfin scanner architecture with the plex scanner and reduce code duplication. * fix(jellyfin-scanner): add imdbId handling back to fix a regression from original behaviour * fix: add imdbId assignment for existing media entries * fix: include imdbId in processed 4k media items and improve 4k detection * fix(jellyfin-scanner): filter seasons based on settings for special episodes (regression)
This commit is contained in:
@@ -34,6 +34,8 @@ interface ProcessOptions {
|
|||||||
is4k?: boolean;
|
is4k?: boolean;
|
||||||
mediaAddedAt?: Date;
|
mediaAddedAt?: Date;
|
||||||
ratingKey?: string;
|
ratingKey?: string;
|
||||||
|
jellyfinMediaId?: string;
|
||||||
|
imdbId?: string;
|
||||||
serviceId?: number;
|
serviceId?: number;
|
||||||
externalServiceId?: number;
|
externalServiceId?: number;
|
||||||
externalServiceSlug?: string;
|
externalServiceSlug?: string;
|
||||||
@@ -95,6 +97,8 @@ class BaseScanner<T> {
|
|||||||
is4k = false,
|
is4k = false,
|
||||||
mediaAddedAt,
|
mediaAddedAt,
|
||||||
ratingKey,
|
ratingKey,
|
||||||
|
jellyfinMediaId,
|
||||||
|
imdbId,
|
||||||
serviceId,
|
serviceId,
|
||||||
externalServiceId,
|
externalServiceId,
|
||||||
externalServiceSlug,
|
externalServiceSlug,
|
||||||
@@ -133,6 +137,21 @@ class BaseScanner<T> {
|
|||||||
changedExisting = true;
|
changedExisting = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
jellyfinMediaId &&
|
||||||
|
existing[is4k ? 'jellyfinMediaId4k' : 'jellyfinMediaId'] !==
|
||||||
|
jellyfinMediaId
|
||||||
|
) {
|
||||||
|
existing[is4k ? 'jellyfinMediaId4k' : 'jellyfinMediaId'] =
|
||||||
|
jellyfinMediaId;
|
||||||
|
changedExisting = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imdbId && !existing.imdbId) {
|
||||||
|
existing.imdbId = imdbId;
|
||||||
|
changedExisting = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
serviceId !== undefined &&
|
serviceId !== undefined &&
|
||||||
existing[is4k ? 'serviceId4k' : 'serviceId'] !== serviceId
|
existing[is4k ? 'serviceId4k' : 'serviceId'] !== serviceId
|
||||||
@@ -173,6 +192,7 @@ class BaseScanner<T> {
|
|||||||
} else {
|
} else {
|
||||||
const newMedia = new Media();
|
const newMedia = new Media();
|
||||||
newMedia.tmdbId = tmdbId;
|
newMedia.tmdbId = tmdbId;
|
||||||
|
newMedia.imdbId = imdbId;
|
||||||
|
|
||||||
newMedia.status =
|
newMedia.status =
|
||||||
!is4k && !processing
|
!is4k && !processing
|
||||||
@@ -203,6 +223,13 @@ class BaseScanner<T> {
|
|||||||
newMedia.ratingKey4k =
|
newMedia.ratingKey4k =
|
||||||
is4k && this.enable4kMovie ? ratingKey : undefined;
|
is4k && this.enable4kMovie ? ratingKey : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jellyfinMediaId) {
|
||||||
|
newMedia.jellyfinMediaId = !is4k ? jellyfinMediaId : undefined;
|
||||||
|
newMedia.jellyfinMediaId4k =
|
||||||
|
is4k && this.enable4kMovie ? jellyfinMediaId : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
await mediaRepository.save(newMedia);
|
await mediaRepository.save(newMedia);
|
||||||
this.log(`Saved new media: ${title}`);
|
this.log(`Saved new media: ${title}`);
|
||||||
}
|
}
|
||||||
@@ -221,11 +248,12 @@ class BaseScanner<T> {
|
|||||||
*/
|
*/
|
||||||
protected async processShow(
|
protected async processShow(
|
||||||
tmdbId: number,
|
tmdbId: number,
|
||||||
tvdbId: number,
|
tvdbId: number | undefined,
|
||||||
seasons: ProcessableSeason[],
|
seasons: ProcessableSeason[],
|
||||||
{
|
{
|
||||||
mediaAddedAt,
|
mediaAddedAt,
|
||||||
ratingKey,
|
ratingKey,
|
||||||
|
jellyfinMediaId,
|
||||||
serviceId,
|
serviceId,
|
||||||
externalServiceId,
|
externalServiceId,
|
||||||
externalServiceSlug,
|
externalServiceSlug,
|
||||||
@@ -257,7 +285,7 @@ class BaseScanner<T> {
|
|||||||
(es) => es.seasonNumber === season.seasonNumber
|
(es) => es.seasonNumber === season.seasonNumber
|
||||||
);
|
);
|
||||||
|
|
||||||
// We update the rating keys in the seasons loop because we need episode counts
|
// We update the rating keys and jellyfinMediaId in the seasons loop because we need episode counts
|
||||||
if (media && season.episodes > 0 && media.ratingKey !== ratingKey) {
|
if (media && season.episodes > 0 && media.ratingKey !== ratingKey) {
|
||||||
media.ratingKey = ratingKey;
|
media.ratingKey = ratingKey;
|
||||||
}
|
}
|
||||||
@@ -271,6 +299,23 @@ class BaseScanner<T> {
|
|||||||
media.ratingKey4k = ratingKey;
|
media.ratingKey4k = ratingKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
media &&
|
||||||
|
season.episodes > 0 &&
|
||||||
|
media.jellyfinMediaId !== jellyfinMediaId
|
||||||
|
) {
|
||||||
|
media.jellyfinMediaId = jellyfinMediaId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
media &&
|
||||||
|
season.episodes4k > 0 &&
|
||||||
|
this.enable4kShow &&
|
||||||
|
media.jellyfinMediaId4k !== jellyfinMediaId
|
||||||
|
) {
|
||||||
|
media.jellyfinMediaId4k = jellyfinMediaId;
|
||||||
|
}
|
||||||
|
|
||||||
if (existingSeason) {
|
if (existingSeason) {
|
||||||
// Here we update seasons if they already exist.
|
// Here we update seasons if they already exist.
|
||||||
// If the season is already marked as available, we
|
// If the season is already marked as available, we
|
||||||
@@ -491,6 +536,22 @@ class BaseScanner<T> {
|
|||||||
)
|
)
|
||||||
? ratingKey
|
? ratingKey
|
||||||
: undefined,
|
: undefined,
|
||||||
|
jellyfinMediaId: newSeasons.some(
|
||||||
|
(sn) =>
|
||||||
|
sn.status === MediaStatus.PARTIALLY_AVAILABLE ||
|
||||||
|
sn.status === MediaStatus.AVAILABLE
|
||||||
|
)
|
||||||
|
? jellyfinMediaId
|
||||||
|
: undefined,
|
||||||
|
jellyfinMediaId4k:
|
||||||
|
this.enable4kShow &&
|
||||||
|
newSeasons.some(
|
||||||
|
(sn) =>
|
||||||
|
sn.status4k === MediaStatus.PARTIALLY_AVAILABLE ||
|
||||||
|
sn.status4k === MediaStatus.AVAILABLE
|
||||||
|
)
|
||||||
|
? jellyfinMediaId
|
||||||
|
: undefined,
|
||||||
status: isAllStandardSeasons
|
status: isAllStandardSeasons
|
||||||
? MediaStatus.AVAILABLE
|
? MediaStatus.AVAILABLE
|
||||||
: newSeasons.some(
|
: newSeasons.some(
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user