Skip to content

Commit 3158b09

Browse files
committed
fix: statuses for PieceInstances should copy from the Piece until package-manager catches up
1 parent 89880fe commit 3158b09

File tree

4 files changed

+85
-68
lines changed

4 files changed

+85
-68
lines changed

meteor/server/publications/packageManager/expectedPackages/generate.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
import { PackageContainerOnPackage, Accessor, AccessorOnPackage } from '@sofie-automation/blueprints-integration'
22
import { getContentVersionHash, getExpectedPackageId } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
3-
import {
4-
PeripheralDeviceId,
5-
ExpectedPackageId,
6-
PieceInstanceId,
7-
PieceId,
8-
} from '@sofie-automation/corelib/dist/dataModel/Ids'
3+
import { PeripheralDeviceId, ExpectedPackageId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids'
94
import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString'
105
import {
116
PackageManagerExpectedPackage,
@@ -120,10 +115,7 @@ export async function updateCollectionForPieceInstanceIds(
120115
if (!pieceInstanceDoc.piece?.expectedPackages) continue
121116

122117
pieceInstanceDoc.piece.expectedPackages.forEach((expectedPackage, i) => {
123-
const sanitisedPackageId = getExpectedPackageId(
124-
protectString<PieceId>(unprotectString(pieceInstanceId)),
125-
expectedPackage._id || '__unnamed' + i
126-
)
118+
const sanitisedPackageId = getExpectedPackageId(pieceInstanceId, expectedPackage._id || '__unnamed' + i)
127119

128120
// Map the expectedPackages onto their specified layer:
129121
const allDeviceIds = new Set<PeripheralDeviceId>()

meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts

Lines changed: 79 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
VTContent,
1212
} from '@sofie-automation/blueprints-integration'
1313
import { getExpectedPackageId } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
14-
import { ExpectedPackageId, PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids'
14+
import { ExpectedPackageId, PeripheralDeviceId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids'
1515
import {
1616
getPackageContainerPackageId,
1717
PackageContainerPackageStatusDB,
@@ -156,7 +156,9 @@ export function getMediaObjectMediaId(
156156
return undefined
157157
}
158158

159-
export type PieceContentStatusPiece = Pick<PieceGeneric, '_id' | 'content' | 'expectedPackages'>
159+
export type PieceContentStatusPiece = Pick<PieceGeneric, '_id' | 'content' | 'expectedPackages'> & {
160+
pieceInstanceId?: PieceInstanceId
161+
}
160162
export interface PieceContentStatusStudio
161163
extends Pick<
162164
Studio,
@@ -506,60 +508,78 @@ async function checkPieceContentExpectedPackageStatus(
506508

507509
checkedPackageContainers.add(packageContainerId)
508510

509-
const expectedPackageId = getExpectedPackageId(piece._id, expectedPackage._id)
510-
const packageOnPackageContainer = await getPackageContainerPackageStatus(
511-
packageContainerId,
512-
expectedPackageId
513-
)
514-
const packageName =
515-
// @ts-expect-error hack
516-
expectedPackage.content.filePath ||
517-
// @ts-expect-error hack
518-
expectedPackage.content.guid ||
519-
expectedPackage._id
520-
521-
if (!thumbnailUrl && packageOnPackageContainer) {
522-
const sideEffect = getSideEffect(expectedPackage, studio)
523-
524-
const packageThumbnailPath = sideEffect.thumbnailPackageSettings?.path
525-
const thumbnailContainerId = sideEffect.thumbnailContainerId
526-
if (packageThumbnailPath && thumbnailContainerId) {
527-
thumbnailUrl = getAssetUrlFromExpectedPackages(
528-
packageThumbnailPath,
529-
thumbnailContainerId,
530-
studio,
531-
packageOnPackageContainer
532-
)
533-
}
511+
const expectedPackageIds = [getExpectedPackageId(piece._id, expectedPackage._id)]
512+
if (piece.pieceInstanceId) {
513+
// If this is a PieceInstance, try looking up the PieceInstance first
514+
expectedPackageIds.unshift(getExpectedPackageId(piece.pieceInstanceId, expectedPackage._id))
534515
}
535516

536-
if (!previewUrl && packageOnPackageContainer) {
537-
const sideEffect = getSideEffect(expectedPackage, studio)
538-
539-
const packagePreviewPath = sideEffect.previewPackageSettings?.path
540-
const previewContainerId = sideEffect.previewContainerId
541-
if (packagePreviewPath && previewContainerId) {
542-
previewUrl = getAssetUrlFromExpectedPackages(
543-
packagePreviewPath,
544-
previewContainerId,
545-
studio,
546-
packageOnPackageContainer
547-
)
517+
let warningMessage: ContentMessage | null = null
518+
let matchedExpectedPackageId: ExpectedPackageId | null = null
519+
for (const expectedPackageId of expectedPackageIds) {
520+
const packageOnPackageContainer = await getPackageContainerPackageStatus(
521+
packageContainerId,
522+
expectedPackageId
523+
)
524+
if (!packageOnPackageContainer) continue
525+
526+
matchedExpectedPackageId = expectedPackageId
527+
528+
if (!thumbnailUrl) {
529+
const sideEffect = getSideEffect(expectedPackage, studio)
530+
531+
const packageThumbnailPath = sideEffect.thumbnailPackageSettings?.path
532+
const thumbnailContainerId = sideEffect.thumbnailContainerId
533+
if (packageThumbnailPath && thumbnailContainerId) {
534+
thumbnailUrl = getAssetUrlFromExpectedPackages(
535+
packageThumbnailPath,
536+
thumbnailContainerId,
537+
studio,
538+
packageOnPackageContainer
539+
)
540+
}
541+
}
542+
543+
if (!previewUrl) {
544+
const sideEffect = getSideEffect(expectedPackage, studio)
545+
546+
const packagePreviewPath = sideEffect.previewPackageSettings?.path
547+
const previewContainerId = sideEffect.previewContainerId
548+
if (packagePreviewPath && previewContainerId) {
549+
previewUrl = getAssetUrlFromExpectedPackages(
550+
packagePreviewPath,
551+
previewContainerId,
552+
studio,
553+
packageOnPackageContainer
554+
)
555+
}
548556
}
557+
558+
warningMessage = getPackageWarningMessage(packageOnPackageContainer, sourceLayer)
559+
560+
// Found a packageOnPackageContainer
561+
break
549562
}
550563

551-
const warningMessage = getPackageWarningMessage(packageOnPackageContainer, sourceLayer)
552-
if (warningMessage) {
553-
messages.push(warningMessage)
564+
if (!matchedExpectedPackageId || warningMessage) {
565+
// If no package matched, we must have a warning
566+
messages.push(warningMessage ?? getPackageSoruceMissingWarning(sourceLayer))
554567
} else {
555568
// No warning, must be OK
556569

570+
const packageName =
571+
// @ts-expect-error hack
572+
expectedPackage.content.filePath ||
573+
// @ts-expect-error hack
574+
expectedPackage.content.guid ||
575+
expectedPackage._id
576+
557577
readyCount++
558578
packageInfos[expectedPackage._id] = {
559579
packageName,
560580
}
561581
// Fetch scan-info about the package:
562-
const dbPackageInfos = await getPackageInfos(expectedPackageId)
582+
const dbPackageInfos = await getPackageInfos(matchedExpectedPackageId)
563583
for (const packageInfo of dbPackageInfos) {
564584
if (packageInfo.type === PackageInfo.Type.SCAN) {
565585
packageInfos[expectedPackage._id].scan = packageInfo.payload
@@ -689,25 +709,28 @@ function getAssetUrlFromExpectedPackages(
689709
}
690710
}
691711

712+
function getPackageSoruceMissingWarning(sourceLayer: ISourceLayer): ContentMessage {
713+
// Examples of contents in packageOnPackageContainer?.status.statusReason.user:
714+
// * Target package: Quantel clip "XXX" not found
715+
// * Can't read the Package from PackageContainer "Quantel source 0" (on accessor "${accessorLabel}"), due to: Quantel clip "XXX" not found
716+
717+
return {
718+
status: PieceStatusCode.SOURCE_MISSING,
719+
message: generateTranslation(`{{sourceLayer}} can't be found on the playout system`, {
720+
sourceLayer: sourceLayer.name,
721+
}),
722+
}
723+
}
724+
692725
function getPackageWarningMessage(
693-
packageOnPackageContainer: Pick<PackageContainerPackageStatusDB, 'status'> | undefined,
726+
packageOnPackageContainer: Pick<PackageContainerPackageStatusDB, 'status'>,
694727
sourceLayer: ISourceLayer
695728
): ContentMessage | null {
696729
if (
697-
!packageOnPackageContainer ||
698730
packageOnPackageContainer.status.status ===
699-
ExpectedPackageStatusAPI.PackageContainerPackageStatusStatus.NOT_FOUND
731+
ExpectedPackageStatusAPI.PackageContainerPackageStatusStatus.NOT_FOUND
700732
) {
701-
// Examples of contents in packageOnPackageContainer?.status.statusReason.user:
702-
// * Target package: Quantel clip "XXX" not found
703-
// * Can't read the Package from PackageContainer "Quantel source 0" (on accessor "${accessorLabel}"), due to: Quantel clip "XXX" not found
704-
705-
return {
706-
status: PieceStatusCode.SOURCE_MISSING,
707-
message: generateTranslation(`{{sourceLayer}} can't be found on the playout system`, {
708-
sourceLayer: sourceLayer.name,
709-
}),
710-
}
733+
return getPackageSoruceMissingWarning(sourceLayer)
711734
} else if (
712735
packageOnPackageContainer.status.status ===
713736
ExpectedPackageStatusAPI.PackageContainerPackageStatusStatus.NOT_READY

meteor/server/publications/pieceContentStatusUI/rundown/regenerateItems.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
} from '@sofie-automation/corelib/dist/dataModel/Ids'
88
import { ReadonlyDeep } from 'type-fest'
99
import { UIPieceContentStatus } from '../../../../lib/api/rundownNotifications'
10-
import { literal, protectString, unprotectString } from '../../../../lib/lib'
10+
import { literal, protectString } from '../../../../lib/lib'
1111
import { CustomPublishCollection } from '../../../lib/customPublication'
1212
import { ContentCache } from './reactiveContentCache'
1313
import { wrapTranslatableMessageFromBlueprintsIfNotString } from '@sofie-automation/corelib/dist/TranslatableMessage'
@@ -154,7 +154,7 @@ export async function regenerateForPieceInstanceIds(
154154
uiStudio,
155155
{
156156
...pieceDoc.piece,
157-
_id: protectString(unprotectString(pieceDoc._id)),
157+
pieceInstanceId: pieceDoc._id,
158158
},
159159
sourceLayer
160160
)

packages/corelib/src/dataModel/ExpectedPackages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
BucketId,
99
ExpectedPackageId,
1010
PieceId,
11+
PieceInstanceId,
1112
RundownBaselineAdLibActionId,
1213
RundownId,
1314
SegmentId,
@@ -134,6 +135,7 @@ export function getExpectedPackageId(
134135
/** _id of the owner (the piece, adlib etc..) */
135136
ownerId:
136137
| PieceId
138+
| PieceInstanceId
137139
| AdLibActionId
138140
| RundownBaselineAdLibActionId
139141
| BucketAdLibId

0 commit comments

Comments
 (0)