Skip to content

Commit 15be3d7

Browse files
authored
fix(base-scanner): derive media availability from actual season state… (#2412)
1 parent 55c2d54 commit 15be3d7

1 file changed

Lines changed: 48 additions & 57 deletions

File tree

server/lib/scanners/baseScanner.ts

Lines changed: 48 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -385,26 +385,6 @@ class BaseScanner<T> {
385385
}
386386
}
387387

388-
// We want to skip specials when checking if a show is available
389-
const isAllStandardSeasons =
390-
seasons.length &&
391-
seasons
392-
.filter((season) => season.seasonNumber !== 0)
393-
.every(
394-
(season) =>
395-
season.episodes === season.totalEpisodes && season.episodes > 0
396-
);
397-
398-
const isAll4kSeasons =
399-
seasons.length &&
400-
seasons
401-
.filter((season) => season.seasonNumber !== 0)
402-
.every(
403-
(season) =>
404-
season.episodes4k === season.totalEpisodes &&
405-
season.episodes4k > 0
406-
);
407-
408388
if (media) {
409389
media.seasons = [...media.seasons, ...newSeasons];
410390

@@ -464,43 +444,38 @@ class BaseScanner<T> {
464444
externalServiceSlug;
465445
}
466446

467-
// If the show is already available, and there are no new seasons, dont adjust
468-
// the status. Skip specials when performing availability check
469-
const shouldStayAvailable =
470-
media.status === MediaStatus.AVAILABLE &&
471-
newSeasons.filter(
472-
(season) =>
473-
season.status !== MediaStatus.UNKNOWN &&
474-
season.status !== MediaStatus.DELETED &&
475-
season.seasonNumber !== 0
476-
).length === 0;
477-
const shouldStayAvailable4k =
478-
media.status4k === MediaStatus.AVAILABLE &&
479-
newSeasons.filter(
480-
(season) =>
481-
season.status4k !== MediaStatus.UNKNOWN &&
482-
season.status4k !== MediaStatus.DELETED &&
483-
season.seasonNumber !== 0
484-
).length === 0;
485-
media.status =
486-
isAllStandardSeasons || shouldStayAvailable
487-
? MediaStatus.AVAILABLE
488-
: media.seasons.some(
489-
(season) =>
490-
season.status === MediaStatus.PARTIALLY_AVAILABLE ||
491-
season.status === MediaStatus.AVAILABLE
447+
const nonSpecialSeasons = media.seasons.filter(
448+
(s) => s.seasonNumber !== 0
449+
);
450+
451+
// Check the actual season objects instead scanner input
452+
// to determine overall availability status
453+
const isAllStandardSeasonsAvailable =
454+
nonSpecialSeasons.length > 0 &&
455+
nonSpecialSeasons.every((s) => s.status === MediaStatus.AVAILABLE);
456+
457+
const isAll4kSeasonsAvailable =
458+
nonSpecialSeasons.length > 0 &&
459+
nonSpecialSeasons.every((s) => s.status4k === MediaStatus.AVAILABLE);
460+
461+
media.status = isAllStandardSeasonsAvailable
462+
? MediaStatus.AVAILABLE
463+
: media.seasons.some(
464+
(season) =>
465+
season.status === MediaStatus.PARTIALLY_AVAILABLE ||
466+
season.status === MediaStatus.AVAILABLE
467+
)
468+
? MediaStatus.PARTIALLY_AVAILABLE
469+
: (!seasons.length && media.status !== MediaStatus.DELETED) ||
470+
media.seasons.some(
471+
(season) => season.status === MediaStatus.PROCESSING
492472
)
493-
? MediaStatus.PARTIALLY_AVAILABLE
494-
: (!seasons.length && media.status !== MediaStatus.DELETED) ||
495-
media.seasons.some(
496-
(season) => season.status === MediaStatus.PROCESSING
497-
)
498-
? MediaStatus.PROCESSING
499-
: media.status === MediaStatus.DELETED
500-
? MediaStatus.DELETED
501-
: MediaStatus.UNKNOWN;
473+
? MediaStatus.PROCESSING
474+
: media.status === MediaStatus.DELETED
475+
? MediaStatus.DELETED
476+
: MediaStatus.UNKNOWN;
502477
media.status4k =
503-
(isAll4kSeasons || shouldStayAvailable4k) && this.enable4kShow
478+
isAll4kSeasonsAvailable && this.enable4kShow
504479
? MediaStatus.AVAILABLE
505480
: this.enable4kShow &&
506481
media.seasons.some(
@@ -520,6 +495,22 @@ class BaseScanner<T> {
520495
await mediaRepository.save(media);
521496
this.log(`Updating existing title: ${title}`);
522497
} else {
498+
// For new media, check actual newSeasons objects instead of scanner
499+
// input to determine overall availability status
500+
const nonSpecialNewSeasons = newSeasons.filter(
501+
(s) => s.seasonNumber !== 0
502+
);
503+
504+
const isAllStandardSeasonsAvailable =
505+
nonSpecialNewSeasons.length > 0 &&
506+
nonSpecialNewSeasons.every((s) => s.status === MediaStatus.AVAILABLE);
507+
508+
const isAll4kSeasonsAvailable =
509+
nonSpecialNewSeasons.length > 0 &&
510+
nonSpecialNewSeasons.every(
511+
(s) => s.status4k === MediaStatus.AVAILABLE
512+
);
513+
523514
const newMedia = new Media({
524515
mediaType: MediaType.TV,
525516
seasons: newSeasons,
@@ -564,7 +555,7 @@ class BaseScanner<T> {
564555
)
565556
? jellyfinMediaId
566557
: undefined,
567-
status: isAllStandardSeasons
558+
status: isAllStandardSeasonsAvailable
568559
? MediaStatus.AVAILABLE
569560
: newSeasons.some(
570561
(season) =>
@@ -578,7 +569,7 @@ class BaseScanner<T> {
578569
? MediaStatus.PROCESSING
579570
: MediaStatus.UNKNOWN,
580571
status4k:
581-
isAll4kSeasons && this.enable4kShow
572+
isAll4kSeasonsAvailable && this.enable4kShow
582573
? MediaStatus.AVAILABLE
583574
: this.enable4kShow &&
584575
newSeasons.some(

0 commit comments

Comments
 (0)