fix(base-scanner): derive media availability from actual season state… (#2412)

This commit is contained in:
fallenbagel
2026-02-13 23:05:59 +05:00
committed by GitHub
parent 55c2d541e6
commit 15be3d7475

View File

@@ -385,26 +385,6 @@ class BaseScanner<T> {
} }
} }
// We want to skip specials when checking if a show is available
const isAllStandardSeasons =
seasons.length &&
seasons
.filter((season) => season.seasonNumber !== 0)
.every(
(season) =>
season.episodes === season.totalEpisodes && season.episodes > 0
);
const isAll4kSeasons =
seasons.length &&
seasons
.filter((season) => season.seasonNumber !== 0)
.every(
(season) =>
season.episodes4k === season.totalEpisodes &&
season.episodes4k > 0
);
if (media) { if (media) {
media.seasons = [...media.seasons, ...newSeasons]; media.seasons = [...media.seasons, ...newSeasons];
@@ -464,43 +444,38 @@ class BaseScanner<T> {
externalServiceSlug; externalServiceSlug;
} }
// If the show is already available, and there are no new seasons, dont adjust const nonSpecialSeasons = media.seasons.filter(
// the status. Skip specials when performing availability check (s) => s.seasonNumber !== 0
const shouldStayAvailable = );
media.status === MediaStatus.AVAILABLE &&
newSeasons.filter( // Check the actual season objects instead scanner input
(season) => // to determine overall availability status
season.status !== MediaStatus.UNKNOWN && const isAllStandardSeasonsAvailable =
season.status !== MediaStatus.DELETED && nonSpecialSeasons.length > 0 &&
season.seasonNumber !== 0 nonSpecialSeasons.every((s) => s.status === MediaStatus.AVAILABLE);
).length === 0;
const shouldStayAvailable4k = const isAll4kSeasonsAvailable =
media.status4k === MediaStatus.AVAILABLE && nonSpecialSeasons.length > 0 &&
newSeasons.filter( nonSpecialSeasons.every((s) => s.status4k === MediaStatus.AVAILABLE);
(season) =>
season.status4k !== MediaStatus.UNKNOWN && media.status = isAllStandardSeasonsAvailable
season.status4k !== MediaStatus.DELETED && ? MediaStatus.AVAILABLE
season.seasonNumber !== 0 : media.seasons.some(
).length === 0; (season) =>
media.status = season.status === MediaStatus.PARTIALLY_AVAILABLE ||
isAllStandardSeasons || shouldStayAvailable season.status === MediaStatus.AVAILABLE
? MediaStatus.AVAILABLE )
: media.seasons.some( ? MediaStatus.PARTIALLY_AVAILABLE
(season) => : (!seasons.length && media.status !== MediaStatus.DELETED) ||
season.status === MediaStatus.PARTIALLY_AVAILABLE || media.seasons.some(
season.status === MediaStatus.AVAILABLE (season) => season.status === MediaStatus.PROCESSING
) )
? MediaStatus.PARTIALLY_AVAILABLE ? MediaStatus.PROCESSING
: (!seasons.length && media.status !== MediaStatus.DELETED) || : media.status === MediaStatus.DELETED
media.seasons.some( ? MediaStatus.DELETED
(season) => season.status === MediaStatus.PROCESSING : MediaStatus.UNKNOWN;
)
? MediaStatus.PROCESSING
: media.status === MediaStatus.DELETED
? MediaStatus.DELETED
: MediaStatus.UNKNOWN;
media.status4k = media.status4k =
(isAll4kSeasons || shouldStayAvailable4k) && this.enable4kShow isAll4kSeasonsAvailable && this.enable4kShow
? MediaStatus.AVAILABLE ? MediaStatus.AVAILABLE
: this.enable4kShow && : this.enable4kShow &&
media.seasons.some( media.seasons.some(
@@ -520,6 +495,22 @@ class BaseScanner<T> {
await mediaRepository.save(media); await mediaRepository.save(media);
this.log(`Updating existing title: ${title}`); this.log(`Updating existing title: ${title}`);
} else { } else {
// For new media, check actual newSeasons objects instead of scanner
// input to determine overall availability status
const nonSpecialNewSeasons = newSeasons.filter(
(s) => s.seasonNumber !== 0
);
const isAllStandardSeasonsAvailable =
nonSpecialNewSeasons.length > 0 &&
nonSpecialNewSeasons.every((s) => s.status === MediaStatus.AVAILABLE);
const isAll4kSeasonsAvailable =
nonSpecialNewSeasons.length > 0 &&
nonSpecialNewSeasons.every(
(s) => s.status4k === MediaStatus.AVAILABLE
);
const newMedia = new Media({ const newMedia = new Media({
mediaType: MediaType.TV, mediaType: MediaType.TV,
seasons: newSeasons, seasons: newSeasons,
@@ -564,7 +555,7 @@ class BaseScanner<T> {
) )
? jellyfinMediaId ? jellyfinMediaId
: undefined, : undefined,
status: isAllStandardSeasons status: isAllStandardSeasonsAvailable
? MediaStatus.AVAILABLE ? MediaStatus.AVAILABLE
: newSeasons.some( : newSeasons.some(
(season) => (season) =>
@@ -578,7 +569,7 @@ class BaseScanner<T> {
? MediaStatus.PROCESSING ? MediaStatus.PROCESSING
: MediaStatus.UNKNOWN, : MediaStatus.UNKNOWN,
status4k: status4k:
isAll4kSeasons && this.enable4kShow isAll4kSeasonsAvailable && this.enable4kShow
? MediaStatus.AVAILABLE ? MediaStatus.AVAILABLE
: this.enable4kShow && : this.enable4kShow &&
newSeasons.some( newSeasons.some(